Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: martie01 am Juli 24, 2020, 22:01:49

Titel: suche in allen tabellen nach String
Beitrag von: martie01 am Juli 24, 2020, 22:01:49
Hallo,

ich würde gerne in der Datenbank in allen Tabellen nach z.B. einen Namen suchen.
Es gab in der knowhow.mdb schon einmal soetwas, was jedoch bei mir nicht funktioniert.
Das hiess snoop for. Es geht in die Fehlermeldung und findet nichts.
Kann mir jemand bitte weiterhelfen?
Option Compare Database
Option Explicit


Private Sub btn_FIND_Click()

    Dim SnoopFor As String

    If Not (IsNull([SEARCH])) Then

        [lbl_SEARCH].Visible = True
        SnoopFor = [SEARCH]
        Call Go(SnoopFor)

    Else

        [SEARCH].SetFocus
        MsgBox "You must enter some search Text.", 16, "Data Snoop"

    End If

End Sub

Private Sub CreateSnoop()

    On Error Resume Next
   
    Dim db As Database
    Dim td As TableDef
    Dim F As Field
   
    Set db = CurrentDb()
    Set td = db.CreateTableDef("tblSNOOP")

    Set F = td.CreateField("Occurence", DB_LONG)
    td.Fields.Append F
    Set F = td.CreateField("Table", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F
    Set F = td.CreateField("Field", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F

    db.TableDefs.Append td

    db.Close

End Sub

Private Sub DeleteSnoop()

    On Error Resume Next
   
    Dim db As Database

    Set db = CurrentDb()
    db.TableDefs.DELETE "tblSNOOP"

    db.Close

End Sub

Private Sub Go(SnoopFor As String)

    Call DeleteSnoop
    Call CreateSnoop
    Call Snoop(SnoopFor)

End Sub

Private Sub Snoop(SnoopFor As String)

    On Error GoTo Snoop_Err

    Dim db As Database
    Dim S As Recordset
    Dim T As Recordset
    Dim td As TableDef
    Dim L As Integer
    Dim F As Integer
    Dim criteria As String
    Dim occ As Long

    Set db = CurrentDb()
    Set S = db.OpenRecordset("tblSNOOP", DB_OPEN_DYNASET)
       
    'cycle through the tables
    For L = 0 To db.TableDefs.count - 1

        Set td = db.TableDefs(L) 'set the table def

        If Not (td.Connect = "") Then 'is this table attached ?
       
            Set T = db.OpenRecordset(td.Name, DB_OPEN_SNAPSHOT) 'set the recordset

            sTABLE.Caption = td.Name: DoEvents 'set caption

            For F = 0 To td.Fields.count - 1 'now cycle through the fields as try to locate value

                sFIELD.Caption = td.Fields(F).Name: DoEvents 'set caption
               
                criteria = "CStr('' & [" & td.Fields(F).Name & "]) Like '" & SnoopFor & "'"
                T.FindFirst criteria
               
                If Not (T.NoMatch) Then
                   
                    occ = 0
                    Do While Not (T.NoMatch) 'now are there any more ?
                   
                        T.FindNext criteria
                        occ = occ + 1

                    Loop

                    S.AddNew
                    S!Occurence = occ
                    S!Table = td.Name
                    S!Field = td.Fields(F).Name
                    S.Update
               
                End If

            Next F

        End If

    Next L

    T.Close
    S.Close
    db.Close

Snoop_Exit:
    DoCmd.Close A_FORM, Me.Name
    DoCmd.OpenTable "tblSNOOP"
   
    Exit Sub

Snoop_Err:
    MsgBox Error$ & " : Snoop has come across an unforseen problem. Please contact the developer.", 16, "Message"
    Resume Snoop_Exit

    Exit Sub

End Sub
Titel: Re: suche in allen tabellen nach String
Beitrag von: MzKlMu am Juli 24, 2020, 23:54:28
Hallo,
mal ne Frage, wieso kann es bei dir sein, dass ein Name in mehreren Tabellen vorkommt?
Titel: Re: suche in allen tabellen nach String
Beitrag von: DF6GL am Juli 25, 2020, 09:27:52
Hallo,

ZitatEs geht in die Fehlermeldung

sehr informativ..

WIE lautet die Fehlermeldung und WO (bei welcher Codezeile)  tritt sie auf?

Zum Debuggen:

Haltepunkt an den Anfang des Codes setzen, mit Einzelschritt Zeile für Zeile durchlaufen und dabei die Varaiablen-Inhalte prüfen..
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 25, 2020, 13:53:11
Hallo,
eine einfache Version ist folgende.
Es ist eine Optionsgruppe notwendig, um Like *.* oder Like .* auswählen zu können.
Die Ergebnisse werden in einem Listenfald angezeigt.

Private Sub Suchenfeld_AfterUpdate()
'Suchen über alle Tabellenfelder
' mit + kann man mehrere Suchparameter als UND-Suchkondition eingeben
' mit dem Leerzeichen kann man Suchparameter als ODER-Suchkondition eintragen
On Error GoTo Fehler
Dim varInhalt  As Variant
Dim intI       As Integer
Dim strFilter  As String
Dim strFilter1 As String
Dim intFeld    As Integer
Dim strMuster  As String
Dim strSQL, strsql1 As String
Dim strlink As String
Dim ZwischenSpeicher As String
Dim rs As DAO.Recordset
Dim strLike As String
  Einlesen = ""
'################################################################################
'######### ***** tbl_Kunde mit gewünschter Tabelle austauschen  ***** ###########
  Einlesen = "SELECT * FROM tbl_Kunde"
'################################################################################
'################################################################################
  Set rs = CurrentDb.OpenRecordset(Einlesen)
   
  If Nz(Me!Suchenfeld, "") = "" Then
    MsgBox "Kein Eintrag im Suchfeld"
    Exit Sub
  End If
 
  Select Case SuchrahmenAuswahl 'Suchmethode wechseln (Like *.* oder Like .*)
    Case 1:  strLike = "*"
    Case 2: strLike = ""
  End Select
 
  ZwischenSpeicher = Me!Suchenfeld
  Me!Suchenfeld.AllowAutoCorrect = False
  strMuster = Replace(Me!Suchenfeld, "+", " + ")
  strMuster = Replace(StrConv(strMuster, vbProperCase), "  ", " ")
   
  If Nz(Me!Suchenfeld) <> "" Then
   intFeld = rs.Fields.count
   varInhalt = Split(strMuster, " ")
   For intI = LBound(varInhalt) To UBound(varInhalt)
     If Len(varInhalt(intI)) > 0 Then
        If varInhalt(intI) = "+" Then
           strlink = " And ("
          Else
           For intFeld = 1 To rs.Fields.count
             If Len(strFilter) > 0 Then strFilter = strFilter & " Or "
                strFilter = strFilter & "[" & rs.Fields(intFeld - 1).Name _
                & "] Like '" & strLike & varInhalt(intI) & "*'"
           Next intFeld
           If Len(strFilter1) > 0 Then
              strFilter1 = strFilter1 & strlink & strFilter & ")"
              strFilter = ""
             Else
              strFilter1 = "(" & strFilter & ")"
              strFilter = ""
           End If
           strlink = " OR ("
        End If
     End If
   Next intI
   Einlesen = Einlesen & " Where " & strFilter1
   Me!LstVollsuche.RowSource = Einlesen
  End If
       
  Me!Suchenfeld = ZwischenSpeicher
  Me!Suchenfeld.SetFocus
  rs.Close
  Set rs = Nothing
exit_Fehler:
Exit Sub
Fehler:
MsgBox "Fehler. Die Abfrage ist entweder zu komplex oder ein anderer Fehler ist aufgetreten. " & vbCrLf & _
"Versuchen Sie es mal alternativ mit dem '+' Zeichen im Suchtext"
Resume exit_Fehler
End Sub
Titel: Re: suche in allen tabellen nach String
Beitrag von: DF6GL am Juli 25, 2020, 14:37:11
Hallo,

@derArb:

Schwerpunkt liegt hierauf (auch wenn's nicht ganz zu verstehen ist):

Zitatin der Datenbank in allen Tabellen nach z.B. einen Namen suchen
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 25, 2020, 14:55:07
Hallo,
ohh...Entschuldigung
Titel: Re: suche in allen tabellen nach String
Beitrag von: DF6GL am Juli 25, 2020, 14:59:33
Es gibt doch da nichts zu entschuldigen....  :)
Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 25, 2020, 15:26:01
@martie01

Vermutlich hast du einfach nur die Code-Sequenz kopiert, aber im Formular die beiden Felder
Search (Textfeld) und
lbl_Search (zugehöriges Bezeichnungsfeld)
nicht angelegt, auf die sich der Code bezieht.
Hast du im Formular auch btn_FIND angelegt und im VB-Editor mal "Debuggen->Kompilieren" geklickt?
Wohinein hast du den fremden Code kopiert (sollte ein eigenes Formular sein)?

Gruß,
crystal

PS:
Der fremde Code ist eher dazu gedacht, einen String in den Tabellen zu finden, solange die Applikation sich noch in der Entwicklung befindet, NICHT jedoch für den "Produktions-Betrieb". Er schreibt die Ergebnisse in eine extra dafür angelegte Tabelle namens "tblSnoop". Ansonsten: siehe Frage von Klaus:

ZitatHallo,
mal ne Frage, wieso kann es bei dir sein, dass ein Name in mehreren Tabellen vorkommt?
Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 25, 2020, 15:45:54
Noch ein Nachtrag:

im Internet findet sich folgender Beitrag:

https://www.devhut.net/2011/08/18/ms-access-–-vba-–-determine-in-which-table-a-field-is-located/

Vielleicht hilft das ja auch weiter...

Gruß,
crystal
Titel: Re: suche in allen tabellen nach String
Beitrag von: martie01 am Juli 26, 2020, 11:44:33
Hallo,
est einmal vielen Dank für die Antworten
- ich möchte mir gerne in der Datenbank zu irgendwelchen Schnipseln wie Namen, Vorgangsnr ,.. anzeigen lassen, was die Datenbank dazu findet.
-das Makro steigt gleich am Anfang aus: Methode oder Datenobjekt nicht gefunden- >  s.FindFirst Criteria
-das Search (Textfeld) und lbl_Search (zugehöriges Bezeichnungsfeld) und extra Formular hatte ich drin ;)
-es müssen nicht ALLE Tabellen sein. Es sind halt jedoch Einige.
-der link führt ins Nevana

ich suche so etwas wie das hier: https://www.add-in-world.com/katalog/ac-globalesuche/
(P.S. funktioniert nicht für 64bit)

grüße
Titel: Re: suche in allen tabellen nach String
Beitrag von: DF6GL am Juli 26, 2020, 13:25:42
Hallo,

habe den Code mal nachgestellt, die Deklarationen korrigiert  und die Formular-Referenzen eliminiert.  Der Code tut das, was er soll: er listet in einer Tabelle die Tabellennamen und die Felder auf, in denen der Suchtext vorkommt.

Option Compare Database
Option Explicit




Private Sub CreateSnoop()

    On Error Resume Next
   
    Dim db As Dao.Database
    Dim td As Dao.TableDef
    Dim F As Dao.Field
   
    Set db = CurrentDb()
    Set td = db.CreateTableDef("tblSNOOP")

    Set F = td.CreateField("Occurence", DB_LONG)
    td.Fields.Append F
    Set F = td.CreateField("Table", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F
    Set F = td.CreateField("Field", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F

    db.TableDefs.Append td

    db.Close

End Sub

Private Sub DeleteSnoop()

    On Error Resume Next
   
    Dim db As Dao.Database

    Set db = CurrentDb()
    db.TableDefs.Delete "tblSNOOP"

    Set db = Nothing

End Sub

Public Sub Go(SnoopFor As String)

    Call DeleteSnoop
    Call CreateSnoop
    Call Snoop(SnoopFor)

End Sub

Private Sub Snoop(SnoopFor As String)

    On Error GoTo Snoop_Err

    Dim db As Dao.Database
    Dim S As Dao.Recordset
    Dim T As Dao.Recordset
    Dim td As TableDef
    Dim L As Long
    Dim F As Long
    Dim criteria As String
    Dim occ As Long

    Set db = CurrentDb()
    Set S = db.OpenRecordset("tblSNOOP", dbOpenDyanaset)
       
    'cycle through the tables
    For L = 0 To db.TableDefs.Count - 1

        Set td = db.TableDefs(L) 'set the table def

        If Not (td.Connect = "") Then 'is this table attached ?
       
            Set T = db.OpenRecordset(td.Name, dbOpenSnapshot) 'set the recordset

            'sTABLE.Caption = td.Name: DoEvents 'set caption

            For F = 0 To td.Fields.Count - 1 'now cycle through the fields as try to locate value

                'sFIELD.Caption = td.Fields(F).Name: DoEvents 'set caption
               
                criteria = "CStr('' & [" & td.Fields(F).Name & "]) Like '" & SnoopFor & "'"
                T.FindFirst criteria
               
                If Not (T.NoMatch) Then
                   
                    occ = 0
                    Do While Not (T.NoMatch) 'now are there any more ?
                   
                        T.FindNext criteria
                        occ = occ + 1

                    Loop

                    S.AddNew
                    S!Occurence = occ
                    S!Table = td.Name
                    S!Field = td.Fields(F).Name
                    S.Update
               
                End If

            Next F

        End If

    Next L

    T.Close
    S.Close
    Set db = Nothing

Snoop_Exit:
    DoCmd.OpenTable "tblSNOOP"
   
    Exit Sub

Snoop_Err:
    MsgBox Error$ & " : Snoop has come across an unforseen problem. Please contact the developer.", 16, "Message"
    Resume Snoop_Exit

    Exit Sub

End Sub

-Speicher den Code in ein neues Standardmodul.
- rufe im Direktfenster die Sub auf:   

call Go ("DeinSuchText")
Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 26, 2020, 13:35:25
Sorry - korrigierter Link:

https://www.devhut.net/2011/08/18/ms-access-%e2%80%93-vba-%e2%80%93-determine-in-which-table-a-field-is-located/

Zitat- ich möchte mir gerne in der Datenbank zu irgendwelchen Schnipseln wie Namen, Vorgangsnr ,.. anzeigen lassen, was die Datenbank dazu findet.

Dieser Satz ist so natürlich falsch, nicht die Datenbank sucht und findet, sondern deine Abfrage.
Hört sich dumm an, aber ich meine: deine Datenbank kann ja selbst nichts finden, sondern du musst (genau) sagen, wonach du suchst.

Entscheident ist hier doch, dass du nicht nach Datenfeld-Namen, sondern nach deren Inhalten suchst. Da sollte es doch möglich sein, das etwas einzuschränken und genauer zu benennen.

Eine Dantenbank kann ja durchaus Dutzende von Tabellen enthalten. Suchen beziehen sich aber i d. R. immer auf sehr wenige Tabellen, z. B. "Suche nach Personen", Suche nach Kunden", "Suche nach Produkten".

Es macht m. E. überhaupt keinen Sinn, die gesamte Datenbank nach dem Text "Maria" abzusuchen (auch noch mit Wildcards und dem like-Operator), der in irgendwelchen Feldern irgendwelcher Tabellen steht. Was nutzt es dir, wenn ein solcher Suchlauf z. B. findet:
"Maria" in Feld "Vorname" in Tabelle "Mitarbeiter"
"Marienstift" in Feld "Adresse1" in Tabelle "Kunden"
"mariannengraben" in Feld "Beschreibung" in Tabelle "Geologie"
usw.

Die Antwort: Nichts und rein gar nichts.
Du findest so auch nicht (oder nicht so ohne weiteres) z. B. die Bestellungen, die für den Kunden "Marienstift" bearbeitet wurden, die Beispiel-"Such-Anfrage" an "die Datenbank" ist also - nochmal und in aller Klarheit - Unsinn.

Dein Wunsch (siehe Zitat oben) ist also grundlegend falsch und sinnlos. Er entspringt eher der Einstellung "Ich hab doch eine Datenbank, da kann ich doch auch suchen" und ist m. E. überhaupt nicht durchdacht, da sie völlig ignoriert, dass eine Datenbank eine wohl geordnete Ansammlung von Tabellen, deren Datenfeldern, Verknüpfungen, Referenzen usw. in einer ebenso wohl durchdachten Struktur ist. Es ist KEINE Ansammlung ungeordneter Daten, die nur darauf warten, "irgendwie" gefunden zu werden.

Von einer gesprochenen Aufforderung "Computer: finde Maria in der Datenbank" UND der Nennung genau der Stellen, die wir gemeint haben, sind wir noch meilenweit entfernt und die Dramaturgie solcher Sci-Fi-Film-Sequenzen verschweigt völlig all die KI, die dahinter stecken müsste, um erstmal herauszufinden, was der "Commander" da eigentlich - oder jedenfalls ungefähr - wissen will...

Du solltest dir m. E. erstmal darüber klar werden, WAS deine Datenbank in welchen Tabellen enthält und dann konkrete Such-Anfragen formulieren, um dort nach betreffenden Datensätzen (Inhalten!) zu suchen, z. B. "Finde Mitarbeiter mit Vornamen Maria" oder "Finde Bestellungen für den Kunden Marienstift".

Würdest du ein Lexikon nach dem Text "Maria" durchsuchen wollen - egal an welcher Stelle er vorkommt? Würdest du "Maria" ohne weiteren Zusatz bei google suchen?

Ich würde sogar so weit gehen, dir vorzuschlagen, deine Frage als "erledigt" zu kennzeichnen, weil sie m. E. nicht zielgerichtet ist und sein kann und sie ein grundlegendes Verständnis über den Sinn und Zweck von Datenbanken (hier genauer: relationalen Datenbanken wie Access) vermissen lässt.

Es macht ja übrigens nur wenig Sinn, z. B. die Personal-Tabelle nach Produkt XYZ zu durchsuchen; willst du "die Datenbank" nach Produkt XYZ durchsuchen, solltest du dir vorher überlegen und darüber klar werden, ob du "Produkt-Stammdaten" oder "Bestellungen" finden möchtest.

Grüße,
crystal
Titel: Re: suche in allen tabellen nach String
Beitrag von: DF6GL am Juli 26, 2020, 13:37:13
Hallo,

er möchte doch gern die Google-Suche nachbauen....  ;D  ;)
Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 26, 2020, 13:48:01
;D  :o
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 27, 2020, 10:21:18
Hallo,
@crystal:
ZitatDein Zitat..."die Datenbank" ist also - nochmal und in aller Klarheit - Unsinn....
Ein Chef sagt, dass er irgendwo mal den Begriff "Xylo" in der DB gelesen hat und sich aber nicht mehr erinnern kann, wo. Dem hilft sehr wohl so eine Suchmöglichkeit.
Titel: Re: suche in allen tabellen nach String
Beitrag von: ebs17 am Juli 27, 2020, 12:18:53
Demjenigen, der irgendetwas irgendwo irgendwie sucht, muss wirklich geholfen werden. Es ist ja auch viel toller, eine solche Suche  auf einen großen wirren Haufen loszulassen, statt wie ein Apotheker gezielt an einen Schrank zu gehen, darin eine Schublade, darin ein Fach zu begutachten auf Inhalt. Letzteres ist ja einfach nur langweilig, kurz und schnell.

Allemal ein Grund, eine solche Volltextsuche gleich zum Standard zu machen.

Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 27, 2020, 13:31:12
Hallo derArb,

dass ein Chef meist sehr wenig Verständnis für Struktur und Aufbau einer Datenbank hat, liegt daran, dass er/sie mehr verdient und sich daher mit solchen Fragen an seine Mitarbeiter wenden darf...

Der Begriff (eher wohl Begriffs-Teil) "Xylo" könnte auf "Xylophon" hinweisen oder irgendwelche Zucker. Also kann schon eingeschränkt werden, ob er im Zusammenhang mit Musik oder mit biochemischen Texten vorgekommen sein könnte.

Also kannst du eine Suche nach diesem Begriff von vornherein schon einschränken, indem du Personal-Tabellen, Auto-Flotten, Kunden-Adressen etc. ausschließt.

Wenn wir nun bei "Musik" und "Biochemie" bleiben, kannst du weiter eingrenzen, in welchen Datenbeständen dieser Text vorkommen könnte. Da die Datenbank kaum beides enthalten wird (es sei denn es handelt sich z. B. um das Text-Archiv eines Print-Mediums), kannst du weiter entscheiden, in welchen Tabellen der Begriff an welchen Stellen vorkommen könnte. Vermutlich wird es irgendein beschreibendes Textfeld sein.

So kannst du dich - evtl. nach kurzer Befragung des Chefs/der Chefin - deterministisch einer etwas konkreteren, aber gezielten Abfrage nähern und diese - "Moment kurz, Chef" - mal eben schnell formulieren und ausführen: suche im Feld "Beschreibung" der Tabelle "BioChemie" nach dem Text "*xylo*" bzw.
"select * from BioChemie where Beschreibung like '*xylo*'".

Die GESAMTE Datenbank mit all ihren Tabellen nach "Xylo" abzusuchen, ist meiner Meinung - nach wie vor - falsch und "mit Kanonen auf Spatzen" oder eher sogar "mit Kanonen auf Mücken" geschossen, einmal von der Performance abgesehen. Sicher ist es möglich, "sowas" zu realisieren, denn Access (wie auch andere Datenbanken) verwaltet Tabellen-Definitionen ja auch nur in Tabellen, auf die man zugreifen kann. Aber nicht jede Frage "eines Chefs" ist sinnvoll und muss mit "ja, kann ich machen" beantwortet werden.

Ich bin nach wie vor der Meinung, dass der Wunsch, "einen String" von "der Datenbank" finden zu lassen, eher als "Unfug" zu klassifizieren ist. Im Übrigen muss "ein Chef" auch noch befragt werden, ob der Text "Xylo" wirklich in "der Datenbank" vorkam (und wenn ja wo ungefähr) oder vielleicht bei der Morgenlektüre der Tageszeitung am Frühstückstisch oder gar im Radio.

Lange Rede, kurzer Sinn und bevor diese Diskussion ins Lächerliche oder Zynische ausartet: ich möchte dir empfehlen, ein paar wenige Abfragen vorzubereiten, mit denen du gezielt in verschiedenen Datenfeldern verschiedener, aber bestimmter Tabellen z. B. nach solch prägnanten (?) Texten wie "Xylo" suchen kannst (falls mal wieder ein Chef vorbeikommt), statt zu versuchen, EINE Abfrage auf die gesamte Datenbank "abzufeuern".

Wenn es sich bei deiner Datenbank eher um ein Textarchiv (s. o.) handeln sollte, brauchst du auch nicht "die Datenbank" nach "Xylo" befragen, sondern nur die eine Tabelle mit dem beschreibenden Feld.

Und wenn du es nicht schaffst, ein paar wenige, konkrete Abfragen vorzubereiten, hast du möglicherweise die Struktur und die inneren Zusammenhänge "der Datenbank" (noch) nicht verstanden.

Meine Kommentare sollen kein Angriff auf dich persönlich sein, ich möchte dich nur bitten, etwas mehr zielgerichtete Überlegungen anzustellen, dir über die Struktur "der Datenbank" klar zu werden und solch unpräzise Fragen "eines Chef" kritisch zu hinterfragen.

Und zur Beruhigung: dies ist dann auch mein gewollt letzter Kommentar in diesem Thread.

Grüße,
crystal

Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am Juli 27, 2020, 13:36:17
@ebs17
Völlig richtig.
Nur sollte sich auch eine "Klartext-Suche" konkret auf Klartext-Felder einer (oder mehrerer) Tabellen beziehen und nicht auf "die Datenbank". In solchen Klartext-Feldern zu suchen, ist ein Abenteuer für sich, aber immer sinnvoller, als "alle Felder aller Tabellen" abzusuchen.
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 28, 2020, 21:20:17
@crystal:
Zitat....dass ein Chef meist sehr wenig Verständnis für Struktur und Aufbau einer Datenbank hat, liegt daran, dass er/sie mehr verdient und sich daher mit solchen Fragen an seine Mitarbeiter wenden darf...
Damit hast Du Dich leider disqualifiziert bei mir.
Meine Risiken, die ich in 45 Berufsjahren für meine Mitarbeiter eingegangen bin, bilden nicht eine Sekunde lang
das ab, was Du uns hier zu vermitteln versuchst.
Meine IT-Abteilungen hatten immer wieder enmpfohlen, "Datenbanken quer zu lesen".
Ich kannte und kenne auch erfahrungsmässig deren (auch Deine) Empfehlungen für weitere Vorgehensarten...
Erkläre mir mal, wie so ein "QUERLESEN" denn bei völlig unsortierten Inhalten von Tabellen brauchbare Ergebnisse in weiteren anderen Auswertungen ergeben soll.

ich erwarte keine Antwort,wie Du es schon freundlicherweise angedroht hattest.


 
Titel: Re: suche in allen tabellen nach String
Beitrag von: martie01 am Juli 29, 2020, 22:21:02
Hallo ,

ist ja schon irgendwie traurig-witzig, wie es im Laufe der Runde schon gar nicht mehr um das eigentliche Thema geht.

DF6GL, ich habe deine Tipps befolgt, bekomme trotzdem die Fehlermeldung: Objektvariable oder with Blockvariable nicht festgelegt. Snopp has come across...

Wenn ich das lokal Fenster verfolge, würde ich sagen, das er die Tabelle gar nicht findet?!

Bin aber auch eben nicht der Fachmann in diesem Gebiet.

Eine Idee? :o
Titel: Re: suche in allen tabellen nach String
Beitrag von: ebs17 am Juli 29, 2020, 23:18:01
Zum Löschen einer Tabelle muss die Tabelle vorhanden sein.
Zum Anlegen einer Tabelle darf die Tabelle noch nicht vorhanden sein.
Ist das jeweils nicht der Fall, darf man mit einer entsprechenden Fehlermeldung rechnen.

Dem kann man begegnen, indem man per On Error Resume Next blindlings Fehler und deren Meldungen ignoriert. Man könnte aber auch vorher prüfen, ob es die Tabelle gibt. Unter dem Namen TableExists gibt es sehr wahrscheinlich entsprechende veröffentlichte Lösungen.

Wenn man dann nach Texten in Datumsfeldern oder Zahlenfeldern filtert, sollte man sich auf weitere Fehler (Datentypfehler) gefasst machen - wenn man die Sinnfrage schon übergangen hat. Auch sollte man die Nichtberücksichtigung von Systemtabellen in seine Überlegungen einbeziehen, wenn "alle" keine Worthülse ist.

Zitatdas eigentliche Thema
Die Grundidee der Hinweise ist ja - und das sollte man inhaltlich zur Kenntnis nehmen wenn nicht gar verstehen wenn nicht gar zum eigentlichen Prinzip machen - dass man in einem geordneten Laden mit eigener Übersicht nicht überall nach etwas suchen muss, sondern auf Grund der Aufgabenstellung weiß, in welcher Tabelle der normalisierten Datenbank und genauer in welchem Feld sich bestimmte Informationen befinden werden, wenn sie vorhanden sind.
Solche Standardisierung hat u.a. dazu geführt, dass wir Autos aus der Serienproduktion fahren und nicht mehr Postkutschen mit einzeln designten Rädern und Achsen.
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 30, 2020, 15:06:49
ZitatSolche Standardisierung hat u.a. dazu geführt, dass wir Autos aus der Serienproduktion fahren und nicht mehr Postkutschen mit einzeln designten Rädern und Achsen.
Sie führte auch dazu, dass wir nicht Standardisiertes wegwerfen und Standardisiertes nach geplanter Nutzungszeit obsolet machen.
Komischerweise agieren inzwischen weltweite Geheimdienste wie Schrotthändler.
Sie sammeln einfach alles, um es irgendwann, wenn die Suchalgorithmen schlau genug sind, in ihre Datenbanken einarbeiten zu können.
Sie haben aber mal sicherheitshalber die Werte gesichert. Kommt dann ein Kunde und fragt nach einer Frontfensterdichtung eines Jaguar E aus dem Jahr 1968, dann antwortet der Datenspezialist, dass er leider erst
bei der Erfassung von Buchstabe "B" ist und der Lagerspezialist sagt, dass er mal in dem Bereich der
datenbankmässig noch nicht integrierten Teile einer aufgekauften Konkurrenzfirma mal nachschauen könne.
Noch viel besser und unschlagbar ist ein motivierter Lagerspezialist, der auch die etwas vernachlässigten Bereiche des Lagers kennt.
Eine grosse Hilfe für ihn wäre dann eine "querlesende" Suchroutine in dem Datenwust der übernommenen Konkurrenzfirma oder einfach noch viel besser ein fotografisch optimiertes Gedächtnis, wie es z.B. Auto-Gebrauchtteilehändler haben. Die brauchen keine Datenbank dafür.
Die wissen im Kopf, ob sie für die diversen Oldtimer oder Kutsche das passende Teil haben.
Wie sagte Theodor Fontane?: "Es ist ein weites Feld".
Praxis hits the theory.
Titel: Re: suche in allen tabellen nach String
Beitrag von: ebs17 am Juli 30, 2020, 17:10:08
ZitatNoch viel besser und unschlagbar ist ein motivierter Lagerspezialist, der auch die etwas vernachlässigten Bereiche des Lagers kennt.
Der sucht aber nicht über alles, sondern holt einfach ab. Das schneller, als er den Computer einschalten würde, und das "Programm" wäre was für die Kinder zum Spielen.
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 30, 2020, 17:57:47
Nein, der setzt sein Hirn ein und verlässt sich nicht stur auf irgendwelche KI-Intelligenzen etc.
Verlass doch einfach mal Dein Wolken-Kuckuksnest und erkundige Dich bei den Praktikern.
Titel: Re: suche in allen tabellen nach String
Beitrag von: martie01 am Juli 30, 2020, 21:13:14
Gut, also ich habe gelernt-> Ich suche  nicht blind in ALLLEN Tabellen sondern nur in bestimmten.
Wie bekomme ich denn eine Abfrage hin, die sich auf fest definierte Tabellen bezieht?

Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am Juli 31, 2020, 21:51:10
Hallo,
ich würde eine LIKE-Suchroutine mit Wildcards benutzen, oder vor Auslösen des Suchvorgangs
über eine Optionsgruppe verschiedene LIKE-Suchroutinen auswählbar machen.
Ausserdem würde ich alle Codezeilen mit
On Error Resume Next erst einmal auskommentieren,
um feststellen zu können, welche Fehler da ignoriert werden sollen.
Später würde ich sie mit einer sauberen Fehlerabarbeitungsroutine ersetzen.
Auskommentieren einer VBA-Codezeile wird mittels eines einfachen Hochkommatas (shift-#) getätigt.
Der Vorteil ist, dass man komplizierte Codezeilen nicht löschen muss, sondern vorübergehend für den
Compiler einfach mal aus seinen abzuarbeitenden Codezeilen ausblenden, dem Programmierer aber seine
wertvollen Codezeilen erhalten kann.
Ich hab diese Möglichkeit benutzt, um Dir meine alt/neu Vorschläge zu unterbreiten.

ich hab den folgenden Code bei mir in einer DB mit ca. 100.000 Datensätzen getestet, was jetzt nicht unbedingt
viel ist, aber zumindest zu einem passablen Zwischenergebnis führte.
Die Suchgeschwindigkeit über alle Tabellen und dortigen Feldern ergab bei mir eine Suchzeit < 7 sek. mit einer
LiKE-Suche mit dem Prinzip "*.*"

Grundsätzlich bekommst Du damit allgemeine Datenhinweise, durch welche Du nun durch weitere Selektionen per SQL
oder dem langsameren VBA Deine Ergebnisse erzielen kannst.
Diese Hinweise sagen aber nur aus, wieviele (Ocurrence) Treffer in welcher Tabelle und einem dortigen Feld
vorhanden sind.

Option Compare Database
Option Explicit

Private Sub CreateSnoop()

    'On Error Resume Next 'alt
    'Auf Fehler warten, um ihn zu begreifen 'neu
   
    Dim db As Dao.Database
    Dim td As Dao.TableDef
    Dim F As Dao.Field
   
    Set db = CurrentDb()
    Set td = db.CreateTableDef("tblSNOOP")

    Set F = td.CreateField("Occurence", DB_LONG)
    td.Fields.Append F
    Set F = td.CreateField("Table", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F
    Set F = td.CreateField("Field", DB_TEXT)
    F.AllowZeroLength = True
    td.Fields.Append F

    db.TableDefs.Append td

    db.Close

End Sub

Private Sub DeleteSnoop()

    'On Error Resume Next 'alt
    'Auf Fehler warten, um ihn zu begreifen 'neu
   
    Dim db As Dao.Database

    Set db = CurrentDb()
    db.TableDefs.Delete "tblSNOOP"

    Set db = Nothing

End Sub

Public Sub Go(SnoopFor As String)

    Call DeleteSnoop
    Call CreateSnoop
    Call Snoop(SnoopFor)

End Sub

Private Sub Snoop(SnoopFor As String)

    On Error GoTo Snoop_Err

    Dim db As Dao.Database
    Dim S As Dao.Recordset
    Dim T As Dao.Recordset
    Dim td As TableDef
    Dim L As Long
    Dim F As Long
    Dim criteria As String
    Dim occ As Long

    Set db = CurrentDb()
    'Set S = db.OpenRecordset("tblSNOOP", dbOpenDyanaset) 'alt
    Set S = db.OpenRecordset("tblSNOOP", dbOpenTable) 'neu
       
    'cycle through the tables
    For L = 0 To db.TableDefs.Count - 1

        Set td = db.TableDefs(L) 'set the table def

        If Not (td.Connect = "") Then 'is this table attached ?
       
            Set T = db.OpenRecordset(td.Name, dbOpenSnapshot) 'set the recordset

            'sTABLE.Caption = td.Name: DoEvents 'set caption

            For F = 0 To td.Fields.Count - 1 'now cycle through the fields as try to locate value

                'sFIELD.Caption = td.Fields(F).Name: DoEvents 'set caption
               
                'criteria = "CStr('' & [" & td.Fields(F).Name & "]) Like '" & SnoopFor & "'" 'alt
                criteria = "CStr('' & [" & td.Fields(F).Name & "]) Like '*" & SnoopFor & "*'" 'neu
                T.FindFirst criteria
               
                If Not (T.NoMatch) Then
                   
                    occ = 0
                    Do While Not (T.NoMatch) 'now are there any more ?
                   
                        T.FindNext criteria
                        occ = occ + 1

                    Loop

                    S.AddNew
                    S!Occurence = occ
                    S!Table = td.Name
                    S!Field = td.Fields(F).Name
                    S.Update
               
                End If

            Next F

        End If

    Next L

    T.Close
    S.Close
    Set db = Nothing

Snoop_Exit:
    DoCmd.OpenTable "tblSNOOP"
   
    Exit Sub

Snoop_Err:
    MsgBox Error$ & " : Snoop has come across an unforseen problem. Please contact the developer.", 16, "Message"
    Resume Snoop_Exit

    Exit Sub

End Sub
Titel: Re: suche in allen tabellen nach String
Beitrag von: crystal am August 01, 2020, 21:27:35
Habe mich entschlossen, den Eintrag zu löschen.
Titel: Re: suche in allen tabellen nach String
Beitrag von: derArb am August 03, 2020, 15:28:25
Hallo martie01,
ZitatDein Zitat in PN: ...Ich habe den Code in ein allg. Modul kopiert und aufgerufen.
Er löscht die Tabelle, erstellt eine Neue, macht dann jedoch Laufzeitfehler 91 und steigt bei T.close aus.
If Not (td.Connect = "") Then 'is this table attached ?Das funktioniert m.E. nur mit verknüpften Tabellen aus einem Backend kommend.
So ist es zumindest bei mir.
Sollte Deine DB nicht aufgeteilt sein in Frontend und Backend, dann ersetze das mit
If Left$(td.Name, 4) <> "Msys" Then 'neue Version - is this table attached ?In #11 gibt es noch einen Flüchtigkeitsfehler.
Es darf nicht heissen
Set S = db.OpenRecordset("tblSNOOP", dbOpenDyanaset) sondern
Set S = db.OpenRecordset("tblSNOOP", dbOpenDynaset)Das hatte ich nicht gleich erkannt und auf das langsamere dbOpenTable geändert.
Du kannst mir ja in PN antworten. Nur solltest Du da auch meine PN an Dich lesen.

Ganz allgemein finde ich diese Suchroutine für das gezielte Auffinden von Daten nicht so optimal.
Erstens bläht das dauernde Löschen und Neuerstellen von Tabellen per Code die DB sehr schnell auf
und sie muss immer wieder komprimiert/repariert werden, um den "Datenmüll" zu entfernen und
zweitens fehlt eine 2. Coderoutine, um gezielt zu einem dieser vielen gefundenen Datensätze springen zu können.
Ich würde das mit 2 Listenfeldern lösen.
Listenfeld_1 zeigt die gefundenen Tabellen und Tabellenfelder auf. Nicht gruppiert und nicht als Anzahl.
Listenfeld_2 zeigt bei Click auf einen Datensatz in Listenfeld_1 die dazugehörigen detaillierten Datensätze an.
Die auszuwerten dürfte dann ja dann kein Problem mehr bedeuten.

Titel: Re: suche in allen tabellen nach String
Beitrag von: martie01 am August 03, 2020, 18:29:33
Hy,
super, genau , das war es   ;D

jetzt funktioniert es...
Danke vielmals.....