Neuigkeiten:

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

Mobiles Hauptmenü

Ereignis "Bei Änderung" für Suchtextfeld

Begonnen von Paule, September 22, 2016, 21:16:27

⏪ vorheriges - nächstes ⏩

Paule

Hallo,

ich habe ein Formular, wo offene Support-Tickets geschlossen werden.
Dafür habe ich eine Tabelle, in der zuerst die Support Tickets eingetragen werden.
Für Repairs bzw. Replacements gibt es auch eine Tabelle, dort wird dann festgehalten, welches Support-Ticket geschlossen wurde.

Im Formular, um ein Support Ticket zu schließen gibt es ein Listenfeld, welches die Support-Tickets anzeigt anzeigt. In diesem lasse ich mir nur alle wirklich offenen Support Tickets anzeigt, zu denen es noch kein Repair oder Replacement gibt. Das funktioniert auch soweit gut mit folgendem SQL Code:
SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName
FROM (SA_Customer INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID) LEFT JOIN SA_Defect_RepairedReplaced ON SA_Defect.DefectID = SA_Defect_RepairedReplaced.DefectID
WHERE (((SA_Defect_RepairedReplaced.RepairedReplacedID) Is Null));


SA_Defect ist die Tabelle mit allen offenen Support-Tickets
SA_Defect_RepairedReplaced die Tabelle wo alle Repairs oder Replacements vermerkt sind, die als FK die DefectID aus SA_Defect haben.


Nun habe ich noch ein Extra-Textsuchfeld eingebaut, mit denen man nach den Kundennummern im Listenfeld filtern kann. Nach Eingabe sollen dann nur noch alle offenen Support Tickets, die der eingegebenen Kundennummer entspricht angezeigt werden.
Das hatte ich mit folgendem Code gemacht:
"Private Sub txtCustomerID_Change()
Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Customer INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID WHERE SA_Defect.CustomerID Like '*"
& Me!txtCustomerID.Text & "*'"

Das Suchfeld funktioniert auch soweit gut. Z.B. gebe ich "193" ein und er zeigt mit nur die einzige DefektID, die der Kundennummer 193 zugeordnet ist.
Wenn ich dann aber merke, dass ich eigentlich eine andere Nummer eingeben wollte, z.B. "194", weil ich mich vertippt habe und die Eingabe in das Such-Textfeld entsprechend lösche, dann zeigt er mit auf einmal wieder alle DefektID's an, unabhängig davon, ob sie "offen" oder schon "geschlossen" sind.

Die Problematik liegt denke ich im Code des Such-Textfeldes. Daher habe ich es mit folgendem Code ebenso probiert:


Private Sub txtCustomerID_Change()
Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM (SA_Customer INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID) LEFT JOIN SA_Defect_RepairedReplaced ON SA_Defect.DefectID = SA_Defect_RepairedReplaced.DefectID WHERE (((SA_Defect_RepairedReplaced.RepairedReplacedID) Is Null)) And SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*"


End Sub

Wenn ich dann etwas in das Suchfeld eingegeben habe, war das Listenfeld auf einmal leer... funktioniert also nicht, oder habe ich einen Fehler im Code gemacht?
Was wären andere Lösungen?

Ich wäre sehr dankbar für euren Rat.

Viele Grüße

el_gomero

Hallo,

wahrscheinlich hast du das falsche Ereignis gewählt - probier mal NachAktualiserung.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Beaker s.a.

Hallo Paul,
Aus der RowSource des Listfeldes (die alle unerledigten anzeigt) würde ich eine
gespeicherte Abfrage machen und dem Feld als Standard-RowSource zuweisen.
Da hast du dann ohne Suchkriterium immer nur alle unerledigten.
Und diese Abfrage nutzt du dann auch um auf den Kunden einzuschränken.
Me!listDefectID.RowSource = _
    "SELECT SA_Defect.DefectID, _
                 SA_Defect.CustomerID, _
                 SA_Customer.CustomerName _
     FROM [color=blue]DieNeueAbfrage[/color] _
         INNER JOIN SA_Defect _
         ON SA_Customer.CustomerID = SA_Defect.CustomerID _
     WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"

Und wenn das Feld leer wird
Me!listDefectID.RowSource = DieNeueAbfrage

Wobei ich mich immer wieder frage warum man eine Kundennummer mit
LIKE '* ... abfragt. Wer kennt den mittlere Teile einer Kundennummer? Meist gibt es doch einen
Nummernkreis, und man kennt die ersten Ziffern; - naja, jeder wie er's braucht.

@Jürgen
OnChange sollte aber funzen; - ändert halt die Liste bei jedem Zeichen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Paule

Hallo ihr beiden,
ich habe es jetzt mal gemäß Ekkehards Anweisung probiert.
Eine neue Abfrage mit dem Namen SA_Options_OpenSupportTicketsQ habe ich hinzugefügt und als Datensatzherkunft dem Listenfeld mit den angezeigten Defekten verwendet. Das funktioniert.

Mit dem unten gezeigten Code für das Ereignis "Bei Änderung" kam es allerdings zu einem Syntaxfehler. Er zeigt dann das Hochkommata vor den Gänsefüßchen ganz zum Schluss an. Was ist daran denn falsch?

Aber würde unabhängig davon (der Fehler tritt auch bei dem untenstehenden Code auf) nicht auch dieser Code schon reichen?
Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTicketsQ WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"

@Ekkehard
Die andere Sache mit dem Like kommt danach... ;) Step-by-Step.

Danke euch schon mal!

bahasu

Hallo Paule,

unter der Annahme, dass "CustomerID" als Zahl deklariert ist, dürfen keine Hochkomma verwendet werden.

Mir erschliesst sich aber nicht der Sinn, warum bei einer ID eine like-Abfrage verwendet wird, da id's normerlweise von access angelegt werden und man darauf keinen manuellen Zugriff pflegt.

Vielleicht hilft etwas in der Art: ... SA_Defect.CustomerID = " & Me!txtCustomerID

Harald
Servus

Beaker s.a.

Hallo,
Like [color=red]'[/color]*" & Me!txtCustomerID.Text & "*'"
Das ist auch kein " ' " sondern ein " ` ".
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Paule

Hallo Ekkehard,
ich bin etwas verwirrt. Ich habe jetzt folgenden Code verwendet:
Private Sub txtCustomerID_Change()
Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTickets INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"
End Sub

Er zeigt mir nachwievor einen Syntax-Fehler an. Diesmal markiert er aber die gesamte Zeile.

Und kann ich nicht auch den kürzeren Code, den ich im vorherigen Post geschrieben habe, verwenden? Oder führt das zu Problemen?

@bahasu
Das hat leider nicht funktioniert.  :o

bahasu

Hi,

was passiert mit:

Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTickets INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"


Harald
Servus

Beaker s.a.

Hallo Paul,
Doppelquotes = Shift 2
Einfachquote = Shift #   ;)

Hast du dir die SQL-Strings mal mit Debug.Print angeschaut?

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Paule

Zitat von: bahasu am September 23, 2016, 21:01:33
Hi,

was passiert mit:

Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTickets INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"


Harald

Hi Harald,
vielen Dank für deine Mühen.
Dann kommt kein Syntax-Fehler mehr.
Ich habe aber beispielsweise ein OpenSupport Ticket vom Kunden mit der ID 60. Der wird im Listenfeld auch korrekt angezeigt. Gebe ich jetzt in das Such-Textfeld nur "6" ein wird das Listenfeld leer. Lösche ich die Eingabe, bleibt es auch leer.

Paule

Zitat von: Beaker s.a. am September 23, 2016, 21:05:23
Hallo Paul,
Doppelquotes = Shift 2
Einfachquote = Shift #   ;)

gruss ekkehard
Ja, soweit so gut. :)
Ich habe jetzt den Code aus deinem ersten Antwort-Post mit beiden Versionen probiert. Also:

Me!listDefectID.RowSource = _
  "SELECT SA_Defect.DefectID, _
                 SA_Defect.CustomerID, _
                 SA_Customer.CustomerName _
     FROM SA_Options_OpenSupportTicketsQ _
         INNER JOIN SA_Defect _
         ON SA_Customer.CustomerID = SA_Defect.CustomerID _
     WHERE SA_Defect.CustomerID Like [b] '*"[/b] & Me!txtCustomerID.Text & "*'"


Und:
Me!listDefectID.RowSource = _
    "SELECT SA_Defect.DefectID, _
                 SA_Defect.CustomerID, _
                 SA_Customer.CustomerName _
     FROM SA_Options_OpenSupportTicketsQ _
         INNER JOIN SA_Defect _
         ON SA_Customer.CustomerID = SA_Defect.CustomerID _
     WHERE SA_Defect.CustomerID Like [b]"*"[/b] & Me!txtCustomerID.Text & "*'"


Bei beiden schickt er mich zurück in den VBA Editor.   :o

bahasu

Hallo,

nach wie vor habe ich "Bauchschmerzen" bei dem like.

Warum nicht:
Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTickets INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID WHERE SA_Defect.CustomerID =" & Me!txtCustomerID.Text

Kannst Du bitte erläutern, warum Du mit like arbeitest?
Wenn Du mit like mehrere Kunden(Customer) haben willst, ist es vermutlich sinnvoller, nicht mit der ID zu arbeiten, sondern mit Texten, die via Fremdkey zugelinkt werden.

Über den Sinn von ".Text" bin ich mir auch nicht im Klaren. Das nimmt man üblicherweise, wenn man noch in dem Feld drin ist (wenn das Feld den Fokus hat).

Harald
Servus

MaggieMay

Hi,
Zitat von: Paule am September 23, 2016, 21:31:29
Bei beiden schickt er mich zurück in den VBA Editor. 
dazu gibt es doch sicher auch eine Fehlermeldung - oder?!
Und wie steht es mit dem Kompilieren des Codes, ehe du ihn testest?

Was die Fehlermeldung dir vermutlich sagen will ist folgendes:
Du kannst eine Zeichenkette nicht so ohne weiteres über mehrere Zeilen verteilen, dazu musst du jeweils Teilstrings bilden.
Das sähe dann bspw. so aus:
Me!listDefectID.RowSource = _
  "SELECT SA_Defect.DefectID, SA_Defect.CustomerID, SA_Customer.CustomerName " & _
  " FROM SA_Options_OpenSupportTicketsQ " & _
  "INNER JOIN SA_Defect ON SA_Customer.CustomerID = SA_Defect.CustomerID " & _
  "WHERE SA_Defect.CustomerID Like '*" & Me!txtCustomerID.Text & "*'"


Die Verwendung der Text-Eigenschaft ist im Change-Ereignis völlig korrekt.
Freundliche Grüße
MaggieMay

Paule

Hallo MaggieMay,
danke für die Erläuterung. Ich habe den Code von dir entsprechend ausprobiert.

Diesmal schickt er mich nicht in den VBA Editor zurück, das ist schon mal ein großer Fortschritt, aber es bleibt selbes Problem wie oben:
Ich habe drei OpenSupport Tickets mit den CustomerID's 60,71, 80.
Gebe ich jetzt in das Such-Textfeld etwas ein, z.B. "6", dann verschwinden alle drei OpenSupport Tickets aus dem Listenfeld. Dieses bleibt auch leer, wenn ich die Eingabe wieder herauslösche.

Beaker s.a.

Dann zeige uns doch mal die ganze Prozedur zum Change-Ereignis.
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)