Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Listenfeld sortieren

Begonnen von Mr. Ahnungslos, Dezember 31, 2013, 23:32:50

⏪ vorheriges - nächstes ⏩

Mr. Ahnungslos

Hallo,

mit folgendem Code befühle ich ein Listenfeld.

    Me.lstTeilnehmer.RowSource = "SELECT tblMitarbeiter.Mitarbeiter_ID, tblMitarbeiter.Nachname & ', ' & tblMitarbeiter.Vorname " & _
                                 "FROM tblMitarbeiter INNER JOIN tblMitarbeiterTeam ON tblMitarbeiter.Mitarbeiter_ID = tblMitarbeiterTeam.Mitarbeiter_FK " & _
                                 "WHERE tblMitarbeiterTeam.Team_FK =" & Me.cboMeeting.Column(2) & " AND Mitarbeiter_ID NOT IN " & _
                                 "(SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ")" 


Kann mir jemand auf die Sprünge helfen, wie ich nun den Code korrekt um "ORDER BY..." ergänze, dass die Listenfeldeinträge nach tblMitarbeiter.Nachname alphabetisch sortiert werden?

Besten Dank

Michael

Hondo

Hallo,
das Order By kommt nach der Schließenden Klammer der Unterabfrage:
WHERE Meeting_FK =" & Me.cboMeeting & ") Order by tblMitarbeiter.Nachname"

BTW: verwende doch Aliase, dann sieht sein SQL Code gleich viel lesbarer aus:

    Me.lstTeilnehmer.RowSource = "SELECT M.Mitarbeiter_ID, M.Nachname & ', ' & M.Vorname " & _
                                 "FROM tblMitarbeiter As M INNER JOIN tblMitarbeiterTeam As T ON M.Mitarbeiter_ID = T.Mitarbeiter_FK " & _
                                 "WHERE T.Team_FK =" & Me.cboMeeting.Column(2) & " AND M.Mitarbeiter_ID NOT IN " & _
                                 "(SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ") " & _
                                 "Order By M.Nachname"


Gruß Andreas

Mr. Ahnungslos

Hallo Andreas,

besten Dank für deine Antwort. Ich bin zwar gerade auf der Arbeit und kann deinen Hinweis nicht ausprobieren, bin mir aber extrem sicher, dass ich genau an dieser Stelle bereits den "ORDER BY"-Zusatz eingetragen habe. Ergebnis: sobald ich das Steuerfeld zur Datenauswahl aktualisiert habe, war das gesamte Listenfeld leer (Erklärung: das Steuerfeld ist eine dropdown-Liste, mit der ein Meeting ausgewählt wird. Dann soll das Listenfeld alle Mitarbeiter anzeigen, die nicht Teammitglieder sind, und somit potentielle Gäste zu dem Meeting sein können. Diese Liste soll dann alphabetisch sortiert werden).

Mache ich da was falsch?

Gruß

Michael

database

#3
Hallo,

du schreibst, dass nach Aktualisierung des Steuerfeldes ... ich nehme an, damit ist 'cboMeeting' gemeint?

Kontolliere bitte mal nach ob ...  Me.cboMeeting.Column(2) ... überhaupt existiert.
Soll heißen ... wieviele Spalten sind denn an der Datenherkunft des Kombis beteiligt?
Beachte bitte, dass die Nummerierung der Spalten (Index) mit 0 beginnt!
Bei 2 Spalten (z.B. ID und einer Meeting-Bezeichnung) wäre die ID unter 'cboMeeting.Column(0)' und
Die Meeting-Bezeichnung unter 'cboMeeting.Column(1)' zu finden!

Mr. Ahnungslos

Hallo Peter,

das hört sich sehr gut an, und mit cboMeeting hast Du natürlich Recht. Werde ich sofort prüfen, wenn ich zu Hause bin. Danke! Ich informiere dann hier wieder über den aktuellen Stand.

beste Grüße

Michael

Mr. Ahnungslos

Hallo Peter,

das alphabetisch sortieren des Listenfeldes hat funktioniert. Doof ist nur, dass ich insgesamt 3 Listenfelder habe (1=alle Teammitglieder, 2= alle Mitarbeiter, die keine Teammitglieder sind, 3= alle Meetingteilnehmer). Feld Nummer 1 ist nun korrekt sortiert, 2 und 3 lassen sich aber nicht sortieren. Ich habe versucht, den "ORDER BY"-Befehl genauso wie bei Listenfeld 1 zu platzieren, aber ohne Erfolg. Die Listenfelder sind leer. Hier noch zur Veranschaulichung die Codes der beiden anderen Listenfelder (diesmal unter Verwendung von Alias, ich hoffe das war richtig so):

'Liste der möglichen Gäste, also Mitarbeiter, die keine Teammitglieder sind
   Me.lstGaeste.RowSource = "SELECT ID, Nachname & ', ' & Vorname " & _
                                           "FROM tblMitarbeiter INNER JOIN tblMitarbeiterTeam ON Mitarbeiter_ID = Mitarbeiter_FK " & _
                                           "WHERE Mitarbeiter_ID Not In (SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ")" & _
                                           "AND Team_FK<>" & Me.cboMeeting.Column(2)

                                 
    'Liste der bereits eingetragenen Teilnehmer eines Meetings
    Me.lstMTeilnehmer.RowSource = "SELECT ID, [Nachname] & ', ' & [Vorname] " & _
                                                    "FROM tblMitarbeiter INNER JOIN tblMeetingTeilnahme ON Mitarbeiter_ID = Mitarbeiter_FK " & _
                                                    "WHERE Meeting_FK =" & Me.cboMeeting


Ich hoffe, dass durch die Verwendung der Alias jetzt nicht die notwendigen Info's fehlen. Wie ist denn nun der ORDER BY-Befehl zu setzen?

Danke

Michael

database

#6
Hallo,

im Prinzip funktioniert es so wie beim Ersten auch.


[size=10pt]
'Liste der möglichen Gäste, also Mitarbeiter, die keine Teammitglieder sind
   Me.lstGaeste.RowSource = "SELECT ID, Nachname & ', ' & Vorname " & _
                                           "FROM tblMitarbeiter INNER JOIN tblMitarbeiterTeam ON Mitarbeiter_ID = Mitarbeiter_FK " & _
                                           "WHERE Mitarbeiter_ID Not In (SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ") " & _
                                           "AND Team_FK<>" & Me.cboMeeting.Column(2)[color=blue] & " ORDER BY Nachname"
[/color]                                           
                             
    'Liste der bereits eingetragenen Teilnehmer eines Meetings
    Me.lstMTeilnehmer.RowSource = "SELECT ID, [Nachname] & ', ' & [Vorname] " & _
                                                    "FROM tblMitarbeiter INNER JOIN tblMeetingTeilnahme ON Mitarbeiter_ID = Mitarbeiter_FK " & _
                                                    "WHERE Meeting_FK =" & Me.cboMeeting [color=blue]& " ORDER BY [Nachname]"
[/color]
[/size]


Du darfst nur nicht vergessen, dass im Ereignis 'AfterUpdate' des Kombifeldes alle 3 Listenfelder neu befüllt werden müssen.
Me.lstTeilnehmer.Requery
Me.lstGaeste.Requery
Me.lstMTeilnehmer.Requery
NACHDEM die RowSource zugewiesen wurde

p.s.
ZitatIch hoffe, dass durch die Verwendung der Alias jetzt nicht die notwendigen Info's fehlen
In deinen Codebeispielen werden keine Aliase benutzt!

Mr. Ahnungslos

Hallo Peter,

Danke für Deine Antwort. Ich dachte, mit den "Alias" ist gemeint, dass man nicht immer den gesamten Pfadim Format Tabelle.Feld etc. schreibt, damit die Lesbarkeit besser wird. Offensichtlich habe ich da etwas Mistverstanden ;)

Nun, ich habe Deine Positionierungen des ORDER BY ausprobiert und erhalte leider wiederum komplett leere Listenfelder. Hier nun mal der gesamte Code

Private Sub cboMeeting_AfterUpdate()
  'Lister der verfügbaren Teilnehmer erstellen
    Me.lstTeilnehmer.RowSource = "SELECT tblMitarbeiter.Mitarbeiter_ID, tblMitarbeiter.Nachname & ', ' & tblMitarbeiter.Vorname " & _
                                 "FROM tblMitarbeiter INNER JOIN tblMitarbeiterTeam ON tblMitarbeiter.Mitarbeiter_ID = tblMitarbeiterTeam.Mitarbeiter_FK " & _
                                 "WHERE tblMitarbeiterTeam.Team_FK =" & Me.cboMeeting.Column(2) & " AND Mitarbeiter_ID NOT IN " & _
                                 "(SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ") order by tblMitarbeiter.Nachname"
                             

                                 
   'Liste der möglichen Gäste, also Mitarbeiter, die keine Teammitglieder sind
   Me.lstGaeste.RowSource = "SELECT tblMitarbeiter.Mitarbeiter_ID, tblMitarbeiter.Nachname & ', ' & tblMitarbeiter.Vorname " & _
                            "FROM tblMitarbeiter INNER JOIN tblMitarbeiterTeam ON tblMitarbeiter.Mitarbeiter_ID = tblMitarbeiterTeam.Mitarbeiter_FK " & _
                            "WHERE tblMitarbeiter.Mitarbeiter_ID Not In (SELECT Mitarbeiter_FK FROM tblMeetingTeilnahme WHERE Meeting_FK =" & Me.cboMeeting & ")" & _
                            "AND tblMitarbeiterTeam.Team_FK<>" & Me.cboMeeting.Column(2) & "Order by tblMitarbeiter.Nachname"

                                 
    'Liste der bereits eingetragenen Teilnehmer eines Meetings
    Me.lstMTeilnehmer.RowSource = "SELECT tblMitarbeiter.Mitarbeiter_ID, [Nachname] & ', ' & [Vorname] " & _
                                  "FROM tblMitarbeiter INNER JOIN tblMeetingTeilnahme ON tblMitarbeiter.Mitarbeiter_ID = tblMeetingTeilnahme.Mitarbeiter_FK " & _
                                  "WHERE tblMeetingTeilnahme.Meeting_FK =" & Me.cboMeeting & "Order by [Nachname]"
                                 

    'Die Listenfelder aktualisieren
    Me.lstTeilnehmer.Requery
    Me.lstMTeilnehmer.Requery
    Me.lstGaeste.Requery
    Me.Requery
   
End Sub


Ich komme leider einfach nicht weiter, ich will die drei Dinger doch einfach nur sortiert haben. Sobald ich ORDER BY komplett weglasse, werden die Felder zwar korrekt gefüllt, sind aber kreuz und quer durcheinander.

Danke für Deine Hilfe

Michael

Hondo

Hallo,
das mit dem Alias ist schon richtig.
Anstatt Tabellennamen.Tabellenfeld schreibt man dann den Alias.Tabellenfeld.
Alias ist zu deklarieren indem man hinter die erste Verwendung eines Tabellennamen "As Aliasnamen" schreibt.
Z.B. bei From Tabelle1 As T1
Oder: Inner Join Tabelle2 As T2

Der Alias kann dann überall verwendet werden in der Abfrage - außer wenn du eine Unterabfrage hast, darin ist er nicht gültig.
Beispiel:
Select
m.Vorname, m.Nachname, m.Alter
From TabelleMitglieder As m
Where ID_MEMBER IN (Select m.ID_MEMBER From TabelleMitglieder2 As m Where m.Alter < 20)
Order By m.Alter


Der Alias m in der Unterabfrage ist nicht identisch mit dem Alias m der äußeren Abfrage.
Gruß Andreas

bahasu

Hi,

was passiert, wenn
& "Order by [Nachname]"

ersetzt wird durch & " Order by  tblMitarbeiter.[Nachname]"

Harald
Servus

Mr. Ahnungslos

DAS WAR ES!!!!!

Jetzt funktioniert alles, DANKE!!!

Gibt es eigentlich keinen DANKE-Button mehr?

database

Hallo,

ZitatNun, ich habe Deine Positionierungen des ORDER BY ausprobiert und erhalte leider wiederum komplett leere Listenfelder
... und ich vermute dass es daran lag, dass du die Leerzeichen VOR dem ORDER BY Befehl nicht beachtet hast - so wie ich sie in meinem Posting stehen habe.  ;)

So wie du das drin stehen hast würde die WHERE-Klausel für das letzte Listenfeld so interpretiert werden:
WHERE tblMeetingTeilnahme.Meeting_FK =5Order by [Nachname]
Nachdem es keinen Meeting_FK geben wird, der 5Order als Wert enthält, bleibt das Listenfeld leer.

Daher gibt es auch immer wieder mal den Hinweis Codevorschläge zu kopieren und nicht abzuschreiben.

Die Angabe der Herkunftstabelle oder eines Alias ist dann zwingend notwendig, wenn die Felder nicht eindeutig zu unterscheiden wären.