REPLACE / :setData() / :datalink

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten

Ich kenne die Lösung

Ja
2
40%
Nein
2
40%
Ich verstehe den Beitrag nicht
1
20%
 
Insgesamt abgegebene Stimmen: 5

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

REPLACE / :setData() / :datalink

Beitrag von AUGE_OHR »

moin,

ich hatte gerade einen altes Problem wo ich zuerst wieder stuzte.

Problem : nach einem RLOCK() / REPLACE (!!!) waren "einige" FELDer
"leer" ... wieso ?!

... wieder mal waren es nur "einige" FELDer ... da war doch mal was.
Das ganze ist GUI, also mit SLE und :datalink. Da hängt ja nun gewöhnlich
ein Set/Get Codeblock drin wo die FELDnamen ein Teil von sind.

Code: Alles auswählen

::Bildnr:dataLink    := {|x| IIf( PCOUNT()==0,;
                                   Trim( (::CHINABMP)->BILDNR ),; // different
                                   JPGTEST->ARTNR         := x ) } // Alias() 
AAdd( ::editControls, ::Bildnr   )
...

REPLACE JPGTEST->ARTNR WITH cCHINANR
Tja und genau diese FELDer waren "leer" nach einem REPLACE ...
ok als Tip noch das ganze passierte ausserhalb der Class wenn ich
per DragDrop ein Bitmap "append"e und dazu die externe FUNCTION
aufrufe (wo ich ein APPEND BLANK mit drin haben)

also soll ich "verraten" wieso es nicht klappen kann ? (wäre für was man
NICHT machen sollte ... )

gruss by OHR
Jimmy
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Moin Jimmy,
ich sehe da zwei "Probleme" in Deinem Code.
Wobei eines jetzt auch nur durch Dein Einfügen (und wahrscheinlich nachträgliches editieren) passiert sein könnte...
Ah - halt! Ich glaube, wenn ich das, was Du immer so am Rande über Deine Applikation erwähnt hast, richtig in Erinnerung habe, dann ist das eine gewollt und somit nur ein sichtbares Problem gegeben...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Jimmy,

kann es sein, daß der Satzzeiger durch das Append Blank auf dem falschen Datensatz steht.?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Rolf Ramacher hat geschrieben: kann es sein, daß der Satzzeiger durch das Append Blank auf dem falschen Datensatz steht.?
Nope daran liegt es nicht.

40 habe es gelesen, 2 wissen die Lösung, 2 nicht und 1 versteht die Frage
nicht. Es scheint also doch ganz gut das ich das mal angeschnitten habe.

Ich werde die Lösung nacher veröffentlichen vielleicht komt ja doch noch
jemand auf die Lösung warum man in eine GUI Lösung nicht mit REPLACE
arbeiten sollte wenn auf den FELDern ein :datalink liegt.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

soll man nicht generell auf Replace verzichten unde den Zuweisungsoperator := benutzten. Ich meine ich hätte das irgendwo mitbekommen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Manfred hat geschrieben: soll man nicht generell auf Replace verzichten und den Zuweisungsoperator := benutzten. Ich meine ich hätte das irgendwo mitbekommen.
Ich denke wenn man eine PPO daraus macht sind beide gleich.

Ich schreibe gerne REPLACE damit ich im Source "sehe" wo ein RLOCK()
notwendig ist. Allerdings sind das dann auch Function/Procedure also
"alter" Code wie auch die DragDrop Routinen.

Also nun zum "Problem" : sehen wir uns nochmal den :datalink an

Code: Alles auswählen

::Bildnr:dataLink    := {|x| IIf( PCOUNT()==0,; 
                                   Trim( (::CHINABMP)->BILDNR ),; // different 
                                   JPGTEST->ARTNR         := x ) } // Alias() 

AAdd( ::editControls, ::Bildnr   ) 
Im Codeblock haben wir ja das IIF dann das :setdata sowie
das :getdata. Das ganze ist nun eine GUI Maske mit paar XbpSLE
einem XbpStatic für das Bitmap und die üblichen XbpPushbutton so wie
man das vom XPPFD.EXE Formdesigner und Class Code gewohnt ist.

Wenn man nun unter GUI einen "neuen" Datzensatz editieren will so
nimmt man dafür den "Ghostrec" ( = Lastrec()+1 ). Ein neuer Datensatz
ist ja auch gewöhnlich "leer"

Nun füge ich also per Dragdrop z.b. aus dem Explorer ein Bitmap in meine
Anwendung indem ich es auf die XbpStatic ziehe und dort "loslasse".

Code: Alles auswählen

::oSHow:DragEnter := {| aState,oData | DragEnterBMP(aState,oData)}
::oSHow:DragLeave := {| aState,uNIL  | DragLeaveBMP(aState,)}
::oSHow:DragDrop  := {| aState,oData | DragDropBMP(aState,oData,::oSHow, ...  )

STATIC FUNCTION DragLeaveBMP(aState,oData)
// hm ...
RETURN NIL

STATIC FUNCTION DragEnterBMP(aState,oData)
LOCAL cBuffer
   IF oData:QueryGetFormat(XBPCLPBRD_FILELIST) == .T.
*   IF oData:QueryGetFormat(XBPCLPBRD_BITMAP) == .T.
      RETURN XBP_DROPMODE_COPY
   ENDIF
RETURN XBP_DROPMODE_NONE

STATIC FUNCTION DragDropBMP(aState,oData,oDraw ... )
LOCAL aFiles := oData:GetData(XBPCLPBRD_FILELIST)
LOCAL i, iMax   := LEN(aFiles)
LOCAL oBmp := XbpBitmap():new():create()
LOCAL nWide, nHigh
...
 oBmp:Loadfile(aFiles[1])
 oDraw:setCaption(oBmp)

 IF JPGTEST->(EOF()) .OR. (RECNO() = LASTREC()+1)
    JPGTEST->(DbAppend())
 ENDIF
Wenn ich also aus dem Explorer ein Bitmap per dragdrop "anfasse" und
in mein XbpStatic "eintrete" (ENTER) so wird DragEnterBMP() ausgeführt.
Ich erhalte nun ein Array mit den "FullPathName" der Dateien.

Nun muss das Bild aber erst in ein XbpBitmap Object "laden" um es
"anzuzeigen" was in DragDropBMP() geschied. Da ich nur 1 Bild anzeigen
kann/will verwende ich also nur :Loadfile(aFiles[1])

Ich hatte ja vorhin schon über den "Ghostrec" erzählt. Wenn ich also auf
sowas gestanden habe wird jetzt ein APPEND BLANK gemacht.

Und nun zu meinem "Fehler"

Code: Alles auswählen

 IF JPGTEST->(DbRLock())
     // FELDer MIT :datalink
     REPLACE JPGTEST->ARTNR     WITH cCHINANR
     REPLACE JPGTEST->FILENAME WITH OnlyFile(aFiles[1])

     // FELDer ohne :datalink
     // Memo Type "V" Bitmap
     REPLACE JPGTEST->DATA     WITH oBmp:setBuffer( ,;
                                                    XBPBMP_FORMAT_WIN3X )
    // Memo Type "M" Text
    REPLACE JPGTEST->FILEPATH WITH aFiles[1]
    IF nWide > nHigh
        REPLACE JPGTEST->LANDSCAPE WITH .T.
    ELSE
        REPLACE JPGTEST->LANDSCAPE WITH .F.
    ENDIF
    JPGTEST->(DbRUnlock())
 ENDIF
RETURN XBP_DROPMODE_COPY
Der Code ist doch ok, also wieso rede ich von "Fehler" und "leeren"
FELDern ?

Lösungs Ansatz : Der "User" ist schuld ...

Nachdem ich also per dragdrop das Bild in meiner Application "sah"
dachte ich "alles klar" also OK geclickt ... klingelt es ?

gruss by OHR
Jimmy
p.s. Ich "weiss" ja das mindesten 2 Leute es "wissen".
Die Antwort sollte von jemanden kommen "dem jetzt ein Licht"
aufgegangen ist und möglichst NICHT von jemanden der es schon
vorher "wusste", Danke !!!
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 »

Manfred hat geschrieben:Hi Jimmy,

soll man nicht generell auf Replace verzichten unde den Zuweisungsoperator := benutzten. Ich meine ich hätte das irgendwo mitbekommen.
REPLACE und := sind im Prinzip identisch, mit einem Unterschied:

REPLACE geht nur auf Felder, := geht mit allem. Ich nutze bei Feldern immer REPLACE alias->Feldname WITH, damit ich im Editor einfach alle Feldzugriffe finden kann. Bei datalink Codeblöcken setze ich deshalb auch gerne ein // REPLACE danach ;-)

@Jimmy,

sorry ich bin nicht der Rätseltyp ;-)
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: @Jimmy,
sorry ich bin nicht der Rätseltyp ;-)
vermutlich "weist" du eh die Lösung :)

Ist den wirklich noch keiner von den "unwissenden" darauf gekommen
was nun bei OK = SAVE = GATHER(::Editcontrol) passiert ?

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 »

Hi,

ne ich hatte die Frage nicht verstanden ;-)

gather schreibt alles aus den SLE in die DBF ... ach so die SLE werden wohl noch leer gewesen sein ?

Nach einem Refresh muss man die neu einlesen ... wehe wehe wenn dann noch der Satzzeiger nicht stimmt, weil man in 1.82 einen Fehler mit SET RELATION hatte ;-)
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

Set Relation ist auch in der 1.9x immer noch nicht korrekt. oder habe ich ein Release verpaßt?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: ne ich hatte die Frage nicht verstanden ;-)
DAS nehme ich dir nicht ab :)
brandelh hat geschrieben: gather schreibt alles aus den SLE in die DBF ... ach so die SLE werden wohl noch leer gewesen sein ?
so im Nebensatz hat du eben gerade die Lösung genannt !!!
Der Kandidat hat 100 Punkte !

Beim OK wird wie üblich mit den GATHER(::editcontrols) der :getdata
Teil des :datalink ausgeführt. Dieser "überschreibt" also alle FELDer
die mit einem :datalink "verbunden" sind und somit waren meine
REPLACE "weg".
brandelh hat geschrieben: Nach einem Refresh muss man die neu einlesen
und genau DAS hatte zunächst nicht ausgeführt !

Statt also ein REPLACE zu nehmen muss man mit :setdata den :datalink
mit dem neuen Wert "füttern". Dann "sieht" man auch gleich den neuen
Wert in der Anzeige und kann auf OK clicken.

Jetzt alles klar (an alle nixversteher) ?
brandelh hat geschrieben: ... wehe wehe wenn dann noch der Satzzeiger nicht stimmt, weil man in 1.82 einen Fehler mit SET RELATION hatte ;-)
naja wer NICHT auf v1.9 updated ist selbst schuld ...

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 »

AUGE_OHR hat geschrieben:
brandelh hat geschrieben: ne ich hatte die Frage nicht verstanden ;-)
DAS nehme ich dir nicht ab :)
ich bin auch nicht immer gut drauf 8)
AUGE_OHR hat geschrieben: naja wer NICHT auf v1.9 updated ist selbst schuld ...
ich bin schon längst auf 1.90, der Fall liegt schon etwas zurück ;-)

ABER ich werde NIE WIEDER set relation nutzen :!:
Gruß
Hubert
Antworten