hi,
in einer MDI Anwendung kann der User ja "beliebig" viele "Fenster"
aufmachen. Er könnte also auch 2x "Neu" anfordern ???
Den GhostRec ( = LastRec() +1 ) brauche ich ja für den :datalink ...
Wenn ich nun "Berechungen" machen will benötige ich oft dazu die "Werte"
sodas ich mit :setdata() die "auslesen" muss was aber bei einem GhostRec
immer "Empty" wäre. Also muss ich ggf. mit :getdata() erst den "Wert" in
den GhostRec "schreiben" um ihn dann "lesen" zu können ...
Was aber passiert wenn ich 2 Threads mit jeweils "Neu" hätte ... hat dann
jeder "seinen " GhostRec oder sind beide GhostRec "identisch" (Recno()) ?
GhostRec / MDI
Moderator: Moderatoren
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Jimmy,
ohne es jetzt direkt probiert zu haben, meine ich mich entsinnen zu können, dass DBRLOCK() auf dem gostrec() .t. gibt, aber nach einem Replace wird doch dennoch nichts zu finden sein. Es gibt keine Fehler aber man kann dort nichts speichern ! Er ist wohl physikalisch auch nicht vorhanden, wird intern wahrscheinlich als leeres Feld erzeugt aber NIE auf die Platte geschrieben.
Wenn du bei einem leeren Datensatz vorgaben in die SLE setzen willst, dann nimm direkt oXbp:setData(cWert) !
ohne es jetzt direkt probiert zu haben, meine ich mich entsinnen zu können, dass DBRLOCK() auf dem gostrec() .t. gibt, aber nach einem Replace wird doch dennoch nichts zu finden sein. Es gibt keine Fehler aber man kann dort nichts speichern ! Er ist wohl physikalisch auch nicht vorhanden, wird intern wahrscheinlich als leeres Feld erzeugt aber NIE auf die Platte geschrieben.
Wenn du bei einem leeren Datensatz vorgaben in die SLE setzen willst, dann nimm direkt oXbp:setData(cWert) !
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12909
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
hi,
geschrieben (o:editbuffer() )
um sicher zu stellen das ich bei :setdata()/:getdata() auf dem richtigen
Datensatz stehe nehmr ich nun nRec.
... ich denke da an einen DAU der "gleichzeitig" 2x "Neu" anlegen will ...
1.) darf man sowas überhaupt (grundsätzlich) zulassen ?
2.) angenomen
wenn der DAU nun 2x "neu" macht und Ghostrec = Lastrec()+1 ist und er
ein Fenster mit OK abschliesst, dann wäre ja jetzt Lastrec() die RECNO()
vom 2st Fenster und alles mit :setdata geht auf nRec ... ?
ja ... aber wenn ein :datalink vorhanden ist wird er "nur" in die "Anzeige"brandelh hat geschrieben: Wenn du bei einem leeren Datensatz vorgaben in die SLE setzen willst, dann nimm direkt oXbp:setData(cWert) !
geschrieben (o:editbuffer() )
um sicher zu stellen das ich bei :setdata()/:getdata() auf dem richtigen
Datensatz stehe nehmr ich nun nRec.
... ich denke da an einen DAU der "gleichzeitig" 2x "Neu" anlegen will ...
1.) darf man sowas überhaupt (grundsätzlich) zulassen ?
2.) angenomen
Code: Alles auswählen
LOCAL nRec := 0
...
IF lNeu
GOTO ( Lastrec()+1 )
ENDIF
nRec := ALIAS->( RECNO() )
Do_Input_SLE(aEdit,nRec)
Do_calc_with_setdata(aEdit,nRec)
IF all_OK(aEdit,nRec)
IF lNeu
APPEND BLANK
nRec := ALIAS->( RECNO() )
ENDIF
GOTO(nRec)
IF DBRLOCK(nRec)
AEVAL(aEdit,{|oSLE| oSLE:Getadata()}
UNLOCK
ENDIF
ENDIF
ein Fenster mit OK abschliesst, dann wäre ja jetzt Lastrec() die RECNO()
vom 2st Fenster und alles mit :setdata geht auf nRec ... ?
gruss by OHR
Jimmy
Jimmy
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Hallo Jimmy,
du machst dir zu viele Sorgen !
egal wie viele auf dem EOF() stehen, jeder erhält nur leere Daten, falls überhaupt etwas eingelesen wird ! Im Normalfall musst du doch oXbp:setData() oder oXbp:getData() oder die Funktionen Scatter() Gather() aufrufen, damit die in editcontrol gemerkten Editcontrols den datalink ausführen. Selbst wenn sie das tun, dann wird ein leerer eingelesen.
Allerdings ist in deinem Beispiel einiges nicht optimal.
1. append blank legt nicht nur einen neuen an, es springt auch direkt auf diesen UND führt ein rlock() durch !
In einem Rutsch, das ist wichtig !
2. Allerdings kann das fehlschlagen und darum muss man danach sofort neterr() abfragen !
3. Ich denke dass dein Selectbereich schon stimmt, aber ich verwende nur noch Funktionen, das ist sicherer !
dieser Code ist sicherer und benötigt weniger Satzbewegungen !
Und nochmal, auf dem EOF() Record kann man ruhig OK machen, in die DBF kommt dabei nichts !
du machst dir zu viele Sorgen !
egal wie viele auf dem EOF() stehen, jeder erhält nur leere Daten, falls überhaupt etwas eingelesen wird ! Im Normalfall musst du doch oXbp:setData() oder oXbp:getData() oder die Funktionen Scatter() Gather() aufrufen, damit die in editcontrol gemerkten Editcontrols den datalink ausführen. Selbst wenn sie das tun, dann wird ein leerer eingelesen.
Allerdings ist in deinem Beispiel einiges nicht optimal.
1. append blank legt nicht nur einen neuen an, es springt auch direkt auf diesen UND führt ein rlock() durch !
In einem Rutsch, das ist wichtig !
2. Allerdings kann das fehlschlagen und darum muss man danach sofort neterr() abfragen !
3. Ich denke dass dein Selectbereich schon stimmt, aber ich verwende nur noch Funktionen, das ist sicherer !
Code: Alles auswählen
IF all_OK(aEdit,nRec)
IF lNeu
ALIAS->(dbappend())
lOK := ! neterr()
else
lOK := ALIAS->(dbrlock())
endif
if lOK
AEVAL(aEdit,{|oSLE| oSLE:Getdata()}
UNLOCK
ENDIF
Und nochmal, auf dem EOF() Record kann man ruhig OK machen, in die DBF kommt dabei nichts !
Gruß
Hubert
Hubert