PDA

Vollständige Version anzeigen : Abfrageparameter von Formularen


Kalinke
11.06.2012, 13:10
Hallo Leute,

ich habe eine Frage:

ich habe eine Abfrage, die mir Daten aus einem Formular liefern soll.
Das funktioniert auch soweit ganz gut.
Wenn aber ein ein Steuerelement in dem Formular Null oder Leer ist, liefert die Abfrage kein Ergebnis!

Was kann ich da machen ?

Vielen Dank schon mal !!!

Atrus2711
11.06.2012, 13:18
Hi,

du kannst diesen Fall als Alternativkriterium abdecken.

Wenn dein bisheriger Formularbezug schematisch so lautet (SQL):
... WHERE Tabellenfeld = Forms!DeinForm!DeinTextfeld
dann bau das um auf
... WHERE (Tabellenfeld = Forms!DeinForm!DeinTextfeld OR Forms!DeinForm!DeinTextfeld IS NULL)
Diese Zusatzbedingung wird genau dann wahr, wenn das Formular-Textfeld leer ist. Da diese Zusatzbedingung als OR (=Alternativbedingung) eingesetzt wird, fängt sie das Leersein für alle Datensätze ab.

Siehe auch http://www.donkarl.com?FAQ3.14

Ein anderer Ansatz ist das Zusammenstellen einer dynamischen SQL aus den benutzten Suchfeldern. Dazu gibts im Codearchiv eine Demo (http://www.ms-office-forum.net/forum/showthread.php?t=254941).

Maxel
11.06.2012, 13:23
Schlage mal in der Hilfe nach zur NZ-Funktion.

Kalinke
11.06.2012, 14:01
Hallo Martin,

ich habe das probiert, es funktioniert leider nicht.
Das Problem ist das ich 30 Felder in einem Formular habe, die ich abfrage.
Ein paar davon können Null sein oder auch nicht.

Ich habe inm Netz gelesen, dass Access nicht viele Felder mit der Oder Funktion zulässt.

Weißt Du da was?

Atrus2711
11.06.2012, 14:10
Hi,

betrifft das Leersein die durchsuchten Tabellenfelder, oder die verwendeten "Suchbegriff-Textfelder" im Formular?

Was leere Tabellenfelder angeht:
Was leer ist, ist mit keinem anderen Vergleich zu finden. Leere Werte sind nicht gleich 5, aber auch nicht <5 und nicht >5. Sie sind eben leer und "unvergleichlich". Dafür gibts ja eben das Kriterium IS NULL. MAxel hat dir NZ() vorgeschlagen; damit könntest du leere Werte in "Fehlanzeigen" ummodeln (z.B. den Text "-leer-" statt NULL). Das Ergebnis dieser Funktion ist dann immer gefüllt: mit dem Wert, oder eben seinem Ersatz. Schön ist das aber nicht.

Was leere Suchbegriff-Textfelder angeht:

Der Ansatz mit dem "OR Feld Is Null" wirkt umständlich, erfordert aber (wie alle Datenbankentwicklung) nur eine gewisse Akribie. Grenzen hat er nur durch die maximale Länge einer SQL, die man aber bei Einsatz von Aliasen oder ggf. Vor-Abfragen verschieben kann. Es gibt keine Zahl X, die aussagt: "eine weitere Bedingung, und Access steigt aus".
Den Ansatz mit der dynamischen SQL hast du gesehen? Der reagiert überhaupt nur auf die tätsächlich genutzten Kriterien, nicht auf die denkbaren Kombinationen.

Lanz Rudolf
11.06.2012, 14:10
Hallo
Lies einmal hier :
https://dl.dropbox.com/u/46590638/ACC/ACCESS%202000BU%20%20Begleitunterlagen.zip
ab Seite 226 Umgang mit NULL
spetziel Seite 235 "NULL im Formular mit Filter" oder und
"Abfrage mit Filter für Alle, mit NULL, Genau die oder die nach Platzhalter"

Anne Berg
11.06.2012, 14:19
Hallo,

zeige bitte den SQL-Code deiner Abfrage.

Kalinke
11.06.2012, 14:42
Hallo,

es handelt sich um eine ganz normale Abfrage.
ich habe sie als Anlage beigefügt(teilweise)

Gruß Jens

Atrus2711
11.06.2012, 14:43
Hi,

das Bild ist kaum zu erkennen. Bitte zeig mal die SQL der Abfrage: Im Entwurf auf das Ansicht-Wechsel-Symbol oben links, dort auf den Pfeil, dort "SQL". Du erhältst einen längeren Text, der uns sehr interessiert.

Lanz Rudolf
11.06.2012, 14:48
Hallo
evtl. würde man mehr aus dem SQL Code Sehen !.
bei access 2003 konnte man das so machen
ob und wie es bei 2010 geht ?:

Den SQL-Code aus einer Abfrage holen (Entwurfsansicht / VBA Direktfenster)
• 1. Möglichkeit
man geht in eine Abfrage Entwurfsansicht und wählt da oben Links unter
Ansicht die SQL-Ansicht jetzt kann man den SQL-Befehl mit Copy&Paste
(Stgr+C/Ctrl+C) oder (Stgr+Ins/Ctrl+Ins) zum Raus-Kopieren
• 2. Möglichkeit
man Öffnen Direktfenster (Stgr+G / Ctrl+G) und gibt im Direktfenster folgenden Befehl ein
?CurrentDB.QueryDefs("AbfGlossar100").SQL /AbfGlossar100 ersetzen mit deiner Abfrage
dann bekommt man auch den SQL-Befehl dieser Abfrage,
jetzt geht es mit Copy&Paste etc.

Kalinke
11.06.2012, 15:29
Hallo,

hier ist der SQL String:

er ist ziemlich lang, liegt aber an der Syntax für das Formular.



SELECT Spezifikation.FormatProd_Breite, Spezifikation.FormatProd_Höhe, Spezifikation.USEPKM, Spezifikation.USESTM, Spezifikation.USEAUSB, Spezifikation.USEBNDS, Spezifikation.KugelbahnenAnzahl, Spezifikation.ZwischenbahnenAnzahl, Spezifikation.WerkzeugNr, Spezifikation.DruckWalzenNr, Spezifikation.DruckwalzenFarbe, Spezifikation.PapierOBTyp, Spezifikation.PapierKBTyp, Spezifikation.PapierZBTyp, Spezifikation.PapierUBTyp, Spezifikation.Druckausführung1, Spezifikation.Druckausführung2, Spezifikation.Druckausführung3, Spezifikation.Druckausführung4, Spezifikation.Farben, Spezifikation.PapierOBDeckung, Spezifikation.OBGrammEinzeln, Spezifikation.KBGrammEinzeln, Spezifikation.ZBGrammEinzeln, Spezifikation.UBGrammEinzeln, Spezifikation.mengentoleranz1, Spezifikation.mengentoleranz2, Spezifikation.Masstoleranz, Spezifikation.Masstoleranz2, Spezifikation.rückstellmuster
FROM Spezifikation
WHERE (((Spezifikation.FormatProd_Breite)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![FormatProd_Breite]) AND ((Spezifikation.FormatProd_Höhe)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![FormatProd_Höhe]) AND ((Spezifikation.USEPKM)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![USEPKM]) AND ((Spezifikation.USESTM)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![USESTM]) AND ((Spezifikation.USEAUSB)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![USEAUSB]) AND ((Spezifikation.USEBNDS)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![USEBNDS]) AND ((Spezifikation.KugelbahnenAnzahl)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![KugelbahnenAnzahl]) AND ((Spezifikation.ZwischenbahnenAnzahl)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![ZwischenbahnenAnzahl]) AND ((Spezifikation.WerkzeugNr)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![WerkzeugNr]) AND ((Spezifikation.DruckWalzenNr)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![DruckWalzenNr]) AND ((Spezifikation.DruckwalzenFarbe)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![DruckwalzenFarbe]) AND ((Spezifikation.PapierOBTyp)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![PapierOBTyp]) AND ((Spezifikation.PapierKBTyp)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![PapierKBTyp]) AND ((Spezifikation.PapierZBTyp)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![PapierZBTyp]) AND ((Spezifikation.PapierUBTyp)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![PapierUBTyp]) AND ((Spezifikation.Druckausführung1)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Druckausführung1]) AND ((Spezifikation.Druckausführung2)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Druckausführung2]) AND ((Spezifikation.Druckausführung3)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Druckausführung3]) AND ((Spezifikation.Druckausführung4)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Druckausführung4]) AND ((Spezifikation.Farben)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Farben]) AND ((Spezifikation.PapierOBDeckung)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![PapierOBDeckung]) AND ((Spezifikation.OBGrammEinzeln)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![OBGrammEinzeln]) AND ((Spezifikation.KBGrammEinzeln)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![KBGrammEinzeln]) AND ((Spezifikation.ZBGrammEinzeln)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![ZBGrammEinzeln]) AND ((Spezifikation.UBGrammEinzeln)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![UBGrammEinzeln]) AND ((Spezifikation.mengentoleranz1)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![mengentoleranz1]) AND ((Spezifikation.mengentoleranz2)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![mengentoleranz2]) AND ((Spezifikation.Masstoleranz)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Masstoleranz]) AND ((Spezifikation.Masstoleranz2)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![Masstoleranz2]) AND ((Spezifikation.rückstellmuster)=[Formulare]![HauptFormular]![FormEingebettet].[Formular]![rückstellmuster]));

Atrus2711
11.06.2012, 15:35
Hi,

um gefunden zu werden, muss ein Datensatz in allen 30 Feldern gleichzeitig zur jeweiligen Formular-Suchvorgabe passen.

Klar, dass da ein Satz, der auch nur in einem Feld keinen Wert hat, da sofort rausfällt.

Du hast Alternativen genannt bekommen.

Anne Berg
11.06.2012, 15:37
Hallo,
und wie sieht's hiermit aus?
ich habe das probiert, es funktioniert leider nicht.Wie hast du es denn umgesetzt?

Mache diese Änderungen unbedingt im SQL-Modus und wechsle nicht wieder zurück zum Entwurf, sonst ist der Code am Ende gar nicht mehr "lesbar". ;)

Kalinke
11.06.2012, 17:04
Hallo Leute,

Vielen Dank für Eure Hilfe!!!

Aber das hat alles nicht so recht funktioniert!

Ich habe das Problen jetzt anders gelöst.
Mag Zwar nicht professionell sein, aber es geht:

Ich schreibe in die Formularfelder die Null enthalten einfach "0" rein.
schon kann ich die Abfrage nutzen.

Vielen Dank nochmanl !!!

Lanz Rudolf
11.06.2012, 17:49
Hallo
das:
Ich schreibe in die Formularfelder die Null enthalten einfach "0" rein
sollte man NIE machen
wenn Du das Richig machst
mit is Null oder mit NZ dann geht es fast sicher !

Lade eine Kleine Muster MDB mit Tabelle (einige DS(Datensätze)) / Formular Etc. Hoch
dann kann man das sicher Lösen

Atrus2711
11.06.2012, 18:03
Das Reinschreiben von 0 ändert nichts an dieser Aussage:
um gefunden zu werden, muss ein Datensatz in allen 30 Feldern gleichzeitig zur jeweiligen Formular-Suchvorgabe passen.

Beispiel: Wenn du nur ein Feld wirklich als Suche nutzt, dann müssten die anderen 29 im Formular und auch in der Tabelle auf 0 stehen.

Maxel
11.06.2012, 19:44
Hm, Martin,

ich tue mich gerade schwer mit folgender Konfrontation:
Ich habe das Problen jetzt anders gelöst. Mag Zwar nicht professionell sein, aber es geht: Ich schreibe in die Formularfelder die Null enthalten einfach "0" rein. schon kann ich die Abfrage nutzen.
Das Reinschreiben von 0 ändert nichts an dieser Aussage: Um gefunden zu werden, muss ein Datensatz in allen 30 Feldern gleichzeitig zur jeweiligen Formular-Suchvorgabe passen. Beispiel: Wenn du nur ein Feld wirklich als Suche nutzt, dann müssten die anderen 29 im Formular und auch in der Tabelle auf 0 stehen.
Warum sollte
Ich schreibe in die Formularfelder die Null enthalten einfach "0" rein
das "Reinschreiben von 0" nicht per NZ(..., 0) lösbar sein, wenn alle Felder numerisch sind? Habe ich da einen Denkfehler?

Anne Berg
11.06.2012, 20:16
@maxel,

dann muss NZ aber auch auf beide Seiten angewandt werden, alsoWhere NZ(datenfeld, 0) = NZ(formularfeld, 0)aber auch das hilft nicht, wenn leere Parameter bewirken sollen, dass sie nicht beachtet werden.
So gesehen hilft das Ersetzen von Null durch 0 überhaupt nichts.