Este é um daqueles complicados.
É um tbrowse, que por si só já é uma exceção.
/*
PBANCOCOMPARAMES - COMPARATIVO MES A MES
1994.01 José Quintas
*/
#include "inkey.ch"
#include "josequintas.ch"
MEMVAR m_MostraDol, m_MostraTot, m_Ano, m_Mes, m_CodResumo, m_Tabela, nQtdCols
PROCEDURE pBancoComparaMes
LOCAL m_Texto, m_TmpMes, m_TmpAno, oBrowse, nKey, mTop, mLeft, mBottom, mRight, ColPos
LOCAL m_TmpMov, nMCol, nMRow, oTBrowse
IF ! AbreArquivos( "jpempresa", "jptabel", "jpconfi", "jpbaccusto", "jpbancario" )
RETURN
ENDIF
SELECT jpbancario
OrdSetFocus( "bancario2" )
SELECT jpbaccusto
OrdSetFocus( "jpbaccusto2" )
GOTO TOP
m_Tabela := PegaContas( .T. )
IF Len( m_Tabela ) == 2 // So contas de totais
MsgWarning( "Não há dados p/ comparativo!" )
RETURN
ENDIF
m_CodResumo := 1
m_Ano := Year( Date() )
m_Mes := Month( Date() )
m_mostratot := .F.
m_mostradol := .F.
mTop := 4
mLeft := 0
mBottom := MaxRow() - 5
mRight := MaxCol() - 2
oBrowse := TBrowseDb( mTop, mLeft, mBottom, mRight )
oBrowse:SkipBlock := { | m_Regs | SkipBrow2( m_Regs ) }
oBrowse:GoTopBlock := { || TopBrow2() }
oBrowse:GoBottomBlock := { || botbrow2() }
oBrowse:HeadSep := Chr(196)
oBrowse:ColSep := Chr(179)
oBrowse:FootSep := Chr(196)
oBrowse:FrameColor := SetColorTbrowseFrame()
ColPos := 2
nQtdCols := 5
oTBrowse := { ;
{ "", { || FldBrow2( -1 ) } }, ;
{ "", { || FldBrow2( 0 ) } }, ;
{ "", { || FldBrow2( 1 ) } }, ;
{ "", { || FldBrow2( 2 ) } }, ;
{ "", { || FldBrow2( 3 ) } }, ;
{ "", { || FldBrow2( 4 ) } } }
ToBrowse( oTBrowse, oBrowse )
TitBrow2()
oBrowse:right()
DO WHILE ! oBrowse:Stable
oBrowse:Stabilize()
ENDDO
DO WHILE .T.
Mensagem( "SETAS, T Totais, ENTER Lançamentos, R Desp/Rec, ESC Sai" )
nKey := 0
DO WHILE nKey == 0 .AND. ! oBrowse:Stable
oBrowse:Stabilize()
nKey := Inkey()
ENDDO
IF oBrowse:stable()
oBrowse:RefreshCurrent()
DO WHILE ! oBrowse:Stabilize()
ENDDO
nKey = Inkey( INKEY_IDLE, HB_INKEY_ALL - INKEY_MOVE + HB_INKEY_GTEVENT )
IF nKey == 0
KEYBOARD Chr( K_ESC )
LOOP
ENDIF
ENDIF
nMRow := MROW()
NMCol := MCOL()
DO CASE
CASE SetKey( nKey ) != NIL
eval( SetKey( nKey ), procname(), procline(), readvar() )
CASE nKey > 999
DO CASE
CASE mBrzMove( oBrowse, nMRow, nMCol, mTop + 1, mLeft + 1, mBottom - 1, mRight - 1 ) // Move cursor
CASE mBrzClick( oBrowse, nMRow, nMCol ) // click no TBrowse atual
//KEYBOARD Chr( K_ENTER )
ENDCASE
CASE nKey == K_ESC ; EXIT
CASE nKey == K_DOWN ; oBrowse:Down()
CASE nKey == K_UP ; oBrowse:Up()
CASE nKey == K_CTRL_DOWN ; oBrowse:PageDown()
CASE nKey == K_CTRL_UP ; oBrowse:PageUp()
CASE nKey == K_LEFT
IF ColPos == 2
m_Ano := iif( m_Mes == 12, m_Ano + 1, m_Ano )
m_Mes := iif( m_Mes == 12, 1, m_Mes + 1 )
TitBrow2()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ELSEIF ColPos > 1
oBrowse:left()
ColPos--
ENDIF
CASE nKey == K_RIGHT
IF ColPos == ( nQtdCols + 1 )
m_Ano = iif( m_Mes == 1, m_Ano - 1, m_Ano )
m_Mes = iif( m_Mes == 1, 12, m_Mes - 1 )
TitBrow2()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ELSE
oBrowse:right()
ColPos++
ENDIF
CASE nKey == Asc( "R" ) .OR. nKey == Asc( "r" )
IF Len( m_Tabela[ m_CodResumo ] ) == 10
SELECT jpbaccusto
SEEK m_Tabela[ m_CodResumo ]
DO WHILE jpbaccusto->cuGrupo == m_Tabela[ m_CodResumo ] .AND. ! Eof()
RecLock()
REPLACE jpbaccusto->cuMostra WITH iif( jpbaccusto->cuMostra == "S", "N", "S" )
RecUnlock()
SKIP
ENDDO
m_Tabela := PegaContas()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ENDIF
CASE nKey == K_ENTER
DO WHILE ! oBrowse:stabilize()
GrafProc()
ENDDO
m_TmpMes := m_Mes - iif( ColPos > 1, ColPos - 2, 0 )
m_TmpAno := m_Ano - iif( m_TmpMes < 1, 1, 0 )
m_TmpMes := m_TmpMes + iif( m_TmpMes < 1, 12, 0 )
WSave()
Mensagem( "Aguarde, pesquisando movimentação..." )
Cls()
@ 2, 0 SAY "Desp/Rec:" + Trim( Left( m_Tabela[ m_CodResumo ], 10 ) ) + iif( Len( m_Tabela[ m_CodResumo ] ) == 10, "", ;
", Resumo:" + Trim( Right( m_Tabela[ m_CodResumo ], 10 ) ) ) + ", mes:" + StrZero( m_TmpMes, 2 ) + "/" + StrZero( m_TmpAno, 4 )
@ 3, 0 SAY "BANCO EMISS __________HISTORICO__________ ___VALOR (NA DATA)__"
m_tmpmov := {}
SELECT jpbaccusto
SEEK Left( m_Tabela[ m_CodResumo ], 10 )
DO WHILE jpbaccusto->cuGrupo == Left( m_Tabela[ m_CodResumo ], 10 ) .AND. ! Eof()
GrafProc()
IF jpbaccusto->cuResumo != Right( m_Tabela[ m_CodResumo ], 10 ) .AND. Len( m_Tabela[ m_CodResumo ] ) > 10
SKIP
LOOP
ENDIF
SELECT jpbancario
SEEK jpbaccusto->bcResumo + StrZero( m_TmpAno, 4 ) + StrZero( m_TmpMes, 2 )
DO WHILE jpbancario->baResumo = jpbaccusto->cuCCusto .AND. Year( jpbancario->baDatEmi ) == m_TmpAno .AND. Month( jpbancario->baDatEmi ) == m_TmpMes .AND. ! Eof()
GrafProc()
m_Texto = iif( jpbancario->baDatBan = Stod( "29991231" ), Space(5), Left( Dtoc( jpbancario->baDatBan ), 5 ) )
m_Texto += Chr(179) + Left( Dtoc( jpbancario->baDatEmi ), 5 )
m_Texto += Chr(179) + Left( jpbancario->baHist, 26 )
m_Texto += Chr(179)
m_Texto += Transform( jpbancario->bavalor, PicVal(14,2) )
m_Texto += "<" + Chr(179)
m_Texto += Space(14)
m_Texto += " "
AAdd( m_tmpmov, m_Texto )
SKIP
ENDDO
SELECT jpbaccusto
SKIP
ENDDO
IF Len( m_tmpmov ) > 0
Mensagem( "Movimente com as setas, ENTER ou ESC sai" )
achoice( 4, 0, 21, 79, m_tmpmov )
ENDIF
WRestore()
CASE nKey == K_HOME
oBrowse:GoTop()
CASE nKey == K_END
oBrowse:GoBottom()
CASE Chr( nKey ) $ "Tt"
m_mostratot = ( ! m_mostratot )
TitBrow2()
oBrowse:Invalidate()
oBrowse:RefreshAll()
CASE Chr( nKey ) $ "Dd"
m_mostradol = ( ! m_mostradol )
TitBrow2()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ENDCASE
ENDDO
RETURN
STATIC FUNCTION TopBrow2()
m_CodResumo := 1
RETURN .T.
STATIC FUNCTION botbrow2()
m_CodResumo := Len( m_Tabela )
RETURN .T.
STATIC FUNCTION SkipBrow2( nSkip )
LOCAL nSkipped := 0
IF nSkip == 0
ELSEIF nSkip > 0 .AND. m_CodResumo < Len( m_Tabela )
DO WHILE nSkipped < nSkip .AND. m_CodResumo < Len( m_Tabela )
GrafProc()
m_CodResumo++
nSkipped++
ENDDO
ELSEIF nSkip < 0
DO WHILE nSkipped > nSkip .AND. m_CodResumo > 1
GrafProc()
m_CodResumo--
nSkipped--
ENDDO
ENDIF
RETURN nSkipped
STATIC FUNCTION FldBrow2( nCont )
LOCAL m_Retorno, m_TmpMes, m_TmpAno, m_Select
m_TmpAno := iif( m_Mes - nCont <= 0, m_Ano - 1, m_Ano )
m_TmpMes := iif( m_Mes - nCont <= 0, m_Mes - nCont + 12, m_Mes - nCont )
m_Select := select()
DO CASE
CASE nCont == -1
IF Len( m_Tabela[ m_CodResumo ] ) == 10
m_Retorno := "->" + Left( m_Tabela[ m_CodResumo ], 10 )
ELSE
m_Retorno := " " + Right( m_Tabela[ m_CodResumo ], 10 )
ENDIF
CASE ( m_Tabela[ m_CodResumo ] == ">ENTRADAS" .OR. m_Tabela[ m_CodResumo] == ">SAIDAS" ) .AND. ! m_MostraTot
m_Retorno := ""
CASE m_Tabela[ m_CodResumo ] = ">ENTRADAS"
m_Retorno := Transform( SomaEntradas( m_TmpAno, m_TmpMes ), PicVal(14,2) )
CASE m_Tabela[ m_CodResumo ] = ">SAIDAS"
m_Retorno := Transform( SomaSaidas( m_TmpAno, m_TmpMes ), PicVal(14,2) )
CASE Len(m_Tabela[ m_CodResumo ]) == 10
m_Retorno := Transform( SomaGrupo( m_Tabela[ m_CodResumo ], m_TmpAno, m_TmpMes ), PicVal(14,2) )
OTHERWISE
m_Retorno := Transform( SomaResumo( Right( m_Tabela[ m_CodResumo ], 10 ), m_TmpAno, m_TmpMes ), PicVal(14,2) )
ENDCASE
SELECT ( m_Select )
RETURN m_Retorno
STATIC FUNCTION TitBrow2()
LOCAL nCont
@ 2, 0 SAY Padc( "VALORES EM MOEDA VIGENTE", MaxCol() )
@ 3, 1 SAY "Item"
FOR nCont = 0 TO ( nQtdCols - 1 )
@ 3, 16 + nCont * 20 SAY Padc( Space(3) + iif( m_Mes - nCont <= 0, ;
StrZero( m_Mes - nCont + 12, 2 ) + "/" + StrZero( m_Ano - 1, 4 ), ;
StrZero( m_Mes - nCont, 2 ) + "/" + StrZero( m_Ano, 4 ) ), 20 )
NEXT
RETURN .T.
STATIC FUNCTION SomaEntradas( m_Ano, m_Mes )
LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo
SELECT jpbancario
nRecNo := RecNo()
GOTO TOP
DO WHILE ! Eof()
GrafProc()
cResumo := jpbancario->baResumo
nTotalTmp := 0
SEEK cResumo + StrZero( m_Ano, 4 ) + StrZero( m_Mes, 2 )
DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == m_Ano .AND. Month( jpbancario->baDatEmi ) == m_Mes .AND. ! Eof()
GrafProc()
IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
EXIT
ENDIF
nTotalTmp += jpbancario->baValor
SKIP
ENDDO
IF nTotalTmp > 0
nTotal += nTotalTmp
ENDIF
SEEK cResumo + "XXXX" SOFTSEEK
ENDDO
GOTO nRecNo
SELECT ( nSelect )
RETURN nTotal
STATIC FUNCTION SomaSaidas( nAno, nMes )
LOCAL nTotal := 0, cResumo, nTotalTmp, nSelect := Select(), nRecNo
SELECT jpbancario
nRecNo := RecNo()
GOTO TOP
DO WHILE ! Eof()
GrafProc()
cResumo := jpbancario->baResumo
nTotalTmp := 0
SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
GrafProc()
IF jpbancario->baResumo == Pad( "APLIC", 10 ) .OR. jpbancario->baResumo == Pad( "NENHUM", 10 )
EXIT
ENDIF
nTotalTmp += jpbancario->baValor
SKIP
ENDDO
IF nTotalTmp < 0
nTotal += nTotalTmp
ENDIF
SEEK cResumo + "XXXX" SOFTSEEK
ENDDO
GOTO nRecNo
SELECT ( nSelect )
RETURN nTotal
STATIC FUNCTION SomaGrupo( cGrupo, nAno, nMes )
LOCAL nTotal := 0, nSelect := Select()
SELECT jpbaccusto
SEEK cGrupo
DO WHILE jpbaccusto->cuGrupo == cGrupo .AND. ! Eof()
GrafProc()
nTotal += SomaResumo( jpbaccusto->cuCCusto, nAno, nMes )
SKIP
ENDDO
SELECT ( nSelect )
RETURN nTotal
STATIC FUNCTION SomaResumo( cResumo, nAno, nMes )
LOCAL nTotal := 0, nSelect := Select()
SELECT jpbancario
SEEK cResumo + StrZero( nAno, 4 ) + StrZero( nMes, 2 )
DO WHILE jpbancario->baResumo = cResumo .AND. Year( jpbancario->baDatEmi ) == nAno .AND. Month( jpbancario->baDatEmi ) == nMes .AND. ! Eof()
GrafProc()
nTotal += jpbancario->baValor
SKIP
ENDDO
SELECT ( nSelect )
RETURN nTotal
STATIC FUNCTION PegaContas( lPrimeiraVez )
LOCAL mLista := {}, m_Grupo
hb_Default( @lPrimeiraVez, .F. )
GOTO TOP
DO WHILE ! Eof()
GrafProc()
AAdd( mLista, jpbaccusto->cuGrupo )
m_Grupo = jpbaccusto->cuGrupo
DO WHILE jpbaccusto->cuGrupo == m_Grupo .AND. ! Eof()
GrafProc()
IF lPrimeiraVez .AND. jpbaccusto->cuMostra == "S"
RecLock()
REPLACE jpbaccusto->cuMostra WITH "N"
RecUnlock()
ENDIF
IF jpbaccusto->cuMostra=="S"
AAdd( mLista, jpbaccusto->cuGrupo + jpbaccusto->cuCCusto )
ENDIF
SKIP
ENDDO
ENDDO
AAdd( mLista, ">ENTRADAS" )
AAdd( mLista, ">SAIDAS" )
RETURN mLista
o tbrowse é feito encima de grupos de centro de custo e centros de custo, com/sem total geral.
Cada coluna se refere a um mês, sendo que a navegação na horizontal entre meses é infinita.
Está sendo usado um DBF pro browse, e as colunas são calculadas.
À primeira vista, seria trazer pronto do SQL, mas pra isso teria que limitar os meses das colunas.
Isso poderia ser resolvido se, ao ultrapassar a coluna, refizesse o comando SQL pra trazer todo browse.
Mesmo assim, teria o browse vertical das linhas, que pode variar.
Acho que a saÃda vai ser fazer um browse em array, ou em um recordset ADO, e as colunas continuarem sendo calculadas.
Numa primeira alteração, posso eliminar apenas o uso do arquivo de movimentação.
Esse arquivo representa 16MB dos 18MB que faltam pra converter.