Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Frage zur Schreibweise mehrerer Kriterien für Abfrage in SQL-Ansicht

Begonnen von Paule, März 01, 2016, 06:17:10

⏪ vorheriges - nächstes ⏩

Paule

Hi!

Ich sitze derzeit an einem Access-Accounting System für unser Start-Up.

Vom Prinzip her, haben wir es sehr simpel gehalten.
Herz des Systems ist ein Formular, welches uns unser gewünschtes Konto auswählt und dieses als TempVar ("AccID") speichert.
Diese wird dann in einer Abfrage als Konto verwendet und die Abfrage zeigt uns dann sowohl die Debit als auch Credit Side an (Abfrage jeweils einzeln zu Credit und Debit Side die wir dann mit Union All vereint haben).
Soweit hat das alles super gepasst.

Jetzt wollen wir noch eine weiteres Kriterium einfügen, nämlich das Datum.
Dazu habe ich im Formular, wo man das gewünschte Konto, welches man sehen möchte, angibt, noch das Start-Datum und das End-Datum hinzugefügt. Und lasse die beim Klicken auf den Button ebenfalls als TempVar speichern ("StartDate" + "EndDate"), sodass mit Klick auf den Button drei TempVars gleichzeitig gespeichert werden.

Jetzt bin ich in den SQL-Code meiner Union-All-Abfrage gegangen und wollte das Kriterium hinzufügen, dass er mir das ausgewählte Konto nur innerhalb des mit den TempVars ausgewählten Zeitraums anzeigen lassen soll. Leider funktioniert das nicht so richtig.

Könnt ihr mich bei den Kriterien weiterhelfen?

SELECT BK_Accounts.AccountNumber, BK_Accounts.AccountName, BK_BookEntryT.Amount, 0 AS Amount2, BK_BookEntryT.BusinessTransaction
FROM BK_Accounts INNER JOIN BK_BookEntryT ON BK_Accounts.AccountNumber = BK_BookEntryT.DebitSide

[b]WHERE (((BK_BookEntryT.DebitSide)=[TempVar]![AccID])) AND (((BK_BookEntryT.BusinessTransaction)>=[TempVar]![StartDate] AND (((BK_BookEntryT.BusinessTransaction)<=[TempVar]![EndDate]));[/b]

UNION ALL SELECT BK_Accounts.AccountNumber, BK_Accounts.AccountName, 0 AS Amount2, BK_BookEntryT.Amount, BK_BookEntryT.BusinessTransaction
FROM BK_Accounts INNER JOIN BK_BookEntryT ON BK_Accounts.AccountNumber = BK_BookEntryT.CreditSide

[b]WHERE (((BK_BookEntryT.CreditSide)=[TempVar]![AccID]))  AND (((BK_BookEntryT.BusinessTransaction)>=[TempVar]![StartDate] AND (((BK_BookEntryT.BusinessTransaction)<=[TempVar]![EndDate]));[/b]


Ich wäre euch dankbar für Hilfe!

Viele Grüße,
Marcus

DF6GL

Hallo,



WAS funktioniert nicht richtig ?   Kommen Fehlermeldungen und wie lauten diese?
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Paule

Zitat von: DF6GL am März 01, 2016, 08:54:33
Hallo,



WAS funktioniert nicht richtig ?   Kommen Fehlermeldungen und wie lauten diese?

Es kommen Syntaxfehler (siehe Screenshot).
Wenn ich da auf OK klicke springt er zu dem Semikolon vor dem UNION ALL Befehl und markiert es schwarz. Ich habe da schon versucht, ein Komma statt Semikolon zu nehmen, dann zeigt er mir aber wieder Syntax-Fehler an und springt zu dem ALL und markiert es schwarz.

MzKlMu

Hallo,
da gehört gar nix hin, weder Komma noch Semikolon. Auch das letzte Semikolon braucht es nicht.

Wozu hast Du hier eine Union Abfrage ?
Gruß Klaus

Paule

Ich habe es ohne Komma und Semikolon versucht...selbes Problem, jetzt markiert er UNION schwarz bei Klick auf OK bei der Fehlermeldung.

Zur UNION ALL Frage:
Wir haben eine Tabelle, in der wir die einzelnen Buchungssätze speichern.
Heißt, wir speichern das Soll-Konto (KontoNr) und das Haben-Konto und geben den Betrag dazu an (Screenshot Syntax2)
Jetzt wollten wir uns für jedes Konto eine Übersicht über alle Beträge auf der Soll-und Habenseite anzeigen lassen, und wo er uns automatisch das Saldo anzeigt (Screenshot Syntax3). Das hat auch super funktioniert. Wir haben uns über ein Formular, wo wir das Konto auswählen können, was wir gezeigt bekommen wollen, eine TEMPVAR erstellt und diese dann für die Abfrage genutzt.
UNION ALL haben wir in der Abfrage, weil es anders uns nicht möglich erschien, dem Programm zu sagen, dass wenn nur auf einer Seite eine Zahl steht (Soll- oder Haben, denn ich buche ja immer nur auf einer Seite das Konto an), er auf die andere nichts schreiben soll und uns trotzdem alle Buchungen, die dieses Konto betreffen so untereinander schreibt, dass erst alle Buchungen kommen, die auf der Soll-Seite gebucht sind und dann alle Buchungen auf der Haben-Seite.

DIe Problematik besteht eben darin, dass wir bei dem Buchungssatz das Konto nur auf einer Seite verwenden.
Das heißt, wir hätten theoretisch für jedes Konto mehrere Buchungen nur auf der Soll- und mehrere Buchungen nur auf der Haben-Seite.
Die will ich mir untereinander anzeigen lassen. Daher UNION ALL.

WIr sind leider überhaupt keine Profis und nutzen das Programm so gut es geht. Ist vielleicht eine komplizierte Lösung, aber sie hat wunderbar und wie gewünscht funktioniert...wäre jetzt nicht das Problem mit der Datumsangabe...

DF6GL

Hallo,

WIE gibt Du die Datum in die Tempvars-Variablen ein?

Was steht da genau drin?   

Im VBA-Editor im Direktfenster
?Tempvar!Startdate
eingeben und return drücken.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MaggieMay

#6
Hallo,

da sind viel zu viele Klammern in den Kriterien, nimm sie mal alle weg, sie sind überflüssig.
Klammern müssen immer paarig gesetzt werden, Klammer auf - Klammer zu, lässt sich doch leicht abzählen...
In deinem Code gibt es 18 x "(" und 14 x ")" !

Das Semikolon nach dem Select-Statement ist OK, muss aber nicht sein.
Freundliche Grüße
MaggieMay

Paule

#7
Zitat von: MaggieMay am März 01, 2016, 10:38:32
Hallo,

da sind viel zu viele Klammern in den Kriterien, nimm sie mal alle weg, sie sind überflüssig.
Klammern müssen immer paarig gesetzt werden, Klammer auf - Klammer zu, lässt sich doch leicht abzählen...
In deinem Code gibt es 18 x "(" und 14 x ")" !

Das Semikolon nach dem Select-Statement ist OK, muss aber nicht sein.

Super,
das klappt jetzt alles!  :) :) :) :)

Ich hatte mir den SQL-Code aus den Hilfsabfragen geholt und in den SQL-Code der Union All-Abfrage kopiert....deswegen hatte ich gar nichts mehr an den Klammern gemacht...  ::)

Paule

Da würde sich jetzt gleich noch eine weitere Frage anschließen:

Wie müsste ich denn den SQL-Code verändern, dass wenn nichts als Start- oder End-Datum angegeben wird (und somit keine TempVar gespeichert werden, oder werden die dann automatisch 0?), er mir einfach alle jemals aufgezeichneten Buchungen zeigen soll?

MaggieMay

Auch in "Hilfsabfragen" müssen die Klammern passen, das ist keine überzeugende Erklärung. Aber nun weißt du ja, worauf du (u.a.) achten musst. ;)

Nicht definierte Tempvars-Elemente liefern den Wert NULL (nicht 0). Wie sich das auswirkt probierst du am besten mal aus.
Freundliche Grüße
MaggieMay

Paule

#10
Zitat von: MaggieMay am März 01, 2016, 12:08:32
Auch in "Hilfsabfragen" müssen die Klammern passen, das ist keine überzeugende Erklärung. Aber nun weißt du ja, worauf du (u.a.) achten musst. ;)

Das kommt dann wohl davon, wenn man nur die Teile des SQL-Codes rauskopiert, die man braucht... Hm, ja...ich muss da anscheinend wirklich mehr darauf achten. Schon das zweite Mal...

ZitatNicht definierte Tempvars-Elemente liefern den Wert NULL (nicht 0). Wie sich das auswirkt probierst du am besten mal aus.

Ja, ich hatte es schon ausprobiert. Es wird dann gar nichts mehr angezeigt, wenn ich das Start- und Enddatum frei lasse.  :(
Die Tabelle lässt er stehen, es wird dann nur kein Datensatz mehr angezeigt.

MaggieMay

#11
Dann musst du das halt prüfen, bspw. so:

WHERE
BK_BookEntryT.DebitSide=[TempVar]![AccID] AND BK_BookEntryT.BusinessTransaction>=NZ([TempVar]![StartDate],DateValue("01.01.1900")) AND BK_BookEntryT.BusinessTransaction<=NZ([TempVar]![EndDate],DateValue("31.12.2999"))


oder so:

WHERE
BK_BookEntryT.DebitSide=[TempVar]![AccID] AND
IIf(TempVar!StartDate Is Null, True, BK_BookEntryT.BusinessTransaction>=[TempVar]![StartDate]) AND
IIf(TempVar!EndDate Is Null, True, BK_BookEntryT.BusinessTransaction<=[TempVar]![EndDate])


Freundliche Grüße
MaggieMay

Paule

Aaaah...die NZ-Funktion ist ja praktisch... coole Sache.

Ich möchte jetzt noch weitere Kriterien nach dem gleichen Verfahren berücksichtigen. Diese sind diesmal kein Datum, sondern Zahlen und kurze Texte.

Bei den Zahlen weiß ich, wie ich dann sage, dass er - sofern keine Eingabe stattfand - dann eben alle anderen anzeigen lassen soll.

Wie mache ich das denn bei kurzen Texten? Ich habe bei mir als einen Tag zum Beispiel die ganzen Fillialnamen. Wie kann ich das jetzt am cleversten lösen, dass er mir, wenn keine spezielle Filliale angegeben wurde in der Eingabe einfach die Buchungssätze für alle Fillialen anzeigt?

Ich habe es versucht mit "Ist nicht Null", weil ich das als Access-Kriterium gefunden habe, aber so richtig annehmen will er das nicht.

AND (BK_BookEntryT.Tag1)=NZ([TempVar]![Tag1J], Text("Ist nicht null")).

Ich habe es nun schon in mehreren Versionen probiert, sowohl ohne Anführungsstrichen, mit einfachen ANführungsstrichen und sonstigen. Eigentlich müsste das doch gehen?



DF6GL

Hallo,


z. B. so:


...AND (BK_BookEntryT.Tag1) Like [TempVar]![Tag1J]  & "*" .....



das hat aber ein paar Tücken.  Am Besten gewöhnst Du Dir an, den SQL-String dynamisch mit VBA zusammenzusetzen oder das (hinzuzufügende) Parameters-Statement  in der Abfrage mit Werten zu beschicken.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

Paule

Aaah, super. Das klappt jetzt alles so, wie ich mir das vorgestellt habe. :)
Ganz lieben Dank an euch alle!
Irgendwie logisch mit "*"....  ::)