Gostei principalmente dos GETs, eliminando problemas com array
Na parte de cima são extratos pra pagamento
Na parte de baixo são cheques emitidos
A intenção é mostrar em cada extrato, quanto os cheques causaram de baixa, e qual o saldo restante.
antes da alteração
CREATE CLASS CalculaBaixaExtratoClass
VAR mExtrato
VAR mBaixa
VAR mSaldo
VAR mCheque
VAR mTexto INIT Space(50)
VAR mSomaExtrato INIT 0
VAR mSomaBaixa INIT 0
VAR mSomaSaldo INIT 0
VAR mSomaCheque INIT 0
VAR mSaldoCheque INIT 0
METHOD Init()
METHOD Calcula()
END CLASS
METHOD Init() CLASS CalculaBaixaExtratoClass
::mExtrato := Array(10)
::mBaixa := Array(10)
::mSaldo := Array(10)
::mCheque := Array(10)
Afill( ::mExtrato, 0 )
Afill( ::mBaixa, 0 )
Afill( ::mSaldo, 0 )
Afill( ::mCheque, 0 )
RETURN SELF
METHOD Calcula() CLASS CalculaBaixaExtratoClass
LOCAL mTotal := 0, nCont
FOR nCont = 1 TO 10
mTotal += ::mCheque[ nCont ]
NEXT
FOR nCont = 1 TO 10
IF ::mExtrato[ nCont ] == mTotal
::mBaixa[ nCont ] := mTotal
::mSaldo[ nCont ] := 0
mTotal := 0
ELSEIF ::mExtrato[ nCont ] > mTotal
::mBaixa[ nCont ] := mTotal
::mSaldo[ nCont ] := ::mExtrato[ nCont ] - ::mBaixa[nCont ]
mTotal := 0
ELSE
::mBaixa[ nCont ] := ::mExtrato[ nCont ]
::mSaldo[ nCont ] := 0
mTotal -= ::mBaixa[ nCont ]
ENDIF
NEXT
::mSomaExtrato := 0
::mSomaBaixa := 0
::mSomaCheque := 0
::mSomaSaldo := 0
FOR nCont = 1 TO Len( ::mExtrato )
::mSomaExtrato += ::mExtrato[ nCont ]
::mSomaBaixa += ::mBaixa[ nCont ]
::mSomaSaldo += ::mSaldo[ nCont ]
::mSomaCheque += ::mCheque[ nCont ]
NEXT
::mSaldoCheque := ::mSomaCheque - ::mSomaBaixa
IF ::mSaldoCheque != 0
::mTexto := Pad( "FALTA OU SOBRA VALOR DE CHEQUE", 50 )
ELSE
::mTexto := Space(50)
ENDIF
RETURN .T.
FUNCTION CalculaBaixaExtrato()
LOCAL GetList := {}, oVal := CalculaBaixaExtratoClass():New()
wSave()
Cls()
@ 2, 1 SAY "Valor extrato 1.:" GET oVal:mExtrato[ 1 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oVal:mBaixa[ 1 ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oVal:mSaldo[ 1 ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 1, 1 SAY "Valor extrato 2.:" GET oVal:mExtrato[ 2 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oVal:mBaixa[ 2 ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oVal:mSaldo[ 2 ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 1, 1 SAY "Valor extrato 3.:" GET oVal:mExtrato[ 3 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oVal:mBaixa[ 3 ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oVal:mSaldo[ 3 ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 1, 1 SAY "Valor extrato 4.:" GET oVal:mExtrato[ 4 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oVal:mBaixa[ 4 ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oVal:mSaldo[ 4 ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 1, 1 SAY "Valor extrato 5.:" GET oVal:mExtrato[ 5 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oVal:mBaixa[ 5 ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oVal:mSaldo[ 5 ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 2, 1 SAY "Somas"
@ Row(), Col() + 13 GET oVal:mSomaExtrato PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 10 GET oVal:mSomaBaixa PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 9 GET oVal:mSomaSaldo PICTURE "999,999,999.99" WHEN .F.
@ Row() + 2, 1 SAY "Cheque 1........:" GET oVal:mCheque[ 1 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 2........:" GET oVal:mCheque[ 2 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 3........:" GET oVal:mCheque[ 3 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 4........:" GET oVal:mCheque[ 4 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 5........:" GET oVal:mCheque[ 5 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 6........:" GET oVal:mCheque[ 6 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 1, 1 SAY "Cheque 7........:" GET oVal:mCheque[ 7 ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row() + 2, 5 SAY "Soma Cheque:" GET oVal:mSomaCheque PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 3 SAY "Saldo em cheque:" GET oVal:mSaldoCheque PICTURE "999,999,999.99" WHEN .F.
@ Row() + 2, 20 GET oVal:mTexto WHEN .F.
READ
wRestore()
RETURN NIL
depois da alteração
#define V_EXTRATO 1
#define V_BAIXA 2
#define V_SALDO 3
#define V_CHEQUE 4
CREATE CLASS CalculaBaixaExtratoClass
VAR mLancto
VAR mSoma INIT { 0, 0, 0, 0 }
VAR mTexto INIT Space(50)
METHOD Init()
METHOD Calcula()
END CLASS
METHOD Init() CLASS CalculaBaixaExtratoClass
LOCAL oElement
::mLancto := Array(10)
FOR EACH oElement IN ::mLancto
oElement := { 0, 0, 0, 0 }
NEXT
RETURN SELF
METHOD Calcula() CLASS CalculaBaixaExtratoClass
LOCAL mTotal := 0, oElement
FOR EACH oElement IN ::mLancto
mTotal += oElement[ V_CHEQUE ]
NEXT
FOR EACH oElement IN ::mLancto
IF oElement[ V_EXTRATO ] == mTotal
oElement[ V_BAIXA ] := mTotal
oElement[ V_SALDO ] := 0
mTotal := 0
ELSEIF oElement[ V_EXTRATO ] > mTotal
oElement[ V_BAIXA ] := mTotal
oElement[ V_SALDO ] := oElement[ V_EXTRATO ] - oElement[ V_BAIXA ]
mTotal := 0
ELSE
oElement[ V_BAIXA ] := oElement[ V_EXTRATO ]
oElement[ V_SALDO ] := 0
mTotal -= oElement[ V_BAIXA ]
ENDIF
NEXT
::mSoma := { 0, 0, 0, 0 }
FOR EACH oElement IN ::mLancto
::mSoma[ V_EXTRATO ] += oElement[ V_EXTRATO ]
::mSoma[ V_BAIXA ] += oElement[ V_BAIXA ]
::mSoma[ V_CHEQUE ] += oElement[ V_CHEQUE ]
::mSoma[ V_SALDO ] += oElement[ V_SALDO ]
NEXT
::mSoma[ V_SALDO ] := ::mSoma[ V_CHEQUE ] - ::mSoma[ V_BAIXA ]
IF ::mSoma[ V_SALDO ] != 0
::mTexto := Pad( "FALTA OU SOBRA VALOR DE CHEQUE", 50 )
ELSE
::mTexto := Space(50)
ENDIF
RETURN .T.
FUNCTION CalculaBaixaExtrato()
LOCAL GetList := {}, oElement, oVal := CalculaBaixaExtratoClass():New()
wSave()
Cls()
@ 1, 0 SAY ""
FOR EACH oElement IN oVal:mLancto
@ Row() + 1, 1 SAY "Valor extrato:" GET oElement[ V_EXTRATO ] PICTURE "999,999,999.99" VALID oVal:Calcula()
@ Row(), Col() + 2 SAY "Baixar:" GET oElement[ V_BAIXA ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 2 SAY "Saldo:" GET oElement[ V_SALDO ] PICTURE "999,999,999.99" WHEN .F.
NEXT
@ Row() + 2, 1 SAY "Somas"
@ Row(), Col() + 10 GET oVal:mSoma[ V_EXTRATO ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 10 GET oVal:mSoma[ V_BAIXA ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 9 GET oVal:mSoma[ V_SALDO ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 1, 0 SAY ""
FOR EACH oElement IN oVal:mLancto
@ Row() + 1, 1 SAY "Cheque .........:" GET oElement[ V_CHEQUE ] PICTURE "999,999,999.99" VALID oVal:Calcula()
NEXT
@ Row() + 2, 5 SAY "Soma Cheque:" GET oVal:mSoma[ V_CHEQUE ] PICTURE "999,999,999.99" WHEN .F.
@ Row(), Col() + 3 SAY "Saldo em cheque:" GET oVal:mSoma[ V_SALDO ] PICTURE "999,999,999.99" WHEN .F.
@ Row() + 2, 20 GET oVal:mTexto WHEN .F.
READ
wRestore()
RETURN NIL
Nota:
Aqui funcionou, mas cai naquilo da minha GETSYS atualizar os GETs automaticamente, afinal toda tela é atualizada durante a digitação.
Pra ficar igual, teria que passar GetList como parâmetro nos VALID, e na rotina de cálculo fazer o get:Display() pra toda GetList.
Mas a intenção é mostrar a mudança do fonte usando FOR EACH.
É um fonte totalmente fora do normal.