Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Paule am September 22, 2016, 21:16:27

Titel: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 22, 2016, 21:16:27
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: el_gomero am September 22, 2016, 22:39:49
Hallo,

wahrscheinlich hast du das falsche Ereignis gewählt - probier mal NachAktualiserung.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Beaker s.a. am September 22, 2016, 22:46:17
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 23, 2016, 06:53:21
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!
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: bahasu am September 23, 2016, 09:11:40
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Beaker s.a. am September 23, 2016, 16:09:21
Hallo,
Like [color=red]'[/color]*" & Me!txtCustomerID.Text & "*'"
Das ist auch kein " ' " sondern ein " ` ".
gruss ekkehard
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 23, 2016, 20:24:01
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag 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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Beaker s.a. am September 23, 2016, 21:05:23
Hallo Paul,
Doppelquotes = Shift 2
Einfachquote = Shift #   ;)

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

gruss ekkehard
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 23, 2016, 21:14:46
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.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 23, 2016, 21:31:29
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: bahasu am September 23, 2016, 21:57:39
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
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: MaggieMay am September 24, 2016, 03:36:58
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.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 24, 2016, 07:13:36
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.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Beaker s.a. am September 24, 2016, 14:57:39
Dann zeige uns doch mal die ganze Prozedur zum Change-Ereignis.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: DF6GL am September 24, 2016, 17:40:35
Hallo,

ich verstehe nach wie vor nicht, wie man  nach der nichts sagenden ID (ich vermute mal einen Autowert)  mit "like" suchen wollte.  Warum nimmst Du nicht den Customer-Namen?

in der Change-Ereignisprocedur des Suchfeldes:

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_Customer.CustomerName Like '*" & Me!txtCustomerID.Text & "*'"
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 24, 2016, 17:50:23
@Franz
Weil wir im afrikanischen Kontext nicht mit Namen arbeiten können. Diese doppeln sich häufig und sind nicht selten falsch. Auf den entsprechenden Formularen (also physisch) arbeiten wir immer mit den Kunden-Nummern.

@Beaker

Option Compare Database

Private Sub Befehl47_Click()
    DoCmd.RunCommand acCmdSaveRecord
    DoCmd.GoToRecord , , acNewRec
    Me!txtSearchPart = ""
    Me!txtCustomerID = ""
    Me!listDefectID.RowSource = "SELECT SA_Defect.DefectID,   SA_Defect.CustomerID, SA_Customer.CustomerName FROM SA_Options_OpenSupportTicketsQ"
    Me!RepairedReplacedItem1.RowSource = "SELECT WH_ItemsT.ItemID, WH_ItemsT.ItemName FROM WH_ItemsT"
End Sub


Private Sub txtCustomerID_Change()
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 & "*'"
End Sub

Private Sub txtSearchPart_Change()
    Me!RepairedReplacedItem1.RowSource = "SELECT WH_ItemsT.ItemID, WH_ItemsT.ItemName FROM WH_ItemsT WHERE ItemName Like '*" & Me!txtSearchPart.Text & "*'"
End Sub


Das sind alle Codes zu diesem Formular. Oder was genau meintest du? Falsch das das falsche ist, dann einfach bescheid geben und ich suche das raus, was du benötigst.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Beaker s.a. am September 24, 2016, 21:15:06
Hallo Paul,
Versuch's mal ohne die einfachen Quotes und wandel den Suchbegriff in eine Zahl.
Private Sub txtCustomerID_Change()
   
    If (txtCustomerID.Text & vbNullString) = vbNullString Then
        Me!listDefectID.RowSource = SA_Options_OpenSupportTicketsQ
'siehe #2 <Da hast du dann ohne Suchkriterium immer nur alle unerledigten.>
    Else
        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 *" & Val(Me!txtCustomerID.Text) & "*"
    End If
   
End Sub


gruss ekkehard
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: DF6GL am September 24, 2016, 23:05:52
Hallo,

verstehe es trotzdem nicht....  Was ist denn CustomerID überhaupt? Was steht da  drin?  Suchen nach einer Ziffer in einer numerischen Zahl ist für mich in diesem Zusammenhang nicht nachvollziehbar.

Oder ist diese "CustomerID"  eine offizielle Kennung (Kennzahl) einer bestimmten Person? Soll heißen, es ist keine Datensatz-ID , eher eine "Ausweisnummer"?
Kommen dann darin auch Buchstaben vor, soll heißen, hat das Tabellenfeld den Datentyp Text?

PS:  Und bist Du sicher, dass die Abfrage  bei fehlendem Kriterium auch tatsächlich alle erwarteten Datensätze liefert ß (Sie liefert keine, wenn es in SA_Defect  keine zugehörenden DS gibt)
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 25, 2016, 09:27:02
@Beaker
Vielen Dank für deine Mühen. Hat leider noch nicht geklappt. Selbes Problem wie oben beschrieben, aber es geht nicht wieder in den VBA-Editor zurück.

Ich denke, es wäre sinnvoll, die Datenbank mal hochzuladen. Dort geht es um das Formular SA_DefectRepairReplacedF. Dort findet man ganz oben das Such-Textfeld.

Vielleicht ist das einfacher?

Wenn es nicht geht, dann geht es eben nicht. Dennoch schon mal vielen Dank für eure Mühen!

@Franz
Die CustomerID ist der AutoWert. Dieser Nummer nehmen wir als Kundennummer, die auf dem Vertrag landet und für den Kunden ist.
In allen physischen Formularen beziehen wir uns immer auf die Kundennummer - sprich, in Access: CustomerID - weil alles andere nicht praktikabel ist. Im Moment ist es übersichtlich in dem entsprechenden Listenfeld. Gerade mit dem Wachsen der Firma wird das Ganze aber umfänglicher werden. Wenn dann Replacement bzw. Repair-Formulare reinkommen, möchte ich nicht die Kundennummer vom Formular ewig in dem Access-Listenfeld suchen, sondern am besten die Kundennummer in das Such-Textfeld eingeben, damit mir nur noch das zu dieser Nummer existierende Open Support Ticket. Dieses kann ich dann "schließen". Das erleichtert die Übersicht... Daher war das so die Idee...

Ich weiß, das die meisten Dinge in unserer Datenbank verwirrend für Access-Profis sind. Es gibt leider keine solchen bei uns, auf die wir zurückgreifen könnten. Bitte sieh mir das also nach, wenn meine Vorgehensweise für dich komisch erscheint. Bis jetzt lief die Datenbank super...aber es ist nur eine temporäre Lösung, bis wir eine bessere Lösung "finanzieren" können.
Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: DF6GL am September 25, 2016, 17:05:31
Hallo,

nun ja, ok,   (ich glaube, wir hatten vor einiger Zeit schon mal Kontakt wegen dieser DB...)


Die Frage, ob die Abfrage
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

ohne Kriterium alle (erwarteten) DS liefert, ist nicht beantwortet...


Statt einem Textfeld empfehle ich eher ein Kombifeld ("cmbCustumerID").Da "springt" der Listenfeld-Cursor gleich auf die ID, deren Ziffern nach und nach eingegeben werden.


Datensatzherkunft: Select CustumerID,CustomerName  from SA_Customer  order by CustomerID
Spaltenanzahl: 2
Spaltenbreiten: 1cm;6cm
gebundene Spalte: 1
Steuerelementinhalt: leer

mit dessen Klick_Prozedur:

Sub cmbCustomerID_Click()

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 =" & Me!cmbCustomerID
End Sub

Titel: Re: Ereignis "Bei Änderung" für Suchtextfeld
Beitrag von: Paule am September 25, 2016, 17:24:23
Hallo Franz,
ich habe entsprechende Anweisungen durchgeführt. Das Kombifeld ist hinzugefügt, genauso wie der Code. Aber selbes Problem wie oben.

Bezüglich der Frage, ob die Abfrage alle Daten liefert:
Meinst du im Listenfeld mit allen offenen Support Tickets?
Da würde die von dir genannte Abfrage keine Hilfe sein. Da werden zwei der drei Datensätze doppelt angezeigt. Verknüpfe ich auch die CustomerID's in beiden Tabellen/Abfragen (SA_Defect und SA_Options_OpenSupportTickets), dann funktioniert es. Dann werden die drei richtigen DS angezeigt. ALso nur bei zwei Inner Joins.

Hilft das weiter?