SQL DateTime <-> XBASE Datum & Zeit
Moderator: Moderatoren
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
SQL DateTime <-> XBASE Datum & Zeit
In SQL wird ja Datum und Zeit in einem Feld gespeichert, in etwa so:
20131113 23:00:00.000
DateTimeAsDate ist in diesem Fall keine Alternative da die Datenbank existiert und auch von einem anderen Programm verwendet wird..
Wie habt Ihr das gelöst?
Gruß
Markus
20131113 23:00:00.000
DateTimeAsDate ist in diesem Fall keine Alternative da die Datenbank existiert und auch von einem anderen Programm verwendet wird..
Wie habt Ihr das gelöst?
Gruß
Markus
Gruß
Markus
Markus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo, Markus -
es gibt auch den Feldtyp DATE. Ich vermute mal, dass SQLExpress aus DATETIME ein Zeichenfeld macht, das Du dann in Deinem Programm selbst "auseinandernehmen" musst.
es gibt auch den Feldtyp DATE. Ich vermute mal, dass SQLExpress aus DATETIME ein Zeichenfeld macht, das Du dann in Deinem Programm selbst "auseinandernehmen" musst.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo Georg,
ja, SQLExpress liefert mir : 20131113 23:00:00.000
Bis hier habe ich auch kein Problem, auch nicht mit dem String zerlegen und zusammenbauen.
Aber, alle meine Masken sind in etwa so aufgebaut:
Also jedes Feld wird mit einem "FieldBlock" an das get System gebunden. Und hier beginnt das Problem, mein erster Ansatz war:
Mit AEVal() werden dann die Felder von/in die db geschrieben und die Bildschirmanzeige beim Blättern durch die DB aktualisiert.
Aber ich kann ja nicht ein Datenfeld an zwei verschiedenen GET Felder binden. Ich muss dann also immer vor / beziehungsweise nach einem AEval() die Datums und Zeitfelder manuell aktualisieren und innerhalb von AEval() abfragen ob es ein Datums/Zeitfeld ist und in diesem Fall dann nicht aktualisieren...
Ich muss das nochmals neu überdenken.
Gruß
Markus
ja, SQLExpress liefert mir : 20131113 23:00:00.000
Bis hier habe ich auch kein Problem, auch nicht mit dem String zerlegen und zusammenbauen.
Aber, alle meine Masken sind in etwa so aufgebaut:
Code: Alles auswählen
oGet := tdDEdate(nZeile+=1,nGetCol,tdSqlFieldBlock(oDlg:oCursor,"TerminVon"),oDlg,oDa)
oGet:setData()
aadd(aEditGets,oGet)
Code: Alles auswählen
oGet := tdDEdate(nZeile+=1,nGetCol,SqlFieldBlockAsDate(oDlg:oCursor,"TerminVon"),oDlg,oDa)
oGet:setData()
aadd(aEditGets,oGet)
oGet := tdDEget(nZeile+=1,nGetCol,SqlFieldBlockAsTime(oDlg:oCursor,"TerminVon"),oDlg,oDa)
oGet:setData()
aadd(aEditGets,oGet)
Aber ich kann ja nicht ein Datenfeld an zwei verschiedenen GET Felder binden. Ich muss dann also immer vor / beziehungsweise nach einem AEval() die Datums und Zeitfelder manuell aktualisieren und innerhalb von AEval() abfragen ob es ein Datums/Zeitfeld ist und in diesem Fall dann nicht aktualisieren...
Ich muss das nochmals neu überdenken.
Gruß
Markus
Gruß
Markus
Markus
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9394
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 364 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
DATETIME, DATE und TIMESTAMP kann man meiner Erfahrung nach in aller Regel mit DtoS(dDatum) bestücken (MySQL, Microsoft SQL). Die Rückgabe erfolgt als Zeichenkette im Format "JJJJ-MM-TT" plus Uhrzeit, so dass die Auswertung der linken 10 Zeichen erfolgen müsste. Beim Datentyp DATE bekommt man nur diesen Anteil, aber auch als Zeichenkette. SQLexpress konvertiert standardmäßig nicht, kann aber über die Eigenschaft ":DateTimeAsDate" des Connection-Objekts dazu gebracht werden, immer den Xbase-Datentypen "Date" zurückzuliefern. Das funktioniert aber nur bei DATETIME und nicht bei TIMESTAMP.
Herzlich,
Tom
Tom
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo, Markus -
Zwischenfrage: macht es Sinn, JEDES Feld zum Bearbeiten anzubieten?
Der Feldtyp TIMESTAMP wird bei MySQL beispielsweise bei jeder Änderung des Datensatzes mit der Änderungs-Zeitmarke aktualisiert.
Zwischenfrage: macht es Sinn, JEDES Feld zum Bearbeiten anzubieten?
Der Feldtyp TIMESTAMP wird bei MySQL beispielsweise bei jeder Änderung des Datensatzes mit der Änderungs-Zeitmarke aktualisiert.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Ich biete ja nicht TIMESTAMP zum bearbeiten an.
Mir geht es um Datumsfelder wie TerminVon, TerminBis und so ähnlich. In XBase brauche ich Datum und Zeit getrennt, in der Datenbank sind die Werte in einem datetime Feld gespeichert. Das ist die Vorgabe.
Zwischenfrage (jaja, mit den Codeblöcken kämpfe ich noch immer... )
das funktioniert prinzipiell:
so aber nicht:
Wo ist da mein Denkfehler?
Gruß
Markus
Mir geht es um Datumsfelder wie TerminVon, TerminBis und so ähnlich. In XBase brauche ich Datum und Zeit getrennt, in der Datenbank sind die Werte in einem datetime Feld gespeichert. Das ist die Vorgabe.
Zwischenfrage (jaja, mit den Codeblöcken kämpfe ich noch immer... )
das funktioniert prinzipiell:
Code: Alles auswählen
PRIVATE pdUID_DAT:= CtoD("")
oGet := tdDEdate(nR,nGet2+12,{||pdUID_DAT},oDlg,oDa)
Code: Alles auswählen
PRIVATE pdUID_DAT:= CtoD("")
oGet := tdDEdate(nR,nGet2+12,MemVarBlock(pdUID_DAT),oDlg,oDa)
Gruß
Markus
Gruß
Markus
Markus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
zur Frage mit dem Denkfehler kenne ich die Syntax von TD nicht, aber ...
Im Resultset sind Datum und Zeit in einer DateTime Var vermutlich als String gemischt, die mußt du halt zerlegen ...
cDateTime := oCur:fieldGet("Datumsfeld") // die Syntax habe ich jetzt nicht genau im Kopf.
nun prüfen, wo was wie in cDateTime steht ...
http://de.wikipedia.org/wiki/ISO_8601
DIN wäre das: 2009-01-01T12:00:00+01:00
nun schreibst du dir am Besten Funktionen, wie GetDate(cSqlDateTime), GetTime(cSqlDateTime) und SetSQLDateTime(dDate,cTime) je nach den Erfordernissen.
In Xbase Xbaseformat und beim INSERT / UPDATE SQL Format ... ab und zu habe ich auch schon gesehen, dass die Zeit nur Nullen enthielt, wenn sie keine Rolle spielte.
Wo ist das Problem ?satmax hat geschrieben:Ich biete ja nicht TIMESTAMP zum bearbeiten an.
Mir geht es um Datumsfelder wie TerminVon, TerminBis und so ähnlich. In XBase brauche ich Datum und Zeit getrennt, in der Datenbank sind die Werte in einem datetime Feld gespeichert. Das ist die Vorgabe.
Im Resultset sind Datum und Zeit in einer DateTime Var vermutlich als String gemischt, die mußt du halt zerlegen ...
cDateTime := oCur:fieldGet("Datumsfeld") // die Syntax habe ich jetzt nicht genau im Kopf.
nun prüfen, wo was wie in cDateTime steht ...
http://de.wikipedia.org/wiki/ISO_8601
DIN wäre das: 2009-01-01T12:00:00+01:00
nun schreibst du dir am Besten Funktionen, wie GetDate(cSqlDateTime), GetTime(cSqlDateTime) und SetSQLDateTime(dDate,cTime) je nach den Erfordernissen.
In Xbase Xbaseformat und beim INSERT / UPDATE SQL Format ... ab und zu habe ich auch schon gesehen, dass die Zeit nur Nullen enthielt, wenn sie keine Rolle spielte.
Gruß
Hubert
Hubert
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Das String zerlegen oder zusammenbauen ist NICHT das Problem, habe ich auch nirgendwo geschrieben.
Ich habe weiter oben geschrieben womit ich mein Problem habe, von String steht da nichts.
Ich habe weiter oben geschrieben womit ich mein Problem habe, von String steht da nichts.
satmax hat geschrieben:Hallo Georg,
ja, SQLExpress liefert mir : 20131113 23:00:00.000
Bis hier habe ich auch kein Problem, auch nicht mit dem String zerlegen und zusammenbauen.
Aber, alle meine Masken sind in etwa so aufgebaut:
Also jedes Feld wird mit einem "FieldBlock" an das get System gebunden. Und hier beginnt das Problem, mein erster Ansatz war:Code: Alles auswählen
oGet := tdDEdate(nZeile+=1,nGetCol,tdSqlFieldBlock(oDlg:oCursor,"TerminVon"),oDlg,oDa) oGet:setData() aadd(aEditGets,oGet)
Mit AEVal() werden dann die Felder von/in die db geschrieben und die Bildschirmanzeige beim Blättern durch die DB aktualisiert.Code: Alles auswählen
oGet := tdDEdate(nZeile+=1,nGetCol,SqlFieldBlockAsDate(oDlg:oCursor,"TerminVon"),oDlg,oDa) oGet:setData() aadd(aEditGets,oGet) oGet := tdDEget(nZeile+=1,nGetCol,SqlFieldBlockAsTime(oDlg:oCursor,"TerminVon"),oDlg,oDa) oGet:setData() aadd(aEditGets,oGet)
Aber ich kann ja nicht ein Datenfeld an zwei verschiedenen GET Felder binden. Ich muss dann also immer vor / beziehungsweise nach einem AEval() die Datums und Zeitfelder manuell aktualisieren und innerhalb von AEval() abfragen ob es ein Datums/Zeitfeld ist und in diesem Fall dann nicht aktualisieren...
Ich muss das nochmals neu überdenken.
Gruß
Markus
Gruß
Markus
Markus
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Anstelle von fieldblock um ein Datenbankfeld mit einem get object zu verbinden suche ich eine Möglichkeit um eine PRIVATE Variable mit einem get object zu verbinden.
als anstelle:
so etwas wie
Gruß
Markus
als anstelle:
Code: Alles auswählen
// DATUM ist ein Datenbankfeld im aktuellen Selektbereich:
tdDEget(1,1,fieldblock(DATUM),oDlg,oDa)
Code: Alles auswählen
// DATUM ist eine private var
tdXdate(1,1,MemvarBlock(DATUM),oDlg,oDa)
Markus
Gruß
Markus
Markus
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Gruß
Hubert
Hubert
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Das ist ja mein Problem, ich bekomme es nicht auf die Reihe mit dem Codeblock....brandelh hat geschrieben:IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Gruß
Markus
Markus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo, Markus -
also, ich verwendete FieldW nicht ...
Ich sammle meine Controls in einem Array, das ich abarbeite, wenn die Eingabe gesichert werden soll.
Ich verwende abgeleitete Objekte, die unter anderem den Feldnamen und dergleichen enthalten. Wenn Du etwas Ähnliches machst, und z.B. den Feldnamen mit einem '*' beginnen lässt, und darauf abfragst, oder den Feldtyp Datum verwendest und darauf reagierst, dann kannst Du in der FOR ... NEXT Schleife die Spezialbehandlung selbst übernehmen.
also, ich verwendete FieldW nicht ...
Ich sammle meine Controls in einem Array, das ich abarbeite, wenn die Eingabe gesichert werden soll.
Ich verwende abgeleitete Objekte, die unter anderem den Feldnamen und dergleichen enthalten. Wenn Du etwas Ähnliches machst, und z.B. den Feldnamen mit einem '*' beginnen lässt, und darauf abfragst, oder den Feldtyp Datum verwendest und darauf reagierst, dann kannst Du in der FOR ... NEXT Schleife die Spezialbehandlung selbst übernehmen.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- satmax
- 1000 working lines a day
- Beiträge: 831
- Registriert: Do, 02. Dez 2010 19:34
- Wohnort: Biberbach in Österreich
- Hat sich bedankt: 1 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo Georg,
im Prinzip mache ich das so, aber normal mit EVAL() und nicht mit for Schleifen. Ich verwende ja TD, habe aber da jetzt eine passable Lösung gefunden. Alle "Spezialfelder" erhalten einen Namen im cargo1 object, und genau diese werden sonder behandelt (TD hat zusätzlich cargo1-cargo5). Teilweise muss ich eben EVAL mit FOR Schleifen ersetzen. Was besseres bringe ich im Moment nicht zustande.
Gruß
Markus
im Prinzip mache ich das so, aber normal mit EVAL() und nicht mit for Schleifen. Ich verwende ja TD, habe aber da jetzt eine passable Lösung gefunden. Alle "Spezialfelder" erhalten einen Namen im cargo1 object, und genau diese werden sonder behandelt (TD hat zusätzlich cargo1-cargo5). Teilweise muss ich eben EVAL mit FOR Schleifen ersetzen. Was besseres bringe ich im Moment nicht zustande.
Gruß
Markus
Gruß
Markus
Markus
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2832
- Registriert: Fr, 08. Feb 2008 21:29
- Hat sich bedankt: 98 Mal
- Danksagung erhalten: 13 Mal
Re: SQL DateTime <-> XBASE Datum & Zeit
Hallo, Markus -
wenn es funktioniert und nachvollziehbar ist, dann ist das doch in Ordnung.
wenn es funktioniert und nachvollziehbar ist, dann ist das doch in Ordnung.
Liebe Grüsse aus der Eifel,
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: SQL DateTime <-> XBASE Datum & Zeit
an der Begrenztheit von Xbase ( alle Version ) welche nicht über die SQL Feld Typen verfügt.satmax hat geschrieben:Wo ist da mein Denkfehler?
IMHO verwendest du das falsche Control für dein "von-bis" Problem.
Das Windows Datepick Control ist für Date / Time gedacht und arbeitet prima mit SQL Syntax
das Datepick Control ist als activeX und "native" verfügbar.
Die Version von Alaska XbpDatePicker() / XbpMonthView() benötigt MsComCtl.OCX
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Re: SQL DateTime <-> XBASE Datum & Zeit
weiter oben schreibst du dies ...satmax hat geschrieben:Das ist ja mein Problem, ich bekomme es nicht auf die Reihe mit dem Codeblock....brandelh hat geschrieben:IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Code: Alles auswählen
// DATUM ist ein Datenbankfeld im aktuellen Selektbereich:
tdDEget(1,1,fieldblock(DATUM),oDlg,oDa)
du müsstest den Feldnamen also als String (oder in einer Stringvariablen) übergeben:FieldBlock( <cFieldName> ) --> bFieldBlock
Code: Alles auswählen
tdDEget(1,1,fieldblock("DATUM"),oDlg,oDa)
fieldblock() gilt ausschließlich für Datenbanken die von einer Xbase++ DBE in Workareas verwaltet werden.
Was macht es ? Prüfen wir es mit einem kleinen Testprogramm:
Code: Alles auswählen
#include "Dmlb.ch"
procedure main()
local x,cFN, nFC
cls
set alternate to test.txt
set alternate on
dbcreate("test",{{"cFeld","c",10,0},;
{"nFeld","n", 8,2},;
{"dFeld","d", 8,0},;
{"lFeld","l", 1,0}})
use test exclusive
if neterr()
? "NETERR() !"
else
nFC := fcount()
for x := 1 to nFC
? "Fieldblock() von ",fieldName(x),": ",fieldblock(fieldName(x)), "Feldtyp: ", FieldInfo( x, FLD_TYPE )
next
endif
? "Testzuweisung: ", x := 10
? "Ende"
inkey(10)
return
Code: Alles auswählen
Fieldblock() von CFELD : {|x| IIf(x==NIL,FIELD->CFELD,FIELD->CFELD:=x) } Feldtyp: C
Fieldblock() von NFELD : {|x| IIf(x==NIL,FIELD->NFELD,FIELD->NFELD:=x) } Feldtyp: N
Fieldblock() von DFELD : {|x| IIf(x==NIL,FIELD->DFELD,FIELD->DFELD:=x) } Feldtyp: D
Fieldblock() von LFELD : {|x| IIf(x==NIL,FIELD->LFELD,FIELD->LFELD:=x) } Feldtyp: L
Testzuweisung: 10
Ende
Wird er mit Parameter (x := Inhalt je nach Feld) aufgerufen, wird der Inhalt von X im Feld gespeichert.
Ist der Parameter NIL also nicht angegeben, dann liefert der Codeblock einfach den Inhalt des Feldes zurück.
Da ein normales XbpSLE() nur Texte verarbeiten kann (eventuell kann tdDEget() mehr), muss man den Codeblock als solchen oft anpassen, damit Strings korrekt geliefert und gespeichert werden.
Bei einem Datumsfeld z.B.:
Code: Alles auswählen
{|x| IIf(x==NIL,dtoc(FIELD->DFELD),FIELD->DFELD:= ctod(x)) }
Man kann aber auch eine Funktion verwenden, die dann ihrerseits die Umwandlungen erledigt:
Code: Alles auswählen
{|x| MyFunc("LFELD",x) }
function MyFunc(cFeld, xInhalt)
if xInhalt = nil
xInhalt := ... Feldinhalt von cFeld ermitteln und zuweisen ... z.B. auch aus einem ResultSet()
else
... Feld cFeld mit dem Wert von xInhalt setzen ... z.B. UPDATE - Anweisung bauen !
xInhalt := ... eventuell neu einlesen, oder einfach so zurückgeben. ...
endif
return xInhalt
Insbesondere um Plausibilitätsprüfungen, die im Fenster in der Methode DatenPlausi() hinterlegt sind.
Gruß
Hubert
Hubert