Hier definiert man, dass
während einem
READ eigener code abgearbeitet wird
@ ... GET cVar1 VALID MeineFunktion_NACH_Feld( cVar , "cVar1")
@ ... GET cVar2 WHEN MeineFunktion_VOR_Feld( cVar , "cVar1" )
Aber nur solange READ aktiv ist, kann man das GETLIST-Array (Array mit GET Objekten) auswerten und eventuell Werte in den GETs ändern.
AScan ist normal etwas schneller als eine eigene Schleife, aber das wird bei 100 Elementen kaum messbar sein.
Die eigene Schleife ist meist leichter zu debuggen und zu verstehen was abgeht.
Eigentlich ist das ganze kein Hexenwerk, so habe ich früher komplexe Rechnungserfassung programmiert ...
Hier der Aufbau per Schleife der Rechnungszeilen, 2 Funktionen haben entschieden, ob das nächste GET übersprungen wird (WHEN) und ob die Eingabe OK war (VALID):
Code: Alles auswählen
for x := 1 to REZEIMAX
y := 1
@5+x,1 get rechnung[ x+offset , ARENUM ] ;
picture "999" when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,5 get rechnung[ x+offset , AANZ ] ;
picture "@E 99.9" valid rechn_n(rechnung) ;
when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,9 get rechnung[ x+offset , AANZ_ART ] ;
picture "!" when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,11 get rechnung[ x+offset , AARTNR ] ;
picture "@!@S15" valid rechn_n(rechnung) ;
when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,27 get rechnung[ x+offset , AA_BEZ ] ;
picture "@S28" when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,56 get rechnung[ x+offset , ACODE ] ;
picture "!!" valid rechn_n_code() ;
when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,59 get rechnung[ x+offset , APREIS ] ;
picture "@E 99,999.99" valid rechn_n(rechnung) ;
when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++}
#endif
@5+x,69 get rechnung[ x+offset , AGES_PREIS ] ;
picture "@E 999,999.99" valid rechn_n(rechnung) ;
when springen(rechnung)
#ifdef __XPP__
aTail(getlist):subscript := {x + Offset, y++} // Zugriff auf aktuelles Get-Objekt
#endif
next
Alaska hat sich entschieden die Instanzvariable
subscript nicht auszufüllen, da sie die intern nicht benutzen,
ich brauche die aber schon für meine Zwecke.
DU kannst hier erkennen, wie man beim Aufbau auf das aktuelle GET-Objekt zugreifen kann !
Hier die VALID Funktion, die das aktuell aktive GET-Objekt abfragt (genau dafür gibt es eine Funktion):
Code: Alles auswählen
*--------------------------------------------------------- RECHN_N -----------
function rechn_n( rechnung )
local oGET, ZeilNum,aSubscript,x
oGet := Getactive() // aktuelles Getobjekt lesen
aSubscript := oGet:subscript // Array mit Position ermitteln
ZeilNum := aSubscript[ 1 ] // Zeilennummer in 1.
if rechnung[ ZeilNum , AANZ ] # 0 .AND. ;
rechnung[ ZeilNum , APREIS ] # 0
rechnung[ ZeilNum , AGES_PREIS ] := round( ;
rechnung[ ZeilNum , AANZ ] * ;
rechnung[ ZeilNum , APREIS ] ,2 )
endif
x=ascan( getlist , {|o| iif( o:subscript[1]=ZeilNum .AND. ;
o:subscript[2]=APREIS , .t. ,.f.) } )
if x > 0 // Einzelpreis suchen und mit Gesamtpreis anzeigen
getlist[x]:display()
getlist[x+1]:display()
endif
if empty(rechnung[ ZeilNum , AGES_PREIS ]) .AND. ! empty(rechnung[ ZeilNum , APREIS ])
meldung(12,"F",{"Achtung: Gesamtpreis ist 0 !!!!",;
"Dies ist meist ein Fehler, bitte Stückzahl und Einzelpreis überprüfen !"})
endif
return .t.
Hier die Funktion die das nächste zu editierende GET auswählt:
Code: Alles auswählen
*--------------------------------------------------------- Springen ---------
function springen( rechnung )
local oGET, ZeilNum,aSubscript,x, edit, feld, ZeileLeer, VorZeileLeer
oGet := Getactive() // aktuelles Getobjekt lesen
aSubscript := oGet:subscript // Array mit Position ermitteln
ZeilNum := aSubscript[ 1 ] // Zeilennummer in 1.
Feld := aSubscript[ 2 ] // Arrayelement in 2.
edit := .t. // Standard Feld editierbar
ZeileLeer := .t. // " Zeile ist leer
VorZeileLeer := .t. // " VorZeile ist leer
for x = AANZ to AGES_PREIS // Ermitteln ob Zeile leer
if ! empty( rechnung[ ZeilNum , x ] )
ZeileLeer := .f.
exit
endif
next
if ZeilNum = 1
VorZeileLeer := .t.
else
for x := AANZ to AGES_PREIS // Ermitteln ob Vorzeile leer
if ! empty( rechnung[ ZeilNum - 1 , x ] )
VorZeileLeer := .f.
exit
endif
next
endif
do case
case feld = ARENUM
if ZeilNum = 1 // erste Zeile immer editieren
edit := .t.
else
edit := ! VorZeileLeer // sonst nur wenn letzte Zeile ! leer
endif
case feld # ARENUM .AND. empty( rechnung[ ZeilNum , ARENUM ] )
edit := .f.
case feld = AANZ
if ZeilNum = 1 // erste Zeile immer editieren
edit := .t.
else
edit := ! VorZeileLeer // sonst nur wenn letzte Zeile ! leer
endif
case feld = AANZ_ART // Anzahlart nur wenn Anzahl in dieser Zeile
edit := ! empty( rechnung[ ZeilNum , AANZ ] )
case feld = AARTNR
if ZeilNum = 1 // erste Zeile immer editieren
edit := .t.
else
edit := ! VorZeileLeer // sonst nur wenn letzte Zeile ! leer
endif
case feld = AA_BEZ
if ZeilNum = 1 // erste Zeile immer editieren
edit := .t.
else
edit := ! VorZeileLeer // sonst nur wenn letzte Zeile ! leer
endif
case feld = ACODE // Rechnungsart, wenn Artikelnr. oder Bez.
edit := ! ( empty( rechnung[ ZeilNum , AARTNR ] ) .AND. ;
empty( rechnung[ ZeilNum , AA_BEZ ] ) )
case feld = APREIS // Einzelpreis, wenn Artikelnr. oder Bez.
edit := ! ( empty( rechnung[ ZeilNum , AARTNR ] ) .AND. ;
empty( rechnung[ ZeilNum , AA_BEZ ] ) )
case feld = AGES_PREIS
if rechnung[ ZeilNum , AANZ ] # 0 .AND. ;
rechnung[ ZeilNum , APREIS ] # 0
edit := .f. // Wenn Anzahl und Einzelpreis festliegen, rechnen!
else // Sonst, wenn Artikelnr. oder Bez. eingeben.
edit := ! ( empty( rechnung[ ZeilNum , AARTNR ] ) .AND. ;
empty( rechnung[ ZeilNum , AA_BEZ ] ) )
endif
endcase
return ( edit )