Variablen übernahme
Moderator: Moderatoren
-
- UDF-Programmierer
- Beiträge: 54
- Registriert: Sa, 07. Jan 2006 17:30
- Wohnort: Braunschweig
- Kontaktdaten:
Variablen übernahme
Hallo,
ich brüte im Moment über folgendes Problem: Über eine SLE gebe ich eine Kennzahl ein. Diese Kennzahl wird in eine Variable übernommen. Das funzt einwandfrei. Danach wird über einen Codeblock aus einen Button heraus eine Funktion ausgeführt. Diese Funktion sucht in einer PostgrSQL-Datenbank nach einem Eintrag. Wird ein Eintrag gefunden, so stehen die Daten in einem Objekt und lassen sich über :getValue(x,y) einer Variablen zuordnen. Bis hier klappts wunderbar. Aber jetzt: Diese Var möchte ich einem anderen SLE zur Anzeige zuordnen. Und hier hakt es. Wie kriege ich die Var in das SLE-Objekt?
Gruß
Manfred
ich brüte im Moment über folgendes Problem: Über eine SLE gebe ich eine Kennzahl ein. Diese Kennzahl wird in eine Variable übernommen. Das funzt einwandfrei. Danach wird über einen Codeblock aus einen Button heraus eine Funktion ausgeführt. Diese Funktion sucht in einer PostgrSQL-Datenbank nach einem Eintrag. Wird ein Eintrag gefunden, so stehen die Daten in einem Objekt und lassen sich über :getValue(x,y) einer Variablen zuordnen. Bis hier klappts wunderbar. Aber jetzt: Diese Var möchte ich einem anderen SLE zur Anzeige zuordnen. Und hier hakt es. Wie kriege ich die Var in das SLE-Objekt?
Gruß
Manfred
- 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
Re: Variablen übernahme
hi,
hast die du im :dataLink verwendest.
grus by OHR
Jimmy
Ich gehe mal davon aus das du für die Variable eine Function (VarBlock)kuhno hat geschrieben: Diese Var möchte ich einem anderen SLE zur Anzeige zuordnen.
Und hier hakt es. Wie kriege ich die Var in das SLE-Objekt?
hast die du im :dataLink verwendest.
Code: Alles auswählen
oSLE1:dataLink := VARBLOCK(@cKdNr)
oSLE1:create():setData()
AAdd ( aEditControls, oSLE1 )
...
oSLE2:dataLink := VARBLOCK(@cKdName)
oSLE2:create():setData()
AAdd ( aEditControls, oSLE2 )
...
oXbp1 := XbpPushButton()...
oXbp1:create()
oXbp1:activate := {|| IF(DoSearch(oSLE1,oSLE2),;
REF2GETS(aEditcontrols),;
NIL }
...
FUNCTION REF2GETS(aEditcontrols)
LOCAL n, LenGets := len(aEditcontrols)
FOR n := 1 to LenGets
aEditcontrols[n]:setdata() // now VarBlock:setdata()
aEditcontrols[n]:show() // let me see my VarBlock now
NEXT
RETURN NIL
Jimmy
-
- UDF-Programmierer
- Beiträge: 54
- Registriert: Sa, 07. Jan 2006 17:30
- Wohnort: Braunschweig
- Kontaktdaten:
Danke erstmal für die Antworten.
Ohne den Code ist das natürlich schwierig. Hier also der Anfang.
Das ist der Eingabeteil. Über cpersnr wird dann der Button Suche betätigt.
Mit :activate usw. wird die Funktion suche(cpersnr) gestartet. cpersnr wird als Parameter übergeben.
Die Funktion suche sieht folgendermassen aus:
Bis hier geht das alles. rName wird auch zurückgegeben.
Jetzt soll das alles (ausser rName sind da noch mehr vars) da rein (nur rName):
Nur in diesem Block stet nix drin. Wenn ich auf das Feld gehen, also den Focus auf diese feld setze und dann den Button "Suche" erneut betätige, dann ist da auch das richtige Ergebnis drin. Nur so stelle ich mir das nicht vor. Alle anderen Dinge aus XBase++ , wie AppEdit() kommen nicht in Frage, da diese Fktn auf DBase-Dateien zugreifen, von denen ich mich wegen vielfachzugriff von bis zu 60 Plätzen getrennt habe.
Wo liegt denn nun mein Verständnis fehler?
Fragen über Fragen!
Gruß
Manfred
Ohne den Code ist das natürlich schwierig. Hier also der Anfang.
Code: Alles auswählen
oPersnr := XbpSLE():new( oDlg:drawingArea, , {84,525}, {84,24}, { { XBP_PP_BGCLR,;
XBPSYSCLR_ENTRYFIELD } } )
oPersnr:tabStop := .T.
oPersnr:bufferLength := 3
oPersnr:dataLink := {|x| IIf( x==NIL, cpersnr, cpersnr := x ) }
oPersnr:create()
oPersnr:killInputFocus := { |x,y,oSLE| oSLE:getData()," " }
Code: Alles auswählen
oSuche := XbpPushButton():new( oDlg:drawingArea, , {192,525}, {96,24}, { { XBP_PP_BGCLR,;
XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
oSuche:caption := "Suchen !"
oSuche:tabStop := .T.
oSuche:create()
oSuche:activate := {|| rName:=suche(cpersnr) }
Die Funktion suche sieht folgendermassen aus:
Code: Alles auswählen
FUNCTION suche(cpersnr)
LOCAL keinda
keinda:=.F.
cSQL := "SELECT * FROM personal where persnr="+cpersnr
oPG := PGSql():new()
if oPG:connect( cConnect ) // cConnect ist als Public in der AppSys definiert
if oPG:exec(cSQL)
oRes := oPG:result
rueckr:= oRes:rows
rtab:=oRes:cols
IF rueckr!= 0
rPassW:= oRes:getValue(0,0)
rName:= oRes:getValue(0,3)
keinda:=.F.
ELSE
keinda:=.T.
ENDIF
oRes:destroy()
endif
oPG:disconnect()
ENDIF
RETURN (rName)
Jetzt soll das alles (ausser rName sind da noch mehr vars) da rein (nur rName):
Code: Alles auswählen
oPnam := XbpSLE():new( oDlg:drawingArea, , {84,420}, {144,24}, { { XBP_PP_BGCLR,;
XBPSYSCLR_ENTRYFIELD } } )
oPnam:autoTab := .T.
oPnam:bufferLength := 20
oPnam:editable := .T.
oPnam:dataLink := {|x| IIf( x==NIL, rName, rName := x ) }
oPnam:getData(rName)
oPnam:create()
oPnam:killInputFocus := { |x,y,oSLE| oSLE:setData()," " }
Wo liegt denn nun mein Verständnis fehler?
Fragen über Fragen!
Gruß
Manfred
- 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,
Das bringt nichts den dort steht du ja (noch) nicht auf dem "richtigen"
Datensatz.
warum verwendest du es hier ? wieso ist der 2st. Parameter " " ?
wenn schon OOP dann sollte man nicht die "variabel" nehmen (die im
datalink steckt) sondern das Object für die der datalink gilt. Es wäre
also hier :
Der "Trick" mit "aEditcontrols" ist das du alle SLE Objecte "einsammelst"
und die dann alle "refresh"en kannst (was dir fehlt). Deshalb geht es
erst beim 2st. mal.
gruss by OHR
Jimmy
p.s. ... sorry bei mir "klemmt" das sssssssssssssss
Dir fehlt ein REF2GETS(aEditcontrols) !kuhno hat geschrieben:Nur in diesem Block stet nix drin. Wenn ich auf das Feld gehen, also den Focus auf diese feld setze und dann den Button "Suche" erneut betätige, dann ist da auch das richtige Ergebnis drin. Nur so stelle ich mir das nicht vor. Alle anderen Dinge aus XBase++ , wie AppEdit() kommen nicht in Frage, da diese Fktn auf DBase-Dateien zugreifen, von denen ich mich wegen vielfachzugriff von bis zu 60 Plätzen getrennt habe.Code: Alles auswählen
oPnam:dataLink := {|x| IIf( x==NIL, rName, rName := x ) } oPnam:getData(rName) oPnam:create() oPnam:killInputFocus := { |x,y,oSLE| oSLE:setData()," " }
Wo liegt denn nun mein Verständnis fehler?
Code: Alles auswählen
oPnam:getData(rName)
Datensatz.
Code: Alles auswählen
oPnam:killInputFocus := { |x,y,oSLE| oSLE:setData()," " }
Code: Alles auswählen
rName:= oRes:getValue(0,3)
datalink steckt) sondern das Object für die der datalink gilt. Es wäre
also hier :
Code: Alles auswählen
oPnam:setdata( oRes:getValue(0,3) )
oPnam:Show()
und die dann alle "refresh"en kannst (was dir fehlt). Deshalb geht es
erst beim 2st. mal.
gruss by OHR
Jimmy
p.s. ... sorry bei mir "klemmt" das sssssssssssssss
-
- UDF-Programmierer
- Beiträge: 54
- Registriert: Sa, 07. Jan 2006 17:30
- Wohnort: Braunschweig
- Kontaktdaten:
Hallo Jimmy,
das hier
geht leider nicht, da das Object oRes beim verlassen der Funktion bereits zerstört wird.
Die Verbindung zur SQL-Datenbank ist nur temporär und wird nur für den Datenaustausch aufgebaut und danach sofort wieder getrennt.
Ich muss die Ergebnisse schon zwischenspeichern. Ist keine DBF-Datei.
Gruß
Manfred
das hier
Code: Alles auswählen
oPnam:setdata( oRes:getValue(0,3) )
oPnam:Show()
Die Verbindung zur SQL-Datenbank ist nur temporär und wird nur für den Datenaustausch aufgebaut und danach sofort wieder getrennt.
Ich muss die Ergebnisse schon zwischenspeichern. Ist keine DBF-Datei.
Gruß
Manfred
- 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,
darum geht es nicht. Bei einem Object wird mit :setdata() / :getdata()
erst der oPnam:dataLink := {|x| IIf( x==NIL, rName, rName := x ) }
"ausgelöst". Eine Zuweisung rName := value "überträgt" es nicht von
alleine in das SLE Object. Das nachfolgenden :Show() zeigt es dann
erst an.
gruss by OHR
Jimmy
den Wert von oRes:getValue kannst du ja "zwischen speichern", aberkuhno hat geschrieben:geht leider nicht, da das Object oRes beim verlassen der Funktion bereits zerstört wird.Code: Alles auswählen
oPnam:setdata( oRes:getValue(0,3) ) oPnam:Show()
darum geht es nicht. Bei einem Object wird mit :setdata() / :getdata()
erst der oPnam:dataLink := {|x| IIf( x==NIL, rName, rName := x ) }
"ausgelöst". Eine Zuweisung rName := value "überträgt" es nicht von
alleine in das SLE Object. Das nachfolgenden :Show() zeigt es dann
erst an.
gruss by OHR
Jimmy