![]() |
Datenbank: DBase • Zugriff über: TTable
Schleife über Datumsfeld
Hallo Leute!
Ich habe 2 Probleme. Ich habe eine DBF-Tabelle in der sich ein Feld befindet, worin ein Datum abgelegt wird. Da das Programm auf unterschiedlichen Rechnern mit unterschiedlichen Datumsformaten läuft, habe ich in der DB nun Daten mit einem 2-stelligen Jahr und mit einem 4-stelligen Jahr drin. 1. Ich würde gern das Datum einheitlich gestalten. 2. Ich würde gern eine Statistik erstellen. Darin soll folgendes geschehen. Es wird das älteste Datum gesucht und das neueste. Anschliessend müssen die Jahre und Monate herausgefunden werden und dann in einer weiteren Schleife jeweils die Datensätze passend zu Monat und Jahr aufgelistet werden. Ergebnis soll dann ungefähr so aussehen: Monat/Jahr Umsatz 01/2005 115,00 Euro 02/2005 230,00 Euro Kann mir jemand folgen? Das Problem, dass ich habe ist, dass ich dies immer dynamisch halten muss, da ich nicht weiss, wieviel Monate und Jahr ich habe, da es das Datum ja immer weiter geht und diese Routine bei jedem Programmstart durchlafen werden soll. Ich würde mich freuen, wenn mir jemand einen Wink geben könnte, denn ich habe noch nicht mal den Hauch eines Denkansatzes... |
Re: Schleife über Datumsfeld
Benutzt man nicht einfach eine "Query" für sowas?
(Habe keine Erfahrung, ob DBase dies unterstützt, aber müsste doch...) In einer Query könnte man die Summe pro Monate bilden und nach Monat, Jahr sortieren. Wenn du Querys einsetzen kannst/willst, werde ich mir mal genauere Gedanken über die Syntax machen, falls nicht ein Profi schneller ist... :wink: (bin halt noch nicht so fix in Delphi u. SQL...) Gruß Pfoto |
Re: Schleife über Datumsfeld
Ja ich kann eine Query nutzen, ahabe es selbst auch schon versucht, bin aber kläglich gescheitert...Leider
|
Re: Schleife über Datumsfeld
Hallo ihr beiden.
Beim ersten Problem von Tom ist mir nicht ganz klar, wie das Datum gespeichert ist. In DATE-Feldern steht das Datum bei DBase immer in der Form YYYYMMDD. Da zwei- und vierstellige Jahreszahlen vorliegen, gehe ich davon aus, dass Jahr und Monat bereits in einzelnen Spalten abgelegt sind. Trotzdem sei noch darauf hingewiesen, dass beim Zugriff über LOCALSQL nur über echte Spaltenwerte aggregiert werden kann, berechnete Felder sind nicht zulässig. Ist also das Datum in einem DATE-Feld gespeichert, dann muss die Tabelle für die Auswertung entweder erweitert werden:
SQL-Code:
Oder man muss mit einer local view arbeiten. Dazu speichert man folgende view definition in einer Datei UMSATZ.SQL:
alter table umsatz
add jahr smallint, add monat smallint update umsatz set jahr = extract(year from datum), monat = extract(month from datum)
SQL-Code:
Anschließend führt man dann die eigentliche query aus:
select extract(year from datum) as jahr,
extract(month from datum) as monat, menge from umsatz
SQL-Code:
Wenn die Spalten JAHR und MONAT bereits in der Basis-Tabelle existieren, dann kann man statt der local view natürlich gleich die Tabelle verwenden:
select jahr, monat, sum(menge) as summe
from "umsatz.sql" group by jahr, monat order by jahr, monat
SQL-Code:
Die zwei-und vierstelligen Jahreszahlen müssen zuerst normiert werden. Das kann so geschehen:
select jahr, monat, sum(menge) as summe
from umsatz group by jahr, monat order by jahr, monat
SQL-Code:
Im Programm sollte für die Normierung besser eine Parameter-Query verwendet werden, da meine Festwerte im kommenden Jahr ein falsches Ergebnis produzieren würden.
update umsatz
set jahr = jahr + 1900 where jahr between 6 and 99 update umsatz set jahr = jahr + 2000 where jahr between 1 and 5 Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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