Avatar billede t_jaeger Praktikant
21. februar 2017 - 02:45 Der er 7 kommentarer

Undgå brugte data fra tabel i kombinationsfelt

Haves: Tabeller med henholdvis persondata og værelsesnr. Formular hvor værelsesnr inskrives vha kombinationsfelt.

Spørgsmål.: Kan "brugte" værelsesdata udlukkes fra kombinationsfelt så det ikke er muligt at vælge det samme værelse igen?
Det må ikke slettes, det skal kunne anvendes igen hvis der sker ændringer i værelsestildelingen.
Avatar billede bvirk Guru
21. februar 2017 - 09:42 #1
Ja det kan sagtens lade sig gøre - kombinationsfeltets datakilde skal være en forespørgsel der ikke medtager "brugte".
Hvis du vil have noget mere konkret så lad os vide tabel/feltnavne og kombinationsfeltet datakilde.
Mvh
Avatar billede bvirk Guru
22. februar 2017 - 16:29 #2
Scenariet er booking af værelser

Givet tabellerne dannet ved:
create table Rooms(id autoIncrement, rName text(50),constraint Room_PK primary key(id))
create table Bookings(id autoIncrement, room integer,start date,end date,constraint Room_PK primary key(id))

Og en form, "Bookings" med enslydende controlelmenter bortset fra "bEnd" istedet for "end" havende form_Bookings indeholdende:
'''''''''''''''''''''''''''''''''
Private Sub Form_Current()
    syncKroom
End Sub

Private Sub bEnd_AfterUpdate()
    syncKroom
End Sub

Private Sub start_AfterUpdate()
    syncKroom
End Sub

Private Sub syncKroom()
    If IsNull(start) Or IsNull(bEnd) Then
        Kroom.ControlSource = ""
        Kroom.RowSourceType = "Value List"
        Kroom.RowSource = "udfyld start og slut tidspunkt"
        Kroom.ColumnWidths = "5cm"
    Else
        Kroom.ControlSource = "room"
        Kroom.RowSourceType = "Table/Query"
        Kroom.ColumnWidths = "0cm;4cm"
    Kroom.RowSource = _
          "SELECT rooms.id, rName from Rooms where not id in " _
        & "(select rooms.id FROM Rooms inner join Bookings on rooms.id=bookings.room where " _
        & "cdate(Forms!bookings!start) < end and cdate(Forms!bookings!end) >start)"
    End If
    Kroom.Requery
End Sub
'''''''''''''''''''''''''''''''

Kombinationsboksen Kroom sættes ved oprettelse til det samme som IsNull(start) ... delen - dog:
antalkolonner=2
bundetkolonne=1
Avatar billede t_jaeger Praktikant
22. februar 2017 - 16:55 #3
Er der en nemmere måde at gøre det på?
Avatar billede bvirk Guru
22. februar 2017 - 17:18 #4
Nej - men for den helt uindviede er måske problematisk

Pointen er ikke at:
currentdb.execute "create table Rooms(id autoIncrement, rName text(50),constraint Room_PK primary key(id))"

er lettere end bruge tabel designeren, men at det er en utvetydig tabelstruktur at anføre på skrift.
Avatar billede bvirk Guru
22. februar 2017 - 17:35 #5
Så lige at sidste del kan skrives kortere men det er rent 'syntatic sugar'

Private Sub syncKroom()
    Dim syncType
    syncType = -(IsNull(start) Or IsNull(bEnd))
    With Kroom
        .ControlSource = Array("room", "")(syncType)
        .RowSourceType = Array("Table/Query", "Value List")(syncType)
        .ColumnWidths = Array("0cm;4cm", "5cm")(syncType)
        .RowSource = Array(KroomSQL, "udfyld start og slut tidspunkt")(syncType)
        .Requery
    End With
End Sub

Private Function KroomSQL()
  KroomSQL = "SELECT rooms.id, [rName] from Rooms where not id in " _
            & "(select rooms.id FROM Rooms inner join Bookings on rooms.id=bookings.room where " _
            & "cdate(Forms!bookings!start) < end and cdate(Forms!bookings!end) >start)"
End Function
Avatar billede t_jaeger Praktikant
26. februar 2017 - 21:46 #6
Prøver med nogle flere oplysninger.:

Tabelnavn: Værelser til rådighed  Felter: Værelse - Id
Tabelnavn: Tildelt værelse            Felter: Værelse - navn - Id
Formnavn: Tildelt værelse  Rækkekilde:SELECT [Værelser til rådighed].Værelse FROM [Værelser til rådighed] ORDER BY [Værelser til rådighed].Værelse;
Avatar billede bvirk Guru
27. februar 2017 - 09:59 #7
Der er jo så ingen afhængighed af andre felter når et værelse skal udvælges og dermed ingen grund til at at kombinationsboksens egenskaber ændres dynamisk.

Kombinationsboksen kan stadig laves med blandt andet:

1. Rækkekilde: select ... where not "feltnavn" in ("select feltnavn ...)
2. Requery på en eller anden event.

Måske andre har noget at tilføje.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester