none
Access Abfrage via Visual Basic 2008 erstellen RRS feed

  • 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
    Montag, 28. September 2009 15:00

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
    Mittwoch, 30. September 2009 05:18

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
    Montag, 28. September 2009 19:33
  • 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
    Montag, 28. September 2009 19:48
  • 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
    Montag, 28. September 2009 20:11
  • 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 ;)
    Montag, 28. September 2009 20:21
  • Warum bei dir die Meldung erscheint, kann man nur bei Kenntnis der konkreten Lösung ermitteln. In meiner Demo habe ich eine accdb (Access 2007) mit dem ACE-Provider genutzt.

    --
    Peter
    Dienstag, 29. September 2009 02:49
  • 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
    Dienstag, 29. September 2009 08:29
  • Du nutzt einen DataReader zum Lesen des zurückgegebenen Recordsest. Mit "Create View ..." wird aber kein Ergebnisset erzeugt, sondern es wird eine Sicht in die Datenbank eingetragen. Zum Lesen benötigt man ein SELECT.

    -- 
    Peter  

    Dienstag, 29. September 2009 09:05
  • 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
    Dienstag, 29. September 2009 09:30
  • 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
    Dienstag, 29. September 2009 10:19
  • 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.
    Dienstag, 29. September 2009 11:37
  • 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
    Dienstag, 29. September 2009 13:59
  • 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
    Mittwoch, 30. September 2009 05:18
  • 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
    Mittwoch, 30. September 2009 06:23
  • Habe doch noch einmal eine Frage.
    Gibt es auch eine Möglichkeit, eine bestehende Abfrage abzuändern und wieder mit den neuen Änderungen zu speichern?
    Gruss Mathias
    Mittwoch, 30. September 2009 18:20
  • 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 
    Donnerstag, 1. Oktober 2009 04:48
  • OK gut, danke für deine Antwort.
    Werde mal nach einer Lösung suchen.
    Gruss Mathias
    Donnerstag, 1. Oktober 2009 06:17