Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Abfrage erzeugt Kompilierungsfehler obwohl in Vergangenheit immer erfolgreich

Begonnen von JoeAcc, April 30, 2025, 12:31:33

⏪ vorheriges - nächstes ⏩

JoeAcc

Hallo,
ich habe eine kleine Access-Datenbank, in der ich u.a. eine View erzeuge, die den Ausdruck "int ((tbl_Musik.dauer/60))" für eine Spalte enthält. Bis vor kurzem ist das problemlos über die Bühne gegangen, aber heute kommt die Fehlermeldung "Kompilierungsfehler. in Abfrageausdruck ' int ((tbl_Musik.dauer/60)) '.
In der DB habe ich mit Makros und VBA experimentiert, das ist der einzige Unterschied seit der letzten erfolgreichen Abfrage.
Was könnte ich dabei unbewusst angestellt haben und wie kriege ich das weg?
Besten Dank.
Ich hoffe, ich konnte mich bei meiner allerersten Frage in einem Forum verständlich ausdrücken...

Knobbi38

Hallo,

zeige doch mal bitte den kompletten SQL-Ausdruck und welchen Datentyp hat das Feld [tbl_Musik.dauer]?

Gruß Knobbi38

JoeAcc

Gerne:
SELECT vorbereiten_10.lfdNr, tbl_Musik.Tanz, tbl_Musik.Titel, tbl_Musik.Interpret, tbl_Musik.Dauer, tbl_Musik.bpm, tbl_Taktverzeichnis.RangeBPM, tbl_Musik.tpm, tbl_Musik.TanzId, Str(Int([dauer]/60)) AS dauerMin, [dauer] Mod 60 AS dauerSek, Str([dauerSek]) AS dauerSek1, IIf([dauerSek]<10,"0"+Right([dauerSek1],1),Right([dauerSek1],2)) AS dauerSek2, [dauerMin]+":"+[dauerSek2] AS DauerGes
FROM (vorbereiten_10 INNER JOIN tbl_Musik ON vorbereiten_10.TanzId = tbl_Musik.TanzId) INNER JOIN tbl_Taktverzeichnis ON tbl_Musik.Tanz = tbl_Taktverzeichnis.Tanz
ORDER BY vorbereiten_10.lfdNr;

Dauer" ist eine Zahl.

ABER:
nach meinem Dafürhalten liegt es an der Verwendung einer Function (hier: INT) in Kombination mit den Access-Objekten Makros und Modulen. Dafür spricht, dass in einer Kopie der DB, in der ich diese Makros und Module entfernt habe, die Ausführung funktioniert (die Idee hatte ich erst nach dem Veröffentlichen).

Knobbi38

Hallo,

Zitatnach meinem Dafürhalten liegt es an der Verwendung einer Function (hier: INT) in Kombination mit den Access-Objekten Makros und Modulen.
Hast du denn irgendwo in einem Modul eine Funktion INT() definiert?

"Zahl" ist eigentlich keine Datentyp für eine Feld, man müsste schon den genauen Datentyp wissen. Wenn du wirklich eine Angabe "Dauer" als Feldinhalt brauchst, würde ich diese in Sekunden erfassen und ggf. nur für die Anzeige formatieren, was dann auch deutlich einfacher geht. Zum Anzeigen eines Long Wertes in Sekunden in der Form hh:nn:ss kannst du in SQL diesen Ausdruck verwenden:
TimeSerial(0,0,[DauerInSekunden])
Gruß Knobbi38

Nachtrag:
Bitte Formatiere deinen SQL-Code mit einem Online-Formatter und stelle diesen dann mit den Code-Tags hier ein, damit man das besser lesen kann:
SELECT vorbereiten_10.lfdnr,
       tbl_musik.tanz,
       tbl_musik.titel,
       tbl_musik.interpret,
       tbl_musik.dauer,
       tbl_musik.bpm,
       tbl_taktverzeichnis.rangebpm,
       tbl_musik.tpm,
       tbl_musik.tanzid,
       str(INT([dauer] / 60)) AS dauerMin,
       [dauer] MOD 60         AS dauerSek,
       str([dauersek])        AS dauerSek1,
       iif([dauersek] < 10,
        "0" + RIGHT([dauersek1], 1),
RIGHT([dauersek1], 2)
       ) AS dauerSek2,
       [dauermin] + ":" + [dauersek2] AS DauerGes
FROM   ( vorbereiten_10 INNER JOIN tbl_musik
  ON vorbereiten_10.tanzid = tbl_musik.tanzid
       ) INNER JOIN tbl_taktverzeichnis
           ON tbl_musik.tanz = tbl_taktverzeichnis.tanz
ORDER  BY vorbereiten_10.lfdnr;


JoeAcc

Okay, "Dauer" ist als Double definiert.
die Timeserial-Funktion kannte ich noch nicht, werde ich ausprobieren, danke.
INT ist eine in Access definierte function (liefert den vor dem Komma stehenden Wert einer Zahl), ich habe auch zB cos versucht, geht auch nicht.
Wie gesagt, in der DB ohne Macros und Modulen funktioniert es ja, in der DB, in der ich Makros und Module stehen habe, funktioniert es nicht. In den genannten Objekten gibt es kein explizites INT(). Meine THese ist, dass ich mit der Verwendung einer Access-Funktion irgendwohin komme, wo Access meint, es müsse kompilieren. Reine Abfragen (Views) werden doch "nur" ausgeführt, ohne dass das SQL kompiliert wird.

Knobbi38

Hallo,

1. sollte Dauer nicht als Double, sondern als Long deklariert werden und wie bereits erwähnt, wird als Einheit Sekunden angenommen.

2. Ohne jetzt weiter auf deine Aussage eingehen zu wollen, ist deine These einfach falsch.

3. Der Begriff "Views" wird meistens in Verbindung mit SQL-Servern verwendet, in Access spricht man eher von "Queries" oder "Abfragen".

4. Das ausprobieren von cos() ist jetzt total abstrus. Wie kommt man auf so etwas?

5. Makros und VBA Code sind in Access zwei vollkommen unterschiedliche Dinge und sollten nicht synonym verwendet werden.

Nur mal so ...

Gruß Knobbi38


JoeAcc

habe eine Abfrage mit der Access-Function "Timeserial" gemacht
SELECT
  tbl_Musik.Dauer,
  TimeSerial(0,0,[dauer]) AS DauerFormat
FROM tbl_Musik;
Der Kompilierungsfehler kommt auch hier, während diwse Abfrage in der DB-Kopie ohne Makro/Module wunderbar läuft.

Danke für den Tipp mit dem online-formatter; ich h ba das immer per Hand gemacht...

Knobbi38

Dann liegt der Fehler sicherlich in einem Modul, möglicherweise sind diese beschädigt.
Repariere deine DB einmal und dann solltest du versuchen, deine Module einzeln zu kompilieren.

Gruß Knobbi38
 

JoeAcc

Zitat von: knobbi38 am April 30, 2025, 13:43:26Hallo,

1. sollte Dauer nicht als Double, sondern als Long deklariert werden und wie bereits erwähnt, wird als Einheit Sekunden angenommen.

2. Ohne jetzt weiter auf deine Aussage eingehen zu wollen, ist deine These einfach falsch.

3. Der Begriff "Views" wird meistens in Verbindung mit SQL-Servern verwendet, in Access spricht man eher von "Queries" oder "Abfragen".

4. Das ausprobieren von cos() ist jetzt total abstrus. Wie kommt man auf so etwas?

5. Makros und VBA Code sind in Access zwei vollkommen unterschiedliche Dinge und sollten nicht synonym verwendet werden.

Nur mal so ...

Gruß Knobbi38



zu 1: spielt keine Rolle
zu 2: Fakt ist: In der DB, die Makro/Module enthält, führt die Verwendung von Access-Funktionen in Abfragen zu dem Kompilierungsfehler. In der DB-Kopie, die keine Makro/Module enthält, funktioniert die gleiche ABfrage.
zu 3: DAnke für den Hinweis, für mich ist "View" und Abfrage" bisher immer synonym gewesen
zu 4: für meine eigene Analyse wollte ich wissen, ob der Fehler was mit der Access-Funktion INT zu tun hat. Deshalb habe ich irgendeine andere Access-Funktion verwendet. Dass das inhaltlicher Blödsinn ist, steht außer Frage.
zu 5: siehe 2

Bitte was meinst Du mit "reparieren". In "Datenbanktools" gibt es "Datenbank komprimieren und reparieren", aber ein Klick drauf bewirkt keine Aktion...

Knobbi38

Hallo,

Zitat... aber ein Klick drauf bewirkt keine Aktion...
Doch da passiert etwas, obwohl keine weitere Meldung erscheint.

Der Tip mit Long anstatt Double ist nur ein Verbesserungshinweis und hat mit deiner eigentlichen Fehlerursache/-suche nichts zu tun.

Fakt ist, du hast in deiner Datenbank einen Fehler, welcher mit Sicherheit auf ein fehlerhaftes Modul oder einem falschen/fehlenden Verweis zurückzuführen ist, ansonsten ließe sich dein Code kompilieren.

Eine Abfrage wird übrigens erst zur Laufzeit "optimiert", vorher findet m.W. nur eine Syntaxprüfung statt und die Verwendung der Funktion Int() ist normalerweise unproblematisch und führt zu keiner Fehlermeldung.

Anstatt jetzt viel Aufwand in die Fehlersuche zu investieren, würde ich die benötigten Module und/oder Makros sukzessive in die funktionierende DB importieren.

Gruß Knobbi38

JoeAcc

Danke, das sehe ich auch so, zu diesem Ansatz bin ich mittlerweile auch gekommen.

nur noch mal zum Verständnis: ich will diesen Code nicht kompilieren. Das soll weiterhin eine Abfrage bleiben, die mit Klicken auf "Ausführen" ein Ergebnis liefert.

Ansonsten vielen Dank, ich bin um 2 wertvolle Erkenntniss reicher: timeserial und online-formatter!

Knobbi38

Hallo,

Zitatnur noch mal zum Verständnis: ich will diesen Code nicht kompilieren. Das soll weiterhin eine Abfrage bleiben, die mit Klicken auf "Ausführen" ein Ergebnis liefert.
Explizit kompilieren kannst du nur ein Modul oder eine Klasse (in der VBE), Abfragen werden automatisch bei der ersten Ausführung optimiert - das geht nicht manuell.

Gruß Knobbi38

Bitsqueezer

Hallo,

aber um noch was zum ursprünglichen Problem zu sagen: Das kann passieren, wenn die Reihenfolge der Referenzen nicht korrekt ist oder wenn der Namespace von VBA "durcheinander" ist, wenn es gleichbenannte Variablen/Funktionen/Module etc. gibt, ebenso, wenn es gleich benannte Feldnamen oder Controlnamen in Formularen gibt.
Ich hatte mal meinen Spaß damit, herauszufinden, warum auf einmal "Date" in VBA nicht mehr funktionierte und ebenso dann auch "Len" oder "Mid". In VBA ließ sich das beheben, indem man z.B. "VBA.Mid" oder "VBA.Date" schreibt, aber das ist natürlich keine Lösung.
Es hatte sich dann herausgestellt, daß jemand ein Control "Date" genannt hat und das hatte schon gereicht, um alle internen VBA-Funktionen auf einmal nicht mehr funktionsfähig zu hinterlassen.

Der Hinweis auf die implementierten Module läßt eben genau auf sowas schließen. Dort würde ich mal zuerst nach Namen suchen, die geschütze Keywords sind.

Gruß

Christian