collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 73
  • Punkt Versteckte: 1
  • Punkt Mitglieder: 1

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 14032
  • stats Beiträge insgesamt: 67182
  • stats Themen insgesamt: 9062
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 17
  • stats Am meisten online: 415

Autor Thema: "Bereichs-Parameterabfrage" im Formular  (Gelesen 10204 mal)

Offline Stefilius

  • Newbie
  • Beiträge: 13
"Bereichs-Parameterabfrage" im Formular
« am: April 24, 2012, 11:41:30 »
Hallo zusammen,

ich hab ein Formular basierend auf einer Abfrage. In dem über 4 Parameter gefiltert bzw. gesucht werden soll.

4 Parameter:
- Abgangsort
- Länderkürzel des Bestimmungsort
- PLZ von/bis des Bestimmungsort
- KG von/bis (die transportiert werden sollen)

Bei den ersten beiden Parametern auch kein Problem. Ich hab die Abfrage über ungebundene Textfelder verknüpft und lass mir das ganze über ein Listenfeld anzeigen:

Me.Listenfeld.Requery

Bei PLZ ist die Tabelle in die Attribute PLZvon und PLZbis aufgeteilt z. B. 2000 bis 2999. Nun will ich irgendeine PLZ dazwischen in mein Formular eingeben und es soll dann diesen Bereich ziehen. In der Abfrage hab ich das über eine extra Spalte geregelt wo ich die Bedingung bei Kriterien eintrage!

Die Frage ist, wie ich das in die Kriterien Zeile vernünftig einbaue bzw. die Bereichsabfrage (welche in der Abfrage funktioniert) mit dem Verweis auf das Formular verbinde oder kombiniere??? Mit "oder" funktioniert das ja nicht...

Hat von euch jemand eine Idee?


Würde mir sehr weiterhelfen!

Gruss Stefilius
 

Offline database

  • Moderator
  • Access Guru
  • *****
  • Beiträge: 4178
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #1 am: April 24, 2012, 13:16:54 »
Hallo,

"Nun will ich irgendeine PLZ dazwischen in mein Formular eingeben und es soll dann diesen Bereich ziehen"

Mit nur einem Parameter kannst du m.E. keinen Bereich auswählen da hierbei keine Ober- und Untergrenze bekanntgegeben wird.
Irgendwie vestehe ich dein Ansinnen nicht ganz.

"Bei PLZ ist die Tabelle in die Attribute PLZvon und PLZbis aufgeteilt z. B. 2000 bis 2999."
Also gehe ich davon aus, dass die Tabelle 2 Spalten besitzt - welche Werte stehen in von und welche in bis?

Kann man sich das in Etwa so vorstellen?

von        bis
1000    1999
2000    2999
3000    3999


Viele Grüße
Peter

Tipps und Links:
---------------------------------------------------------
1. http://www.donkarl.com
2. http://www.access-entwicklerbuch.de/2007/index.php?page=buch
3. http://www.xlam.ch/pos/rules.htm
3.a Reservierte Worte
4. http://www.functionx.com/vbaccess/index.htm
5. http://www.dbwiki.net

Nicht vergessen: Jede(r) hat mal klein angefangen!
Bitte keine Fragen per PN senden - Fragen gehören ins Forum!
 

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #2 am: April 24, 2012, 13:28:53 »
Hallo,

dein Tabellen-Beispiel ist korrekt. Genau so sieht das bei mir aus!

Ich möchte nun als Beispiel die PLZ 1589 eingeben und dann soll über die Abfrage dieser Bereich gewählt werden.

Warum ich das so möchte:
Für jedes PLZ-Gebiet ist ein anderer Preis festgelegt, denn ich dadurch angezeigt bekommen möchte.

In Kombination mit den anderen Parametern soll mir im Endeffekt ein Preis für eine Route vom Abgangsort, Länderkürzel des Bestimmungsorts, PLZ des Bestimmungsorts und KG angezeigt werden.

In meiner Parameterabfrage funktioniert das Ganze ja, nur wie bekomm ich das ins Formular??

Danke schon mal für deine Antwort!
 

Offline database

  • Moderator
  • Access Guru
  • *****
  • Beiträge: 4178
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #3 am: April 24, 2012, 13:44:43 »
Nun denn,

Zitat
Ich möchte nun als Beispiel die PLZ 1589 eingeben und dann soll über die Abfrage dieser Bereich gewählt werden.

Also der Bereich 1000 - 1999 ...

dann schreibe ins Kriterienfeld unter PLZvon deiner Abfrage:

in der Annahme dass das Eingabefeld für die PLZ 'txtPLZ' benamst ist

Left(Forms!DeinFormular!txtPLZ;1) & "000"

Bedingung, die PLZ-Spalten der Tabelle sind als Text deklariert

HTH
Viele Grüße
Peter

Tipps und Links:
---------------------------------------------------------
1. http://www.donkarl.com
2. http://www.access-entwicklerbuch.de/2007/index.php?page=buch
3. http://www.xlam.ch/pos/rules.htm
3.a Reservierte Worte
4. http://www.functionx.com/vbaccess/index.htm
5. http://www.dbwiki.net

Nicht vergessen: Jede(r) hat mal klein angefangen!
Bitte keine Fragen per PN senden - Fragen gehören ins Forum!
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 237
    • Code-Bibliothek für Access-Entwickler
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #4 am: April 24, 2012, 14:21:57 »
Hallo!

Im Prinzip kannst du das auch so ähnlich wie mit den anderen Parametern gestalten.

Aus der einen Bedingung werden dann einfach 2 Bedingungen:
Code: (vb) [Auswählen]
where ... PLZvon <= Nz([PLZ], 9999) AND PLZbis >= Nz([PLZ], 0)
[PLZ] kann als Abfrageparamter gestaltet werden oder bei Bedarf auch durch einen Bezug auf ein Textfeld ersetzt werden.

mfg
Josef

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #5 am: April 24, 2012, 14:37:45 »
Danke erst mal für die Antwort, das funktioniert ja wunderbar!

Das Problem ist, dass mit der Erweiterung meiner DB 4-stellige, 5-stellige und auch 6-stellige PLZ gefunden werden sollen. Das ist natürlich abhängig vom jeweiligen Land.

Des Weiteren sind die PLZ-Gebiete nicht immer so schöne gegliedert wie im obigen Beispiel.
Zum Beispiel in Deutschland:

10000 - 15999
16000 - 17999
20000 - 22999
. . . . .

Im Moment läuft das in meinem Abfragekriterium so:  >=[PLZvon] Und <=[PLZbis] Dieses wird allerdings nicht in PLZvon oder PLZbis als Kriterium geführt sondern in einer extra Spalte... Ist das überhaupt notwendig?

Das kann ganz beliebig sein. Ist es möglich jenes Problem mit Variablen bzw. Wildcards zu lösen?
Oder wie soll ich das am Besten machen bzw. ist es überhaupt möglich?

Sorry stehe da gerade ein bisschen auf dem SChlauch!
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 237
    • Code-Bibliothek für Access-Entwickler
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #6 am: April 24, 2012, 14:58:07 »
Hallo!

Ein Beispiel:
Tabelle
PlzVonPlzBisWert
100013671
146859992
.........
1000012345815

SQL-Anweisung:
Code: (vb) [Auswählen]
Select
   Wert
from
   Tabelle
where
   PlzVon <= Nz([PlzEingeben], 999999)
   AND
   PlzBis >= Nz([PlzEingeben], 0)
Anm.: das Nz für den Ersatz eines NULL-Wertes dient dazu, dass man bei keiner Filtereingabe alle Datensätze erhält.
Falls die PLZ als Text und nicht als Zahl gespeichert wird, ist diese Filterung allerdings nicht 1:1 anwendbar .. zumindest nicht, für unterschiedlich lange PLZ-Werte.

mfg
Josef
« Letzte Änderung: April 24, 2012, 15:07:23 von Josef P. »
 

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #7 am: April 24, 2012, 15:30:55 »
Hallo Josef P.

super das funktioniert so weit wirklich gut! Danke dir!!!

Wie binde ich diese Kriterien jetzt noch in mein Formular ein? Das ist eigentlich der Hauptknackpunkt für mich, da ich mit Formularen noch nicht viel gearbeitet habe.
Speziell bei diesem Parameter weiss ich nicht wie das funktioniert. Die vorherigen Parameter hab ich mit Erfolg in mein Formular integriert.

Noch eine allerletzte Frage. Wenn ich die PLZ-Spalten als Text gespeichert habe (z.B. England), ist es dann theoretisch anders möglich ne Lösung zu finden? Wenn nicht würde ich mir da was einfallen lassen um das speziell für England zu umgehen und die Spalte PLZvon und PLZbis als Zahl speichern zu können.

Gruss
Stefilius
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 237
    • Code-Bibliothek für Access-Entwickler
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #8 am: April 24, 2012, 15:42:38 »
Hallo!

Wenn du den vorherigen Parameter (welcher auch immer das ist) erfolgreich eingebaut hast, sollte es mit dem PLZ-Parameter nicht anders sein.
Da ich allerdings nicht weiß, was du bisher gemacht hast bzw. wie die Abfrage aussieht, kann ich dir auch nicht bei den nächsten Schritten helfen.

Wenn du deine aktuelle Abfrage in der SQL-Ansicht öffnest und den Text hier zeigst, wird sich sicher jemand finden, der dir einen Tipp geben kann, wie du in diese SQL-Anweisung die PLZ-Prüfung einbauen kannst.

Bezüglich PLZ als Text:
Ein Text-Vergleich hat den Nachteil, dass "2" größer als "1000" ist. Damit wird das Filtern bei Bereichen etwas aufwendiger.
Zumindest wird noch die Prüfung der Textlänge notwendig.

Als Beispiel (unter der Voraussetzung, dass unterschiedliche PLZ-Längen nicht kombiniert werden):
Code: (vb) [Auswählen]
Select
   Wert
from
   Tabelle
where
   PlzVon <= Nz([PlzEingeben], "ZZZZZZZZZ")
   AND
   PlzBis >= Nz([PlzEingeben], "")
   AND
   (Len(PLzVon) = Len([PlzEingeben]) OR [PlzEingeben] IS NULL)

Ein ganz anderer Ansatz könnte das Zuordnen jeder einzelnen vorhandenen PLZ zum jeweiligen Bereichs-Datensatz sein in einer weiteren 1:n-Tabelle sein.
Die Tabelle für die einzelnen PLZ-Werte könnte man per VBA einmalig befüllen. Dann müsste man nur noch in dieser TAbelle die passene PLZ-Wert suchen und könnte über den Fremdschlüssel die Daten aus der übergeordneten Tabelle mit den Preisen usw. auslesen.

mfg
Josef
« Letzte Änderung: April 24, 2012, 15:47:20 von Josef P. »
 

Offline database

  • Moderator
  • Access Guru
  • *****
  • Beiträge: 4178
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #9 am: April 24, 2012, 15:50:45 »
Hallo,

hmmm... welche Überraschungen hast du sonst noch auf Lager ?  ;D

"Des Weiteren sind die PLZ-Gebiete nicht immer so schöne gegliedert wie im obigen Beispiel"

Es würde theoretisch genügen wenn du den Startwert deiner PLZ kennst - z.B. 16000
Hierbei soll dan der Bereich 16000 bis 17999 gefunden werden.

Gut, dann schreibst du ins Kriterienfeld unter PLZvon:

 =[PLZ eingeben]

In der Abfrage steht dann kein Formularverweis sondern nur obige Parameterabfrage.
Wird die Ausführung der Abfrage angestoßen erscheint das Eingabefeld in das du dann die StartPLZ einträgst.
Somit bist du flexibel was den Aufbau und die Länge der PLZ betrifft.
Eine weiter Einschränkung auf PLZbis benötigst du eigentlich nicht, da ja zu einem PLZvon Eintrag nur ein einziger PLZbis Eintrag besteht.

HTH
Viele Grüße
Peter

Tipps und Links:
---------------------------------------------------------
1. http://www.donkarl.com
2. http://www.access-entwicklerbuch.de/2007/index.php?page=buch
3. http://www.xlam.ch/pos/rules.htm
3.a Reservierte Worte
4. http://www.functionx.com/vbaccess/index.htm
5. http://www.dbwiki.net

Nicht vergessen: Jede(r) hat mal klein angefangen!
Bitte keine Fragen per PN senden - Fragen gehören ins Forum!
 

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #10 am: April 25, 2012, 08:59:09 »
Hallo zusammen,

erst mal danke für eure Antworten und Hilfen. Leider ist das nicht exakt das was ich gerne hätte. Ich würde eben gerne eine x-beliebige PLZ-Zahl eingeben und Access soll mir den dazugehörigen Bereich suchen, der die eingegebene PLZ umfasst. Das in Verbindung mit dem Abgangsort, dem Länderkürzel und der zu transportierenden KG-Zahl soll mir einen Preis ergeben. Was in der Abfrage auch tadellos klappt!

Ich kopiere euch mal den sql-code der Abfrage des WHERE-Teils rein. Ich hoffe das reicht!

WHERE ((([PLZeingeben])>=[PLZvon] And ([PLZeingeben])<=[PLZbis]) AND (([KGeingeben])>=[KGvon] And ([KGeingeben])<=[KGbis]) AND (([Absenderort])=[Aort]) AND (([BLänderkürzel])=[Länderkürzel]));

Integriert ins Formular mit:
Wie [Formulare]![Test]![Aort] & "*"

Es geht ja um den WHERE-Teil:
Den Abgangsort (Aort) und das Länderkürzel habe ich über den obigen Weg in mein Formular eingebaut. Wie kann ich jetzt den Code von Josef P. integrieren? Bzw. wie würdet ihr den oberen WHERE-Teil in ein Formular mit ungebundenen Texfeldern integrieren??

Hier der Code von Josef P.:
WHERE    PlzVon <= Nz([PlzEingeben], "ZZZZZZZZZ")    AND   PlzBis >= Nz([PlzEingeben], "")    AND   (Len(PLzVon) = Len([PlzEingeben]) OR [PlzEingeben] IS NULL)

Kann mir jemand von euch da helfen?
Als Anfänger tut man sich bei so etwas eben schwer...

Danke für eure Hilfe und Geduld

Gruss Stefilius
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 237
    • Code-Bibliothek für Access-Entwickler
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #11 am: April 25, 2012, 09:26:07 »
Hallo!

Zitat
Integriert ins Formular mit:
Wie [Formulare]![Test]![Aort] & "*"

Integriert ins Formular bedeutet aber schon, dass du eine SQL-Anweisung (Abfrage) verwendest, oder?
=>
Code: (vb) [Auswählen]
Where [Absenderort] like [Forms]![Test]![Aort] & "*"Anm.: Falls die SQL-Anweisung direkt im Formular und nicht in einer extra Abfrage gespeichert ist, würde ich "[Forms]![Test]!" weglassen, damit der SQL-Code unabhängig vom Formularnamen wird.

aus
Code: (vb) [Auswählen]
WHERE    PlzVon <= Nz([PlzEingeben], "ZZZZZZZZZ")    AND   PlzBis >= Nz([PlzEingeben], "")    AND   (Len(PLzVon) = Len([PlzEingeben]) OR [PlzEingeben] IS NULL)wird mit Formularbezug:
Code: (vb) [Auswählen]
WHERE    PlzVon <= Nz([Forms]![Test]![txtPLZ], "ZZZZZZZZZ")    AND   PlzBis >= Nz([Forms]![Test]![txtPLZ], "")    AND   (Len(PLzVon) = Len([Forms]![Test]![txtPLZ]) OR [Forms]![Test]![txtPLZ] IS NULL)In diesem Code werden übrigens nur dann alle PLZ-Bereiche angezeigt, wenn kein Wert in das Textfeld eingeben wurde.


Ansonsten:
Hast du schon einmal darüber nachgedacht, den Filterausdruck dynamisch im VBA-Code zu erzeugen? .. Also nur jene Filter-Ausdrücke erzeugen, die zur Datenfilterung benötigt werden. Leere Textfelder (die keine filterung auslösen sollen) würden dann in der SQL-Anweisung gar nicht vorkommen.
Dafür gibt es bestimmt einige Beispiele in diesem Forum oder per Google & Co. zu finden.

mfg
Josef
« Letzte Änderung: April 25, 2012, 09:51:39 von Josef P. »
 

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #12 am: April 25, 2012, 10:34:26 »
Hallo!

Nochmals vielen Dank für deinen Code. Das funktioniert jetzt perfekt, genauso wie ich es wollte!!!

Zitat
Integriert ins Formular bedeutet aber schon, dass du eine SQL-Anweisung (Abfrage) verwendest, oder?

Ja, ich verwende eine SQL-Anweisung!

Wenn ich versuche deinen Code auf KGvon/KGbis zu duplizieren (natürlich mit geänderten Txt-Feldern) und ihn in  SQL dafür einzufügen versuche kommt die Fehlermeldung:

"Der Ausdruck wurde falsch eingegeben oder er ist zu komplex, um ausgewertet zu werden. Beispielsweise kann ein numerischer Ausdruck zu viele komplizierte Elemente enthalten. Vereinfachen Sie den Ausdruck, in dem sie Teile des Ausdrucks Variable zuweisen"

Was kann man dagegen machen?

Zitat
Ansonsten:
Hast du schon einmal darüber nachgedacht, den Filterausdruck dynamisch im VBA-Code zu erzeugen? .. Also nur jene Filter-Ausdrücke erzeugen, die zur Datenfilterung benötigt werden. Leere Textfelder (die keine filterung auslösen sollen) würden dann in der SQL-Anweisung gar nicht vorkommen.
Dafür gibt es bestimmt einige Beispiele in diesem Forum oder per Google & Co. zu finden.


Darüber hab ich mir noch keine Gedanken gemacht und zwar aus dem Grund, dass ich mit VBA nicht vertraut bin und mich in diesem Bereich der Programmierung wirklich überhaupt nicht auskenne...

Freundliche Grüsse
Stefilius
 

Offline Josef P.

  • Access-Profi
  • **
  • Beiträge: 237
    • Code-Bibliothek für Access-Entwickler
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #13 am: April 25, 2012, 10:46:11 »
Hallo!

Wie sieht der nicht funktionierende Ausdruck nun aus?

Noch etwas: schreib bitte einmal die Datentypen der zu filternden Felder von der Tabelle auf. Davon hängt nämlich ab, wie man den NZ-Ausdruck formulieren muss (wegen Zahl vs. Text).

Wenn du die SQL-Anweisung direkt im Formular in der Eigenschaft "RecordSource" abspeicherst, kannst du den Formular-Bezug weglassen, solange die Steuerelementnamen nicht mit Feldnamen aus der Tabelle identisch sind.

Meine Annahme der Datentypen in der Tabelle für den nachfolgenden SQL-Ausdruck:
Absenderort: Text
PlzVon + PlzBis: Text
KGvon: Zahl
Länderkürzel: Text

=>
Code: (vb) [Auswählen]
WHERE  
   Absenderort like [Aort] & "*"
   AND
   (PlzVon <= Nz([txtPLZ], "ZZZZZZZZZ")  AND PlzBis >= Nz([txtPLZ], "") AND (Len(PLzVon) = Len([txtPLZ]) OR [txtPLZ] IS NULL))
   AND
   (KGvon <= Nz([txtKG], 999999)  AND KGbis >= Nz([txtKG], -999999))
   AND
   BLänderkürzel like [txtLänderkürzel] & "*"

mfg
Josef

Offline Stefilius

  • Newbie
  • Beiträge: 13
Re: "Bereichs-Parameterabfrage" im Formular
« Antwort #14 am: April 25, 2012, 13:14:03 »
Hallo!

Die Fehlermeldung kommt auch weiterhin mit dem von dir vorgeschlagenen Code. Des Weiteren erscheint die Fehlermeldung nur beim Öffnen des Formulares. Allerdings lässt sich das Formular öffnen und liefert dann auch die richtigen Ergebnisse.

Hier mal der Code der WHERE-Bedingung in meiner Abfrage:

WHERE (((Routen_tbl.Aort) Like Formulare!Test!Aort & "*") And ((Routen_tbl.Länderkürzel) Like Formulare!Test!Länderkürzel & "*")) And PlzVon<=Nz(Forms!Test!txtPLZ,"ZZZZZZZZZ") And PlzBis>=Nz(Forms!Test!txtPLZ,"") And (Len(PLzVon)=Len(Forms!Test!txtPLZ) Or Forms!Test!txtPLZ Is Null) And (KGvon<=Nz(Forms!Test!txtKG,999999) And KGbis>=Nz(Forms!Test!txtKG,-999999));
Die Datentypen sind wie von dir beschrieben:

Aort: Text
PLZvon  +PLZbis: Text
KGvon + KGbis: Zahl
Länderkürzel: Text

Freundliche Grüsse

Stefilius