online 1
gast (50)

/ Forum / Datenbanken

DatenbankenDatenbanken

Fragevon Axel18 vom 23.10.2019, 11:12 Options

Kniffelige Abfrage

Hallo Zusammen,

ich habe eine etwas komplizierte Frage, an der ich mir langsam die Zähne ausbeiße. Ich habe eine Datenbank übernommen (was immer schlecht ist), kann einiges in Access XP, aber mir fehlt es noch an Vielem. Mein aktuelles Problem ist folgendes:

1. ich habe eine Datenbank mit 3 Tabellen (eigentlich sind es viel
mehr, aber es geht hier um die 3 Tabellen) mit folgenden
(wichtigen) Feldern:
- Kunden
- Kundennummer (indiziert, kommt nur einmal vor)

- Kundendaten
- Kundennummer (kann mehrfach vorkommen)
- Produktnummer (kann pro Kunde nur einmal vorkommen, aber insgesamt als
Produktnummer in dieser Tabelle mehrfach)

- Aufträge
- Kundennummer (logischerweise mehrfach, da für jede
Auftragsposition ein Datensatz erstellt wird)
- Produktnummer (ebenfalls mehrfach)

Ich habe nun ein Formular (Auftragseingabe), in welchem die Auftragsdetails eingegeben werden. Da sind dann u.a. auch wieder die bereits genannten Felder

- Kundennummer
- Produktnummer

enthalten. Die Eingabe soll in der Tabelle „Aufträge“ gespeichert werden. Wird in dem Formular ein Kunde eingegeben, der in der Tabelle „Kunden“ nicht existiert, dann kommt eine Fehlermeldung. Das ist eigentlich auch alles ok, bis auf die Tatsache, dass bei Eingabe einer Produktnummer, die nicht in der Tabelle „Kundendaten“ als „Kundennummer+Produktnummer“ vorhanden ist KEINE Fehlermeldung erscheint.

Es kann also durchaus sein, dass ich für den Kunden Müller in „Kundendaten“ drei Produktnummern habe (1000, 2000, 5000), und bei einer weiteren Eingabe mit der Produktnummer 7000 diese angenommen wird.

Ich muss also herausfinden, was ich wo schreiben muss – bzw., welche Verweise oder Abfragen nötig sind – damit mir das System meldet: „Müller und 7000“ existieren nicht.

Wer kann mir da helfen?

Beste Grüße
Axel


Antwort schreiben

Antwort 1 von lleopard vom 23.10.2019, 19:19 Options

Moin Axel,

geh doch schrittweise vor.

Bevor du einen Datensatz erzeugst, schaust du halt nach:

gibt es den kunden Müller

dim Kunde as string

Kunde = DLookUp("Kunde","Kundendaten","Kunde='" & Eingabe.Value & "'")

Das Gleiche für die Produktnummer

Das Ergebnis kannst du dann einfach analysieren..

Gruß leo

Antwort 2 von Axel18 vom 24.10.2019, 14:09 Options

Hallo Leo,

danke für Deine Bemühungen.
Dein Tipp hilft mir derzeit nur teilweise weiter. Grund: ich bin in VBA nicht firm, verstehe aber ein ganz klein wenig.

In meinem Fall ist es so,, dass die Kundennummer(Ksort) bereits abgefragt und quasi gegen gecheckt ist.

Mein Problem liegt in der „Produktnummer(PRNUM)“ die passend zu der Kundennummer (Ksort) sein muss.

Kundendaten
KSort PRNUM
glöckler 131
glöckler 161
glöckler 164
glöckler 168
glöckler 170
glöckler 173
glöckler 176
glöckler 178
glöckler 181
glöckler 242

Du siehst in dem o.g. Auszug aus der Tabelle Kundendaten, dass für den Kunden Glöckler mehrere PRNUM angegeben sind.

Nun kann es ja im Eifer des Gefechts vorkommen, dass bei Eingabe eines Auftrages für Glöckler die PRNUM 342 eingegeben wird. Und jetzt soll quasi alarmartig eine Meldung kommen, dass es Glöckler+342 nicht gibt.

Könntest Du mir liebenswürdigerweise schreiben, wie die gesamte VBA für das Feld Produktnummer im Formular Auftragseingabe lauten muss?

Vielleicht komme ich mit solchen Beispielen ja auch dazu, andere Abfragefelder analog zu gestalten und lerne dadurch mehr von VBA.

Danke und Beste Grüße
Axel

Antwort 3 von Teddy7 vom 25.10.2019, 09:44 Options

Hallo Axel !
Leo schein noch zu schlafen. Vielleicht kann ich Dir zwischenzeitlich weiterhelfen. Es gibt meistens mehrere Ansätze für eine Lösung - so auch hier.
Du kannst die Eingaben in normalen, gebundenen Felern machen und im Feld PRNUM im Ereignis "nach Aktualisierung" einen Code hinterlegen, der die Prüfung durchführt. Der kann so aussehen:
dim xkunde as string
dim suche as string
' zunächst prüfen, ob ein Kunde eingegeben wurde
if nz(ksort,"") = "" then
msgbox "Bitte Kunde eingben"
exit sub
end if
' dann prüfen, ob eine prnum eingegeben wurde
if nz(prnum, 0) = 0 then
msgbox "Bitte PrNum eingben"
exit sub
end if
' jetzt prüfen, ob die Kombination da ist
suche = "KSort = '" & ksort & "' and prnum = " & prnum
xkunde = ""
on error resume next
xkunde = DLookUp("KSort","Kundendaten",suche)
on error goto 0
if xkunde = "" then
msgbox "Kunde/PrNum gibt es nicht"
end if
///////////////////////////////
dabei sein Kundendaten die Tebelle, in der die Kombination zu finden ist. Im Feld suche wird quasi eine where-Klausel zusammengestellt, mit der dann gelesen wird. Findet der dlookup die Kombination nicht, dann gibt es einen Fehler.
Eine Möglichkeit, das abzufangen ist, das Ergebnisfeld(Xkunde) vorher auf leer zu setzen und mit on error resume next festzulegen, dass das Programm bei Fehler mit dem nächsten Befehl weiter macht. Das muß natürlich danach wieder aufgehoben werden (on error goto 0)
/////////////////////////////////////
Besser ist m.E. die Lösung, nur existierende prnum zuzulassen. Dazu arbeitet man mit einem Kombifeld, das auf einer Abfrage beruht, die man mit der Eingabe im Feld KSort bereits auf den Kunden reduziert hat. Das erreicht man, indem man eine Abfrage über KSort und prnum macht, diese gruppiert(um jede Ausprägung nur einmal zu bekommen) und im Kriterium der Spalte KSort auf das Feld im Erfassungsformular verweist:
= [Formulare]![DeinErfassungsformular]![KSort]
So stehen im Kombifeld nur zulässige prnum zur Auswahl.
Wenn Du im Kombifeld einstellst "nur Einträge aus Liste", dann kann da nix falsches eingegeben werden.
//////////
So - mir qualmen die Finger. Erst mal noch Viel Spaß beim basteln.
Gruß
Teddy

Antwort 4 von Teerbaby vom 25.10.2019, 10:09 Options

Zitat:
on error resume next
xkunde = DLookUp("KSort","Kundendaten",suche)
on error goto 0
if xkunde = "" then
msgbox "Kunde/PrNum gibt es nicht"
end if


Mit "on error resume next" zu arbeiten, finde ich sehr hässlich.
So müsste das auch gehen:

if isNull(DLookUp("KSort","Kundendaten",suche)) then
msgbox "Kunde/PrNum gibt es nicht"
end if

Antwort 5 von Axel18 vom 26.10.2019, 15:54 Options

Hallo Teddy und Teerbaby,

danke für Eure Bemühungen, aber beide Lösungen haben nicht zu dem erhofften Erfolg geführt.

Im Feld PRNUM kann ich bei beiden Vorschlägen von Euch eine PRNUM eingeben, die „irgendwo“ in der Tabelle Kundendaten steht, aber nicht in Verbindung mit dem gewünschten Kunden.

Gebe ich eine Nummer ein, die gar nicht in der Tabelle existiert, ja, dann kommen Eure Meldungen.

Ich habe beide Vorschläge als Ereignis in „Nach Aktualisierung“ geschrieben, somit dürfte da kein Fehler sein. Habt Ihr eine Idee, wo ich noch ansetzen könnte?

Beste Grüße und ein schönes Wochenende
Axel

Antwort 6 von Axel18 vom 27.10.2019, 08:59 Options

Guten Morgen zusammen,

ich habe mir das nochmals in Ruhe angeschaut, und von Teerbaby die Änderung eingebaut.

Dann kommt aber bei Eingabe einer PRNUM (auch einer korrekten) eine Fehlermeldung:

Laufzeitfehler 3464
Datentypen in Kriterienausdruck unverträglich[/b]

Wenn ich debugge ist die Zeile:

If IsNull(DLookup("KSort", "Kundendaten", suche)) Then

gelb unterlegt.

PRNUM ist als Textfeld definiert.
Helfen diese Informationen weiter?

Beste Grüße und und schönes Wochenende
Axel

Antwort 7 von Teddy7 vom 30.10.2019, 21:57 Options

Ist ja logisch, dass eine NUMMER als Text hinterlegt ist *grummel*.
Dann muß natürlich prnum in der Selektionsvariable auch in Hochkommas gesetzt werden:
suche = "KSort = '" & ksort & "' and prnum = '" & prnum & "'"
Gruß
Teddy

Antwort 8 von Axel18 vom 31.10.2019, 21:07 Options

Hi Teddy,

ich bin auf Reisen und komme frühestens am Wochenende dazu, das auszuprobieren. Ich melde mich dann.

Danke und beste Grüße
Axel

Antwort 9 von Axel18 vom 05.11.2019, 17:05 Options

Hallo Teddy,

ich bin sicherlich lästig, aber auch mit der geänderten Version komme ich nicht weiter. Es kommt jetzt, egal welche PRNUM ich eingebe stets die Meldung "Kunde/Prnum gibt es nicht"

Ich verzweifle langsam.

Beste Grüße
Axel

Antwort 10 von Teddy7 vom 06.11.2019, 08:24 Options

Morjen Axel !

Dann debugge doch mal und sieh Dir an, was in suche drin steht (einfach mit dem Cursor drauf fahren.

gruß
Teddy

Antwort 11 von Axel18 vom 06.11.2019, 08:39 Options

Hallo Teddy,

ich weiß nicht, was ich gemacht habe, aber es funktioniert jetzt. Ich habe nur eine Erklärung: der Mensch, der das Programm ursprünglich geschrieben hat, hat auch einen Code eingegeben für "VOR Aktualisierung". Den habe ich jetzt komplett gelöscht und Deinen Vorschlag für "NACH Aktualisierung" eingesetzt. Und jetzt ist es ok.

Herzlichen Dank nochmals für Deine Bemühungen und vor allen Dingen Deine Geduld.

Beste Grüße
Axel

Ähnliche Themen

abfrage
jasper111  19.01.2007 - 153 Hits - 3 Antworten

Abfrage in Access soll auch leere Felder anzeigen
maigansl  09.04.2008 - 115 Hits - 1 Antwort

access abfrage
lbw54  05.05.2008 - 153 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 07:32:25 2026