Access meldet „ODBC-Aufruf fehlgeschlagen“ bei Summen oder Verbünden
Eine Abfrage über verknüpfte Tabellen des Treibers scheitert mit Fehler 3146 „ODBC-Aufruf
fehlgeschlagen“, während einfache Abfragen derselben Tabellen laufen. Typisch: eine
Summenabfrage (Summe, Anzahl, Gruppierung), ein Verbund zweier verknüpfter Tabellen, eine
Unterabfrage.
Umgebung
Microsoft Access und Access-Runtime mit verknüpften Tabellen über {Wkl OData}; ebenso jede andere
ODBC-Anwendung, die solche Anweisungen schickt.
Ursache
Access schickt Summen, Gruppen und Verbünde über verknüpfte Tabellen als eine Anweisung an den Treiber und rechnet sie nicht selbst, wenn der Treiber ablehnt (auch wenn der Treiber keine SQL-Konformität meldet). Der Treiber rechnet ebenfalls nichts lokal; er übersetzt, reicht durch oder lehnt ab:
| Anweisung | Läuft, wenn … |
|---|---|
Summen, Gruppen, HAVING, DISTINCT über eine Tabelle | der Dienst Gruppieren ankündigt ($apply) oder eine Adresse für eigene Anweisungen besteht |
Verbund zweier Tabellen, Unterabfrage, Rechnen zwischen Aggregaten (SUM(a) - SUM(b)) | eine Adresse für eigene Anweisungen besteht |
Fehlt beides, lehnt der Treiber mit SQLSTATE 42000 ab, und Access zeigt nur 3146. Der Datendienst
Wkl.Data.Gateway nennt die Adresse jedem Aufrufer, dessen Regel den Alias nennt, solange geprüfte
Anweisungen am Alias eingeschaltet sind (Vorgabe). Lehnt er eine Anweisung ab, weil ein genanntes
Objekt nicht freigegeben ist, kommt 403 als 28000 an, und Access zeigt ebenfalls 3146.
Behebung
- Lesen Sie den Grund in der Ablaufverfolgung des Treibers: Setzen Sie
TRACEFILE=in der Verbindung oder die UmgebungsvariableWKL_ODATA_ODBC_TRACE, starten Sie Access neu, und wiederholen Sie die Abfrage. Steht dort, dass der Dienst kein Gruppieren ankündigt oder dass die Anweisung nicht übersetzbar ist, fahren Sie mit Schritt 2 fort. - Lassen Sie den Betreiber prüfen, ob der Dienst eigene Anweisungen für Ihren Aufrufer annimmt: beim Datendienst Wkl.Data.Gateway geprüfte Anweisungen am Alias und eine Regel, die den Alias und jedes Objekt der Abfrage freigibt; siehe Pass-Through-Abfragen einrichten, Schritt 1. Meldet der Dienst die Adresse selbst, ist auf dem Arbeitsplatz nichts zu ändern. Nennen die Verbindungen der Datei
PASSTHROUGHausdrücklich, muss jede Verbindung der Datei sie nennen. - Nimmt der Dienst keine eigenen Anweisungen an, bauen Sie die Abfrage um: Summen über eine einzelne Tabelle laufen gegen einen Dienst mit
$applyauch so; einen Verbund legen Sie als Sicht in der Datenbank an und verknüpfen die Sicht. - Starten Sie Access neu, nachdem der Dienst geändert wurde: Access teilt eine Verbindung je
DATABASE-Wert und liest die Angaben des Dienstes beim Verbinden.
Prüfung
Dieselbe Abfrage liefert Zeilen. In der Ablaufverfolgung steht statt der Abweisung eine Anfrage mit
$apply= (Gruppieren) oder eine Anfrage an die Adresse für eigene Anweisungen (…/sql.json).