Tabelleninhalt in allen verfügbaren Tabellen suchen.

Moderator: ModerationP

Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 15. Okt 2019, 08:56

Hi,

ich suche einen Wert in einer realtiv großen Datenbank mit vielen Tabellen und Spalten.

99100094

Mir ist nur wichtig zu wissen, wo dieser Wert vorhanden ist, ich habe aber keinen Anhaltspunkt, wie der Feldname sein könnte. Es soll keine hochwertige Suchfunktion werden sondern es reicht die Tabellen und Spalten in der Datenbank alle zu durchlaufen und jedes Feld mit dem Suchbegriff zu matchen. Beim Treffer soll er erstmal stoppen und mir ausgeben in welcher Tabelle und welcher Spalte er den Wert gefunden hat. Oder soll diese Info in einer Match Tabelle auflisten. Das reicht.

Ich wüsste jetzt nicht wie ich das "auf die Schnelle" realisieren könnte. Es gibt zwar Gobale Suchfunktionen die das sozusagen können, jedoch ist der Aufwand für den Nutzen unwirtschaftlich, weil ich wirklich nur wissen muss, in welchem Feld und welcher Tabelle steht dieser Wert.

Hat jemand eine Zündende Idee wie ich das machen kann? (Eine Datenbankdokumentation liefert meines wissens nur Feldnamen, leider keine Inhalte.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon KlausMz » 15. Okt 2019, 09:06

Hallo,
macht es wirklich Sinn, in allen Feldern und Spalten zu suchen ?
Es kann doch nicht sein, dass mann z.B. wegen der Suche nach der PLZ überall suchen muss.
Du musst doch wissen, was der gesuchte Wert für eine Bedeutung hat.
Gruß
Klaus . . . . . Feedback wäre wünschenswert.
Ich möchte bitte keine unaufgeforderten PN. Fragen bitte im Forum.
Benutzeravatar
KlausMz
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 39264
Registriert: 06. Okt 2003, 15:09
Wohnort: Irgendwo in der Pfalz

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon Gast » 15. Okt 2019, 09:36

in allen Tabellen suchen

... zeugt von einer erheblichen Unübersicht (oder Unordnung).

Wenn man ob der Bedeutung von 99100094 eine Vorstellung hätte und Tabellenbezeichnungen oder gar deren Feldnamen "sprechende" Bezeichnungen wären, könnte man "alle" auf ganz wenig einschränken.

Die Suche dürfte ja mit Tabellen beginnen.
Eine Variante, wäre, den Tabelleninhalt in Text zu verwandeln (Textexport, ADO-Recordset.Getstring) und dann den Text mit Instr zu prüfen.
Für interessante Tabellen müsste man dann die Feldauflistung ermitteln, vermutlich Date- und Boolean-Felder gleich ausschließen und eine Abfrage mit Spaltentest dynamisch erstellen und anwenden. Alternativ könnte man wiederum die Einzelspalten als Text ausgeben und diesen prüfen.
Gast
 

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 15. Okt 2019, 10:38

Gebe ich euch recht. Ist auch knifflig was ich hier habe.

Ich versuch euch mal das aktuelle Problem zu beschreiben.

Der besagte Wert ist die "aktuellste" Artikelnummer eines Artikelstammes die "neu" vergeben werden würde. Allerdings von einer Demodatenbank

Problem bei einer bestehenden Datenbank (mit anderen Nummernkreis) ist, das man einen Dummy angelegt hat mit Artikel Nr 89999, Das Warenwirtschaftsprogramm meckert jetzt seit nem Update das keine neue Artikelnummer vergeben werden kann, weil die aktuell höchste bereits vergeben wurde (siehe dummy). (Weil die eben manuell eingegeben wurde). Nur damit hat man sich seit der aktuellen Version die Autovergabe von freien Artikelnummern zerschossen. Artikel einfach löschen ist aber nicht drin, weil das schon mehrere Jahre so ist und darüber bereits Belege gelaufen sind.

Jetzt Doktor ich etwas an der Demodatenbank herum um herauszufinden, wie die automatische Artikelnummervergabe denn arbeiten könnte.
Viele Warenwirtschaftsprogramme haben ein Feld, in der die nächste Artikelnummer vorgemerkt gespeichert wird, und nach Anlage einfach +1 aktualisiert wird.
Habe bei der Demodatenbank auch schon die Artikelnummer sozusagen mal neu definiert mit zwei Strings und 5 Zahlenstellen, dann schlägt er mir bei Neuanlage erstmal trotzdem automatisch wieder die oben genannte Nummer vor (als ob keine Änderung erfolgt ist), obwohl der Nummernkreis auf DE000000 geändert wurde. Sobald ich aber anfange DE einzugeben, schlägt er mir ala Autovervollständigung dann die neue korrekte Artikelnummer vor.

Das wär für mich erstmal ein Indikator dafür das ich recht haben könnte und die "neu" definierte Artikelnummer nur nicht als erster Datensatz in dieser Tabelle geführt ist.

Worauf ich hinaus möchte ist folgendes. Feld finden, Wert auf den aktuell neusten Wert zurückändern und schon könnte die automatische Vergabe wieder funktionieren.
Da aber die Frage, wenn es das gibt, wo?

Und einziger konkreter Anhaltspunkt ist eben die noch nicht vergebene aber bereits vorgeschlagene Artikelnummer, denn die gibts nur in einem Feld. Oder wird zumindest davon berechnet.
Zuletzt geändert von MrZOrtrax am 15. Okt 2019, 10:45, insgesamt 1-mal geändert.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon knobbi38 » 15. Okt 2019, 10:41

Hallo,

dann würde ich mal die Hotline des Herstellers kontaktieren.

Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1514
Registriert: 02. Jul 2015, 14:23

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 15. Okt 2019, 11:03

Der Hersteller sagt "erstmal", das sei so nicht vorgesehen das man einen Dummy anlegt. Kann man rausprogrammieren lassen, aber das kostet Geld. Und das seh ich erstmal nicht ein. Jetzt kann ich zwar sagen das ist ein Bug und mich mit dem Hersteller drüber streiten bis er einsieht das es saubeutelich programmiert gewesen ist. Aber das dauert ja alles zu lange. Sowas zieht sich wochen und monate.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon derArb » 15. Okt 2019, 12:54

Hallo,
Du kannst doch die Tabellennamen über Dao.Tabledefs einlesen.
z.B. so:
Code: Alles auswählen
Private Sub TabellenAuslesen_Click()
    Dim TabListe() As String, i As Integer
    Dim AktTable As DAO.TableDef
    Dim Liste As String
    ReDim TabListe(0)
    For Each AktTable In CurrentDb.TableDefs
        If AktTable.Attributes = 0 Then
          'Anzeigen nur bestimmter Tabellen, deren Namen mit "TAB" anfangen
          'If Mid(AktTable.Name, 1, 3) = "TAB" Then
             ReDim Preserve TabListe(UBound(TabListe) + 1)
             TabListe(UBound(TabListe) - 1) = AktTable.Name
          End If
        'End If
    Next AktTable
    For i = 0 To UBound(TabListe) - 1
        Liste = Liste & ";" & TabListe(i)
    Next i
    Me!DeinListenfeld.RowSourceType = "Value List"
    Me!DeinListenfeld.RowSource = Mid(Liste, 2)
End Sub


Diese Liste benutzend könntest du nun die Felder nach einer Fields-Auswertung über DAO durchsuchen.
Hier ein Beispiel aus einer Suche in einem Kundenformular mit einer Datenquelle "qry_Kundensuche"
Diese Datenquelle musst du in einer Schleife mit Deinen Tabellennamen durchlaufen lassen,
oder über die Auswahl der Tabellen in einem Kombifeld auswählen.

Code: Alles auswählen
Private Sub Suchenfeld_AfterUpdate()
'Suchen über alle Tabellenfelder
' mit + kann man mehrere Suchparameter als UND-Suchkondition eingeben
' mit der Tilde kann man Suchparameter als ODER-Suchkondition eintragen
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
On Error GoTo Fehler

  Me.Filter = ""
  Me.FilterOn = False
  Einlesen = ""
  '################################################################################
  '######### ***** tbl_Kunde mit gewünschter Tabelle austauschen  ***** ###########
  Einlesen = "SELECT * FROM qry_Kundensuche"
  '################################################################################
  '################################################################################
 
  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), "  ", " ")
  strMuster = Replace(StrConv(strMuster, vbProperCase), "~", " ~ ") 'Aug.2019 NEU
                                                           'noch klären: strMuster = Replace(strSuchText, Chr(160), " ")
  intFeld = rs.Fields.Count
  'Trennzeichen für Mehrfache Begriffe mit OR = "~"
  varInhalt = Split(strMuster, " ")
  For intI = LBound(varInhalt) To UBound(varInhalt)
    If Len(varInhalt(intI)) > 0 Then
      'Trennzeichen für Mehrfache Begriffe mit AND = "+"
      If varInhalt(intI) = "+" Then
        strlink = " And ("
       Else
        'Anzahl der zu durchsuchenden Tabellen-/Abfragenfelder bestimmen. Die Reihenfolge zählt von links nach rechts.
        For intFeld = 1 To rs.Fields.Count 'statt rs.Fields.Count die Zahl der Felder eingeben.
          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 '& SortRichtung
  Debug.Print Einlesen
  Me!LstVollsuche.RowSource = Einlesen
  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


Das wäre ein Ansatz. Hierzu auch eine Beispiel DB mit kleiner Kundendatensuche in allen Feldern.
Darin soll mit einer kleinen Suchroutine nach folgendem gesucht werden:
"Bei irgendeinem Kunden gibt es in irgendeinem seiner Felder der Suchwert ""XYZ"".
Zeige mir alle Datensätze aller Kunden in einem Listenfeld, in welchen dieser Suchwert auch als Teilbegriff enthalten ist.
Zusätzlich kann auch nach mehreren Teilbegriffen mittels UND-Methode bzw. ODER-Methode gesucht werden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von derArb am 15. Okt 2019, 13:07, insgesamt 2-mal geändert.
MfG
derArb

Scio me nihil scire...Εν οίδα οτι ουδέν οίδα... Ich weiss, dass ich nichts weiss (Sokrates)
Ich bevorzuge Beiträge mit korrekter deutscher Grammatik.
derArb
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 14439
Registriert: 19. Apr 2006, 18:39
Wohnort: Berlin

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon Gast » 15. Okt 2019, 13:02

Die Demo hat offenen Programmcode?

Eine automatische Artikelnummervergabe kann man an Prozessen / Formularen festmachen und somit diese analysieren. Das wäre zielgerichtet und für die Folge nachhaltig.
Gast
 

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 17. Okt 2019, 07:27

Der Ansatz sieht gut aus, jetzt musste ich (weil es sich um ODBC Verknüpfungen handelte) das erstmal als Tabelle importieren, aber damit sollte es gehen. =) Ich check das mal weiter ab.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 17. Okt 2019, 07:45

Hm im zweiten Test mit den original Tabellen kommt ein Laufzeitfehler:

Code: Alles auswählen
2176 (Die Einstellung dieser Eigenschaft ist zu lang)
    Me!DeinListenfeld.RowSource = Mid(Liste, 2)


Ich umgehe das Problem, indem ich das anstatt in ein Textfeld / Listbox das in eine separate Tabelle anfüge.

Jetzt habe ich ein Tabelle "Inhalt" mit der Spalte "Inhalt" als Text definiert. Und die Namen sind wunderbar drin aufgeführt.

Ich habe anschließend die Datenherkunft von der Listbox auf die Tabelle oben verlinkt. Jetzt stehen die Daten auch drin.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 17. Okt 2019, 09:04

Jetzt häng ich ein bisschen fest und weiß nicht weiter.

Bei unterer Funktion habe ich ein Textfeld namens Suchenfeld erstellt.

Bei der Funktion an sich habe ich folgenden Inhalt ergänzt:
Code: Alles auswählen
Einlesen = "SELECT * FROM " & Me.Inhalt


Code: Alles auswählen
'Me!LstVollsuche.RowSource = Einlesen


hab ich auskommentiert.

Anschließend gelooped (Einlesen = "SELECT * FROM " & Me.Inhalt) mit neuem Inhalt.

OK. Zwischenzeitlich konnte ich klären woran das liegt. Der Name vom Suchfeld war fasch. Soweit geht es jetzt weiter,

Allerdings werde ich nun beim Ausführen bei ganz vielen Feldern Parameter für (Kontenplan) gefordert. Was hat es nun damit auf sich...
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 17. Okt 2019, 12:07

Das hier sind Ergebnisse aus dem Direktbereich:

Code: Alles auswählen
SELECT * FROM dbo_BCSPjmAdressenKontakt Where ([Mandant] Like '99100094*' Or [Adresse] Like '99100094*' Or [Kontaktplan] Like '99100094*' Or [Intervall] Like '99100094*' Or [Intervalltyp] Like '99100094*' Or [Wochentag] Like '99100094*' Or [Tageszeit] Like '99100094*' Or [Ausfuehrer] Like '99100094*' Or [AnsprechpartnerID] Like '99100094*' Or [Information] Like '99100094*' Or [Timestamp] Like '99100094*')
SELECT * FROM dbo_BCSPjmAdressenKontaktFolge Where ([Mandant] Like '99100094*' Or [Adresse] Like '99100094*' Or [Kontaktplan] Like '99100094*' Or [Intervall] Like '99100094*' Or [Intervalltyp] Like '99100094*' Or [Wochentag] Like '99100094*' Or [Tageszeit] Like '99100094*' Or [Ausfuehrer] Like '99100094*' Or [AnsprechpartnerID] Like '99100094*' Or [Information] Like '99100094*' Or [Timestamp] Like '99100094*') OR ([Mandant] Like '99100094*' Or [PosID] Like '99100094*' Or [Adresse] Like '99100094*' Or [Vorgang] Like '99100094*' Or [Timestamp] Like '99100094*')
SELECT * FROM dbo_BCSPjmArtikelObjektVerbrauch Where ([Mandant] Like '99100094*' Or [Adresse] Like '99100094*' Or [Kontaktplan] Like '99100094*' Or [Intervall] Like '99100094*' Or [Intervalltyp] Like '99100094*' Or [Wochentag] Like '99100094*' Or [Tageszeit] Like '99100094*' Or [Ausfuehrer] Like '99100094*' Or [AnsprechpartnerID] Like '99100094*' Or [Information] Like '99100094*' Or [Timestamp] Like '99100094*') OR ([Mandant] Like '99100094*' Or [PosID] Like '99100094*' Or [Adresse] Like '99100094*' Or [Vorgang] Like '99100094*' Or [Timestamp] Like '99100094*') OR ([Mandant] Like '99100094*' Or [Artikelnummer] Like '99100094*' Or [Position] Like '99100094*' Or [ZaehlerID] Like '99100094*' Or [Intervall] Like '99100094*' Or [OderZaehlerID] Like '99100094*' Or [OderIntervall] Like '99100094*' Or [Verbrauchartikel] Like '99100094*' Or [Menge] Like '99100094*' Or [Memo] Like '99100094*' Or [Timestamp] Like '99100094*')
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon MrZOrtrax » 17. Okt 2019, 12:08

Ah ok. Anhand der Beispieldatei stelle ich fest, das die generierten SQL abfragen sozusagen in die Listbox geladen werden.

Hier macht mir leider die unterschiedliche Tabellenspalten einen Strich druch die Rechnung... Das muss irgendwie anders gehen...

Wie kann ich denn z.B. einfach nur kontrollieren ob der generierte Code ausgeführt ein Suchergebnis liefert? Müsste nichtmal so gut optisch angezeigt werden als im Beispiel.
MrZOrtrax
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 242
Registriert: 21. Aug 2016, 12:21

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon Gast » 17. Okt 2019, 13:39

Ganz schön umständlich.

Wenn man feststellen möchte, in welchen Feldern der Begriff vorkommt, müsste man die Felder einzeln prüfen. Wenn man eine ganze Liste an Feldern mit OR verknüpft, erfährt man ja nur, dass der Begriff in der Tabelle in irgendeinem Feld vorkommt.

Folgender Ablaufplan wäre denkbar:

Code: Alles auswählen
Schleife über alle relevanten Tabellen
   Recordset auf "SELECT * FROM Tabellenname"
   Schleife über die Recordsetfelder
      Wenn Feld vom Typ Text dann
         Wenn DCount("*", "Tabellenname", "Feldname = '" & Suchtext & "'") > 0 dann
            schreibe Tabellenname, Feldname, Anzahl
         Ende wenn
      Ende wenn
   Ende Recordsetschleife
Ende Tabellenschleife
Gast
 

Re: Tabelleninhalt in allen verfügbaren Tabellen suchen.

Beitragvon Gast » 17. Okt 2019, 18:15

Oh, da beisst man sich ja selbst in den Hintern, sorry.
Das ist ja alles schon vorgeschlagen worden (las ich) mit der Angabe, den angeführten Code als Ansatz zu verstehen.
Wie man relevant uninteressante Tabellen im Vorfeld wegfiltern kann, fällt mir jetzt auch nicht ein, wenn man gar nicht mehr an das dB-Modell rankommen kann.
Es ist also doch eher weniger umständlich, im Vorfeld relevant unwichtige Tabellen einfach bei der Auswertung mit eingebunden zu lassen, als deren Relevanz
erst einmal umständlich auzuwerten und auszufiltern.
Gast
 

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: Raubgraf und 9 Gäste