Nutzen von Access-VBA-programmierten Funktionen in einer Abfrage

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Nutzen von Access-VBA-programmierten Funktionen in einer Abfrage

    Moin Moin,

    ich habe ein Problem mit einer Abfrage in Access, wo ich eine eigene Funktion in VBA programmiert habe. Die will mein Programm nicht ausführen, weil er sie nicht findet. Es geht darum, dass ich Group_Concatenate per VBA in Access integriert habe und das wiederum in einer Abfrage verwende.

    In meinem Programm rufe ich dann die Abfrage auf, was mit der Meldung "~ Finde Funktionen nicht ~" scheitert.

    Hier die VBA-Funktion

    VB.NET-Quellcode

    1. Public Function TourConcat(pustr_Prefix As String, pustr_Nr As String)
    2. Dim str_SQL As String
    3. Dim str_Ergebnis As String
    4. Dim ado_RS As New ADODB.Recordset
    5. str_SQL = "SELECT TOP 5 Kundenort FROM abf_Touren_Auftrag_Kunden WHERE " & _
    6. "TourPrefix = '" & pustr_Prefix & "' AND " & _
    7. "TourNr = '" & pustr_Nr & "' " & _
    8. "GROUP BY Kundenort ORDER BY Kundenort"
    9. ado_RS.Open str_SQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    10. While ado_RS.EOF = False
    11. If str_Ergebnis = "" Then
    12. str_Ergebnis = ado_RS!Kundenort
    13. Else
    14. str_Ergebnis = str_Ergebnis & ", " & ado_RS!Kundenort
    15. End If
    16. ado_RS.MoveNext
    17. Wend
    18. ado_RS.Close
    19. Set ado_RS = Nothing
    20. TourConcat = str_Ergebnis
    21. End Function


    Jetzt habe ich schon ein wenig gegoogelt und scheinbar gibt es keine Lösung für das Problem. Hat von Eucher einer eine Idee, wie ich mein Ziel trotzdem erreichen kann.

    Mein Ziel ist quasi unten angehängte Abfrage so in meinem Programm wieder zu geben. Ohne diese Abfrage hätte ich redundante Datensätze und das will ich verhindern.

    Bilder
    • Concat.PNG

      3,88 kB, 441×67, 237 mal angesehen
    zum Prob selbst kann ich nix sagen - ich vermeide immer möglichst, VBA in VB-Proggis einzubinden, also dieses Office-InterOp frist gemein Resourcen, ist schlecht portabel, instabil und neigt zu Memory-Leaks.

    guggemol "Datenbank in 10 Minuten" auf erfinderdesrades.unitweb.de/Pr…r/Downloadpage/index.html

    Das mittm typisierten Dataset dürfte eine ganz neue Vorgehensweise sein für dich.
    Das Zusammenrühren mehrerer Werte in eine Zelle ist auch ziemlich problematisch: zum einen kann die Zelle dadurch sehr breit werden, zum andern kann man solch natürlich nicht mehr zurückspeichern.

    Eine Alternative wäre der ParentchildView: Da würde man links die Touren auswählen können, und rechts bekäme man die betroffenen Orte angezeigt.
    guggemol die vier Views auf Video
    Danke - schon wieder einmal.

    Die Kombination von VBA und VB.NET halte ich auch nicht für sinnvoll.
    Mein Ziel ist ein ganz anderes: Eine ListView soll mir die Touren anzeigen und die darin anzufahrenden Orte.

    Tour Nr. 1 fährt Musterstadt, Musterdorf, Mustergemeinde, Musterinsel etc. an. Jetzt will ich aber nicht 4 Einträge in der ListView haben, sondern nur einen Eintrag mit Tour Nr. 1 und der Aufzählung der Orte.

    Gespeichert werden sollen diese Informationen nicht, nur angezeigt werden. In einem anderen Formular werden die Daten schon korrekt angezeigt und vor allen Dingen aufgesplittet.

    In MySQL geht das ja per SQL-Command, aber nicht in Access. Ich weiß Access ist ein Zustand und keine Datenbank ;), aber aufgrund der späteren Infrastruktur nicht zu bewerkstelligen.

    Deine Idee mit dem ParentchildView werde ich mir mal durch den Kopf gehen lassen.
    jou, lasses dir gründlich durch den Kopf gehen. Alternativ kann man die Touren auch einfach in einer Combobox zur Auswahl anbieten - das dürfte ziemlich Platz sparen.
    Und vergiss ListView - das ist ein Holzweg, schon weil das kein Databinding unterstützt.
    gugge diese post: Rechnen Problem und die weiterführenden Links
    mit ner Combobox würde ich am Ziel vorbeischießen ohne die Aufgabenstellung nur Ansatzweise gelöst zu haben.
    Ich habe mal gerade was in Word gezimmert, was meine Idee/Aufgabenstellung ist.

    So eine Auflistung bekommt man doch nur im ListView hin. Alles andere ist doch für den Nutzer nicht mehr komfortabel.

    Die ListView ist nur als Anzeige ohne Berechnungen oder dergleichen gedacht.
    Bilder
    • Tourenplanung.PNG

      10,49 kB, 663×229, 243 mal angesehen
    ok, das ist schon recht advanced.
    Ich hab sone gruppierte Ansicht aber auch mal mit DGVs gebacken, gugge vb-paradise.de/index.php/Attachment/17929/, da gibts eine Übersicht, und die kann man auch nach verschiedenen Spalten gruppieren.

    Aber schon advanced.

    PS: das Admin-Passwort ist "admin", und die gruppierte Ansicht ist "Alle Belege"

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    puuuuhhhhhh.... das ist aber richtig Advanced.

    An für sich habe ich schon komplett alles mit ListView fertig, mir fehlt nur der Teil mit den Orten.

    Weil mir sicherlich die Programmierkentnisse in deine Richtung gesehen dermaßen fehlen, beschränke ich mich auf den Lösungsansatz die Orte auszulagern.
    Hi kurzda,

    poste mal deine functions aufruf, ich würde zwar zustimmen, dass man da nicht viel verkehrt machen kann, aber manchmal sind es eben diese kleinen niglichkeiten
    JonDonym
    Eine Anonymisierung-Tool, das nicht nur deine IP verdeckt, sondern deine History, BrowserTyp, Windows-Version etc.
    Das Tool hat ca. 5 FreeKaskaden und ca. 10 Premium. Minimum 5 EUR für ein Volumen von 650MB.

    Meine Lösung

    Hi,

    hier meine Lösung, IMHO eine gute und einfache funktionierende Lösung (sichtlicher noch Luft nach Oben!!)

    Ich erspare jetzt mal die langen Zeilen Code.

    Danke für die Hilfe beim Verstädnis und Brainstorming.
    Bilder
    • 20140907_Tourenplanung_Übersicht.PNG

      27,93 kB, 804×613, 242 mal angesehen
    hübsch

    Es ist ja 4-views-mäßig betrachtet ein ParentChild-View mit einem DetailView.

    Hast du auch bischen Databinding eingesetzt, oder schreibst du jeden Wert einzeln in die Controls?

    Weil Listview unterstützt ja kein Databinding, die anneren Controls aber sehr wohl.
    Da bräuchtest du nur im ListView-SelectionChanged eine BindingSource.Position zu verstellen, und Databinding würde alles annere erledigen.