![]() |
Datenbank: Sqlite • Version: 3 • Zugriff über: Delphi
Datum aus voriger Zeile zum berechnen
Hallo Spezialisten,
jetzt stehe ich vor dem nächsten Problem, zu dem ich keine Lösung finde. Die Datenbank: Stammdaten Die Tabelle : Zwischen ! gekürzt ! CREATE TABLE [zwischen]( [SatzNr] INTEGER PRIMARY KEY ASC AUTOINCREMENT, [QEchtDat] DATE, [WER] CHAR(30), [Nummer] INTEGER); Die Abfrage: Select QechtDat,wer,Nummer from Zwischen where jahr="2019" and nummer = "139" order by QechtDat bringt folgendes Ergebnis: QEchtDat WER Nummer 2019-01-10 Demag 139 2019-01-19 Demag 139 2019-01-25 Demag 139 2019-02-01 Demag 139 2019-02-08 Demag 139 2019-02-13 Demag 139 2019-02-27 Demag 139 2019-03-08 Demag 139 2019-03-15 Demag 139 Jetzt muss ich für jede Zeile die vergangenen Tage zur vorigen Zeile berechnen: Beispiel: QEchtDat WER Nummer Tage 2019-01-10 Demag 139 0 2019-01-19 Demag 139 9 2019-01-25 Demag 139 6 Zeile 1 ist die erste Zeile und deshalb 0 Tage Wie bekomme ich es hin, (dass ich das Datum aus der Zeile zuvor mitnehme in die nächste Zeile) (oder in der aktuellen Zeile auf das Datum der vorigen Zeile zugreife) um daraus die Tage zu berechnen. [SatzNr] ist in der Abfrage NICHT fortlaufend ! Wenn irgendwie möglich Abfrage mit --Erklärung denn diese Nuss ist mir zu hart.:oops: Danke im voraus für Eure Mühe. |
AW: Datum aus voriger Zeile zum berechnen
In Sqlite kannst Du mit einer Unterabfrage arbeiten. Auf
![]() |
AW: Datum aus voriger Zeile zum berechnen
Seit Ende 2018 (Version 3.25) gibt es Windows Functions in SQLite.
Damit nimmt man z.B. im Fall hier für Zugriff auf vorige oder folgende Datensätze lag() und lead() und benötigt keine Unterabfragen dazu. Der Zugriff auf andere Datensätze (vorige, nächste) ist damit sehr vergleichbar zu Tabellenkalkulationsprogrammen. Da die Unterabfragen wegfallen und eine spezifische Implementierung dieser Funktionen vorgenommen wurde, ist es idR auch viel schneller. Die Implementierung würde ich schon recht umfangreich nennen. ![]() Hier ein Tutorial: ![]() |
AW: Datum aus voriger Zeile zum berechnen
Danke Timo und Jo !
Durch den Hinweis (Link) von Timo konnte ich mir die Lösung zusammenbauen.:-D Aus: SELECT day ,price ,price - (SELECT t2.price FROM mytable t2 WHERE t2.item = t1.item AND t2.day < t1.day ORDER BY t2.day DESC LIMIT 1 ) AS change FROM mytable t1 wurde: SELECT Qechtdat,wer,nummer, JulianDay(Qechtdat) - (SELECT JulianDay(Qechtdat) As Integer FROM Zwischen t2 WHERE t2.nummer = t1.nummer AND JulianDay(t2.Qechtdat) < JulianDay(t1.Qechtdat) ORDER BY JulianDay(t2.Qechtdat) DESC LIMIT 1) AS Tage FROM Zwischen t1 where Jahr = "2019" and nummer = "139" mit dem Ergebnis: QEchtDat WER Nummer Tage 2019-01-10 Demag 139 20 2019-01-19 Demag 139 9 2019-01-25 Demag 139 6 2019-02-01 Demag 139 7 Zeile 1 hat aber einen Fehler - hier ist kein Bezug auf ein Datum - also müsste er 0 sein. Wie ich den ersten Eintrag auf 0 bekomme ist mir aber noch schleierhaft. Hat jemand eine Idee ? (Lösung) |
AW: Datum aus voriger Zeile zum berechnen
Mal etwas verkürzt
Mit dieser Datenbasis
SQL-Code:
liefert diese Abfrage
CREATE TABLE [zwischen](
[SatzNr] INTEGER PRIMARY KEY ASC AUTOINCREMENT, [QEchtDat] DATE, [WER] CHAR(30), [Nummer] INTEGER); INSERT INTO [zwischen] (QEchtDat,WER,Nummer) VALUES ('2019-01-10','Demag',139); INSERT INTO [zwischen] (QEchtDat,WER,Nummer) VALUES ('2019-01-19','Demag',139); INSERT INTO [zwischen] (QEchtDat,WER,Nummer) VALUES ('2019-01-25','Demag',139); INSERT INTO [zwischen] (QEchtDat,WER,Nummer) VALUES ('2019-02-01','Demag',139); INSERT INTO [zwischen] (QEchtDat,WER,Nummer) VALUES ('2019-02-08','Demag',139);
SQL-Code:
diese Daten
select QEchtDat,
julianday(QEchtDat) - julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) Tage from zwischen
Code:
QEchtDat Tage
---------------- ------------------ 10.01.2019 0 19.01.2019 9 25.01.2019 6 01.02.2019 7 08.02.2019 7 |
AW: Datum aus voriger Zeile zum berechnen
WOW !!! :shock:
Danke Schokohase !!! Volltreffer - bin sprachlos - |
AW: Datum aus voriger Zeile zum berechnen
In Sqlite Expert liefert diese Abfrage die RICHTIGEN Ergebnisse.
Aber in Delphi 10.2 mit: QText:=QText+'select QEchtDat,wer,nummer, '; QText:=QText+'julianday(QEchtDat) - '; QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) Tage '; QText:=QText+'FROM zwischen '; QText:=QText+'Where Jahr ="2019"'; QText:=QText+'and nummer = "139" '; QText:=QText+'ORDER BY QEchtDat '; ZeigDatenQ.Close; ZeigDatenQ.sql.text:=''; ZeigDatenQ.sql.text:=(QText); ZeigDatenQ.Open; bekomme ich einen Fehler: [FireDac][Phys][SQLite] ERROR: near "over" : syntax error. den ich nicht finden kann. (Die Zeile 3 von QText:= ist in einer Zeile geschrieben wird hier aber getrennt) |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Hier z.B. fehlt eines
Delphi-Quellcode:
Jahr ="2019"';
|
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Windows Functions sind echt cool und sparen eine Menge Clientgerödel und ergeben sogar lesbare Statements. Dazu ähnlich gibt es "um die Ecke" einen langen Thread zum Thema Performance.. Ich sag einfach mal so, damit geht in SQL alles, was auch mit Excel geht. Und zwar prinzipiell ohne Größenbeschränkung und ohne ständig mit Workarounds arbeiten zu müssen*. Für eine Delphianwendung bedeutet das, man kann nahe zu beliebige Datentransformationen, -Reports, .. anzeigen, ohne eine Zeile Programmcode zu schreiben. (Nur das SQL Statement und die Komponenten verknüpfen > RAD!) Zitat:
Wenn es kein Syntaxfehler ist, der durch das Aneinanderklöppeln von Statementhäppchen entstanden ist, dann ist es vielleicht ein Versionsproblem. * dafür wäre ein weiteres Feature der DB noch Pivot/Unpivot |
AW: Datum aus voriger Zeile zum berechnen
Also, ich war heute mal an einem anderen Rechner:
Win 10 mit Delphi Rio. (Delphi 10.3 Version 26....) SqlVersion 3.23.1 Die Abfrage direkt im FDQuery eingegeben ! Der gleiche Fehler in Delphi ! auch mit korrigierten Leerzeichen. In SQLite Expert (Sql Version 3,2.9) Liefert die Abfrage: select QEchtDat,wer,nummer, julianday(QEchtDat) - julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) AS Tage FROM zwischen Where Jahr = "2019" and nummer = "139" ORDER BY QEchtDat das: QEchtDat WER Nummer Tage 2019-01-10 Demag 139 0 2019-01-19 Demag 139 9 2019-01-25 Demag 139 6 2019-02-01 Demag 139 7 2019-02-08 Demag 139 7 2019-02-13 Demag 139 5 läuft tadellos !! Hat jemand noch eine Idee ? |
AW: Datum aus voriger Zeile zum berechnen
|
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Du könntest über Delphi mal abfragen:
Code:
Ich hab im Kopf, die sqlite ist bei Firedac integriert, aber da bin ich mir wirklich nicht sicher. Hier gibt es sicher jemand, der das genau weiß.
select sqlite_version();
Hier noch was gefunden: ![]() |
AW: Datum aus voriger Zeile zum berechnen
Also mein SQL-Statement ist so wie hier gepostet mit Delphi 10.3.2 und FireDAC lauffähig.
|
AW: Datum aus voriger Zeile zum berechnen
Mal nebenebei: Pack das over mal nicht in eine gesonderte Zeile.
Dein Code:
Delphi-Quellcode:
Richtig wäre:
...
QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) Tage '; ...
Delphi-Quellcode:
Oder:
...
QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) Tage '; ...
Delphi-Quellcode:
Oder:
...
QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat)' + 'over (order by QEchtDat)) Tage '; ...
Delphi-Quellcode:
Schau mal ob sich damit dein Problem lösen lässt.
...
QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat)'; QText:=QText+'over (order by QEchtDat)) Tage '; ... |
AW: Datum aus voriger Zeile zum berechnen
Also SQL ist nicht Zeilen sensitiv. Aber Leerzeichen zwischen den Schlüsselwörtern, Feldnamen und Funktionen können nicht schaden!
|
AW: Datum aus voriger Zeile zum berechnen
SQL ist nicht Zeilensensitiv, ABER bei der Compilierung in Delphi gibt es Probleme wenn du innerhalb eines Strings die Zeile wechselst, was er laut/ copy/paste tut:
Delphi-Quellcode:
...
QText:=QText+'julianday(lag(QEchtDat,1,QEchtDat) //hier endet die Zeile ohne ' und ; oder + um den String abzuschließen over (order by QEchtDat)) Tage '; // hier geht der String weiter ohne ihn mit ' zu beginnen bzw. "over" kennt Delphi so in der Form natürlich nicht (da falsch interpretiert) ... |
AW: Datum aus voriger Zeile zum berechnen
Du hast Recht, hab ich übersehen!
|
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Zitat:
|
AW: Datum aus voriger Zeile zum berechnen
Hast recht @Schokohase.
Habe aktuell das gleiche Problem -.- und die Abfrage passt in der Workbench einwandfrei, nur über den Query bekomme ich den Fehler. FDQuery.Open('SELECT * FROM ' + sDatenbank + ' WHERE seriennummer = ' + sSNR); Workbench: Einwandfrei Delphi (FDQuery.SQL): Einwandfrei Programm zur Laufzeit: Fehler FEHLER (zumindest bei mir) gefunden. Ich hatte die Datenbank per Bedingung definiert, welche aber irgendwie ins leere lief und daher leer/undefiniert war. Das führte zu meinem Fehler, evtl. hat der TE ein ähnliches Problem? AM besten mal per Showmessage(QText); deine Variablen der Query Abfrage prüfen |
AW: Datum aus voriger Zeile zum berechnen
So, musste erst mal etwas arbeiten.
Selbst mit der Abfrage in einem Zug und + kommt der gleiche Syntax Fehler bei "over" . Die Formatierung wird hier verändert ! QText:='select QEchtDat,wer,nummer,julianday(QEchtDat) -'+ ' julianday(lag(QEchtDat,1,QEchtDat) over (order by QEchtDat)) as Tage '+ 'FROM zwischen Where Jahr = "2019" and nummer = "139" ORDER BY QEchtDat'; Mit Showmessage(QText)wird alles, wie eingegeben (mit leerzeichen an den richtigen Stellen) angezeigt. Was kann ich noch testen um den Fehler zu finden ? |
AW: Datum aus voriger Zeile zum berechnen
Rufe die Abfrage der SQLiteversion aus Delphi heraus auf, wie ich es oben vorgeschlagen habe.
|
AW: Datum aus voriger Zeile zum berechnen
Im Abfrageeditor mit ausführen:
gestern in Rio 10.3.2 3.23.1 In Tokyo 3.9.2 In SqLite Expert 3.29.0 Hier klappt die Abfrage ! |
AW: Datum aus voriger Zeile zum berechnen
Wie in Beitrag 3 geschrieben, die Funktionen sind in V 3.25 eingeführt worden.
Irgendwo später hab ich einen Link gepostet, wie man die sqlite dll dynamisch einbinden kann. Versuchs einfach mal! |
AW: Datum aus voriger Zeile zum berechnen
Hallo Jo,
mit dem dynamischen Zugriff auf Sqlite habe ich so meine Probleme. Ich habe Bedenken, dass nach dem kopieren der DLL´s und einstellen in Firedac mein System nicht mehr richtig läuft und meine ganze Arbeit damit stecken bleibt. Kennst Du eine Schritt für Schritt Anleitung, die ich zur Not auch Schritt für Schritt rückgängig machen kann. Mit 65 wird man vorsichtiger und es ist schon passiert,das mit weniger, viel Arbeit ausgelöst wurde. Lag und Kollegen ist mit Sicherheit eine feine Sache aber ich trau mich nicht .... da bastel ich mir lieber die Abfrage um und arbeite umständlich weiter :oops::cry: |
AW: Datum aus voriger Zeile zum berechnen
Also mir wird bei Rio die SQLite Version 3.28.0 angezeigt.
Beim FDConnection Verbindungseditor gibt es einen Info-Tab
Code:
So sieht das bei mir aus. Zeig doch mal deine Info
================================
FireDAC info ================================ Tool = RAD Studio 10.3 FireDAC = 17.0.0 (Build 93731) Platform = Windows 32 bit Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR ================================ Client-Info ================================ Loading driver SQLite ... DLL = <sqlite3_x86.obj statically linked> Client version = 3.28.0 Compile options = DEFAULT_CACHE_SIZE=8000;DEFAULT_FILE_FORMAT=4; DEFAULT_JOURNAL_SIZE_LIMIT=1048576; DEFAULT_PAGE_SIZE=4096;DEFAULT_RECURSIVE_TRIGGERS; ENABLE_COLUMN_METADATA;ENABLE_DBSTAT_VTAB; ENABLE_FTS3;ENABLE_FTS3_PARENTHESIS;ENABLE_FTS4; ENABLE_FTS5;ENABLE_JSON1;ENABLE_RBU;ENABLE_RTREE; ENABLE_STAT4;HAS_CODEC;OMIT_AUTOINIT;TEMP_STORE=2; THREADSAFE=2;USE_URI ================================ Sitzungs-Info ================================ Current catalog = Current schema = Total changes = 0 Database encoding = UTF8 Encryption mode = <unencrypted> Cache size = 10000 |
AW: Datum aus voriger Zeile zum berechnen
================================
Verbindungsdefinitionsparameter ================================ Database=E:\Abr\AbrDB\Stammdaten.db LockingMode=Normal Synchronous=Full DriverID=SQLite ================================ FireDAC info ================================ Tool = RAD Studio 10.2 FireDAC = 16.0.0 (Build 88974) Platform = Windows 32 bit Defines = FireDAC_NOLOCALE_META;FireDAC_MONITOR ================================ Client-Info ================================ Loading driver SQLite ... DLL = <sqlite3_x86.obj statically linked> Client version = 3.9.2 Compile options = ENABLE_COLUMN_METADATA;ENABLE_DBSTAT_VTAB; ENABLE_FTS3;ENABLE_FTS3_PARENTHESIS;ENABLE_FTS4; ENABLE_FTS5;ENABLE_JSON1;ENABLE_RTREE; ENABLE_STAT4;HAS_CODEC;OMIT_AUTOINIT; OMIT_DEPRECATED;SYSTEM_MALLOC;TEMP_STORE=2; THREADSAFE=2 ================================ Sitzungs-Info ================================ Current catalog = Current schema = Total changes = 0 Database encoding = UTF8 Encryption mode = <unencrypted> Cache size = 10000 |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Es gibt Backupsoftware, mit der man im Notfall eine zerpfriemlete Software wieder auf den alten Stand bringen kann. Firedac 16 versus 17 wäre dann wohl der Grund für die Ursache. Ich hab leider keine Schritt für Schritt Anleitung und kann Dir als Alternative nur das nennen, was du selbst geschrieben hast, mehr Handarbeit in den Queries. (Oder offenbar ein Delphi Update) Sicher kannst Du das auch abwägen, wenn es nur diese eine Abfrage ist, dann ist und bleibt es halt eine Abfrage mit Workaround, wenn noch mehr so Zeug kommt, überlegst Du es Dir vielleicht anders. |
AW: Datum aus voriger Zeile zum berechnen
So, jetzt muss ich mir mal kurz die Augen reiben:
Der Link zu Emba, den ich in Beitrag ![]() ![]() |
AW: Datum aus voriger Zeile zum berechnen
Hast du auch geprüft ob deine genutzten Variablen passen (richtige Werte)?
|
AW: Datum aus voriger Zeile zum berechnen
Zitat:
![]() Und dann nochmal Tokyo ![]() Allerdings scheint die Rio-Doku falsch zu sein, denn ich habe ja die SQLite-Version 3.28.0 an Bord. |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Ich bin wohl nicht in der Lage, einen Link zu posten. Wieauchimmer, vielleicht bekommt concept2015 das noch mit und geht das Wagnis ein. |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Du musst das nur wissen und entsprechend handeln. |
AW: Datum aus voriger Zeile zum berechnen
Zitat:
Was für eine geniale Verkettung unlücklicher Umstände! Das bestärkt einen nicht gerade darin, einem Link zu folgen und den Inhalt am eigenen System anzuwenden. Danke für den Hinweis. |
AW: Datum aus voriger Zeile zum berechnen
So, ich bin das Wagnis eingegangen -
die richtigen DLL´s in die Verzeichnisse kopiert 64er DLL umbenannt FireDAC.inc geändert '.' weg und jetzt ? Alles beim alten ! ... der Fehler kommt |
AW: Datum aus voriger Zeile zum berechnen
Im laufenden Betrieb? Mal einen Neustart gemacht?
Schon erneut die Versionsabfrage durchgeführt? |
AW: Datum aus voriger Zeile zum berechnen
Ja, alles beim alten.
Muss ich die Verbindung jetzt anders aufbauen ? |
AW: Datum aus voriger Zeile zum berechnen
Ich kann Dir da nicht weiterhelfen, außer Dich jede Zeile aus dem Link abzufragen.
Ich habe diese Delphi Version nicht und kann es nicht nachvollziehen. Vielleicht ist da jemand anderes zu in der Lage. |
AW: Datum aus voriger Zeile zum berechnen
Hallo, nach tagelangem rumgewurschtel in Delphi wurde es mir zu bunt. Wenn ich die SqLite.DLL (extern) benutzen will, bekomme ich die Windows Funktions dazu, verliere aber die Datenbank-Verschlüsselung - das geht nicht.
Ich lasse alles so, wie es ist und verzichte (vorerst) auf die Funktionen. Deshalb nochmal meine Frage: Wie muss ich die Abfrage umstellen, um in der ersten Zeile, in der ja kein Datum vorher ist, mit 0 bekomme ? Hier nochmal die Abfrage: SELECT Qechtdat,wer,nummer, JulianDay(Qechtdat) - (SELECT JulianDay(Qechtdat) As Integer FROM Zwischen t2 WHERE t2.nummer = t1.nummer AND JulianDay(t2.Qechtdat) < JulianDay(t1.Qechtdat) ORDER BY JulianDay(t2.Qechtdat) DESC LIMIT 1) AS Tage FROM Zwischen t1 where Jahr = "2019" and nummer = "139" Das Ergebnis liefert bis auf die erste Zeile richtige Daten: QEchtDat WER Nummer Tage 2019-01-10 Demag 139 20 2019-01-19 Demag 139 9 2019-01-25 Demag 139 6 2019-02-01 Demag 139 7 2019-02-08 Demag 139 7 2019-02-13 Demag 139 5 2019-02-27 Demag 139 14 2019-03-08 Demag 139 9 2019-03-15 Demag 139 7 2019-03-22 Demag 139 7 2019-04-04 Demag 139 13 2019-04-04 Demag 139 13 2019-04-11 Demag 139 7 2019-04-26 Demag 139 15 Wenn mir da jemand helfen könnte :roll: |
AW: Datum aus voriger Zeile zum berechnen
Zunächst solltest du alle Felder mit der zugehörgen DB erweitern. Es könnte sonst böse Überraschungen geben.
Also:
SQL-Code:
Gruß
SELECT t1.Qechtdat,
t1.wer, t1.nummer, JulianDay(t1.Qechtdat) - ........ usw. K-H |
AW: Datum aus voriger Zeile zum berechnen
Hab ich gemacht aber hilft mir ja nicht wirklich.
Hat noch jemand eine Idee ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz