Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac) (https://www.delphipraxis.net/189203-fehler-bei-zugriff-auf-access-db-ueber-anydac-jetzt-firedac.html)

juergen 17. Mai 2016 14:34

Datenbank: Access • Version: 2000 • Zugriff über: AnyDac

Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
Hallo zusammen,

ich muss mir Daten aus einer Access-DB holen (für mich das erste Mal dass mit Access arbeite).
Ich habe im TADConnetion-Editor von AnyDac den Pfad zu der mdb angegeben, den Usernamen und das Passwort.

Wenn ich dann die TADConnetion-Verbindung aktiviere und die Query öffnen will, erscheint folgende Meldung:
Code:
EADException [AnyDAC][Phys]-321. Character [(] is missed
Den SQL-String habe ich mir 1:1 aus einer Excel-Verbindung raus kopiert und meiner Query auch so zugewiesen. Das SQL-Statement schaut wie folgt aus:
Code:
Select `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit, `Mitarbeiter Stempelungen`.Buchung FROM `Y:\Test\Daten.mdb`.`Mitarbeiter Stempelungen` `Mitarbeiter Stempelungen` WHERE (`Mitarbeiter Stempelungen`.Buchung=1) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}) OR (`Mitarbeiter Stempelungen`.Buchung=2) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}) OR (`Mitarbeiter Stempelungen`.Buchung=5) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}) OR (`Mitarbeiter Stempelungen`.Buchung=6) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}) ORDER BY `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit
Kann jemand die Fehlermeldung einordnen oder hat eine Idee wo ich suchen könnte?

Vielen Dank schon mal vorab!

baumina 17. Mai 2016 14:56

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
Ich gehe mal davon aus, dass um die ODER-Verknüpfungen jeweils die Klammerung fehlt:

SQL-Code:
Select `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit, `Mitarbeiter Stempelungen`.Buchung
FROM `Y:\Test\Daten.mdb`.`Mitarbeiter Stempelungen` `Mitarbeiter Stempelungen` 
WHERE
((`Mitarbeiter Stempelungen`.Buchung=1) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}))
OR ((`Mitarbeiter Stempelungen`.Buchung=2) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}))
OR ((`Mitarbeiter Stempelungen`.Buchung=5) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}))
OR ((`Mitarbeiter Stempelungen`.Buchung=6) AND (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}))
ORDER BY `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit
Mein Vorschlag zur Vereinfachung:
SQL-Code:
Select `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit, `Mitarbeiter Stempelungen`.Buchung
FROM `Y:\Test\Daten.mdb`.`Mitarbeiter Stempelungen` `Mitarbeiter Stempelungen` 
WHERE (`Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}) AND
((`Mitarbeiter Stempelungen`.Buchung=1)
OR (`Mitarbeiter Stempelungen`.Buchung=2)
OR (`Mitarbeiter Stempelungen`.Buchung=5)
OR (`Mitarbeiter Stempelungen`.Buchung=6))
ORDER BY `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit
Evtl. geht auch das:
SQL-Code:
Select `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit, `Mitarbeiter Stempelungen`.Buchung
FROM `Y:\Test\Daten.mdb`.`Mitarbeiter Stempelungen` `Mitarbeiter Stempelungen` 
WHERE `Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'} 
AND `Mitarbeiter Stempelungen`.Buchung IN (1,2,5,6)
ORDER BY `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit

nahpets 17. Mai 2016 15:19

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
Außer Excel kenne ich keine "Datenbankschnittstelle", die im Select-Statement die Angabe des Datenbanknamens bzw. der Datenbankdatei erfordert.

Die Verbindung zur Datenbank wird eigentlich durch die Connection hergestellt.

Daher ließe sich das Statement von Baumina (vermutlich) noch verkürzen:
SQL-Code:
Select `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit, `Mitarbeiter Stempelungen`.Buchung
FROM `Mitarbeiter Stempelungen` `Mitarbeiter Stempelungen`
WHERE `Mitarbeiter Stempelungen`.DatumUhrzeit>{ts '2015-12-31 23:59:59'}
AND `Mitarbeiter Stempelungen`.Buchung IN (1,2,5,6)
ORDER BY `Mitarbeiter Stempelungen`.Mitarbeiter, `Mitarbeiter Stempelungen`.DatumUhrzeit
Um das Statement lesbarer zu machen, könnte man auch noch den Tabellennamen vor allen Spalten weglassen, da ja nur der Zugriff auf eine Tabelle erfolgt.

Den in Hochkommata gefassten Tabellenalias, der mit dem in Hochkomma gefassten Tabellennamen identisch ist, halte ich für überflüssig. Wenn man mit 'nem Alias arbeitet, sollte man eine kurze, aber verständliche Zeichenfolge wählen. Das könnte dann so aussehen:
SQL-Code:
Select
ms.Mitarbeiter,
ms.DatumUhrzeit,
ms.Buchung
FROM `Mitarbeiter Stempelungen` ms
WHERE ms.DatumUhrzeit > {ts '2015-12-31 23:59:59'}
AND ms.Buchung IN (1,2,5,6)
ORDER BY
ms.Mitarbeiter,
ms.DatumUhrzeit

juergen 17. Mai 2016 15:29

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
@baumina,

danke für deine Hilfe! :thumb:
Mein eigentliches Problem scheint erst mal ein ganz anderes zu sein:
Ich kann die EXCEL-Abfrage nicht 1:1 als SQL ausführen!
Da bin ich gerade dabei wie die SQL-Syntax für Access lauten muss.
Anstelle
Code:
`Mitarbeiter Stempelungen`.Mitarbeiter
muss es in Access wohl eher so sein:
Code:
[Mitarbeiter Stempelungen].Mitarbeiter
Auch die Datumsselektion lautet ganz anders:
Code:
And ([Mitarbeiter Stempelungen].DatumUhrzeit>#2016-04-30 23:59:59#)
Deine Hinweise sind aber trotzdem richtig und ich werde wohl die 2. Version von dir umsetzen, da ich mich mit der Access spezifischen Syntax überhaupt nicht auskenne.

@nahpets
Danke für deine Antwort. Mit Alias arbeite ich sonst auch, nur kenne ich Access eben gar nicht und muss erst mal das Ganze Access-konform hinbiegen.


Euch noch einen schönen Tag!

nahpets 17. Mai 2016 15:41

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
Bei Access stelle ich mich immer erstmal dumm an und nutze es so, wie auch Oracle, MSSQL und andere Datenbanken. Meist klappt das mit der Syntax nach SQL-Standard. Erst wenn das nicht geht, suche ich nach Auswegen.

Wenn ich Deine Ergänzungen richtig verstanden habe, müsste dashier eigentlich funktionieren:
SQL-Code:
Select
ms.Mitarbeiter,
ms.DatumUhrzeit,
ms.Buchung
FROM `Mitarbeiter Stempelungen` ms
WHERE ms.DatumUhrzeit > #2015-12-31 23:59:59#
AND ms.Buchung IN (1,2,5,6)
ORDER BY
ms.Mitarbeiter,
ms.DatumUhrzeit
Was ich noch nicht begriffen habe ist: Wann muss man in Access dieses ` oder jenes ´ oder [ und ] nehmen oder war es doch " bzw. ' :-(

juergen 17. Mai 2016 17:25

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
@nahpets,
Zitat:

Bei Access stelle ich mich immer erstmal dumm an und nutze es so, wie auch Oracle, MSSQL und andere Datenbanken. Meist klappt das mit der Syntax nach SQL-Standard. Erst wenn das nicht geht, suche ich nach Auswegen.
Das hätte ich mal auch von Anfang an so machen sollen! Ich hatte allerdings gedacht Access wäre so speziell dass ich die Excel-Abfrage als Ausgangsbasis nehmen sollte. Als ich gemerkt hatte dass das so nicht geht, habe ich die Abfrage in Access erstellt. Und die sah auch "komisch" aus (siehe den Post vom mir wo die Access-Syntax aus der Access-Abfrage zu sehen ist).
Deine Abfrage funktioniert direkt. :shock:
Und das ist ja Standard. In Zukunft werde ich das auch so machen wie von dir vorgeschlagen, erst mal den SQL-Standard verwenden...

:dp:

p80286 17. Mai 2016 21:53

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
ein Tip am Rande, verabschiede Dich bitte von Monstren wie Mitarbeiter Stempelung. Auch wenn die eine oder andere Datensammlungssoftware dies als Tabellen/Feldname akzeptiert könntest Du bei anderen Datenbanken damit auf wenig Gegenliebe stoßen.

Gruß
K-H

hoika 18. Mai 2016 04:54

AW: Fehler bei Zugriff auf Access-DB über AnyDac (jetzt FireDac)
 
Hallo
es ist doch nicht seine eigene Datenbank,
da kann er für diese Feldnamen nicht wirklich was.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz