VB6: Abfrage in Access erstellen

Huhu
hab folgendes Problem:

Dim DB As DAO.Database
Dim Abfrage As DAO.QueryDef
Dim str As Variant
Dim strSQL As String

Set DB = OpenDatabase(Laufwerkpfad)

str = „35391100 187533 6“

strSQL = „SELECT Einsatz.SeriennummerTel, Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von, Einsatz.Bis, Einsatz.Bearbeiter FROM einsatz WHERE (((Einsatz.SeriennummerTel)=str));“

Set Abfrage = DB.CreateQueryDef(„tempAbfrage“, strSQL)
DoCmd.OpenQuery Abfrage.Name
DB.QueryDefs.Delete „tempAbfrage“
DB.Close
Abfrage.Close

DoCmd.Close

ich bekomme immer die Meldung:

„laufzeitfehler ‚7874‘:
Microsoft Access kann das Objekt „tempAbfrage“ nicht finden“

kann mir jemand sagen warum der Code nicht funktioniert?

Huhu

Hallo Patric,

hab folgendes Problem:

Naja schauen wir einmal :wink:
Aber vorerst mal eine Frage. Warum verwendest du DAO anstatt ADO?
Mit DAO habe ich schon sehr lange nichts mehr zu tun gehabt, aber dennoch wollen wir mal schauen :smile:

Dim DB As DAO.Database
Dim Abfrage As DAO.QueryDef
Dim str As Variant
Dim strSQL As String

Soweit schaut es gut aus!

Set DB = OpenDatabase(Laufwerkpfad)

Was ist Laufwerkpfad? Eine Function? Eine Variable? Wenn ja wo ist sie declariert?

str = „35391100 187533 6“

Die Variable Str ist vonm Typ Variant! Du weisst ihr aber ein String zu. Warum declarierst du sie nicht als String?
Selbst und wenn würde ich die Zuweisung wiefolgt machen

str=cstr("35391100 187533 6")



> strSQL = "SELECT Einsatz.SeriennummerTel,  
> Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von,  
> Einsatz.Bis, Einsatz.Bearbeiter FROM einsatz WHERE  
> (((Einsatz.SeriennummerTel)=str));"

Auch hier liegt schon ein Fehler vor!
Du stellst einen Vergleich. Du hast aber die Variable als Variant declariert! 
Welchen Typ hat denn das Feld Einsatz.Seriennummer?
Desweiteren willst du Strings vergleichen so setzt man die immer in '!
Auch hast du hier die Möglichkeit, wenn es sich um einen Stringvergleich handelt das du das = durch den Operator Like ersetzen kannst!
In deinem Falle wäre es dann so!



    
    strSQL = "SELECT Einsatz.SeriennummerTel,Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von,Einsatz.Bis, Einsatz.Bearbeiter FROM Einsatz WHERE Einsatz.SeriennummerTel Like '" & str & "';"





> Set Abfrage = DB.CreateQueryDef("tempAbfrage", strSQL)

Ich glaube hier liegt der Hund begraben! Du musst eine Variable übergeben die den Namen für die Pass Trough beinhaltet.
Probiere mal folgendes



    
    Dim AbfrageName as String
    Abfragename="TempAbfrage"
    Set Abfrage=db.CreateQueryDef(Abfragename,strSql)






> DoCmd.OpenQuery Abfrage.Name


Auch hier musst du den Abfragename angeben, der erstellten Pass Trough Abfrage!
Was ist Abfrage für ein Object?
Was ist Name für ein Object?
Auch musst du mal schauen. Name ist sicherlich ein reserviertes Wort!
Unter VB ist es zumindest so!



> DB.QueryDefs.Delete "tempAbfrage"

Auch hier übergebe mal lieber eine Variable!



    
     Abfragename ="TempAbfrage"
     db.QueryDefs.Delete Abfragename






> DB.Close

Soweit ok



> Abfrage.Close

Auch Ok


> DoCmd.Close

Auch Ok


> 




> ich bekomme immer die Meldung:  
>   
> "laufzeitfehler '7874':  
> Microsoft Access kann das Objekt "tempAbfrage" nicht finden"

In welcher Zeile tritt denn der Fehler auf?



> kann mir jemand sagen warum der Code nicht funktioniert?

siehe oben :smile:
Wie gesagt. Meine Aussagen sind auf VB zutreffend. Sollte aber in deinem Falle auch stimmen. 

MfG

vielen dank für die antwort und die kleinen Korrekturen :smile:

Huhu

Hallo Patric,

hab folgendes Problem:

Naja schauen wir einmal :wink:
Aber vorerst mal eine Frage. Warum verwendest du DAO anstatt
ADO?

ich kenne mich mit vb und vba leider überhaupt nicht aus, ich habe lediglich gute grundkenntnisse in c und c++, ich hatte auch mal einen access mit vba crashcurs aber ist leider schon fünf jahre her :smile:
ich habe damals dao gelernt und kenne ado leider noch nicht. ist jetzt meine erste Datenbank seit dem besagten Kurs.

Mit DAO habe ich schon sehr lange nichts mehr zu tun gehabt,
aber dennoch wollen wir mal schauen :smile:

Dim DB As DAO.Database
Dim Abfrage As DAO.QueryDef
Dim str As Variant
Dim strSQL As String

Soweit schaut es gut aus!

Set DB = OpenDatabase(Laufwerkpfad)

Was ist Laufwerkpfad? Eine Function? Eine Variable? Wenn ja wo
ist sie declariert?

Laufwerkpfad ist eine globale funktion die einen string zurück gibt.
ich verwende sie in allen Formulare um die datenbank objekte zu erstellen.

str = „35391100 187533 6“

Die Variable Str ist vonm Typ Variant! Du weisst ihr aber ein
String zu. Warum declarierst du sie nicht als String?
Selbst und wenn würde ich die Zuweisung wiefolgt machen

str=cstr(„35391100 187533 6“)

strSQL = „SELECT Einsatz.SeriennummerTel,
Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von,
Einsatz.Bis, Einsatz.Bearbeiter FROM einsatz WHERE
(((Einsatz.SeriennummerTel)=str));“

Auch hier liegt schon ein Fehler vor!
Du stellst einen Vergleich. Du hast aber die Variable als
Variant declariert!
Welchen Typ hat denn das Feld Einsatz.Seriennummer?
Desweiteren willst du Strings vergleichen so setzt man die
immer in '!
Auch hast du hier die Möglichkeit, wenn es sich um einen
Stringvergleich handelt das du das = durch den Operator Like
ersetzen kannst!
In deinem Falle wäre es dann so!

strSQL = „SELECT
Einsatz.SeriennummerTel,Einsatz.SeriennummerSIM,
Einsatz.Einsatzort, Einsatz.Von,Einsatz.Bis,
Einsatz.Bearbeiter FROM Einsatz WHERE Einsatz.SeriennummerTel
Like '“ & str & „’;“

Set Abfrage = DB.CreateQueryDef(„tempAbfrage“, strSQL)

Ich glaube hier liegt der Hund begraben! Du musst eine
Variable übergeben die den Namen für die Pass Trough
beinhaltet.
Probiere mal folgendes

Dim AbfrageName as String
Abfragename=„TempAbfrage“
Set Abfrage=db.CreateQueryDef(Abfragename,strSql)

du hast recht genau ihr liegt er begraben in dieser zeile tritt auch der besagte laufzeitfehler ‚7874‘ auf.
ich habe den code jetzt richtig gestellt aber leider kommt die fehlermeldung immer noch :frowning:

DoCmd.OpenQuery Abfrage.Name

Auch hier musst du den Abfragename angeben, der erstellten
Pass Trough Abfrage!
Was ist Abfrage für ein Object?
Was ist Name für ein Object?
Auch musst du mal schauen. Name ist sicherlich ein
reserviertes Wort!
Unter VB ist es zumindest so!

DB.QueryDefs.Delete „tempAbfrage“

Auch hier übergebe mal lieber eine Variable!

Abfragename =„TempAbfrage“
db.QueryDefs.Delete Abfragename

DB.Close

Soweit ok

Abfrage.Close

Auch Ok

DoCmd.Close

Auch Ok

ich bekomme immer die Meldung:

„laufzeitfehler ‚7874‘:
Microsoft Access kann das Objekt „tempAbfrage“ nicht finden“

In welcher Zeile tritt denn der Fehler auf?

kann mir jemand sagen warum der Code nicht funktioniert?

siehe oben :smile:
Wie gesagt. Meine Aussagen sind auf VB zutreffend. Sollte aber
in deinem Falle auch stimmen.

MfG

hast du noch eine Idee warum es nicht funktioniert?

hier der korrigierte quelltext:

Dim DB As DAO.Database
Dim Abfrage As DAO.QueryDef
Dim str As String
Dim strSQL As String
Dim AbfrageName As String

Set DB = OpenDatabase(Laufwerkpfad)

str = CStr(„35391100 187533 6“)
AbfrageName = „TempAbfrage“

strSQL = „SELECT Einsatz.SeriennummerTel,Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von,Einsatz.Bis, Einsatz.Bearbeiter FROM Einsatz WHERE Einsatz.SeriennummerTel Like '“ & str & „’;“

Set Abfrage = DB.CreateQueryDef(AbfrageName, strSQL)

DoCmd.OpenQuery AbfrageName

DB.QueryDefs.Delete AbfrageName

DB.Close

Abfrage.Close

DoCmd.Close

Hallo,

irgendwie kommt es mir vor als fehle da noch eine Anweisung nach dem Create:

CurrentDb.QueryDefs.Append Abfrage

Tschau
Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Patric,

hm gute Frage,
wenn ich Zeit haette würde ich es mal probieren :s
Aber fragen wir mal anders. Was soll den der Code bewirken?
Du vesuchst eine Pass Trough Abfrage zu erstellen.
Danach möchtest du sie ausführen und im Anschluss wieder löschen :s

Kann es sein das du nur ein SQL Statement ausführen möchtest?
Am besten ist es, wenn du mal schreibst, was du genau möchtest, dann kann ich dir eine Lösung präsentieren, heute Abend haette ich Zeit mich der Sache mal genauer anzunehmen :smile:
Entweder in DAO oder halt in ADO :wink:

MfG Alex

Hallo,

nein mit

CurrentDb.QueryDefs.Append Abfrage

gehts auch nicht, ich hab in der Hilfe gelesen das man die Append Methode auch nur bei temporären Abfragen ohne Namen ausgefhrt werden muss.

Hallo,

irgendwie kommt es mir vor als fehle da noch eine Anweisung
nach dem Create:

CurrentDb.QueryDefs.Append Abfrage

Tschau
Peter

Hi Alex,

ich will eigentlich nur eine Auswahlabfrage ausführen und danach gerne in Tabellenform anzeigen lassen, am besten die Abfrage selbst.
Speziell in dieser Abfrage möchte ich einfach nur per kombifeld eine Seriennummer einlesen und aus einer tabelle alle Datensätze mit dieser Nummer anzeigen lassen.

ich habe jetzt eine Lösung, in der ich aber 2 Tabellen zum zwischenspeichern und Anzeige brauche. mir kommt die Lösung aber sehr umständlich vor, für Verbesserungsvorschläge wäre ich dankbar :smile:

hier ist der Code:

Dim DB As DAO.Database
Dim Abfrage As DAO.QueryDef
Dim temp As DAO.Recordset
Dim abfrage_Tabelle As DAO.Recordset
Dim str As String
Dim strSQL As String
Dim AbfrageName As String

Set DB = OpenDatabase(Laufwerkpfad)
Set abfrage_Tabelle = DB.OpenRecordset(„Tabelle_Abfrage“, dbOpenTable)

str = CStr(Form_Geräte_verwaltung.Kombo_tel.Value)

AbfrageName = „TempAbfrage“

strSQL = „SELECT Einsatz.SeriennummerTel,Einsatz.SeriennummerSIM, Einsatz.Einsatzort, Einsatz.Von,Einsatz.Bis, Einsatz.Bearbeiter FROM Einsatz WHERE Einsatz.SeriennummerTel Like '“ & str & „’;“

’ Bestehende Abfrage in DB.Querydefs löschen
DB.QueryDefs.Delete AbfrageName

Set Abfrage = DB.CreateQueryDef(AbfrageName, SQL_string)
Set temp = Abfrage.OpenRecordset(dbOpenSnapshot)

’ Tabelle für Abfrageergebnis löschen------------
If Not abfrage_Tabelle.EOF Then
Do While Not abfrage_Tabelle.EOF
abfrage_Tabelle.MoveLast
abfrage_Tabelle.Delete

abfrage_Tabelle.MoveFirst
Loop
End If
'--------------------------------------------------
Do While Not temp.EOF
abfrage_Tabelle.AddNew
abfrage_Tabelle!SeriennummerTEL = temp!SeriennummerTEL
abfrage_Tabelle!SeriennummerSIM = temp!SeriennummerSIM
abfrage_Tabelle!Einsatzort = temp!Einsatzort
abfrage_Tabelle!von = temp!von
abfrage_Tabelle!bis = temp!bis
abfrage_Tabelle!Bearbeiter = temp!Bearbeiter
abfrage_Tabelle.Update
temp.MoveNext
Loop

’ DB.QueryDefs.Delete AbfrageName

DB.Close
Abfrage.Close
abfrage_Tabelle.Close
DoCmd.Close
DoCmd.OpenTable „Tabelle_Abfrage“
end sub

abfrage_Tabelle = DB.OpenRecordset(„Tabelle_Abfrage“, dbOpenTable), Tabelle_Abfrage ist eine „von Hand“ erstellte Tabelle in der Datenbank.

Ist übrigens keine ODBC Umgebung sondern nur ein MicrosoftJet Arbeitsbereich, wenn ich mich nicht täusche //blush :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Alex,

Hallo Patric,

ich will eigentlich nur eine Auswahlabfrage ausführen und
danach gerne in Tabellenform anzeigen lassen, am besten die
Abfrage selbst.

Also einfach nur ein SQL Statement ausführen, was dir die gewünschten Datensätze zurueckliefert :smile: Dazu musst du aber ein Recordset definieren, was die Daten dann beinhaltet!

Speziell in dieser Abfrage möchte ich einfach nur per
kombifeld eine Seriennummer einlesen und aus einer tabelle
alle Datensätze mit dieser Nummer anzeigen lassen.

Sollte kein Thema sein. Du liest aus dem Kombifeld einfach die Seriennummer ein und bindest diese dann in dein SQL Statement mit ein :smile:

dim StrSql as String
StrSql="SELECT Einsatz.SeriennummerTel,Einsatz.SeriennummerSIM,Einsatz.Einsatzort, Einsatz.Von,Einsatz.Bis,Einsatz.Bearbeiter FROM Einsatz WHERE Einsatz.SeriennummerTel Like '" & str & "';"
Set RS =DB.Execute (StrSql)

Somit bekommst die gewünschten Daten geliefert :wink: Diese kannst du nun ganz bequem auslesen und anzeigen :smile:

ich habe jetzt eine Lösung, in der ich aber 2 Tabellen zum
zwischenspeichern und Anzeige brauche. mir kommt die Lösung
aber sehr umständlich vor, für Verbesserungsvorschläge wäre
ich dankbar :smile:

Das denke ich auch mal :smile:

Das was du versuchst ist mit Kanonen auf Spatzen schiessen *gg*
Du versuchst eine Abfrage in der DB zu speichern.
Danach möchtest du sie ausführen und danach wieder löschen :s

Ich habe mich heute mal schnell damit auseinander gesetzt.
Also wenn du eine Abfrage speichern willst, so musst du nur einen Bezeichner mit übergeben. Dieser muss nicht als Variable vorliegen. Da lag ich gestern falsch :s
Willst du dann aber die Abfrage ausführen, so musst du nur den Bezeichner angeben! Dann bekommst du die gewünschten Daten! Diese musst du aber an ein Recordset uebergeben! Das hattest du glaube nicht gemacht :confused:

Aber lange Rede kurzer Sinn.
Ich hab mal schnell ein paar Subs geschrieben, die ihren Dienst machen. Schau sie dir einfach mal an. Dann siehst du die Wirkungsweise. Entweder du kopierst dir die Subs oder pflegst es in dein Project ein :smile:

'Verweis auf MS DAO 3.6 muss gesetzt sein!
Option Explicit

Private DB As DAO.Database 'Database
Private WS As DAO.Workspace 'Worksspace
Private RS As DAO.Recordset 'Recordest

'Verbindung zur DB wird hergestellt!
Sub Connect()
 Set WS = DBEngine.Workspaces(0) ' Hier koenntest du Rechte vergeben
 Set DB = WS.OpenDatabase("Laufwerkpfad", False, False) 'Datenbank wird geöffnet -\> Laufwerkpfad ist die Function von dir. Parameter ggfls. anpassen!
End Sub

'Eine ganz normale Abfrage wird erstellt!
'Aufruf zum Bsp.
'Call CreateAbfrageOhneParameter("Abfrage1","SELECT E.ID, E.Vorname, E.Nachname FROM Personal E WHERE E.Vorname LIKE 'Patric' ORDER BY E:Vorname;")
Private Sub CreateAbfrageOhneParameter(Bezeichner As String, SQL As String)
Dim QD As QueryDef
 Set QD = DB.CreateQueryDef(Bezeichner, SQL)
End Sub

'Abfrage mit Parametern wird erstellt
'Aufruf zum Bsp.
'Call CreateAbfrageMitParameter("Abfrage2","SELECT E.ID, E.Vorname, E.Nachname FROM Personal E WHERE E.Vorname LIKE 'Patric' ORDER BY E:Vorname;")
Private Sub CreateAbfrageMitParameter(Bezeichner As String, SQL As String)
Dim QD As QueryDef
Dim PAR As String
 PAR = "PARAMETERS [DeineSpalte] TEXT; SELECT \*FROM Einsatz WHERE [DeineSuchspalte] LIKE [DeineSpalte] & '\*';"
 Set QD = DB.CreateQueryDef(Bezeichner, PAR)
End Sub

'Eine PassTrough wird erstellt
'Aufruf zum Bsp.
'Call PassTroughAbfrage("Abfrage3","SELECT E.ID, E.Vorname, E.Nachname FROM Personal E WHERE E.Vorname LIKE 'Patric' ORDER BY E:Vorname;")
Private Sub PassTroughAbfrage(Bezeichner As String, SQL As String)
Dim QD As QueryDef
 Set QD = DB.CreateQueryDef(Bezeichner)
 QD.Connect = "OBDC;DSN=DeineDSN;UID=DEINEUID:stuck\_out\_tongue\_winking\_eye:WD=;DATABASE=DeineDataBase"
 QD.SQL = SQL
End Sub

'Ein SQL Statement auf ein Recordset wird ausgeführt
'Aufruf zum Bsp.
'Call RunSQLAufRecordset("SELECT E.ID, E.Vorname, E.Nachname FROM Personal E WHERE E.Vorname LIKE 'Patric' ORDER BY E:Vorname;")
Private Sub RunSQLAufRecordset(SQL As String)
 RS.Close
 Set RS = DB.OpenRecordset(SQL)
End Sub

'Ein SQL Statement auf die DB wird ausgeführt
'Aufruf zum Bsp.
'Call RunSQLAufDatabase("Delete \* FROM Personal WHERE Vorname LIKE 'Patric';")
Private Sub RunSQLAufDatabase(SQL As String)
'Vorraussetzung das das SQL Statement keine Datensätze zurueckliefert!
'Bsp. waehre -\> Lösch, Update und Export Operationen!
 DB.Execute (SQL)
 'Wieviele Datensaetze von der Änderung betroffen sind bekommst du via db.RecordsAffected Eigenschaft heraus :wink:
End Sub

'Eine Abfrage Ohne Parameter wird ausgeführt
'Aufruf zum Bsp.
'Call RunAbfrageOhneParameter("Abfrage1")
Private Sub RunAbfrageOhneParameter(Bezeichner As String)
Dim QD As QueryDef
 Set QD = DB.QueryDefs(Bezeichner)
 RS.Close
 Set RS = QD.OpenRecordset(dbOpenDynaset)
End Sub

'Eine Abfrage Mit Parameter wird ausgeführt
'Aufruf zum Bsp.
'Call RunAbfrageMitParameter("Abfrage2")
Private Sub RunAbfrageMitParameter(Bezeichner As String)
Dim QD As QueryDef
 Set QD = DB.QueryDefs(Bezeichner)
 QD.Parameters("Deine Spalte") = "DeinWert"
 RS.Close
 Set RS = QD.OpenRecordset
End Sub

So ich hoffe, ich habe keine Tippfehler drinnen :smile:

MfG Alex

achso, ich hab ma wieder die haelfte vergessen *schaem*

Also das was ich gepostet habe, trifft auf VB6 zu!
Unter VBA sollte es eigentlich auch funktionieren. Aber dafür lege ich meine Hand nicht ins Feuer :smile:

Ich lese aber gerade, das du unter VBA mit

DoCmd.RunSQl SQLStatement
'oder 
CurrentDB.Execute SQLStatement,, dbFailOnError
'Auch wenn du eine Abfrage ausführen möchtest, so kannst du das mittels Execute machen
CurrentDB.Execute "Abfrage1"

ein SQL Statement /Abfrage ausführen kannst!

MfG Alex