Variablen übernahme

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Variablen übernahme

Beitrag von kuhno »

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

Re: Variablen übernahme

Beitrag von AUGE_OHR »

hi,
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?
Ich gehe mal davon aus das du für die Variable eine Function (VarBlock)
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
grus 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,

wenn Jimmys Vorschlag nicht geht, könnte man das Object in den CARGO Slot stecken und darauf zugreifen ...
Gruß
Hubert
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Danke erstmal für die Antworten.

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()," "  }
Das ist der Eingabeteil. Über cpersnr wird dann der Button Suche betätigt.

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) }
Mit :activate usw. wird die Funktion suche(cpersnr) gestartet. cpersnr wird als Parameter übergeben.
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)
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):

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()," "  }

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
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,
kuhno hat geschrieben:

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()," "  }
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?
Dir fehlt ein REF2GETS(aEditcontrols) !

Code: Alles auswählen

   oPnam:getData(rName)
Das bringt nichts den dort steht du ja (noch) nicht auf dem "richtigen"
Datensatz.

Code: Alles auswählen

   oPnam:killInputFocus := { |x,y,oSLE| oSLE:setData()," "  }
warum verwendest du es hier ? wieso ist der 2st. Parameter " " ?

Code: Alles auswählen

rName:= oRes:getValue(0,3)
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 :

Code: Alles auswählen

oPnam:setdata( oRes:getValue(0,3) )
oPnam:Show()
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
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Hallo Jimmy,

das hier

Code: Alles auswählen

oPnam:setdata( oRes:getValue(0,3) )
oPnam:Show() 
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
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,
kuhno hat geschrieben:

Code: Alles auswählen

oPnam:setdata( oRes:getValue(0,3) )
oPnam:Show() 
geht leider nicht, da das Object oRes beim verlassen der Funktion bereits zerstört wird. :(
den Wert von oRes:getValue kannst du ja "zwischen speichern", aber
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
Antworten