Não serve de referência pra nada, porque é diferente de tudo, mas.... tá feito.
Código: Selecionar todos
/*
PBANCOCOMPARAMES - COMPARATIVO MES A MES
1994.01 José Quintas
*/
#include "inkey.ch"
#include "josequintas.ch"
#define BA_ENTRADAS 1
#define BA_SAIDAS -1
MEMVAR nIndexAno, nIndexMes, nIndexCCusto, aCCustoList, nQtdCols
PROCEDURE pBancoComparaMes
LOCAL m_TmpMes, m_TmpAno, oBrowse, nKey, mTop, mLeft, mBottom, mRight, ColPos
LOCAL nMCol, nMRow, oTBrowse, oElement
IF ! AbreArquivos( "jpempresa", "jptabel", "jpconfi", "jpbaccusto", "jpbancario" )
RETURN
ENDIF
aCCustoList := PegaContas( .T. )
nIndexCCusto := 1
nIndexAno := Year( Date() )
nIndexMes := Month( Date() )
mTop := 4
mLeft := 0
mBottom := MaxRow() - 5
mRight := MaxCol() - 2
oBrowse := TBrowseDb( mTop, mLeft, mBottom, mRight )
oBrowse:SkipBlock := { | nSkipRows | CCustoSkip( nSkipRows ) }
oBrowse:GoTopBlock := { || CCustoGoTop() }
oBrowse:GoBottomBlock := { || CCustoGoBottom() }
oBrowse:HeadSep := Chr(196)
oBrowse:ColSep := Chr(179)
oBrowse:FootSep := Chr(196)
oBrowse:FrameColor := SetColorTbrowseFrame()
ColPos := 2
nQtdCols := 5
oTBrowse := { ;
{ "", { || CCustoColuna( -1 ) } }, ;
{ "", { || CCustoColuna( 0 ) } }, ;
{ "", { || CCustoColuna( 1 ) } }, ;
{ "", { || CCustoColuna( 2 ) } }, ;
{ "", { || CCustoColuna( 3 ) } }, ;
{ "", { || CCustoColuna( 4 ) } } }
ToBrowse( oTBrowse, oBrowse )
CCustoTitulo()
oBrowse:Right()
DO WHILE .T.
Mensagem( "SETAS, T Totais, ENTER Lançamentos, D Detalhes, 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 )
CASE mBrzClick( oBrowse, nMRow, nMCol )
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_HOME ; oBrowse:GoTop()
CASE nKey == K_END ; oBrowse:GoBottom()
CASE nKey == K_LEFT
IF ColPos == 2
nIndexAno := iif( nIndexMes == 12, nIndexAno + 1, nIndexAno )
nIndexMes := iif( nIndexMes == 12, 1, nIndexMes + 1 )
CCustoTitulo()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ELSEIF ColPos > 1
oBrowse:Left()
ColPos--
ENDIF
CASE nKey == K_RIGHT
IF ColPos == ( nQtdCols + 1 )
nIndexAno = iif( nIndexMes == 1, nIndexAno - 1, nIndexAno )
nIndexMes = iif( nIndexMes == 1, 12, nIndexMes - 1 )
CCustoTitulo()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ELSE
oBrowse:Right()
ColPos++
ENDIF
CASE nKey == Asc( "D" ) .OR. nKey == Asc( "d" )
IF Empty( aCCustoList[ nIndexCCusto, 2 ] )
FOR EACH oElement IN aCCustoList
IF oElement[ 1 ] == aCCustoList[ nIndexCCusto, 1 ] .AND. ! Empty( oElement[ 2 ] )
oElement[ 3 ] := ! oElement[ 3 ]
ENDIF
NEXT
oBrowse:Invalidate()
oBrowse:RefreshAll()
ENDIF
CASE nKey == K_ENTER
DO WHILE ! oBrowse:stabilize()
GrafProc()
ENDDO
m_TmpMes := nIndexMes - iif( ColPos > 1, ColPos - 2, 0 )
m_TmpAno := nIndexAno - iif( m_TmpMes < 1, 1, 0 )
m_TmpMes := m_TmpMes + iif( m_TmpMes < 1, 12, 0 )
CCustoDetalhes( aCCustoList[ nIndexCCusto, 1 ], aCCustoList[ nIndexCCusto, 2 ], m_TmpMes, m_TmpAno )
CASE Chr( nKey ) $ "Tt"
aCCustoList[ Len( aCCustoList ) - 1, 3 ] := ! aCCustoList[ Len( aCCustoList ) - 1, 3 ]
aCCustoList[ Len( aCCustoList ), 3 ] := ! aCCustoList[ Len( aCCustoList ), 3 ]
CCustoTitulo()
oBrowse:Invalidate()
oBrowse:RefreshAll()
ENDCASE
ENDDO
CLOSE DATABASES
RETURN
STATIC FUNCTION CCustoGoTop()
nIndexCCusto := 1
DO WHILE ! aCCustoList[ nIndexCCusto, 3 ]
nIndexCCusto++
ENDDO
RETURN .T.
STATIC FUNCTION CCustoGoBottom()
nIndexCCusto := Len( aCCustoList )
DO WHILE ! aCCustoList[ nIndexCCusto, 3 ]
nIndexCCusto--
ENDDO
RETURN .T.
STATIC FUNCTION CCustoSkip( nSkip )
LOCAL nSkipped := 0
IF nSkip == 0
ELSEIF nSkip > 0 .AND. nIndexCCusto < Len( aCCustoList )
DO WHILE nSkipped < nSkip .AND. nIndexCCusto <= Len( aCCustoList )
nIndexCCusto++
IF nIndexCCusto <= Len( aCCustoList ) .AND. aCCustoList[ nIndexCCusto, 3 ]
nSkipped++
ENDIF
ENDDO
IF nIndexCCusto > Len( aCCustoList )
CCustoGoBottom()
ENDIF
ELSEIF nSkip < 0
DO WHILE nSkipped > nSkip .AND. nIndexCCusto >= 1
nIndexCCusto--
IF nIndexCCusto > 0 .AND. aCCustoList[ nIndexCCusto, 3 ]
nSkipped--
ENDIF
ENDDO
IF nIndexCCusto < 1
CCustoGoTop()
ENDIF
ENDIF
RETURN nSkipped
STATIC FUNCTION CCustoColuna( nCont )
LOCAL m_Retorno, m_TmpMes, m_TmpAno
m_TmpAno := iif( nIndexMes - nCont <= 0, nIndexAno - 1, nIndexAno )
m_TmpMes := iif( nIndexMes - nCont <= 0, nIndexMes - nCont + 12, nIndexMes - nCont )
DO CASE
CASE nCont == -1
IF Empty( aCCustoList[ nIndexCCusto, 2 ] )
m_Retorno := "->" + Pad( aCCustoList[ nIndexCCusto, 1 ], 10 )
ELSE
m_Retorno := " " + Pad( aCCustoList[ nIndexCCusto, 2 ], 10 )
ENDIF
CASE ! aCCustoList[ nIndexCCusto, 3 ]
m_Retorno := ""
CASE aCCustoList[ nIndexCCusto, 1 ] = ">ENTRADAS"
m_Retorno := Transform( SomaMovimento( m_TmpAno, m_TmpMes, BA_ENTRADAS ), PicVal(14,2) )
CASE aCCustoList[ nIndexCCusto, 1 ] = ">SAIDAS"
m_Retorno := Transform( SomaMovimento( m_TmpAno, m_TmpMes, BA_SAIDAS ), PicVal(14,2) )
CASE Empty( aCCustoList[ nIndexCCusto, 2 ] )
m_Retorno := Transform( SomaGrupo( aCCustoList[ nIndexCCusto, 1 ], m_TmpAno, m_TmpMes ), PicVal(14,2) )
OTHERWISE
m_Retorno := Transform( SomaResumo( aCCustoList[ nIndexCCusto, 2 ], m_TmpAno, m_TmpMes ), PicVal(14,2) )
ENDCASE
RETURN m_Retorno
STATIC FUNCTION CCustoTitulo()
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( nIndexMes - nCont <= 0, ;
StrZero( nIndexMes - nCont + 12, 2 ) + "/" + StrZero( nIndexAno - 1, 4 ), ;
StrZero( nIndexMes - nCont, 2 ) + "/" + StrZero( nIndexAno, 4 ) ), 20 )
NEXT
RETURN .T.
STATIC FUNCTION SomaMovimento( nAno, nMes, nTipo )
LOCAL nTotal
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "SELECT SUM( SOMA ) AS TOTAL FROM" + ;
" ( SELECT BARESUMO, SUM( BAVALOR ) AS SOMA" + ;
" FROM JPBANCARIO" + ;
" WHERE BARESUMO NOT IN ( 'APLIC', 'NENHUM' )" + ;
" AND Year( BADATEMI ) = " + NumberSQL( nAno ) + ;
" AND Month( BADATEMI ) = " + NumberSQL( nMes ) + ;
" GROUP BY BARESUMO" + ;
" HAVING SOMA " + iif( nTipo == 1, ">", "<" ) + " 0 ) AS A"
:Execute()
nTotal := :Number( "TOTAL" )
:CloseRecordset()
ENDWITH
RETURN nTotal
STATIC FUNCTION SomaGrupo( cGrupo, nAno, nMes )
LOCAL nTotal
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "SELECT SUM( BAVALOR ) AS SOMA" + ;
" FROM JPBANCARIO" + ;
" LEFT JOIN JPBACCUSTO ON JPBACCUSTO.CUCCUSTO = JPBANCARIO.BARESUMO" + ;
" WHERE Year( BADATEMI ) = " + NumberSQL( nAno ) + ;
" AND Month( BADATEMI ) = " + NumberSQL( nMes ) + ;
" AND JPBACCUSTO.CUGRUPO = " + StringSQL( cGrupo )
:Execute()
nTotal := :Number( "SOMA" )
:CloseRecordset()
ENDWITH
RETURN nTotal
STATIC FUNCTION SomaResumo( cResumo, nAno, nMes )
LOCAL nTotal
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "SELECT SUM( BAVALOR ) AS SOMA" + ;
" FROM JPBANCARIO" + ;
" WHERE BARESUMO = " + StringSQL( cResumo ) + ;
" AND Year( BADATEMI ) = " + NumberSQL( nAno ) + ;
" AND Month( BADATEMI ) = " + NumberSQL( nMes )
:Execute()
nTotal := :Number( "SOMA" )
:CloseRecordset()
ENDWITH
RETURN nTotal
STATIC FUNCTION PegaContas()
LOCAL aCCustoList := {}, cGrupo
LOCAL cnSQL := ADOClass():New( AppConexao() )
WITH OBJECT cnSQL
:cSQL := "SELECT CUGRUPO, CUCCUSTO FROM JPBACCUSTO ORDER BY CUGRUPO, CUCCUSTO"
:Execute()
DO WHILE ! :Eof()
AAdd( aCCustoList, { :String( "CUGRUPO" ), "", .T. } )
cGrupo = :String( "CUGRUPO" )
DO WHILE cGrupo == :String( "CUGRUPO" ) .AND. ! Eof()
AAdd( aCCustoList, { :String( "CUGRUPO" ), :String( "CUCCUSTO" ), .F. } )
:MoveNext()
ENDDO
ENDDO
:CloseRecordset()
ENDWITH
AAdd( aCCustoList, { ">ENTRADAS", "", .F. } )
AAdd( aCCustoList, { ">SAIDAS", "", .F. } )
RETURN aCCustoList
STATIC FUNCTION CCustoDetalhes( cGrupo, cCCusto, nMes, nAno )
LOCAL oTBrowse
LOCAL cnSQL := ADOClass():New( AppConexao() )
WSave()
Mensagem( "Aguarde, pesquisando movimentação..." )
Cls()
@ 2, 0 SAY "Grupo:" + cGrupo + iif( Empty( cCCusto ), "", ", CCusto:" + cCCusto ) + ;
", mes:" + StrZero( nMes, 2 ) + "/" + StrZero( nAno, 4 )
WITH OBJECT cnSQL
:cSQL := "SELECT JPBACCUSTO.CUGRUPO, IDBANCARIO, BACONTA, BARESUMO," + ;
" BADATBAN, BADATEMI, BAHIST, BAVALOR" + ;
" FROM JPBANCARIO" + ;
" LEFT JOIN JPBACCUSTO ON JPBACCUSTO.CUCCUSTO = JPBANCARIO.BARESUMO" + ;
" WHERE Year( BADATEMI ) = " + NumberSQL( nAno ) + ;
" AND Month( BADATEMI ) = " + NumberSQL( nMes ) + ;
" AND JPBACCUSTO.CUGRUPO = " + StringSQL( cGrupo )
IF ! Empty( cCCusto )
:cSQL += " AND BARESUMO = " + StringSQL( cCCusto )
ENDIF
:cSQL += " ORDER BY BACONTA, BADATBAN, BADATEMI, IDBANCARIO"
:Execute()
oTBrowse := { ;
{ "BANCO", { || iif( :Date( "BADATBAN" ) == Stod( "29991231" ), Space(8), :Date( "BADATBAN" ) ) } }, ;
{ "EMISSAO", { || :Date( "BADATEMI" ) } }, ;
{ "HISTORICO", { || :String( "BAHIST", 50 ) } }, ;
{ "VALOR", { || Transform( :Number( "BAVALOR" ), PicVal(14,2) ) } } }
BrowseADO( cnSQL, oTBrowse, "BAHIST", { || "" } )
:CloseRecordset()
ENDWITH
KEYBOARD ""
WRestore()
RETURN NIL
Aproveitei pra usar nomes melhores, dividir melhor, etc. etc.
Até eliminei o uso de variáveis PRIVATE, mas voltei atrás.
Também pensei em deixar as variáveis numa classe, pra simplificar, mas... dá no mesmo de variável PRIVATE, então ficou assim.