Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

verwandte Strings suchen

Begonnen von jagger, April 04, 2019, 19:39:54

⏪ vorheriges - nächstes ⏩

jagger

Hallo Access-Gemeinde,

vielleicht ist das ja hier schon erklärt worden,
aber ich weiss nicht genau wonach ich suchen soll.
Okay, ich versuch es mal.
Theoretisches Beispiel:
in tab_ Adresse01 gibt es folgende Spalten mit folgendem Inhalt:
spName01    spVorname01
Müller           Thomas     
Müller           Max         
Müller           Thomas     
Müller           Heinz         
Müller           Steffen       
Müller           Heinz
Müller           Max         

Wie kann ich, wenn ich jetzt, z.B. in einem Formular (endlos)
basierend
auf tab_Adresse02
spName02    spVorname02
"Müller"         "Thomas"   

eingebe erreichen, dass mir z.B. eine msgbox anzeigt,
dass in tab_ Adresse01 Einträge zu
   
Müller           Max         
Müller           Heinz         
Müller           Steffen     

vorhanden sind? Gibt es keine etsprechenden Daten, soll nix passieren.

Vielleicht könnte man Strings zusammensetzen:
Müller-Thomas     
Müller-Max         
Müller-Thomas     
Müller-Heinz         
Müller-Steffen       
Müller-Heinz
Müller-Max       

und dann mit dem String Müller-Thomas 
vergleichen? Aber wie?

Ich finde einfach keinen Lösungsansatz.

Hat vielleicht jemand eine Idee?

Mit bestem Dank im Voraus
LG
jagger


markusxy

In dem Beispiel ignorierst du ja einfach den Vornamen.
Vielleicht erklärst du mal wozu das ganze gut sein soll, und das Konzept was dahinter stehen soll.

jagger

Hallo markus888,

ich möchte bei Eingabe von "Müller" "Thomas"
in tab_Name02 prüfen, ob es
in tab_Name01 anderslautende Einträge zu Müller gibt.

Müller           Max         
Müller           Heinz         
Müller           Steffen
     

Ich hatte das vielleicht im Eröffnungspost etwas umständlich beschrieben.

Das Beispiel ist nur ein Denkmodell bzw. die vereinfachte Variante (Auszug) einer Datenbank.

LG
jagger





markusxy

Dann such einfach nach Müller und die Sache hat sich.
Im Endeffekt musst du eine Regel für die Suche festlegen, die sich für die Anwendung ableiten lässt.
Das musst du aber selbst festlegen.
Wo könnte da das Problem liegen?

PhilS

Zitat von: jagger am April 05, 2019, 08:19:43
ich möchte bei Eingabe von "Müller" "Thomas"
in tab_Name02 prüfen, ob es
in tab_Name01 anderslautende Einträge zu Müller gibt.
Hmm, das macht die Sache nicht wirklich verständlicher.

Mir ist nach wie vor unklar was a) der Sinn der Sache sein soll und b) wo denn das konkrete Problem ist.

Das bisher gewünschte lässt sich ja einfach abfragen:
SELECT
       spName02
      ,spVorname02
FROM tab_Adresse02
WHERE spName02  = [AktuelleEingabeName]
AND      spVorname02 <> [AktuelleEingabeVorName]
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

jagger

Hallo PhilS,
ZitatZitat von: jagger am Heute um 08:19:43

    ich möchte bei Eingabe von "Müller" "Thomas"
    in tab_Name02 prüfen, ob es
    in tab_Name01 anderslautende Einträge zu Müller gibt.

Hmm, das macht die Sache nicht wirklich verständlicher.

Ich will es mal anders versuchen.
Übernehmen wir mal Deine Textfelder für das Formular.
Wenn ich also im Formular02 (Datensatzquelle:tab_Name02) in
Me![AktuelleEingabeName] ==> Müller
Me![AktuelleEingabeVorName] ==> Thomas
eingebe, soll bei z.B. "Nach Aktualisierung" von Me![AktuelleEingabeVorName] geprüft werden,
ob es in tab_Name01 Müller XYZ gibt.
Aber <> Müller Thomas.

Ist das der Fall soll eine msgbox oder ein Popup-Formular diese anzeigen.
Wenn es keine Müllers (<> Müller Thomas) oder nur Müller Thomas gibt, soll nix passieren.

Also irgendwie mit
if "Müller XYZ in tabName01" <> "Müller Thomas" then
msgbox "###"
end if

:-[

Ich hoffe, diese Erklärung ist besser.

LG
jagger




PhilS

Zitat von: jagger am April 05, 2019, 09:25:55
Ist das der Fall soll eine msgbox oder ein Popup-Formular diese anzeigen.
Wenn es keine Müllers (<> Müller Thomas) oder nur Müller Thomas gibt, soll nix passieren.

Also irgendwie mit
if "Müller XYZ in tabName01" <> "Müller Thomas" then
msgbox "###"
end if
Hmm, viel klarer ist es damit nicht. - Vor allem nicht, wo das konkrete Problem ist.


Die eigentliche Anforderung wird ja bereits von meinem (skizzierten) SQL-Statement bereits erfüllt.Du musst jetzt nur nach der Eingaben von Name und Vorname (After-Update der Steuerelemente) ein Recordset mit dem SQL-Statement öffnen. Wenn dieses Daten enthält, liest du die Daten aus und zeigst sie in der MessageBox an.


Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Beaker s.a.

@jagger
Warum nimmst du zur Eingabe nicht einfach ein Kombi, das Tab01 als DS-Herkunft hat?
Da siehst du dann den "Thomas" zwar auch, aber was ist so schlimm daran?
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)

jagger

Hallo Beaker s.a.,

ich will doch nur nach der Eingabe von
Name Müller und Vorname Thomas (in einem Formular) prüfen, ob es in der Tabelle tab_Adresse01
weitere Kombination(en) von Name und Vorname gibt.
Also die Suche nach "Müller-*)
Wobei die Kombination "Müller-Thomas" ignoriert werden soll.

Im Textfeld "NameSting" wird ein String aus Name &"-"& Vorname ==> Name-Vorname zusammengesetzt.
In der Abfrage (siehe unten) wird der String in der Spalte "StringName" zusammengesetzt.

Eine Abfrage, die genau das tut ist:
SELECT tab_Adresse01.spName01, tab_Adresse01.spVorname01, [spName01] & "-" & [spVorname01] AS StringName
FROM tab_Adresse01
WHERE (((tab_Adresse01.spName01)="Müller") AND (([spName01] & "-" & [spVorname01]) Not Like "Müller-Thomas"));


oder mit den Textfeldern als Kriterien
SELECT tab_Adresse01.spName01, tab_Adresse01.spVorname01, [spName01] & "-" & [spVorname01] AS StringName
FROM tab_Adresse01
WHERE (((tab_Adresse01.spName01) Like [Formulare]![Formular02]![AktuelleEingabeName]) AND (([spName01] & "-" & [spVorname01]) Not Like [Formulare]![Formular02]![NameString]));


Wenn es in Tabelle tab_Adressen01 keine Müllers (außer Müller-Thomas) gibt, soll nix passieren.
Gibt es weitere Müllers, soll ein Formular mit allen Müllers geöffnet werden.

Mein Problem ist, dass ich nicht weiss, wie ich das mit vba oder/und SQL formulieren muss. Ich stehe gerade (schon den ganzen Tag) auf der Leitung.
Alle Versuche oder Ansätze endeten in Fehlermeldungen oder dem Ruf nach Parametern.
Alle bisherigen Tipps konnten mir nicht weiterhelfen, oder ich habe sie einfach nicht verstanden.  :o

Ich habe gerade einen ganzen Wald vorm Kopf. :'(

Die Namen und Vornamen sind nur Beispiele.


LG jagger

jagger

@alle,

ich bin der Lösung schon ein Stück näher gekommen.
Ich habe eine Abfrage "qry_Adresse01" erstellt.
SELECT tab_Adresse01.spName01, tab_Adresse01.spVorname01, [spName01] & "-" & [spVorname01] AS StringName
FROM tab_Adresse01
GROUP BY tab_Adresse01.spName01, tab_Adresse01.spVorname01, [spName01] & "-" & [spVorname01];


Mit  AfterUpdate bei "AktuelleEingabeVorName"
Dim NaSt As String
Dim NaM As String

NaSt = Me!AktuelleEingabeName & "-" & Me!AktuelleEingabeVorName
NaM = Me!AktuelleEingabeName

Dim db As DAO.Database
Dim rst As DAO.Recordset
     Set db = CurrentDb
         Set rst = db.OpenRecordset("SELECT * from qry_Adresse01 WHERE spName01 = '" & NaM & "' and  StringName not like '" & NaSt & "'")
         Do While Not rst.EOF
         Debug.Print rst!spName01, rst!spVorname01, rst!StringName
         rst.MoveNext
     Loop
        rst.MoveLast
        rst.MoveFirst
        MsgBox rst.RecordCount & " Datensätze ermittelt!"
       
        rst.Close

     Set rst = Nothing
     Set db = Nothing
     
End Sub


Das "rst.RecordCount" liefert mir jetzt die Anzahl der Datensätze (jetzt noch in der msgbox).
Diesen Wert kann ich dann für
if das und das then öffne das Formular XY
nutzen.
Jetzt habe ich nur das Problem, wenn die Abfrage (qry_Adresse01) keinen Wert liefert,
kommt Laufzeitfehler 3021 "kein aktueller Datensatz".
Die Zeile "rst.MoveLast" wird angemeckert.

Wie kann ich das abfangen?
Man müsste also irgendwie prüfen, ob Werte ausgegeben wurden. Also "schauen", ob Debug.Print was anzeigt.

Wie kann man das machen? Vielleicht mit
If Me.Recordset.RecordCount = 0 Then?
Aber weder ="" noch = Null oder
If IsNull(Me.Recordset.RecordCount) then
reagieren hier

LG
jagger


PhilS

Zitat von: jagger am April 06, 2019, 14:04:16
Jetzt habe ich nur das Problem, wenn die Abfrage (qry_Adresse01) keinen Wert liefert,
kommt Laufzeitfehler 3021 "kein aktueller Datensatz".
Die Zeile "rst.MoveLast" wird angemeckert.

Wie kann ich das abfangen?
Me.Recordset.RecordCount bezieht sich auf das Recordset des Formulars. Du interessierst dich für rst.RecordCount.

Das MoveLast/MoveFirst kannst du aber einfach ersatzlos streichen. Du bist doch unmittelbar vorher durch alle Records des Recordsets gelaufen. Die Problematik, dass noch nicht alle Datensätze abgerufen wurden kann also bei deinem Code nicht eintreffen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

jagger

Hallo PhilS,

das war genau die Lösung. Danke Dir!

Dim NaSt As String
Dim NaM As String

NaSt = Me!AktuelleEingabeName & "-" & Me!AktuelleEingabeVorName 'Eingabefelder in Formular "Formular02"
NaM = Me!AktuelleEingabeName

Dim db As DAO.Database
Dim rst As DAO.Recordset
     Set db = CurrentDb
         Set rst = db.OpenRecordset("SELECT * from qry_Adresse01 WHERE spName01 = '" & NaM & "' and  StringName not like '" & NaSt & "'")
         Do While Not rst.EOF
         Debug.Print rst!spName01, rst!spVorname01, rst!StringName
         rst.MoveNext
     Loop
             
   If rst.RecordCount = 0 Then
      MsgBox "mach nix"
   Else
      MsgBox "öffne das Formlar XYZ"
   End If
       
        rst.Close

     Set rst = Nothing
     Set db = Nothing
     
End Sub


Mit dieser funktionieren "kleinen Datenbank" kann ich mich jetzt an die Umsetzung in der eigentlichen Datenbank machen.

Vielen Dank an alle Mitwirkenden.
Ich habe die DB mal angehängt. Vielleicht kann das ja jemand nutzen.

LG
jagger


Beaker s.a.

@jagger
Die vorgeschaltete Abfrage ist IMO völlig überflüssig, - eine Gruppierung
über alle Felder schon eh.

Set rst = db.OpenRecordset( _
      "SELECT spName01, spVorname01, spName01 & "-" & spVorname01 AS StringName " _
    & "FROM tab_Adresse01 " _
    & "WHERE spName01 = '" & NaM & "' and StringName Not Like '" & NaSt & "'")

Dann noch eine Frage zum Kriterium; - deine Anwender wissen um die
Verwendung von Jokerzeichen (*, ?), und benutzen sie auch?
Ansonsten macht "LIKE" ohne vorgegebene Joker keinen Sinn, - ist dann
wie gleich (=) oder eben ungleich (<>) mit NOT.
Also entweder
... Stringname Not Like '*" & NaSt & "*'")
'oder
... Stringname <> '" & NaSt & "'")

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)

jagger

Hallo Beaker s.a.,

ZitatDie vorgeschaltete Abfrage ist IMO völlig überflüssig, - eine Gruppierung
über alle Felder schon eh.
Ich war ja froh, dass es läuft!  :) :) :) Wie bekomme ich die Grupierung dann in das Recordset?

Mit Set rst = db.OpenRecordset( _
      "SELECT spName01, spVorname01, spName01 & "-" & spVorname01 AS StringName " _
    & "FROM tab_Adresse01 " _
    & "WHERE spName01 = '" & NaM & "' and StringName Not Like '" & NaSt & "'")


Kommt Laufzeitfehler 13 "Typen unverträglich".
Das Entfernen der Hochkommas ändert das auch nicht.

ZitatDann noch eine Frage zum Kriterium; - deine Anwender wissen um die
Verwendung von Jokerzeichen (*, ?), und benutzen sie auch?
Ansonsten macht "LIKE" ohne vorgegebene Joker keinen Sinn, - ist dann
wie gleich (=) oder eben ungleich (<>) mit NOT.

Da hast Du natürlich recht, Danke. Ich habe es zu "<>" geändert.

LG
jagger

Beaker s.a.

@jagger
Sorry, mein Fehler, - den Alias kannst du in der WHERE-Klausel gar nicht
verwenden; - da kannst du ihn auch gleich weglassen, der Inhalt interessiert
ja eh nicht.

Set rst = db.OpenRecordset( _
      "SELECT spName01, spVorname01 " _
    & "FROM tab_Adresse01 " _
    & "WHERE spName01 = '" & NaM & "' And spName01 & "-" & spVorname01 <> '" & NaSt & "'")

(hoffentlich ohne Fehler).
Warum hier eine Gruppierung nötig sein sollte kann ich nicht erkennen.
Den zusammengesetzten String brauchst du eigentlich auch gar nicht,
wenn du dir noch einmal Philips SQL-String in seiner ersten Antwort
anschaust. Der zeigt genau die gleichen DS an.
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)