Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Tom75 am Oktober 21, 2024, 08:53:54

Titel: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 08:53:54
Hallo und guten Morgen zusammen,

per VBA-Code wird eine Prozedur ausgeführt, die derzeit noch alle hinterlegten Abfragen ausführt.
Damit nicht immer alle Abfragen ausgeführt werden, möchte ich vorher einen Abgleich mit einem Listenfeld durchführen, so dass nur die Abfragen ausgeführt werden, die dort das gesuchte Kriterium enthalten. Das Kriterium enthält i.Ü. Werte in Form einer 4-stelligen Zahl

Wie kann man den Abgleich mit dem Listenfeld [Liste2697] in den bestehenden Code einfügen ?

Danke für Deine Antwort im Voraus.
Tom


    Dim sPfad As String
    Dim qry As QueryDef
    Dim rst As DAO.Recordset
    Dim dbe As DAO.Database
   
    Set dbe = CurrentDb
    Set rst = dbe.OpenRecordset( _
            "SELECT Name FROM MSysObjects WHERE Name LIKE 'UE50*'")
    With rst
        Do While Not .EOF
            Set qry = dbe.QueryDefs(.Fields(0))
           
            sPfad = "C:\Exporte\Stunden\Stunden - " & Right(.Fields(0), 4) & ".xlsm"
            ExcelExportCopyFromRecordset qry.Name, sPfad, "UE50", "A2", True
           
            .MoveNext
        Loop
    End With
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 10:16:47
Hallo Tom,

was verstehst du unter "die dort das gesuchte Kriterium enthalten" ?

Um dir helfen zu können, mußt du etwas mehr ausholen; so ist das für Außenstehende nicht nachvollziehbar.

Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 10:26:30
Hallo Knobbi,

danke für Deine Nachfrage, die ich hiermit gern beantworten möchte.

Also in dem Listenfeld stehen quasi die Werte, die die gesuchte(n) Abfragen ergänzen.
Alle Abfrage beginnen immer mit "UE50 " und sollen durch den jeweilig im Listenfeld gefunden Wert ergänzen, die dann ausgeführt werden soll.
Das Listenfeld kann je nach Daten-Ausgangslage mal 1 Wert oder auch bis zu 20 Werte enthalten.

Ich hoffe meine Antwort hilft weiter.
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 10:28:58
Ok, stellt sich die Frage, woher die Zahlen im Listenfeld kommen. Dann könnte man u.U. diesen Mechanismus auch als Where-Bedingung verwenden.

Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 10:34:01
Also die Quelle des Listenfeldes ist wiederum die folgende Abfrage:


SELECT [Stunden_ALLE].BAUSTELLE
FROM [Stunden_ALLE]
GROUP BY [Stunden_ALLE].BAUSTELLE;
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 10:51:53
Ja gut und die Baustellen werden jetzt im Listenfeld selektiert?

Wenn dem so ist, kannst du aus den selektierten Angaben einen kommaseparierten String zusammensetzen und diesen per IN-Klausel als Where-Bedingung verwenden. Die Like-Klausel wird dann nicht mehr benötigt.


Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 10:59:58
Das Listfeld im Formular soll eigentlich nur dazu dienen anzuzeigen, für welche Baustellen es Daten gibt.

Es sollen dann genau nur die Abfragen ausgeführt, die mit dem korrekten, vervollständigten Abfragenamen gefunden werden.
Um ehrlich zu sein hab ich keinen Schimmer davon, wie ich wie von Dir beschriebenen kommaseparierten String zusammensetzen und diesen per IN-Klausel als Where-Bedingung erstellen und in den bestehenden Code einfügen soll.
Würdest Du mir da bitte helfen können ?
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 11:34:39
Wenn alle Baustellen angezeigt werden sollen, die auch im Listenfeld erscheinen, kannst du das so machen:
SELECT name
FROM   msysobjects
WHERE  name IN (SELECT "UE50" & [stunden_alle].baustelle
                FROM   [stunden_alle]
                GROUP  BY [stunden_alle].baustelle) 

aber ganz ehrlich, ich habe das Gefühl, daß da noch etwas nicht stimmt. Queryname mit Baustellennamen zu verbinden, ich weiß nicht, da bin ich sehr skeptisch, ob das wirklich so i.O. ist.
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 12:14:33
DANKE mein Bester, das hat mit 1 Ergebnis (gemäß Listenfeld) schon mal funktioniert ... ich werde es mit mehr Daten und mehreren Einträgen im Listenfeld das Verhalten der Prozedur und ausgeführten Abfragen testen.

Eine Zusatzfrage habe ich jedoch noch.
Dadurch das bisher jede vordefiniert Abfrage jeweils EIN MAL ausgeführt wurde, werden nun 3 Abfragen nicht mehr berücksichtigt, da der Name der Abfrage nicht durch das Ergänzen mit den Werten aus dem Listenfeld möglich ist, da es diese 3 Bezeichnungen schlichtweg nicht gibt.

Und zwar soll im Falle des Findens bestimmter Baustellen-Nummern am ENDE der ganzen Prozedur zusätzlich jeweils eine bzw. zwei weitere Abfrage(n) ausgeführt werden, wobei je Datenlage NUR Werte der Baustelle 6100 ODER alle anderen in der Datenbank geladen sind.

--> 6100 soll die Abfrage 6199 ausführen
--> 40** und/oder jeder andere Wert soll die Abfrage "4000" und "ALLE" ausführen


Wie kann man das noch in Abhängigkeit der Datenlage bewerkstelligen ?
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 17:27:59
Hallo Knobbi,

also Dein Code hat auch in der anderen Datenkonstellation einwandfrei funktioniert, besten Dank dafür noch mal.

Jetzt wäre nur noch das mit meiner Zusatzfrage offen.
Vielleicht hast Du da noch was passendes im Petto.
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 17:44:48
Hallo Tom,

genau das sind die Schwierigkeiten, wenn das Datenmodell nicht stimmt - was ich ja schon vermutet habe. Das gewurschtel mit den Baustellbezeichner mit Teilen des Abfragenamens mag zwar elegant aussehen, ist aber gelinde gesagt totaler Schrott.  :o So etwas hat mit einer Datenbank nicht mehr viel zu tun. Wer hat sich denn bei euch so etwas einfallen lassen, der sollte sich sein Lehrgeld wiedergeben lassen. Das Datenmodell bedarf dringend einer Überarbeitung!

Prinzipiell lassen sich natürlich noch mehrere Auswahl-Abfragen ausführen.Die Auswertung muß ja nicht alles mit einer einzigen umgesetzt werden. Allerdings kenne ich die Kriterien nicht, so daß ich dir erstmal dafür keine Lösung anbieten kann.

Frage mal nebenbei:
Worin unterscheiden sich den die verschiedenen Queries, unabhängig von den Baustellennamen. So wird doch für jede neue Baustelle auch eine neue Abfragen gebraucht.
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 17:59:12
Danke für Deine Antwort und ja, ich weiss dass das was ich da versuche umzusetzen keineswegs profihaft ist.
Ich nutze für meine Zwecke auch nur eine bestehende Datenbank, um für mich relevante Informationen zu extrahieren ... und genau das wie Du schon richtig vermutest laienhaft.

Die Datenbank selbst ist eine Art Universal-Auswertungs-Datenbank, die für verschiedene Firmen mit unterschiedlichen Baustellen verwendet wird. Heisst das man immer NUR die Baustellen-Daten importieren kann die einer bestimmten Firma zugeordnet sind. Die Queries selbst sind quasi Unterabfragen für jede Baustelle und beinhalten individuelle Kriterien. Und leider ja, für jede neue Baustelle wird dann neue Abfrage benötigt. Zum Glück kommt dies nur alle 5 Jahre 1 mal vor.

Ich hoffe Du kannst mir dennoch bei meinem letzten Problem helfen, was ich mir innerhalb der Prozedur gedanklich so vorstelle ... weiß aber das es so nicht, wegen der falschen Syntax, nicht funktioniert.

    Dim sPfad As String
    Dim qry As QueryDef
    Dim rst As DAO.Recordset
    Dim dbe As DAO.Database
   
    Set dbe = CurrentDb
    Set rst = dbe.OpenRecordset( _
            SELECT Name FROM  msysobjects WHERE  name IN (SELECT "UE50" & [stunden_alle].Baustelle FROM   [stunden_alle] GROUP  BY [stunden_alle].baustelle)
             "SELECT Name FROM MSysObjects WHERE Name LIKE 'UE50 ALLE'")

    With rst
        Do While Not .EOF
            Set qry = dbe.QueryDefs(.Fields(0))
           
            sPfad = "C:\Exporte\Stunden\Stunden - " & Right(.Fields(0), 4) & ".xlsm"
             sPfad = "C:\Exporte\Stunden\Stunden - ALLE".xlsm"
            ExcelExportCopyFromRecordset qry.Name, sPfad, "UE50", "A2", True
           
            .MoveNext
        Loop
    End With
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 21, 2024, 18:44:00
Hallo Tom,

richtig, so kann das nicht funktionieren. Die zusätzlichen Exporte dürfen natürlich nicht Bestandteil der Schleife sein.

So ungefähr sollte es aussehen:
Sub Demo()
  Dim sPfad As String
'  Dim qry As QueryDef
  Dim rst As DAO.Recordset
  Dim dbe As DAO.Database
 
  Set dbe = CurrentDb
  Set rst = dbe.OpenRecordset( _
      "SELECT Name FROM  msysobjects " _
      & "WHERE Name IN ( " _
      & "  SELECT 'UE50' & [stunden_alle].Baustelle " _
      & "  FROM [stunden_alle] " _
      & "  GROUP  BY [stunden_alle].baustelle" _
      & ")" _
    )

  With rst
    Do Until .EOF
'       Set qry = dbe.QueryDefs(.Fields(0))
       sPfad = "C:\Exporte\Stunden\Stunden - " & Right(.Fields(0), 4) & ".xlsm"
'       ExcelExportCopyFromRecordset qry.Name, sPfad, "UE50", "A2", True
       ExcelExportCopyFromRecordset .Fields(0), sPfad, "UE50", "A2", True
       .MoveNext
    Loop
  End With

  ' Cleanup
  If Not rst Is Nothing Then
    rst.Close
    Set rst = Nothing
  End If
 
  ' Export Alle
  sPfad = "C:\Exporte\Stunden\Stunden - ALLE.xlsm"
  ExcelExportCopyFromRecordset <Abfragename für ALLE>, sPfad, "UE50", "A2", True ' <--- Anpassen !!!
End Sub
Ich habe mal den Code etwas "optimiert". Nach deinem ursprüngliche Code steht in Feld(0) der Name der Abfrage, dann brauchst du nicht die Query öffnen um dann nur den Namen der Abfrage aus den Query zu übergeben - den hast du ja schon und kannst ihn direkt übergeben.
Den Abfragenamen für "ALLE" brauchst du nicht über MySysObj ermitteln, den weißt du bereits und der dürfte konstant sein - kann also auch direkt übergeben werden.
Mit den anderen Abfragen und Sonderlocken machst du das dann ähnlich.

Übrigens:
Wenn man selber eine Ressource öffnet, z.B. in diesem Fall ein Recordset, dann sollte man diese per .Close auch wieder freigeben!!! Eine der "goldenen" Regeln ...  ;) 

Gruß
Ulrich
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 21, 2024, 19:25:44
Guten Abend Ulrich,

ganz herzlichen Dank für den neuen Code, den ich mir morgen mal aus der Nähe anschaue, annährend nachzuvollziehen und versuche, diesen auch mit den Optimierungen in meinen Code zu implementieren.
Ich kann Dich aber immerhin beruhigen, das Recordset wird nach dem End With wieder geschlossen.  :)
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Tom75 am Oktober 22, 2024, 09:45:56
Guten Morgen Ulrich,

ich habe Deinen Code nun erfolgreich implementieren können.

Die Exporte für die Zusatz-Dateien habe ich noch über einen CASE SELECT generieren können, so dass ich nun alles wie ich mir vorgestellt habe umsetzen konnte. Daher an der Stelle noch mal ein ganz herzliches DANKESCHÖÖÖN für Deine tolle Hilfe !

Beste Grüße
Tom
Titel: Re: Wie VBA-Code um Abgleich mit Listenfel ergänzen ?
Beitrag von: Knobbi38 am Oktober 22, 2024, 12:57:27
Kein Problem.

Grüße
Ulrich