Uma pequena melhoria que uso nos GETs.
Uso um bloco alterado na GETSYS - a parte com by JPA
DO WHILE ! nPos == 0
aVarGet := Array( Len( GetList ) ) // by JPA to otimize screen update
FOR EACH oElement IN GetList // by JPA to otimize screen update
aVarGet[ oElement:__EnumIndex ] := oElement:VarGet()
NEXT
// GET NEXT GET from list and post it as the active GET
PostActiveGet( oGet := GetList[ nPos ] )
// Read the GET
IF ( VALTYPE( oGet:reader ) == "B" )
EVAL( oGet:reader, oGet ) // Use custom reader block
ELSE
GetReader( oGet, lIsMouse ) // Use standard reader
ENDIF
FOR EACH oElement IN GetList // by JPA to otimize screen update
IF aVarGet[ oElement:__EnumIndex ] != oElement:VarGet()
oElement:Display()
ENDIF
NEXT
// Move to NEXT GET based on EXIT condition
nPos := Settle( GetList, nPos )
ENDDO
Nada demais, só atualiza a tela caso o conteúdo do GET tenha sido alterado.
Muito útil quando a digitação altera o conteúdo de outros GETs, porque na GETSYS normal isso só acontece se passar pelo GET.
#include "hbclass.ch"
PROCEDURE Main
SetMode( 35, 100 )
SetColor( "W/B,N/W,,,W/B" )
CLS
Nota := NotaClass():New()
@ 1, 0 SAY "Valor da Nota:" GET Nota:Valor VALID Nota:CalculaImpostos()
@ 2, 0 SAY "Base ICMS....:" GET Nota:IcmBase WHEN .F.
@ 3, 0 SAY "Base Reducao.:" GET Nota:IcmReducao VALID Nota:CalculaImpostos()
@ 4, 0 SAY "Alíquota.....:" GET Nota:IcmAliquota VALID Nota:CalculaImpostos()
@ 5, 0 SAY "Valor ICMS...:" GET Nota:IcmValor WHEN .F.
@ 6, 0 SAY "Base ST......:" GET Nota:StBase WHEN .F.
@ 7, 0 SAY "IVA..........:" GET Nota:StIVA VALID Nota:CalculaImpostos()
@ 8, 0 SAY "Aliq.ST......:" GET Nota:StAliquota VALID Nota:CalculaImpostos()
@ 9, 0 SAY "Valor ST.....:" GET Nota:StValor WHEN .F.
READ
CREATE CLASS NotaClass
VAR Valor INIT 0
VAR IcmBase INIT 0
VAR IcmReducao INIT 0
VAR IcmAliquota INIT 0
VAR IcmValor INIT 0
VAR StBase INIT 0
VAR StIVA INIT 0
VAR StAliquota INIT 0
VAR StValor INIT 0
METHOD CalculaImpostos()
END CLASS
METHOD CalculaImpostos()
::IcmBase := ::Valor - ( Int( ::Valor * ::IcmReducao ) / 100 )
::IcmValor := Int( ::IcmBase * ::IcmAliquota ) / 100
::StBase := ::IcmBase + ( Int( ::IcmBase * ::StIVA / 100 ) )
::StValor := Max( 0, Int( ::StBase * ::StAliquota ) / 100 - ::IcmValor )
SetPos( 11, 0 )
? "Icmbase:", ::IcmBase, "STBase", ::StBase
RETURN .T.
Sem alterar a getsys, valores errados na tela, ou necessidade de fonte adicional:
Valor da Nota: 100
Base ICMS....: 100.00
Base Reducao.: 20
Alφquota.....: 10
Valor ICMS...: 8.00
Base ST......: 80.00
IVA..........: 50
Aliq.ST......: 10
Valor ST.....: 4.00
Icmbase: 80.00 STBase 120.00
Até lembrei das estorinhas de criança, que tinham o "moral da estória".
Acho que isso era algo do tipo: "use a cabeça e pense".
Qual o moral da estória aqui:
Problema resolvido de vez, sem complicar os fontes de trabalho.
Se é pra complicar, que seja pra simplificar.