Problem beim Auslesen von Access Datenbank Abfragen die VBA Macros enthalten

    Problem beim Auslesen von Access Datenbank Abfragen die VBA Macros enthalten

    Hallo,

    ich habe folgendes Problem:

    Ich möchte die resultierende Datenmenge einer Abfrage die ich in einer Access Datenbank über ein VBA Makro definiert habe, auslesen. Dazu nutze ich folgenden Code:

    Delphi-Code

    1. procedure TForm11.btnMDBauslesenClick(Sender: TObject);
    2. var
    3. FileNameMDB: string;
    4. i : Integer;
    5. Abfragevorhanden : Boolean;
    6. Datensaetze : Integer;
    7. //Access : Variant;
    8. begin
    9. if (OpenDialog1.Execute(Self.Handle)) then
    10. begin
    11. FileNameMDB := OpenDialog1.FileName;
    12. end;
    13. if (FileExists(FileNameMDB)) then
    14. begin
    15. ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + FileNameMDB+ ';JET OLEDB:Database Password=""';
    16. ADOConnection1.Connected := true;
    17. ADOConnection1.GetProcedureNames(LokaleDatenbanktabellen);
    18. lblAnzeigePfadLokaleDatenbank.Caption := FileNameMDB;
    19. Abfragevorhanden := false;
    20. for i := 0 to LokaleDatenbanktabellen.Count -1 do
    21. begin
    22. if LokaleDatenbanktabellen[i] = 'SpezielleAbfrage_mit_VBA-Makro' then
    23. begin
    24. Abfragevorhanden :=true;
    25. end;
    26. end;
    27. //Hier habe ich versucht die Sicherheitsstufe auf niedrig zu setzen, um so zu überprüfen, ob dadurch das Makro ausgeführt wird. Was jedoch nichts gebracht hat :/
    28. // Access := CreateOleObject('Access.Application');
    29. //
    30. // // ab Access 2003 Sicherheiststufe auf niedrig stellen
    31. // Access.AutomationSecurity := 1;
    32. ////
    33. //// // Access-Datei öffnen (true=exklusiv)
    34. // Access.OpenCurrentDatabase(FileNameMDB);
    35. if Abfragevorhanden =true then
    36. begin
    37. ADOQuery1.SQL.Clear;
    38. ADOQuery1.SQL.Text := Format('SELECT * FROM %s',['SpezielleAbfrage_mit_VBA-Makro']);
    39. ADOQuery1.Open;
    40. Datensaetze := 0;
    41. ADOQuery1.Last;
    42. ADOQuery1.First;
    43. Datensaetze := ADOQuery1.RecordCount;
    44. lblDatensaetzegesamt.Caption := 'Datensätze gesamt: ' + Datensaetze.ToString();
    45. end
    46. else
    47. begin
    48. MemoAusgabe.Lines.Add('FEHLER! Abfrage "SpezielleAbfrage_mit_VBA-Makro" in der Datenbank nicht vorhanden!');
    49. end;
    50. cmbAlleAbfragen.Items := LokaleDatenbanktabellen;
    51. end;
    52. end;


    Das VBA Makro funktioniert in MS Access 2003 einwandfrei, von daher gehe ich nicht davon aus, dass am Makro etwas nicht stimmt.Wenn ich den Code jedoch ausführen möchte kommt immer "Undefinierte Funktion 'gndr' in Ausruck" welcher durch das Makro manipuliert werden sollte. "gndr" steht in diesem Fall für "Gender". Hier soll einfach nur Herr bzw. Frau auf "M" oder "F" geändert werden.

    Hat jemand von euch vielleicht noch eine Idee was ich daran verändern könnte, damit ich die Datenmenge aus der Datenbank bekomme?

    Für jede Hilfe bin ich sehr dankbar! :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Fragger93“ ()

    Ich kann mir vorstellen, dass Access intern das Minus im Tabellennamen akzeptiert, aber es bei der Übergabe via ADO zu einer Fehlinterpretation kommt.

    Versuch mal den Tabellennamen in Anführungsstriche zu setzen (nicht Hochkomma) oder in eckige Klammern einzufassen.

    Grüße
    Mikhal
    Computer erleichtern die Arbeit -
    und die Welt ist eine Scheibe!
    Mir ist erstmal nur eines aufgefallen, das aber für dein Problem nicht wichtig ist, generell aber schon: Boolsche Variablen fragt man nicht mittels True ab.

    Falsch:

    Delphi-Code

    1. if Abfragevorhanden =true then

    Richtig:

    Delphi-Code

    1. if Abfragevorhanden then


    Die Boolsche Variable steht für einen Ausdruck, der bereits true oder false ist. Wenn du auf true testest, dann fragst du im Grunde if true = true then. Das kann gutgehen, muß aber nicht, da für true alle Werte größer 0 gelten, für false dagegen 0. Wenn dus genauer wissen willst ...

    Nun zu deinem Problem: Es ist nicht möglich, dein Problem nachzustellen, weil ausser dir niemand das Access-File mit dem problematischen Makro besitzt. Vielleicht könntest du das hier mal anhängen. Weitere Fragen:
    • Wieso formatierst du den SQL-Text überhaupt? Hast du das mal ohne Format versucht?
    • Was ist das für eine Tabelle: %s ??
    • Das Makro trägt den Bezeichner SpezielleAbfrage_mit_VBA-Makro?
    • Wenn das %Zeichen ein Platzhalter (Asterix) sein soll, versuch es stattdessen doch mal mit dem &-Zeichen. Access hält sich hier nicht an übliche Datenbankstandards.
    • Könntest du das Makro nicht durch einen SQL-Befehl aus der Clientanwendung heraus ersetzen? So kompliziert scheint das Makro ja nicht zu sein, oder?
    Ansonsten fällt mir hierzu nix mehr ein.
    Nur um das richtig zu verstehen:
    Du hast also in Access eine Abfrage, in der nicht nur eingebaute Funktionen wie "Now()" oder "Val()" verwendet werden, sondern auch von Dir selbst in VBA erstellte?

    Da wird nicht funktionieren, denn von Delphi aus hast Du keinen Zugriff auf den VBA-Interpreter - Access selbst natürlich schon.

    Was sind das für selbst erstellte Funktionen?
    Braucht Du die hier zwingend, oder kannst Du nicht besser die rohen Tabellen abfragen und die Funktionen in Delphi nachbauen?
    "After three days without programming, life becomes meaningless." (The Tao of Programming, Book 2)
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler, 'Refactoring')
    Entschuldigung, ich hab keine Benachrichtigung in meinem Email-Postfach gesehen das hierauf jemand geantwortet hat, vielleicht ist Sie auch im Spamordner untergegangen... Ich bin heute zufällig nochmal hier vorbei gekommen und habe bemerkt das mir etliche von euch geschrieben haben.

    Ich habe das Problem so "gelöst" das ich unsereren Leuten vom "Data-Management" gesagt habe sie sollen ohne VBA-Skripts auskommen. Ein großer Unterschied dabei ist das WENN Skripts verwendet werden die Abfrage in

    Delphi-Code

    1. ADOConnection1.GetProcedureNames(LokaleDatenbanktabellen);


    steht. Und wenn KEINE VBA-Skripts verwendet werden, es in

    Delphi-Code

    1. ADOConnection1.GetTableNames(LokaleDatenbanktabellen);


    steht.

    @Mikhal : Die Tabellennamen in Anführungsstriche zu setzen habe ich bisher nicht versucht, werde ich aber wenn ich Zeit habe mal ausprobieren! Danke für den Tipp!

    @Slipstream : Danke für den Tipp mit den Boolschen Variablen. Bin mit Delphi noch nicht sooo vertraut. Bin erst seit 2 Monaten in der Ausbildung^^
    Den SQL-Text formatiere ich so, weil ich mich stark an einer Vorlage eines Kollegen orientiert habe.
    Den Namen der Tabelle darf ich an dieser Stelle aus Datenschutz Gründen nicht nennen :( Aber das sollte ja eigentlich auch unerheblich sein oder?
    Nein, das Makro besitzt einen anderen Namen, diesen darf ich aber auch nicht nennen.
    Der Platzhalter funktioniert so, dass Projekt ist nun eigentlich so gut wie abgeschlossen und der Platzhalter ist unverändert.
    Da sind spezielle Abfragen von den "Data-Management"-Mitarbeitern drin. Ich habe keine Ahnung wie die sich matchen. Ich hole mir eigentlich immer nur den resultierenden Datensatz raus und lade diesen hoch ¯\_(ツ)_/¯.

    @BerndG : Nein, die VBA-Skripts stammen von anderen. Ich habe keine Ahnung was diese machen und hatte bisher auch noch keine Erfahrung mit solchen Skripts.
    Die benötigten Funktionen wurden Teilweise über SQL-Anweisungen umgeformt oder über mein Tool gezielt abgefragt, ja.

    @Slipstream post Nr.2: Wie gesagt, tut mir Leid. Bin heute nochmal vorbei gekommen und habe bemerkt das hierauf doch bereits geantwortet wurde.