GhostRec / MDI

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

GhostRec / MDI

Beitrag von AUGE_OHR »

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()) ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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) !
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: Wenn du bei einem leeren Datensatz vorgaben in die SLE setzen willst, dann nimm direkt oXbp:setData(cWert) !
ja ... aber wenn ein :datalink vorhanden ist wird er "nur" in die "Anzeige"
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
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 ... ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

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 !

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 
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 !
Gruß
Hubert
Antworten