Neuigkeiten:

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

Mobiles Hauptmenü

Verwendung von InStr innerhalb DLookup

Begonnen von ulli, Oktober 24, 2010, 11:59:47

⏪ vorheriges - nächstes ⏩

ulli

Hallo zusammen,

nachdem ich schon eine Weile ohne Ergebnis im Net gesucht habe, wende ich mich jetzt an euch Experten und Erfahrene. Ich habe mit Access 2003 eine Kassen-Anwendung erstellt. Dabei gibt es ein Hauptformular, in dem der Verkaufsvorgang und die Kundendaten erfasst werden, und ein Unterformular (verknüpft mit einer eigenen Tabelle), in der die einzelnen Artikel des Verkaufs abgespeichert werden.

In diesem Unterformular gibt es ein Feld "ArtNr", in das entweder die Artikelnummer eingegeben wird (derzeit 4stellige Zahl) oder aber über einen Scanner ein EAN13-Code eingelesen wird. Nun soll Access in Abhängigkeit von der Länge des eingegebenen Wertes entweder direkt über die Artikelnummer in der Tabelle "Artikel" den Artikel finden und eintragen oder aber nach der EAN-Nummer suchen und die entsprechende Artikelnummer zurückliefern. Das Feld "EAN" in der Tabelle "Artikel" ist ein größeres Textfeld, dort sind bei manchen Artikeln auch mehrere EAN13-Nummern hinterlegt.

Bislang habe ich die Suche bei EAN13 über ein Makro realisiert, das ein Formular "Artikel" öffnet und darin nach der EAN-Nummer sucht. Das funktioniert auch, nur liefert mir das Makro, wenn die EAN-Nummer nicht existiert, trotzdem eine Artikelnummer zurück. Deswegen wollte ich mit DLookup und InStr die Artikelnummer finden lassen:

Me!ArtNr = DLookup("ArtNr", "Artikel", "Instr([EAN], [Me!ArtNr]) >= 1")


Das funktioniert aber so nicht. Vermutlich liegt es an fehlenden Zeichen? Oder mache ich einen anderen Denkfehler?

DF6GL

Hallo,

mhmm,


1) Du brauchst ein Feld ("ArtNr"), das an die entspr. Tabelle ("eigene Tabelle") gebunden ist. Weiterhin ein ungebundenes Feld ("txtArtNr) , in das die Artikelnr entweder von Hand oder per Scanner eingegeben wird.


2) Mittels Ereignisprozedur "Nach Aktualisierung" von txtArtNr wird per VBA anhand der Länge entschieden, ob der Wert gleich dem gebundenen Feld zugewiesen wird oder erst per Dlookup gesucht wird:



Sub txtArtNr_Afterupdate()
Dim  lngLaenge as Long
lngLaenge len(nz(Me!txtArtNr,"")
If lngLaenge = 0 Then
Exit Sub
Elseif lngLaenge >= 13 Then
Me!ArtNr=DLookup("ArtNr", "Artikel", "[EAN] like '*" &  Me![txtArtNr] & "*'")
Else
Me!ArtNr= Me!txtArtNr
End If




btw:

In Deinem Code sind hier die Eckklammern falsch gesetzt:
Me!ArtNr = DLookup("ArtNr", "Artikel", "Instr([EAN], [Me!ArtNr]) >= 1")


und statt Instr ist auch der Like-Operator zu gebrauchen.


Statt einen ungebunden Textfeld könnte man auch ein Kombifeld mit Datensatzherkunft zur Tabelle "Artikel" benutzen und dessen Ereignis "Bei nicht in Liste" hernehmen.


database

Hallo,

deine DB weist einen groben Fehler auf ...
"Das Feld "EAN" in der Tabelle "Artikel" ist ein größeres Textfeld, dort sind bei manchen Artikeln auch mehrere EAN13-Nummern hinterlegt"  :o

Das ist ein Verstoß gegen die Normalisierungsregeln in der Tabelle Artikel!
Wenn für ein und den selben Artikel verschieden EAN-Codes zu speichern sind, so solltest du das über eine 'Zwischentabelle' erledigen, in der die ID des Artikels und der EAN-Code einzutragen sind.
Wenn die Voraussetzungen für eine Suche nach dem EAN-Code gegeben ist, kann dann diese Zwischentabelle mittels einer geeigneten Funktion bzw. Abfrage (siehe Vorschlag von DF6GL) analysiert und der zugehörige Artikel ermittelt werden.

HTH
Peter

ulli

Vielen Dank für eure rasche und effektive Hilfe; die Variante mit dem LIKE-Operator brachte schon mal das gewünschte Ergebnis, auch wenn die Artikel-Tabelle noch nicht normalisiert ist.

Ich habe das mit der Zwischentabelle so verstanden: es gibt eine neue Tabelle, in der jeweils Artikelnummer (als ID) und EAN abgespeichert sind; die Artikelnummer kann mehrmals vorkommen; Artikel- und EAN-Tabelle sind  1:n-verknüpft.

Um noch was zu lernen: warum geht  das mit InStr nicht?

DF6GL

Hallo,


wenn, dann so:

.
.
Me!ArtNr=DLookup("ArtNr", "Artikel", "InStr([EAN]," &  Me![txtArtNr] & ") <> 0 ")
.
.

ulli