Benutzer mit den meisten Antworten
Access Abfrage via Visual Basic 2008 erstellen

Frage
-
Hallo zusammen.
Im Access musste ich im Betrieb Abfragen von unserer DB erstellen.
Nun relevant ist die "HWSWAbfrage", dort wird das gewünschte Ergebnis gefiltert.
Dies ist eine von vielen Abfragen. Die letzte wird als Import für den End-Serienbrief verwendet.
Nun zu Visual Basic:
Die weitere Aufgabe, die mir zugeteilt wurde, in VB ein kleines Programm zur besseren Bedienung zu erstellen.
Dazu werden 3 mögliche Abfragen zur Verfügung gestellt.
Die HardwareAbfrage, SoftwareAbfrage und EichmahungAbfrage. Jede Abfrage (also immer nur eine aufs Mal möglich) wird in der selben Abfrage (HWSWAbfrage) in Access gespeichert/erstellt.
Da nun die HWSWAbfrage für weiter nachfolgende Abfragen verwendet wird, muss natürlich der Name gleich bleiben, aber der Inhalt ändert je nach Abfrage.
Deshalb wollte ich immer die HWSWAbfrage in Access via VB löschen, und eine neue mit neuem Inhalt erstellen, da ich nicht weiss, wie ich z.B. nur den Inhalt ändern könnte.
Deshalb mache ich immer ein DROP VIEW und CREATE VIEW.
Mein einziges Problem, das ich habe ist, dass bei CREATE VIEW der Fehler kommt, dass nur eine einfache SELECT Abfrage in VIEWS zulässig sei.
Was kann ich tun, damit ich eine erweiterte Abfrage erstellen kann?
Oder gibts eine Möglichkeit immer den Inhalt der HWSWAbfrage zu verändern und abzuspeichern?
(Die Verbindung habe ich via OleDb, auch hier weiss ich nicht, was am besten ist).
Besten Dank für Tipps und Beispielcode.
Bin noch ziemlicher Anfänger und brauche die Lösung leider relativ dringend. (Wenn Fragen auftauchen, nur stellen).
Vielen Dank
Antworten
-
Hi Mathias,
das ORDER BY verkraftet die ACE bei CTREATE VIEW nicht. Nutze besser einen richtigen Datenbankserver als diese Einplatzlösung mit einer Access-Datei.
--
Peter- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 30. September 2009 05:18
- Als Antwort markiert L.O.G Mittwoch, 30. September 2009 06:48
Alle Antworten
-
Ich kann dein Problem mit der ACE nicht repoduzieren. Hier meine Demo:
Option Explicit On Option Infer On Option Strict On Module Module1 Sub Main() ' Using cn As New OleDb.OleDbConnection(My.Settings.cnmdb) cn.Open() Using cmd As New OleDb.OleDbCommand("DROP View V1", cn) Try Console.WriteLine("DROP VIEW return code: {0}", cmd.ExecuteNonQuery) Catch ex As Exception Console.WriteLine("DROP VIEW Error: {0}", ex.Message) End Try cmd.CommandText = "CREATE VIEW V1 AS SELECT * FROM Tab1 INNER JOIN Tab2 ON Tab1.ID = Tab2.FK" Console.WriteLine("CREATE VIEW return code: {0}", cmd.ExecuteNonQuery) End Using cn.Close() End Using ' Console.ReadLine() End Sub End Module
--
Peter- Als Antwort vorgeschlagen Peter Fleischer Montag, 28. September 2009 20:11
-
Vielen Dank für deine Antwort.
Könntest du mir vielleicht noch die Zeilen erklären und evt. noch angeben was ich noch selber definieren/deklarieren und wo was angeben muss?
Ich sehe dies leider noch nicht so ganz heraus, da ich noch Anfänger bin.
Besten Dank für deine Hilfe.
Gruss -
Was soll ich dir zuerst mitteilen: meine Bankverbindung oder meine Telefonnummer :-) ?
Die paar Befehle solltest du als Programmierer mit der Hilfe und einem Buch eigentlich selbst verstehen können.
using -> Scope mit Dispose
Connection -> Verbindung zur Datenbank
.Open -> Verbindung öffnen
DROP -> alte Sicht löschen
CREATE -> neue Sicht erstellen
Console.WriteLine -> Ergebnis auf Console ausgeben
Console.ReadLine -> Stopper, damit Konsolenanwendung nicht sofort wieder beendet wird.
--
Peter -
Also, vielen vielen Dank. Hier wird einem gut geholfen.
Werde dies morgen sofort ausprobieren.
Was mich aber noch interessiert:
Wieso ist bei mir die Meldung erschienen, dass nur eine einfache SELECT Abfrage in VIEWS zulässig sei?
Oder was ändert diese Meldung in deinem Code, dass dies nicht mehr erscheint?
Vielen Dank!
Und ja, ich werde hoffentlich bald schweigen, damit ich deine Zeit nicht verschwende ;) -
Hallo.
Also ich habe dies probiert, aber leider kriege ich es nicht zum laufen.
Zuerst hatte ich einen Fehler wegen Module, da ich es nicht kannte. Als ich es über "Projekt" hinzufügte verschwand der Fehler, doch es kam der nächste Fehler: "cnmdb" ist kein Member von "ACT_Abfragen.My.MySettings".
Nun wollte ich nochmals fragen (wenn du noch Zeit hast und willst), was ich bei meinem bisherigen Code abändern muss, damit es dann auch wunschgemäss funkioniert wegen der erweiterten Abfrage.
(Ich verwende Access 2002). Bei deinem Vode wusste ich auch nicht, wo ich die Verbindung zur Access DB angeben musste.
Hoffentlich kannst du mir bei meinem Code nochmals helfen:Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click Dim con As New OleDb.OleDbConnection Dim cmd As New OleDb.OleDbCommand Dim reader As OleDb.OleDbDataReader con.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=N:\Act\Act.mdb" cmd.Connection = con cmd.CommandText = "CREATE VIEW test AS SELECT * FROM CONTACT" 'cmd.CommandText = "CREATE VIEW test AS SELECT * FROM CONTACT WHERE CONTACT.CUST_Eichdatum_023545265 Between #9/20/2007# And #12/31/2007# ORDER BY COMPANYNAME" Try con.Open() reader = cmd.ExecuteReader() Do While reader.Read() Loop reader.Close() con.Close() Catch ex As Exception MsgBox(ex.Message) End Try End Sub
Wäre dir sehr dankbar, vielen Dank.
Gruss -
Das einzige was ich will, ist ja nur das Erstellen und löschen einer Abfrage in Access.
Lesen muss ich gar nicht können. Ich will nur eine erweiterte Abfrage erstellen können, löschen funktionierte schon.
Den Code habe ich vom Visual Basic Galileo OpenBook.
Ich kann deinen Code noch so umbauen und in meinen einbauen. Es funktioniert einfach nicht.
Wie gesagt, schon wegen module und My .Settings.cnmdb bin ich am Anschlag.
Was muss ich denn noch in meinem Code abändern?
Ich weiss, evt. habe ich schon zu viel drin wegen den Reader, aber irgendwie funktionierts ohne dem auch nicht.
Nochmals Danke -
My.Settings sind die Settings (Einstellungen) aus den Application Properties (Projekteigenschaften). Dort kannst du den ConnectionString (Verbindungszeichenfolge) eintragen. Damit kann dann zur Ausführung auch über die config-datei der konkrete Zugriffsweg eingestellt werden. Anstelle von My.Settings.cnmdb kannst du natürlich auch direkt die zeichenkette mit der Verbindungszeichenfolge eintragen.
--
Peter -
Also nochmals. Ich habe es soweit abgeändert:
Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click Using cn As New OleDb.OleDbConnection("N:\Act\Act.mdb") cn.Open() Using cmd As New OleDb.OleDbCommand("DROP View test", cn) Try Catch ex As Exception MsgBox(ex.Message) End Try cmd.CommandText = "CREATE VIEW test AS SELECT * FROM CONTACT WHERE CONTACT.CUST_Eichdatum_023545265 Between #9/20/2007# And #12/31/2007# ORDER BY COMPANYNAME" End Using cn.Close() End Using End Sub
Nun weiss ich aber nicht, in welchem Format ich die Verbindungseinstellung in die Klammer setzen muss, bzw. was ich noch angeben muss.
So erscheint noch eine Fehlermeldung. Wenn ich noch etwas vergessen haben sollte, dann wäre ich froh, wenn du dies bemerken könntest.
Es tut mir leid, wenn ich etwas schwierig bin, aber ich befinde mich im Moment noch in der Lehre und bin dies am erlernen.
Danke für deine Hilfe und dein Verständnis. -
So, nun denke ich sieht mein Code identisch aus wie deiner und ich habe ihn zu laufen gebracht.
Allerdings ändert sich das Ergebnis nichtim Vergleich zu meinem Code, den ich bei der Fragenstellung hatte.
Und nochmals, ich verwende Access 2002.
Hast du, oder auch jemand anders, sonst noch eine Idee wie ich die Fehlermeldung "Nur einfache SELECT-Anweisungen in VIEWS zulässig" wegbringe? Es wäre sehr wichtig diese Abfrage zu erstellen.
Noch mein aktueller Code (wie der von Peter) der auch nicht funktioniert:
Private Sub OKButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OKButton.Click Using cn As New OleDb.OleDbConnection(My.Settings.ACTConnectionString) cn.Open() Using cmd As New OleDb.OleDbCommand("DROP View test", cn) Try Console.WriteLine("DROP VIEW return code: {0}", cmd.ExecuteNonQuery) Catch ex As Exception Console.WriteLine("DROP VIEW Error: {0}", ex.Message) End Try cmd.CommandText = "CREATE VIEW test AS SELECT * FROM CONTACT WHERE CONTACT.CUST_Eichdatum_023545265 Between #9/20/2007# And #12/31/2007# ORDER BY COMPANYNAME" Console.WriteLine("CREATE VIEW return code: {0}", cmd.ExecuteNonQuery) End Using cn.Close() End Using End Sub
Und noch die Verbindungseistellungen, welche in den Eigenschaften hinterlegt sind:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=N:\Act\Act.mdb
Danke für eure Geduld und Tipps.
Gruss Mathias -
Hi Mathias,
das ORDER BY verkraftet die ACE bei CTREATE VIEW nicht. Nutze besser einen richtigen Datenbankserver als diese Einplatzlösung mit einer Access-Datei.
--
Peter- Als Antwort vorgeschlagen Peter Fleischer Mittwoch, 30. September 2009 05:18
- Als Antwort markiert L.O.G Mittwoch, 30. September 2009 06:48
-
Super, vielen vielen Dank! Jetzt funktionierts endlich, habe schon lange herumgebastelt und nicht gewusst dass es am ORDER BY liegt. Diese Bedingung kann ich schlimmstenfalls auch weglassen in der Abfrage, Hauptsache, der Rest funktioniert.
Nochmals vielen Dank und wünsche dir einen schönen Tag ;)
Gruss Mathias -
Eine allgemeingültige (SQL)-Antwort kenne ich nicht. Bei Access müsstest du da auf ADOX zurückgreifen. Es ist aber schon sehr lange her, dass ich das nutzen musste, und kann dir deshalb auf die Schnelle keine Lösung bieten. Besser ist es bestimmt, die Orglösung so aufzubauen, dass auf das Rücklesen von View-Deklarationen verzichtet werden kann. Wenn beispielsweise ein Anwender die Sicht verändert, muss jede dieser Möglichkeiten der Veränderung im Programm abgefangen werden, was letztendlich in der Implementierung eines komplexen Parsers endet.
--
Peter