Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO bestimmte Felder auslesen (https://www.delphipraxis.net/139980-ado-bestimmte-felder-auslesen.html)

-remit- 9. Sep 2009 14:45

Datenbank: ADO • Zugriff über: ADOConnection

ADO bestimmte Felder auslesen
 
Hallo,

ich benötige Hilfe bei einem Datenbankproblem. In einer (nicht von mir angelegten) Datenbank wird in eine Spalte das Datum, und dahinter mit einem Leerzeichen getrennt die Uhrzeit, abgespeichert.

Beispiel:
17.02.2007 13:13:23

In der Spalte gibt es ca. 1200 Datensätze und alle sind unterschiedlich (dank der Zeit). Ich benötige jedoch nur das Datum, leider hilft dort die SQL-Abfrage DISTINCT nicht weiter (oder gibt es einen Zusatz, nur die ersten 10 Zeichen zu vergleichen?).

Die 1200 Datensätze teilen zu 1/6 jeweils das gleiche Datum, im Endeffekt sind es also nur 6 verschiedene Daten.

Ich hatte mich bereits damit abgefunden mit den kompletten Datensätzen in Delphi selber zu arbeiten, also nachträglich herauszufiltern. Dazu habe ich alles soriteren lassen und wollte dann mit einer simplen if-Abfrage:
if Feld[i] <> Feld[i+1] then
Speicher:=Feld[i];
Nun habe ich mit der ADOQuery und der DataSource herumexperimentiert. Ich habe immernoch nicht die richtige Formatierung für Einzelfeldabfragen gefunden. Was muss ich nehmen DataSource oder Query? FieldByName, Fields.Fields[i], usw. ich habe alles ausprobiert, entweder erhalte ich ListenMaxima Errors oder Zugriffsverletzungen :(

Ich bin dankbar für jede Hilfe, es wäre wünschenswert, gleich durch einen SQL-Befehl den Datensatz auf die 6 Daten zu reduzieren!

MfG
-remit-

DeddyH 9. Sep 2009 14:50

Re: ADO bestimmte Felder auslesen
 
Wer Zeitangaben als String speichert, gehört IMHO standrechtlich geteert und gefedert. Aber schau doch einmal, ob das DBMS SUBSTRING oder SUBSTR unterstützt, damit könntest Du die ersten Zeichen auswerten.

nahpets 9. Sep 2009 15:14

Re: ADO bestimmte Felder auslesen
 
Hallo,

da sollte sowas wie
SQL-Code:
select distinct(SubStr(Datumsspalte,1,10)) from tabelle
funktionieren. Manche Datenbanken mögen es auch als
SQL-Code:
select distinct(SubString(Datumsspalte,1,10)) from tabelle
oder per Standard
SQL-Code:
select distinct(SubString(Datumsspalte from 1 for 10)) from tabelle
Prinzipiell sollte Dein Problem aber mit SQL zu lösen sein.

edit: Schreibfehler korrigiert

hoika 9. Sep 2009 16:05

Re: ADO bestimmte Felder auslesen
 
Hallo,

es wäre ja scön zu wissen:

1. Welche Datenbank
2. Welchen Typ hat das Feld ? Wirklich String ?
(Auch Firebird zeigt beim Typ TimeStamp das Datum so an).


Heiko

-remit- 9. Sep 2009 17:03

Re: ADO bestimmte Felder auslesen
 
Danke nahpets ;-) Gut, dass es auch mit SQL funktioniert. Ich werde es morgen auf der Arbeit testen!

@DaddyH
ich habe leider keine Ahnung ob es ein String ist oder ein TimeStamp, das werde ich morgen nachschauen!
@hoika
zu 1. Ich muss zugeben, meien Angabe oben ist ungenau, es handelt sich um eine Access-Datenbank (*.mdb).
zu 2. Ich weiß nicht ob es String oder TimeStamp ist, würde die Distinct-Variante von nahmpets auch mit TimeStamps funktionieren? Ebenfalls mit SubSting oder dann SubTimeStamp?

Vielen Dank an euch drei!

Gruß
Max

nahpets 10. Sep 2009 09:03

Re: ADO bestimmte Felder auslesen
 
Hallo,
Zitat:

Zitat von -remit-
Danke nahpets ;-) Gut, dass es auch mit SQL funktioniert. Ich werde es morgen auf der Arbeit testen!

@DaddyH
ich habe leider keine Ahnung ob es ein String ist oder ein TimeStamp, das werde ich morgen nachschauen!
@hoika
zu 1. Ich muss zugeben, meien Angabe oben ist ungenau, es handelt sich um eine Access-Datenbank (*.mdb).
zu 2. Ich weiß nicht ob es String oder TimeStamp ist, würde die Distinct-Variante von nahmpets auch mit TimeStamps funktionieren? Ebenfalls mit SubSting oder dann SubTimeStamp?

Vielen Dank an euch drei!

Gruß
Max

zu 2.: Nein, würde so nicht funktionieren, da müsstest Du (wahrscheinlich) den Timestamp erst in einen String verwandeln und darauf ein SubString und darauf dann Distinct. Wie sich Access in dem Umfeld verhält, weiß ich nicht.

-remit- 10. Sep 2009 09:11

Re: ADO bestimmte Felder auslesen
 
Hallo,

es handelt sich nicht um einen String :( Es folgt immer ein "Unbekannter Fehler" habe alle Formatierungen durchprobiert.
So weit ich mich jetzt informiert habe kann beim Anlegen doch auch festgelegt werden, in welchem Umfang die Daten in die Datenbank geschrieben werden. Ob man TT.MM.JJJJ oder MM.TT.JJ usw. haben möchte, kann es nicht auch so möglich sein, die Daten wieder auszulesen?

Gruß
Max

nahpets 10. Sep 2009 09:23

Re: ADO bestimmte Felder auslesen
 
Hallo,

Substring scheint's bei Access nicht zu geben.
Schau mal bitte bei Google nach: access substring sql.
Mid, Left, Right könnten da helfen, ob die mit Timestamp zurechtkommen weiß ich nicht.

Hilft Dir derda http://entwickler-forum.de/archive/i...p/t-52453.html eventuell weiter?

-remit- 10. Sep 2009 09:31

Re: ADO bestimmte Felder auslesen
 
Ich habe noch ein wenig gegoogelt und herausgefunden dass man die einzelnen Daten herausfiltern kann mit

SQL-Code:
SELECT DISTINCT MONTH([datum]) FROM rechnungen
jetzt bekomme ich bereits alle verschiedene Monate heraus, das ist wunderbar, wie lautet der Befehl für das komplette Datum?

Ich habe mir den Link angeschaut, dort wird das TimeStamp-Format jedoch in einen String umgewandelt, ich glaube (oder besser hoffe^^) jedoch, dass es auch ohne Umwandlung funktioniert ;-)

Gruß
Max

nahpets 10. Sep 2009 09:43

Re: ADO bestimmte Felder auslesen
 
Hallo,

wenn's Month gibt, gibt es bestimmt auch ein Day und Year und ein Date für alles zusammen.

Das Access-SQL scheint sich ein bisserl an Basic anzulehnen, eventuell einfach mal die Basicfunktionen für Datum und Konvertierung benutzen. Mit ein bisserl Glück klappt das ja.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:38 Uhr.
Seite 1 von 2  1 2      

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