Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Komfortable Suche - Fehler 3078 im VBA Code

Begonnen von accessy, November 21, 2012, 07:13:22

⏪ vorheriges - nächstes ⏩

accessy

Hallo Access - Experten,

ich habe mal gegoogelt und etwas gefunden,
was bereits schon vor langer Zeit mal gepostet wurde.

Ich habe einen Commandbutton mit einer Ereignisprozedur bei Klicken belegt.

Private Sub Befehl459_Click()
 Call suchenStr(tabelle$)
End Sub


Dann wird hieraus die Function aufgerufen.
Allerdings bekomme ich eine Laufzeitfehler 3078.
Das Microsoft Jet-Modul findet die Tabelle, oder Abfrage nicht.
Es ist diese Zeile, um die es geht.
Set rs = db.OpenRecordset(Kunden)
Im Original stand dort   Set rs = db.OpenRecordset(Tabelle)
Ich habe das Wort Tabelle gegen den Namen Kunden getauscht, weil meine Tabelle so heißt.
Die müsste die Function doch finden?

Kann mir da jemand sagen, warum die nicht gefunden wird?


Function suchenStr(tabelle$)

'diese Funktion sucht in einer Tabelle in beliebig vielen Feldern auch einen Teilstring
'Eingabe in die Inputbox ohne Sternchen und ohne "
'Günther Ritter gritter@ gmx.de
'http://www.ostfrieslandweb.de/ kostenlose ACCESS-Beispiele

Dim db As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Function
Set db = CurrentDb
Set rs = db.OpenRecordset(Kunden)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
   strSQL = strSQL & " or " & rs.Fields(I).Name _
   & " like '*" & begriff & "*'"
Next

   rs.Close

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
      If rs.RecordCount = 1 Then
        MsgBox "Treffer"
      Else
        MsgBox "Kein Treffer"
      End If
    rs.Close
 Set db = Nothing
End Function

database

Hallo,

wenn du mit Klick auf den Button den Namen der Tabelle übergeben willst, muss dieser Name an der Stelle auch bekannt sein:


Private Sub Befehl459_Click()

    Dim TabellenName as String
   
    TabellenName = "NameDeinerTabelle"

    Call suchenStr(TabellenName)

End Sub



Dann sollte die Übergabe / Übernahme an eine Andere Prozedur auch funktionieren.
Nimm statt einer Function in DIESEM Fall eine 'normale' Prozedur  ;)


Sub suchenStr(TabellenName)

'diese Funktion sucht in einer Tabelle in beliebig vielen Feldern auch einen Teilstring
'Eingabe in die Inputbox ohne Sternchen und ohne "
'Günther Ritter gritter@ gmx.de
'http://www.ostfrieslandweb.de/ kostenlose ACCESS-Beispiele

Dim db As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Function
Set db = CurrentDb
Set rs = db.OpenRecordset(TabellenName)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
    strSQL = strSQL & " or " & rs.Fields(I).Name _
    & " like '*" & begriff & "*'"
Next

    rs.Close

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
       If rs.RecordCount = 1 Then
         MsgBox "Treffer"
       Else
         MsgBox "Kein Treffer"
       End If
     rs.Close
  Set db = Nothing
End Sub



ebs17

Kleiner Nachtrag zu "komfortable Suche":

Wenn eine Zeichenkette in allen Feldern einer Tabelle (inklusiv der vorhandenen ID?) gesucht wird, ist das vor allem ein Hinweis auf Planlosigkeit und in einer wohlgeordneten Tabelle entsprechend einer vorgenommenen Datenmodellierung wohl kaum vorstellbar,
- weil dann gleiche Informationen in einem Feld liegen würden
- und ein Textvergleich für Boolean-, Zahlen und Datumsfelder sicher an Fehlern scheitern würde.

MfGA
ebs
Mit freundlichem Glück Auf!

Eberhard

accessy

Hallo Peter,

ich habe es mal nach deinen Vorgaben geändert.
Leider ist der Fehler immer noch der gleiche, an gleicher Stelle.

Private Sub Befehl459_Click()
  Dim TabellenName As String
  TabellenName = "Kunden"
  Call suchenStr(Kunden)
End Sub


Private Sub suchenStr(Kunden)

Dim db As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Sub
Set db = CurrentDb
Set rs = db.OpenRecordset(Kunden)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
strSQL = strSQL & " or " & rs.Fields(I).Name _
& " like '*" & begriff & "*'"
Next
rs.Close

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

If rs.RecordCount = 1 Then
MsgBox "Treffer"
Else
MsgBox "Kein Treffer"
End If
rs.Close
Set db = Nothing
End Sub

Maxel

#4
Hallo,

Call suchenStr(Tabellenname)

...

Private Sub suchenStr(Tabellenname As String)

...

& " from " & Tabellenname & " where "
Viele Grüße
Maxel

accessy

Hallo erstmal,

sag mal, hast du den Code bei dir mal getestet?
Läuft der bei dir?

Also ich kann hier ändern was ich will,
ich bekomme immer diesen Laufzeitfehler 3078.

Auch mit deinem Vorschlag..

Beaker s.a.

Hallo Achim,
Lass Dir doch mal die Variable "strSQL" im Direkt-
fenster ausgeben und schau was da raus kommt.
Wenn Du da den Fehler nicht selber findest, kannst
Du den String ja hier posten.
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)

database

Hallo,

also:

Wenn du den Namen der Tabelle aus dem Buttonklick heraus an die Prozedur übergeben willst machst du das so:

Private Sub Befehl459_Click()
  Dim TabellenName As String
  TabellenName = "Kunden"
  Call suchenStr(TabellenName)
End Sub



Die Variable 'TabellenName' enthält zu diesem Zeitpunkt bereits den Namen deiner Tabelle 'Kunden'
Die Prozedur sollte dann genau so aussehen:


Private Sub suchenStr(TabellenName As String)

Dim db As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Sub
Set db = CurrentDb
Set rs = db.OpenRecordset(TabellenName)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & TabellenName & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
strSQL = strSQL & " or " & rs.Fields(I).Name _
& " like '*" & begriff & "*'"
Next
rs.Close

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

If rs.RecordCount = 1 Then
MsgBox "Treffer"
Else
MsgBox "Kein Treffer"
End If
rs.Close
Set db = Nothing
End Sub




Weiter sollte diese Bedingung geändert werden ...

If rs.RecordCount = 1 Then

Sollte deine Suche nämlich 2 Datensätze ergeben bekommst du als Message  'Kein Treffer'

Daher:

If rs.RecordCount >= 1 Then

HTH

accessy

Hallo Ekkehard,

das mit dem Direktfenster habe ich nicht so drauf.
Wie muss ich denn die Variable da eingeben, um etwas erkennen zu können?
Bin leider kein VBA Experte. Das Überwachungsfenster nutze ich schon gelegentlich.
Aber mit diesem Direktfenster kann ich irgendwie nichts anfangen.

Hallo Peter,
wir kommen der Sache langsam näher.
So sieht der Code nun aus:
Jetzt kommt der Laufzeitfehler 13, Typen unverträglich.
Und es ist wieder diese Zeile hier.
  Set rs = db.OpenRecordset(TabellenName)

Ich vermute, dass hier ein Konflikt zwischen STRING und Objekt vorliegt.


Private Sub Befehl459_Click() 
Dim TabellenName As String 
TabellenName = "Kunden" 
Call suchenStr(TabellenName)
End Sub


Private Sub suchenStr(TabellenName As String)

Dim db As Database
Dim rs As Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Sub
Set db = CurrentDb
Set rs = db.OpenRecordset(TabellenName)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"
   For I = 1 To rs.Fields.Count - 1
      strSQL = strSQL & " or " & rs.Fields(I).Name _
      & " like '*" & begriff & "*'"
   Next
rs.Close
Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)
  If rs.RecordCount >= 1 Then
     MsgBox "Treffer"
   Else
     MsgBox "Kein Treffer"
  End If
rs.Close
Set db = Nothing
End Sub

database

Hallo,

ich muß ganz ehrlich sagen, dass ich das selbst noch nie so verwendet habe:

Set rs = db.OpenRecordset(TabellenName)

Schreib statt dessen einfach mal     Set rs = db.OpenRecordset("SELECT * FROM Kunden")

oder lege den Code so an, wie du ihn auch weiter unten verwendest:

Dim strSQL1 As String

strSQL1 = "SELECT * FROM '" & TabellenName & "'"
Set rs = db.OpenRecordset(strSQL1)


Und diese Zeile ist noch immer falsch!

& " from " & tabelle & " where " _

die MUSS so lauten:

& " from " & TabellenName & " where " _

oder

& " from Kunden where " _

ZitatAber mit diesem Direktfenster kann ich irgendwie nichts anfangen.
Mit Hilfe des Direktfensters ist es Möglich verschiedene Anweisungen dort DIREKT ausführen zu lassen
oder z.B. den Wert einer Variablen zur Laufzeit auszugeben.
Das kannst du bewerkstelligen in dem du den Befehl  'debug.print' verwendest.


strSQL = "select " _
& rs.Fields(0).Name _
& " from " & TabellenName & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
strSQL = strSQL & " or " & rs.Fields(I).Name _
& " like '*" & begriff & "*'"
Next
rs.Close

'Ausgabe von strSQL ins Direktfenster
Debug.Print strSQL

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)



Auf diese Zeile ...

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

...setzt du einen Haltepunkt, dann kannst du sehen, welchen SQL-String du gegen die DB schickst.

accessy

Hallo Peter,

habe alle deine Vorgaben umgesetzt.
Der Haltepunkt brachte mir ebensowenig eine neue Erkenntnis wie das Debug.print im Direktfenster,
weil der Code gleich in der Zeile

Set rs = db.OpenRecordset("SELECT * FROM Kunden")

mit der gleichen Fehlermeldung stehen bleibt wie gehabt.
Fehler 13, Typen unverträglich.

Der Code ist nicht von mir, Peter.
Den habe ich gefunden beim Googeln.
Der ist 8 Jahre alt.

DF6GL

Hallo,


Dim db As DAO.Database
Dim rs As DAO.Recordset

und Verweis setzen auf die Dao3.6-Library

accessy

Also den Verweis brauchte ich nicht setzen; der war schon aktiviert.
Dann habe ich die beiden

Dim db As DAO.Database
Dim rs As DAO.Recordset

eingebaut.

Es wird mit jedem Hinweis interessanter, ob das je funktionieren wird.
Jetzt sieht der Code so aus und bringt den
Laufzeitfehler 3131    Syntaxfehler in FROM-Klausel.
und es wird diese Zeile hervorgehoben.

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)



Private Sub suchenStr(TabellenName As String)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim FeldCnt%, I%, strSQL$, begriff$

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Sub
Set db = CurrentDb
Set rs = db.OpenRecordset(TabellenName)

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & tabelle & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
    strSQL = strSQL & " or " & rs.Fields(I).Name _
    & " like '*" & begriff & "*'"
Next
   rs.Close

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

If rs.RecordCount >= 1 Then
     MsgBox "Treffer"
   Else
     MsgBox "Kein Treffer"
End If

rs.Close
Set db = Nothing
End Sub

database

#13
Hallo,

strSQL = "select " _
& rs.Fields(0).Name _
& " from " & TabellenName & " where " _
& rs.Fields(0).Name _
& " like '*" & begriff & "*'"

For I = 1 To rs.Fields.Count - 1
strSQL = strSQL & " or " & rs.Fields(I).Name _
& " like '*" & begriff & "*'"
Next
rs.Close

'Ausgabe von strSQL ins Direktfenster
Debug.Print strSQL

Set rs = db.OpenRecordset(strSQL, dbOpenSnapshot)

Du hast die oben rot markierte Änderung noch immer nicht umgesetzt.
Der Fehler in der FROM-Klausel kommt daher, dass Access die Variable 'tabelle' nicht kennt, du musst stattdessen die Variable 'TabellenName' verwenden!

DF6GL

Hallo,

habe den Code nicht komplett analysiert und auch nicht den ganzen Thread durchgelesen...   Was genau willst Du denn machen?


Eine Suche nach einem bestimmten Begriff über alle Tabellenfelder ist eher konzeptlos anstatt in irgendeiner Form nötig. Und eine allgemeine Funktion für die Suche nach/in einem bestimmten Feld einer bestimmten Tabelle erfordert wesentlich höheren Aufwand wegen der nötigen Berücksichtigung der Datentypen der einzelnen Tabellenfelder.

Eine Suche über alle auswertbaren(!) Felder  in einer bestimmten Tabelle könnte im Prinzip so aussehen:


Private Sub suchenStr(TabellenName As String)

Dim db As DAO.Database
Dim rs As DAO.Recordset, fld As DAO.Field
Dim FeldCnt As Long, I As Long, strSQL As String, begriff As String

begriff = InputBox("Suchbegriff eingeben")
If begriff = "" Then Exit Function
Set db = CurrentDb
Set rs = db.OpenRecordset("Select * from [" & TabellenName & "]", dbOpenSnapshot)

Do Until rs.EOF
On Error Resume Next
For Each fld In rs.Fields
If fld.Value Like "*" & begriff & "*" Then
MsgBox fld.Name & ": " & fld.Value
End If



Next

rs.MoveNext
Loop

rs.Close
Set db = Nothing
End Sub