SQL DateTime <-> XBASE Datum & Zeit

alles was zunächst nicht kategorisierbar ist

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von georg »

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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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:

Code: Alles auswählen

oGet := tdDEdate(nZeile+=1,nGetCol,tdSqlFieldBlock(oDlg:oCursor,"TerminVon"),oDlg,oDa)
oGet:setData()
aadd(aEditGets,oGet)
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,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)
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
Gruß
Markus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von Tom »

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von georg »

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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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:

Code: Alles auswählen

PRIVATE pdUID_DAT:= CtoD("")
oGet := tdDEdate(nR,nGet2+12,{||pdUID_DAT},oDlg,oDa)
so aber nicht:

Code: Alles auswählen

PRIVATE pdUID_DAT:= CtoD("")
oGet := tdDEdate(nR,nGet2+12,MemVarBlock(pdUID_DAT),oDlg,oDa)
Wo ist da mein Denkfehler?

Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von brandelh »

zur Frage mit dem Denkfehler kenne ich die Syntax von TD nicht, aber ...
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.
Wo ist das Problem ?
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 ...
:arrow: 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
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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. :)
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:

Code: Alles auswählen

oGet := tdDEdate(nZeile+=1,nGetCol,tdSqlFieldBlock(oDlg:oCursor,"TerminVon"),oDlg,oDa)
oGet:setData()
aadd(aEditGets,oGet)
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,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)
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
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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:

Code: Alles auswählen

// DATUM ist ein Datenbankfeld im aktuellen Selektbereich:
tdDEget(1,1,fieldblock(DATUM),oDlg,oDa)
so etwas wie

Code: Alles auswählen

// DATUM ist eine private var
tdXdate(1,1,MemvarBlock(DATUM),oDlg,oDa)
Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von brandelh »

IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

brandelh hat geschrieben:IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Das ist ja mein Problem, ich bekomme es nicht auf die Reihe mit dem Codeblock.... :banghead:
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

Wobei die private habe ich nicht mehr....
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von georg »

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.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
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

Beitrag von satmax »

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
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von georg »

Hallo, Markus -


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.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von AUGE_OHR »

satmax hat geschrieben:Wo ist da mein Denkfehler?
an der Begrenztheit von Xbase ( alle Version ) welche nicht über die SQL Feld Typen verfügt.

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: SQL DateTime <-> XBASE Datum & Zeit

Beitrag von brandelh »

satmax hat geschrieben:
brandelh hat geschrieben:IGITT PRIVATE ... nimm besser einen Codeblock der eine Spezielle Funktion aufruft.
Das ist ja mein Problem, ich bekomme es nicht auf die Reihe mit dem Codeblock.... :banghead:
weiter oben schreibst du dies ...

Code: Alles auswählen

// DATUM ist ein Datenbankfeld im aktuellen Selektbereich:
tdDEget(1,1,fieldblock(DATUM),oDlg,oDa)
zur Syntax von tdDEget() kann ich nichts sagen, aber wenn DATUM der Name eines Feldes in einer DBF ist, dann ist die Syntax von fieldBlock() nicht richtig:
FieldBlock( <cFieldName> ) --> bFieldBlock
du müsstest den Feldnamen also als String (oder in einer Stringvariablen) übergeben:

Code: Alles auswählen

tdDEget(1,1,fieldblock("DATUM"),oDlg,oDa)
Aber hast du nicht eine SQL Datenbank ?

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
gibt folgendes aus:

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
wie man sieht, ist der Codeblock unabhängig vom Datenformat.
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)) }
Um hier flexibel zu sein, verwende ich nomalerweise den datalink gar nicht, sondern setze direkt o:setData() bzw. o:getData() ein.
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
Ich persönlich verwende je Fenster eine Methode DatenLaden() und eine DatenSpeichern() die sich jeweils um alles nötige kümmert.
Insbesondere um Plausibilitätsprüfungen, die im Fenster in der Methode DatenPlausi() hinterlegt sind.
Gruß
Hubert
Antworten