Announcement

Collapse
No announcement yet.

Zugriff von VBA auf Access

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff von VBA auf Access

    Hallo,
    ich habe jetzt schon einige Beiträge hier in diesem Forum gelesen, aber so richtig bin ich nicht weitergekommen.

    Ich bekomme es nicht hin über VBA auf die Daten zuzugreifen.

    Ich habe in Access eine Tabelle namens "Artikel" mit den Spalten ART_NR und ART_NAME und versuche auf diese mit folgendem VBA Code zuzugreifen.


    Code:
    Option Compare Database
    Option Explicit
    
    Sub test()
    
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim strSQL As String
    Dim var
    
    Set db = CurrentDb              
    strSQL = "SELECT * FROM Artikel"   
    Set rs = db.OpenRecordset(strSQL)  
    
    If Not rs.EOF Then rs.MoveFirst    
    
    Do While Not rs.EOF               
      var = rs!ART_NR               
      rs.MoveNext                      
    Loop
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
    
    End Sub
    Ich erhalte einen Laufzeitfehler mit folgender Meldung:

    "Too few parameters. Expected 1"

    Kann mir da jemand weiterhelfen.

    Danke

  • #2
    Hallo Mojito,

    an welcher Stelle tritt der Fehler auf?

    Olaf
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo

      An folgender Stelle:

      Set rs = db.OpenRecordset(strSQL)

      Es scheint als liegt hier der Fehler: Set db = CurrentDb

      Comment


      • #4
        Das sollte eigentlich funktionieren, ausser Du hast eine ADP.

        Dann versuch es mal mit:
        SET db = CodeDB

        Olaf
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hmm, leider funktioniert das so auch nicht. Werde mal weiter tüfteln.

          Im Prinzip funktioniert das auch, liegt wohl daran das meine Tabellen Namen mit Umlauten und Undzeichen haben. Ich habe das eben mal mit einer kleinen Tabelle mit dem Namen Tabelle1 getestet und da funktioniert der Zugriff
          Zuletzt editiert von mojito; 05.11.2007, 13:37.

          Comment


          • #6
            Wenn Du Leer- oder bestimme Sonderzeichen im Tabellen- oder Feldnamen hast, muss Du sie in eckige Klammer setzten, z.B.

            strSQL = "SELECT * FROM [Tabelle 1]"
            var = rs![Feld Name]

            Oder Du nutzt die Fields-Auflistung:
            var = rs.Fields("Feld Name")

            Olaf
            Olaf Helper

            <Blog> <Xing>
            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

            Comment


            • #7
              okay, danke für den Hinweis, werde ich gleich mal probieren

              Comment


              • #8
                Habe mal noch eine Frage:

                Wie lautet denn der Syntax, wenn ich einen bestimmten Artikel suche in meinem Beispiel 27307. Aber so wie ich es probiert habe, funktioniert es nicht:

                strSQL = "SELECT Tabelle1.RNR, Tabelle1.ART_NR FROM Tabelle1 WHERE Tabelle1.ART_NR = 27307"

                EDIT: Hat sich erledigt habe es gefunden: ='27307' muss es heissen

                Danke

                gruss
                mojito

                Comment


                • #9
                  Ich habe da noch ein Problem, hängt wohl auch damit zusammen das ich mit Access noch nicht ganz so gut vertraut bin.

                  Ich habe drei Access Abfragen die aufeinander aufbauen. Welche Möglichkeit habe ich diese im VBA abzufragen. In der ersten Abfrage suche ich nach einer bestimmten Zahl. Die Datensätze die diese Zahl enthalten werden dann angezeigt. Die daraus entstehende Tabelle wird dann für die 2te Abfrage und die daraus entstehende Tabelle wiederum für die letzte Abfrage benötigt .
                  Momentan habe ich keine Idee wie ich das am geschicktesten Anstelle.

                  Evtl. ist jemand so nett und gibt mir eine kleine Hilfestellung.

                  Danke

                  gruss

                  mojito

                  Comment


                  • #10
                    Hallo mojito,

                    auf eine Abfrage (View) kannst Du genauso wie bei einer Tabelle selektieren, also
                    SELECT * FROM AbfrageName

                    Einfüge- (INSERT) oder Aktualisierungsabfragen (UPDATE), wo Du kein Ergebnis zurückerwartest kannst Du mit

                    CodeDB.QueryDefs("EinfügeAbfrage").Execute

                    ausführen.

                    Olaf
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #11
                      Hallo Olaf,

                      Das habe ich soweit verstanden, aber wie verhält es sich, wenn ich z.B. folgendes haben:

                      Tabelle1
                      Art_name | Art_nr | Art_menge | ReNr

                      Ich möchte mir nun daraus alle ReNr anzeigen lassen mit der Art_nr 0815, das mache ich mit Abfrage1:

                      Code:
                      SELECT Tabelle1.ReNr, Tabelle1.Art_nr
                      FROM Tabelle1 WHERE Art_nr = 0815;
                      Ich möchte aber nun eine 2te Abfrage auf der daraus enstehende Tabelle der Abfrage1 durchführen.

                      Meine 2te Abfrage würde so aussehen:
                      Code:
                      SELECT Tabelle1.ReNr., Tabelle1.ARt_menge, Tabelle1.Art_nr
                      FROM Tabelle1 INNER JOIN Abfrage1 ON Tabelle1.ReNr = Abfrage1.ReNr
                      WHERE (((Abfrage1.ReNr) Is Not Null));
                      Dies möchte ich gerne in VBA schreiben, weiss aber nicht wie ich auf die durch die Abfrage1 erstellt Tabelle zugreife.

                      Zur Eklärung noch: Mein Ziel ist es eigentlich aus einer Tabelle in der Artikel, Rechnungsnummer und Menge stehen, eine Tabelle zu erzeugen in der ich zu jedem Artikel sehen kann welches die TOP5 Artikel sind die ebenfalls immer zu diesem einen Artikel gekauf wurden.

                      Einfach ausgedrückt: Kunden die diesen Artikel kauften, kauften auch


                      gruss

                      mojito
                      Zuletzt editiert von mojito; 06.11.2007, 10:20.

                      Comment


                      • #12
                        Hallo mojito,

                        ich habe noch nicht so ganz verstanden, wo nun Dein eigentliches Problem liegt.
                        Zunächst kurz zu den Begriffen, eine Abfrage erstellt keine Tabelle, sondern gibt Dir eine Ergebnismenge (Resultset) zurück, mir der Du dann weiter arbeiten kannst.

                        In der 2. Abfrage hats Du die erste Abfrage ja schon gejoint. Aus allen Tabellen/Unterabfragen Deiner FROM Klausel kannst Du Dir die Felder zurückgebeben. Bei einem Self-Join wie hier bzw. wenn Du gleiche Feldnamen hast, solltest Du ALIAS mit "AS" verwenden, damit Du eindeutige Feldnamen im Resultset bekommst; sonst wird es schwer, das richtige Feld anzusprechen, z.B.

                        [highlight=SQL]
                        SELECT Tabelle1.ReNr AS ReNr_1, Tabelle1.Art_menge AS Art_Menge1, Tabelle1.Art_nr AS Art_Nr1,
                        Abfrage1.ReNr AS ReNr_2, Abfrage1.Art_Nr as Art_Nr2
                        FROM Tabelle1 INNER JOIN Abfrage1 ON Tabelle1.ReNr = Abfrage1.ReNr
                        WHERE (((Abfrage1.ReNr) Is Not Null));[/highlight]

                        Wenn Du die TOP 5 Artikel der gleichen Verkäufe haben willst, kannst Du es z.B. mit einem Sub-Select lösen, also
                        - Ermittel zunächst alle ReNr, in den auch Artikel 0815 enthalten war
                        - Hole alle Artikel <> 0815 aus diesen Rechnungen, summiere die Gesamtmenge und sortiere danach absteigend; die Top 5 davon will ich haben

                        [highlight=SQL]
                        SELECT TOP 5 Art_Nr, SUM(Art_Menge) AS GesMenge
                        FROM Tabelle1
                        WHERE Art_Nr <> '0815'
                        AND ReNr IN
                        (SELECT ReNr
                        FROM Tabelle1
                        WHERE Art_Nr = '0815')
                        GROUP BY Art_NR
                        ORDER BY SUM(Art_Menge) DESC
                        [/highlight]

                        Mit einem Self-Join könnte die Lösung so aussehen:

                        [highlight=SQL]
                        SELECT TOP 5 DST.Art_Nr, SUM(DST.Art_Menge) AS GesMenge
                        FROM Tabelle1 AS Src
                        INNER JOIN
                        Tabelle1 AS DST
                        ON SRC.ReNr = DST.ReNr
                        WHERE SRC.Art_Nr = '0815'
                        AND DST.Art_Nr <> '0815'
                        GROUP BY DST.ART_Nr
                        ORDER BY SUM(DST.Art_Menge) DESC
                        [/highlight]

                        Habe ich jetzt nicht in Access ausprobiert, sollte aber so prinzipiell funktionieren.

                        Olaf
                        Zuletzt editiert von O. Helper; 06.11.2007, 13:36.
                        Olaf Helper

                        <Blog> <Xing>
                        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                        Comment


                        • #13
                          Hallo Olaf,

                          Danke für die hilfreichen Antworten. Mein Problem bestand darin, da ich es nicht verstanden habe die 3 Teilabfragen in eine einzige zu packen.

                          Mein nächster Schritt wird dann folgender sein, das ich eine neue Tabelle erzeuge in der ich dann Zeilenweise den Artikel mit den dazugehörigen TOP Artikeln eintrage.

                          Meine Frage nun, ist das machbar wenn ich das alles in ein VBA Modul implementiere und beim Aufruf dieses Moduls erhalte ich dann eine komplette Liste mit allen Artikeln und den dazugehörigen ebenfalls verkauften TOP Artikeln.
                          Machbar insofern das das Script dann sehr lange arbeiten wird, da es mehr als 80000 Artikel sind.

                          Danke

                          gruss
                          mojito

                          Comment


                          • #14
                            Wie die Laufzeiten sind, musst Du mal austesten, das kann man schlecht vorhersagen.
                            Auch wird es Unterschiede bei den 2 Varianten geben; ich tippe mal, das der Self-Join in Access schneller sein wird.
                            Hast Du einen Index auf der Tabelle angelegt? Hier wäre ReNr und Art_Nr günstig.

                            Olaf
                            Olaf Helper

                            <Blog> <Xing>
                            * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                            Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                            Comment


                            • #15
                              Ja index habe ich auf die von dir genannten Felder gelegt und beim testen ist es auch so, das Self-Join um einiges schneller ist.
                              Zuletzt editiert von mojito; 06.11.2007, 18:41.

                              Comment

                              Working...
                              X