Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Monti am Juli 13, 2012, 15:23:51

Titel: Kombinationsfeld mit SQL als RowSource einen weiteren Eintrag per VBA hinzufügen
Beitrag von: Monti am Juli 13, 2012, 15:23:51
Hallo zusammen,

ich hänge zur Zeit an einem einfachen Problem zu dem ich bislang noch keine einfache Lösung gefunden habe, vielleicht könnt ihr mir ja helfen.

Und zwar habe ich in einem Formular ein Kombinationsfeld (cmbObjects) das dazu dient die Einträge eines Listenfeldes (lstProperties) zu Filtern und dessen Basis eine Tabelle (tblObjects) ist von der die Spalten  [objId] und [objName] verwendet werden.
Ich führe in VBA eine Prozedur aus, die abhängig vom gewählten Eintrag in cmbObjects die lstProperties füllt - das funktioniert auch soweit wie gewünscht.
Jetzt würde ich allerdings gerne einen Eintrag "Alle anzeigen" ("ID" Wert: 0) on-the-fly hinzufügen ohne diesen vorher irgendwo in der Datenbank hinterlegen zu müssen.

Wie kann ich einem Kombinationsfeld mit RowSourceType "Table/Query" einen weiteren Eintrag hinzufügen?
Oder, wie kann ich dem Ergebnis einer SQL-Abfrage einen weiteren Datensatz hinzufügen ohne die zugrunde liegende Tabelle zu ändern oder mit temporären Tabellen arbeiten zu müssen?

Eine Alternative die mir eingefallen ist: als RowSourceType "Value List" nehmen, per AddItem zunächst den Eintrag "0 - Alle anzeigen" hinzufügen, dann die Abfrage in ein Recordset Objekt zu speichern, dieses per Schleife zu durchlaufen und dem Kombinationsfeld anzuhängen (in der Form: [objId] & " - " & [objName]). Wenn ich dann einen Eintrag auswähle erhalte ich den Wert von [objId] in dem ich den String entsprechend trimme...
Das erscheint mir jedoch alles ein wenig zu aufwendig für den angesprochenen Fall, dass ich lediglich einen Eintrag der ComboBox hinzufügen möchte?!?

Ich hoffe ich habe mich verständlich ausgedrückt, ich würde mich sehr über eure Hilfe oder einen Denkanstoss freuen!

Gruß,
Monti
Titel: Re: Kombinationsfeld mit SQL als RowSource einen weiteren Eintrag per VBA hinzufügen
Beitrag von: database am Juli 13, 2012, 16:49:46
Hallo,


Da nehme ich an, dass eine Abfrage mit dem Befüllen ddes Kombifeldes in Verbindung steht, wenn nicht erstelle eine Abfrage als Datenherkunft des Kombifeldes und gestallte diese als UNION-Abfrage.



select 0 as objID,'Alle anzeigen' as objName from tblOjects
union
select objID, objName from tblObjects


Damit hast du eine UNION-Abfrage, die an der ersten Stelle des Abfrage-Ergebnisses die ID 0 und einen beliebigen Text in der 2. Spalte anzeigt.
In weiterer Folge kannst du nun zum Befüllen des Listenfeldes auf diese Werte zugreifen und entsprechend darauf reagieren.

HTH

Titel: Re: Kombinationsfeld mit SQL als RowSource einen weiteren Eintrag per VBA hinzufügen
Beitrag von: Monti am Juli 13, 2012, 18:35:00
Hi,

vielen Dank für deine rasche Antwort, das ist schonmal ein vielversprechender Tipp den du mir da gegeben hast, leider funktioniert das noch nicht ganz so...

Also, meine bisherige Prozedur zum befüllen des Kombinationsfeld sah so aus:

'Kombinationsfeld initialisieren und mit Abfrage verknüpfen
With Me![cmbObjects]
   .RowSourceType = "Table/Query"
   .ColumnCount = 2
   .BoundColumn = 1
   .RowSource = "SELECT [objId], [objName] FROM tblObjects ORDER BY [objName], [objId]"

   'Ersten Eintrag auswählen
   If IsNull(.Value) And .ListCount > 0 Then
       .Value = .ItemData(0)
   End If
End With


Wenn ich die Zeile:
.RowSource = "SELECT [objId], [objName] FROM tblObjects ORDER BY [objName], [objId]"
jetzt abändere in:
.RowSource = "SELECT 0 AS [objId], 'Alle anzeigen' AS [objName] UNION ALL SELECT [objId], [objName] FROM tblObjects ORDER BY [objName], [objId]"
bekomme ich gar nichts angezeigt...

Nehme ich allerdings nur das Statement einzeln:
SELECT 0 AS [objId], 'Alle anzeigen' AS [objName]
wird der "Alle anzeigen" Eintrag in der Liste angezeigt.

Somit kann der Fehler nur in der UNION Anweisung liegen, hast du dafür eine Idee was da bei mir falsch läuft?




Btw. ich habe mittlerweile auch noch eine andere Lösung verwirklicht, wobei mir deine (sofern sie funktioniert) wesentlich eleganter erscheint!


'Kombinationsfeld initialisieren
With Me![cmbObjects]
   .RowSourceType = "Value List"
   .ColumnCount = 2
   .BoundColumn = 1
   .RowSource = "0;Alle anzeigen"
End With

'Kombinationsfeld befüllen
Dim rcsTemp As Recordset
Set rcsTemp = CurrentDb.OpenRecordset( _
   "SELECT [objId], [objName] FROM tblObjects ORDER BY [objName], [objId]", dbOpenSnapshot)
With rcsTemp
   .MoveFirst
   Do Until .EOF
       Me![cmbObjects].AddItem (.Fields(0) & ";" & .Fields(1))
       .MoveNext
   Loop
   .Close
End With

'Ersten Eintrag auswählen
If IsNull(Me![cmbObjects].Value) And Me![cmbObjects].ListCount > 0 Then
   Me![cmbObjects] = Me![cmbObjects].ItemData(0)
End If



Titel: Re: Kombinationsfeld mit SQL als RowSource einen weiteren Eintrag per VBA hinzufügen
Beitrag von: daolix am Juli 13, 2012, 21:14:18
Probiers mal genau so wie es database getippt hat:

.RowSource = "SELECT 0 AS [objId], 'Alle anzeigen' AS [objName] From tblObjects UNION ALL SELECT [objId], [objName] FROM tblObjects ORDER BY [objName], [objId]"

Titel: Re: Kombinationsfeld mit SQL als RowSource einen weiteren Eintrag per VBA hinzufügen
Beitrag von: Monti am Juli 13, 2012, 23:25:31
Super, danke euch beiden!!!

Haar genauso wie "daolix" es geschrieben hat (bzw. "database" es vorher schon formulierte) funktionierts!!!

Dachte eigentlich, dass ich alle Varianten ausprobiert hatte mit und ohne Tabellenangabe im ersten Teil des Statements und definitiv auch ohne "ALL", aber wahrscheinlich ist mir einfach irgendwo beim rumprobieren vorher ein Fehler unterlaufen...

Vielen Dank nochmal - you saved my weekend!!!