Hallo zusammen,
ich kenne mich in Excel VBA gut aus aber in Access ist das alles ein
wenig anders. Ich habe eine Access Datenbank, in der habe ich 3 Tabellen (Buchungen, Konten, Adressen). Dann
habe ich eine Abfrage, in der sind die Buchungen mit den Konten und die Buchungen mit den Adressen verbunden. Soweit so gut.
Darüber hinaus habe ich ein Formular mit 4 Textfeldern (Von Konto; Bis Konto; Von Kostenstelle bis Kostenstelle) und einen Button (Suchen).
Der Suchbutton startet onclick die Abfrage. In der Abfrage habe ich Kriterien die sich aus den Textfeldern des Formulars die Werte ziehen. Soweit auch so gut.
Jetzt werden nur die Kriterien zu lang zu unübersichtlich und zu kompliziert, das wäre mit ein paar if/else Abfragen viel eleganter und
übersichlicher zu machen.
Meine Frage daher, wie müsste in etwa der Code lauten für:
On click
Öffne Query
mit Parameter, wenn Formular!Abfrage!Textfeld1 = 0 dann Kriterium <= Formular!Abfrage!Textfeld2
usw.
Ausführen der Query und Ausgabe in der Tabelle
Für Hilfe wäre ich sehr dankbar.
Gruß
Matthias
Hallo,
"Jetzt werden nur die Kriterien zu lang zu unübersichtlich und zu kompliziert, das wäre mit ein paar if/else Abfragen viel eleganter und
übersichlicher zu machen. "
versteh ich nicht... Das wird keinesfalls eleganter und übersichtlicher....
Es gibt doch nur zwei Bereichseinschränkungen (Konto und Kostenstelle)
Beschreib mal, wie was und wann Du suchen willst und poste die Abfragen und den Code etc dazu. Am Besten wäre das Hochladen der zuerst komprimierten/reparierten und anschlissend gezippten mdb-Datei
btw: Ergebnisse in Abfrageansicht zu zeigen ist nicht optimal. Benutze dafür besser Formulare, bzw. Listenfelder oder auch Berichte...
Crosspostings sind unerwünscht:
http://forum.freeaccess.de/YaBB.pl?num=1313754193/0
Anscheinend verstehen wir unter Übersichtlichkeit etwas anderes, aber
für mich ist vba code einfacher zu lesen und zu handhaben als Kriterien einer Accessabfrage die in etwa so aussehen:
Wenn(IstNull(([Formulare]![Abfrage]![TXT_KTO_V] Und [Formulare]![Abfrage]![TXT_KTO_B]);Wert([Daten GL Export TBG]![Konto]);Wenn(IstNull(([Formulare]![Abfrage]![TXT_KTO_V];<= [Formulare]![Abfrage]![TXT_KTO_B];Wenn(IstNull(([Formulare]![Abfrage]![TXT_KTO_B];>= [Formulare]![Abfrage]![TXT_KTO_V];>=[Formulare]![Abfrage]![TXT_KTO_V] Und <=[Formulare]![Abfrage]![TXT_KTO_B])
und das gleiche nochmal für die Kostenstelle udn evtl. weitere Abfragen, das wäre in VBA mit einem Array für die Abfragen und Platzhaltern einfacher.
Das Cross-Posting kam dadurch zu Stande das ich schnellere Responses gewöhnt bin aus z.B. dem Herber Excel-Forum
und erst nach dem Posting gesehen habe das in dem anderen Forum mehr los ist.
Schöne Grüße
Matthias
Hallo Matthias,
dann würde ich dir vorschlagen in VBA die Record-Source durch einen SLQ-String aufzubauen.
Hier kannst Du dann mit verschachtelte IF arbeiten.
Gruß
Johann
Hilf dir selbst, dann hilft dir Gott ;D
Selbst gelöst:
Die VBA Anweisung lautet:
Private Sub BTN_Click()
Dim frmFormular As Form_frmAbfrage
Set frmFormular = Forms("frmAbfrage")
If IsNull(frmFormular.txtKSTV) Then
frmFormular.txtKSTV = 0
End If
If IsNull(frmFormular.txtKSTB) Then
frmFormular.txtKSTB = 9999
End If
If IsNull(frmFormular.txtKTOV) Then
frmFormular.txtKTOV = 0
End If
If IsNull(frmFormular.txtKTOB) Then
frmFormular.txtKTOB = 9999999
End If
If frmFormular.txtKSTV = 0 And frmFormular.txtKSTB = 9999 Then
GoTo Step2
End If
DoCmd.OpenQuery "qryBAB"
GoTo Ende
Step2:
DoCmd.OpenQuery "qryBAB2"
Ende:
frmFormular.txtKSTV = Null
frmFormular.txtKSTB = Null
frmFormular.txtKTOV = Null
frmFormular.txtKTOB = Null
End Sub
Und der SQL Text in der 1. Abfrage:
SELECT DISTINCT DatenGLExportTBG.[FIBU Datum], DatenGLExportTBG.Kostenstelle, DatenGLExportTBG.Konto, DatenGLExportTBG.Bezeichnung, DatenGLExportTBG.SALDO, Lieferanten.Name, TBGKontenBAB2011.[BAB-Zeile]
FROM (DatenGLExportTBG LEFT JOIN TBGKontenBAB2011 ON DatenGLExportTBG.Konto = TBGKontenBAB2011.Konto) LEFT JOIN Lieferanten ON DatenGLExportTBG.Adresse = Lieferanten.Lieferan
WHERE ((([DatenGLExportTBG.Kostenstelle])>=[Formulare]![frmAbfrage]![txtKSTV] And ([DatenGLExportTBG.Kostenstelle])<=[Formulare]![frmAbfrage]![txtKSTB]) AND (([DatenGLExportTBG.Konto])>=[Formulare]![frmAbfrage]![txtKTOV] And ([DatenGLExportTBG.Konto])<=[Formulare]![frmAbfrage]![txtKTOB]));
In der 2. Abfrage habe ich die Bedingung für die Kostenstelle weggelassen, da es auch Konten gibt, die keiner Kostenstelle zugeordnet sind und Access sonst die leeren Zeilen nicht anzeigt.