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
Hallo,
mal ne Frage, wieso kann es bei dir sein, dass ein Name in mehreren Tabellen vorkommt?
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..
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
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
Hallo,
ohh...Entschuldigung
Es gibt doch da nichts zu entschuldigen.... :)
@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?
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
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
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")
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
Hallo,
er möchte doch gern die Google-Suche nachbauen.... ;D ;)
;D :o
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.
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.
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
@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.
@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.
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
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.
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.
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.
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.
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?
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
Habe mich entschlossen, den Eintrag zu löschen.
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.
Hy,
super, genau , das war es ;D
jetzt funktioniert es...
Danke vielmals.....