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