× Linguagem de Programação ADVPL

Perguntas Fluxo de Caixa Sintético e Analitico

Mais
10 anos 7 meses atrás #22152 por Djean
Caros estou desenvolvendo um fluxo de caixa sintético e analítico da movimentação bancaria por natureza, o mesmo está me trazendo a movimentação diária e os totalizadores por natureza mais não está puxando o saldo do banco da banco tabela SE8, conforme abaixo o explicação e fonte. Valeu galera, depois de concluído disponibilizo em downloands.

Saldo bancos (se8)+movimento bancário (entradas-saídas)=saldo atual bancos.

#include "rwmake.ch"

//************************************(IMPNAT)********* IMPR fluxo de caixa mod grafico.
User Function IMPNAT()
//**********************

cString :="SED"
cDesc1 :=OemToAnsi("Este programa tem como objetivo, emitir um relatorio de")
cDesc2 :=OemToAnsi("fluxo de caixa realizado.")
cDesc3 :=""
titulo :=SM0->M0_NOMECOM
tamanho :="M"
cPerg :="IMPNAT"
aReturn := { "Zebrado", 1, "Administracao" ,1,1,1,"",1 }
nomeprog :="IMPNAT"
aLinha := {}
nLastKey := 0
nLin := 1
cCancel :="**** CANCELADO PELO OPERADOR ****"
m_pag := 1 // Variavel que acumula numero da pagina.
n_col := 130
wnrel :="IMPNAT" // Nome Default deste Relatorio em disco.
linha := 90
cfilteruser :=areturn[7]

Private oFont, cCode
Private LinCab := 0
Private ntotGer:= 0
Private aOkImp := .f.
Private cPerg :="IMPNAT"
Private _Natureza :={} // Natureza
cOk := pergunte(cPerg,.T.)
If !cOk
Return(Nil)
Endif

_SaldoAnter:=0
_DataSaldo :=MV_PAR01-DAY(MV_PAR01) // DATA SALDO ANTERIOR (ULTIMO DIA DO MES ANTERIOR)
DBSELECTAREA("SE8") // PARA BUSCAR NO SE8 (SALDOS BANCARIOS)
DBSETORDER(1) // E8_BANCO+E8_AGENCIA+E8_CONTA+DTOS(E8_DTSALAT)
DBSEEK(xFilial("SE8")+"9999"+". "+". "+DTOS(_DataSaldo))
IF FOUND()
_SALDOANTER:=E8_SALATUA
ENDIF


nHeight:=15
lBold:= .F.
lUnderLine:= .F.
lPixel:= .T.
lPrint:=.F.
nSedex := 1

oFont := TFont():New( "Courier",,nHeight,,lBold,,,,,lUnderLine )
oFont1:= TFont():New( "Courier",,8,,,,,,,.f. )
oFont2:= TFont():New( "Courier",,8,,,,,,,.f. )
oFont3:= TFont():New( "Courier",,12,,,,,,,.f. )
oFont4:= TFont():New( "Courier",,14,,,,,,,.f. )
oFont5:= TFont():New( "Courier",,8,,,,,,,.f. )
oFont6:= TFont():New( "Courier",,8,,,,,,,.f. )
oFont7:= TFont():New( "Courier",,8,,,,,,)


oPrn := TMSPrinter():New()
oPrn:Setup()


npag := 0
linha := 3000

cabec1 :="FLUXO DE CAIXA REALIZADO POR NATUREZA"
//nLinha:=nLinha+1


DBSELECTAREA("SE7")
DBSETORDER(1)
DO CASE
CASE MONTH(MV_PAR01)==1
_VARPREV:="SE7->E7_VALJAN1"
CASE MONTH(MV_PAR01)==2
_VARPREV:="SE7->E7_VALFEV1"
CASE MONTH(MV_PAR01)==3
_VARPREV:="SE7->E7_VALMAR1"
CASE MONTH(MV_PAR01)==4
_VARPREV:="SE7->E7_VALABR1"
CASE MONTH(MV_PAR01)==5
_VARPREV:="SE7->E7_VALMAI1"
CASE MONTH(MV_PAR01)==6
_VARPREV:="SE7->E7_VALJUN1"
CASE MONTH(MV_PAR01)==7
_VARPREV:="SE7->E7_VALJUL1"
CASE MONTH(MV_PAR01)==8
_VARPREV:="SE7->E7_VALAGO1"
CASE MONTH(MV_PAR01)==9
_VARPREV:="SE7->E7_VALSET1"
CASE MONTH(MV_PAR01)==10
_VARPREV:="SE7->E7_VALOUT1"
CASE MONTH(MV_PAR01)==11
_VARPREV:="SE7->E7_VALNOV1"
CASE MONTH(MV_PAR01)==12
_VARPREV:="SE7->E7_VALDEZ1"
ENDCASE

DBSELECTAREA("SED")
DBSETORDER(1)
DBGOTOP()
WHILE !EOF()
IF (ED_ACUMULA+ED_REALDIA) > 0
IF RECLOCK("SED",.F.)
SED->ED_ACUMULA :=0 // ZERA CAMPOS NA TABELA DE NATUREZAS
SED->ED_REALDIA :=0
SED->ED_MESANT :=0
MSUNLOCK()
ELSE
ALERT("Tabela de naturezas em uso por outro usuario ...")
RETURN Nil
ENDIF
ENDIF
DBSKIP()
ENDDO

DBSELECTAREA("SE5")
DBSETORDER(1)
dDataIni:=(MV_PAR01-DAY(MV_PAR01))+1
DBSEEK(xFilial("SE5")+DTOS(dDataIni),.T.)
Processa( {|| fBuscMOV() } )
wnrel := SetPrint(cString,wnrel,cPerg,@titulo,cDesc1,cDesc2,cDesc3,.F.,"",.T.,"M","",.T.)
_TOTPRED:=0
_TOTPREA:=0
_TOTPRAN:=0
DBSELECTAREA("SED")
DBGOTOP()
_GRUPO :=1//Grupo de Receitas
_PREFIXO:=LEFT(ED_CODIGO,_Grupo)
_DESCRIC:=ALLTRIM(ED_DESCRIC)
WHILE !EOF()
IF ED_CODIGO>MV_PAR05 .OR. ED_CODIGO<MV_PAR04
DBSKIP()
LOOP
ENDIF

IF LINHA>2850
IF nPag>0
oPrn:EndPage()
ENDIF

Linha := 0
nPag := nPag +1

// oPrn:SayBitmap( Linha :=Linha+100,080,cBitMap,420,080 )
oPrn:Say( Linha,2090 ,"PAGINA: "+STRZERO(nPag,4,0), oFont1)
oPrn:Say( Linha:=Linha+50 , 080 ,cabec1, oFont4)
oPrn:Say( Linha:=Linha+50, 080 ,SM0->M0_NOMECOM+' '+"CNPJ: "+TransForm(SM0->M0_CGC,'@R 99.999.999/9999-99'), oFont3)
oPrn:Say( Linha:=Linha+50,1930 , "DATA REF.: "+DTOC(MV_PAR01), oFont1)


IF nPag==1
LINHA:=LINHA+ 100
oPrn:Box( Linha,40,Linha+80,2350)
oPrn:Say( Linha:=Linha+20,060,"NATUREZA DATA", oFont1)
oPrn:Say( Linha,900," MOVIMENTO DIA ACUMULADO MÊS", oFont1)
oPrn:Say( Linha:=Linha+60,250 , "SALDO ANTERIOR ", oFont1)
oPrn:Say( Linha,1980 ,TRANSFORM(_SaldoAnter,"@E 9,999,999.99"), oFont1)
Linha:=Linha+20
_SALDOATU:=_SaldoAnter

ENDIF
LINHA:=LINHA+40
ENDIF

// IF LEFT(SED->ED_CODIGO,1)$"1-2"
IF LEFT(SED->ED_CODIGO,1) $ "1"
_GRUPO:=1 // Grupo de Naturezas Receita
ELSE
_GRUPO:=2 // Grupo de Naturezas Despesa
ENDIF
IF LEFT(ED_CODIGO,_GRUPO)<>_Prefixo
IF (_TOTPRED+_TOTPREA+_TOTPRAN) <> 0
oPrn:Say( Linha ,250 , "TOTAL "+_DESCRIC, oFont2)
// oPrn:Say( Linha, 880 ,TRANSFORM(_TOTPRED,"@E 9,999,999.99"), oFont2)
oPrn:Say( Linha,1980 ,TRANSFORM(_TOTPREA,"@E 9,999,999.99"), oFont2)//Totais de entrada
// oPrn:Say( Linha,1460 ,TRANSFORM(_TOTPRAN,"@E 9,999,999.99"), oFont2)
// oPrn:Say( Linha,1833 ,TRANSFORM(_PREVISTO ,"@E 9,999,999.99"), oFont7)
// oPrn:Say( Linha,2160,TRANSFORM(((ED_ACUMULA*100)/_PREVISTO) ,"9999.99%"), oFont7)

LINHA :=LINHA+45
oPrn:line(linha,050,Linha,2350)
LINHA :=LINHA+45
ENDIF
_TOTPRED :=0
_TOTPREA :=0
_TOTPRAN :=0
_PREFIXO :=LEFT(ED_CODIGO,_GRUPO)
_DESCRIC:=ALLTRIM(ED_DESCRIC)
ENDIF
IF ED_CLASSE<>"A" .AND. MV_PAR02==1 .AND. (ED_REALDIA+ED_ACUMULA)==0
SED->(DBSKIP())
Loop
ENDIF
IF ED_CLASSE<>"A" .AND. MV_PAR02==2 .AND. (ED_REALDIA+ED_ACUMULA)==0
SED->(DBSKIP())
Loop
ENDIF
IF SE7->(DbSeek(xFilial("SE7")+SED->ED_CODIGO+STRZERO(YEAR(MV_PAR01),4,0)))
_PREVISTO:=&_VARPREV
ELSE
_PREVISTO:=0
ENDIF

oPrn:Say( Linha ,050 , ED_CODIGO , oFont7)
oPrn:Say( Linha ,250 ,TRANSFORM(LEFT(ED_DESCRIC,30),"@!"), oFont7)
IF SED->ED_CLASSE=="A" // IMPRIME SOMENTE VALORES DAS ANALITICAS


// oPrn:Say( Linha,0880 ,TRANSFORM(ED_REALDIA,"@E 9,999,999.99"), oFont7)
oPrn:Say( Linha,1980 ,TRANSFORM(ED_ACUMULA,"@E 9,999,999.99"), oFont7)
// oPrn:Say( Linha,1460 ,TRANSFORM(_TOTPRAN,"@E 9,999,999.99"), oFont2)
// oPrn:Say( Linha,1460 ,TRANSFORM(_TOTPRAN,"@E 9,999,999.99"), oFont2)
// oPrn:Say( Linha,1833 ,TRANSFORM(_PREVISTO ,"@E 9,999,999.99"), oFont7)
// oPrn:Say( Linha,2160,TRANSFORM(((ED_ACUMULA*100)/_PREVISTO) ,"9999.99%"), oFont7)
ENDIF
LINHA :=LINHA+40
if mv_par03=2
item:=1
do while item<=len(_Natureza)
if substr(_natureza[item],1,10)=sed->ed_codigo
oPrn:Say( Linha ,250 ,SUBSTR(_natureza[item],12,(LEN(_natureza[item])-11)), oFont2)
LINHA :=LINHA+40
endif
item++
enddo
oPrn:line( Linha,050,Linha,2300)
LINHA :=LINHA+40
endif

_TOTPRED :=_TOTPRED + ED_REALDIA
_TOTPREA :=_TOTPREA + ED_ACUMULA // TOTAL DO PREFIXO
_TOTPRAN :=_TOTPRAN + ED_MESANT//mudei

IF _Prefixo=="1"
_SALDOATU:=_SALDOATU+ED_ACUMULA // RECEITAS (1)
ELSE
_SALDOATU:=_SALDOATU-ED_ACUMULA // DESPESAS (2)
ENDIF

DBSKIP()

ENDDO

oPrn:Say( Linha ,250 , "TOTAL "+_DESCRIC, oFont2)
//oPrn:Say( Linha, 1460 ,TRANSFORM(_TOTPRED,"@E 9,999,999.99"), oFont2)
oPrn:Say( Linha,1980 ,TRANSFORM(_TOTPREA,"@E 9,999,999.99"), oFont2)
//oPrn:Say( Linha,1460 ,TRANSFORM(_TOTPRAN,"@E 9,999,999.99"), oFont2)
//oPrn:Say( Linha,1833 ,TRANSFORM(_PREVISTO ,"@E 9,999,999.99"), oFont7)

LINHA :=LINHA+60

oPrn:line( Linha:=Linha+ 60,050,Linha,2300)
LINHA:=LINHA+ 60
oPrn:Say( Linha ,250 , "SALDO ATUAL ", oFont2)
oPrn:Say( Linha,1970 ,TRANSFORM(_SALDOATU,"@E 9,999,999.99"), oFont2)
Dbselectarea("SED")
DBSETORDER(1)
oPrn:Preview()
MS_FLUSH()
oPrn:EndPage()
Return(nil)

//******************
STATIC FUNCTION FBUSCMOV() // ATUALIZA REALIZADO NO SED- CAD NATUREZAS
//******************
PROCREGUA(RECCOUNT())
_cAtual:=recno()

WHILE !EOF() .AND. E5_DATA<=MV_PAR01
IF !E5_SITUACA=="C" .AND. !E5_TIPODOC $ "ES%EC%DC%BA%CP%TR%" // NAO CONSIDERA CHEQUE%CHCANCELADO%DESCPGTIT"
// IF !E5_SITUACA=="C" .AND. !E5_TIPODOC $ "EC%DC%CH" // NAO CONSIDERA CHEQUE%CHCANCELADO%DESCPGTIT"
INCPROC('Atualizando Natureza ')
DBSELECTAREA("SED")
DBSEEK(xFilial("SED")+SE5->E5_NATUREZ)
IF FOUND()
IF SED->ED_CLASSE=="A"
IF RECLOCK("SED",.F.)
IF SE5->E5_TIPODOC=="ES" // ESTORNO SUBTRAI
SED->ED_ACUMULA:=SED->ED_ACUMULA-SE5->E5_VALOR
IF SE5->E5_DATA==MV_PAR01
SED->ED_REALDIA:=SED->ED_REALDIA-SE5->E5_VALOR
ENDIF
aadd(_Natureza,se5->e5_naturez+' '+dtoc(se5->e5_data)+' '+se5->e5_histor+'-'+se5->e5_benef+' '+TRANSFORM(se5->e5_valor,"@E 9,999,999.99"), oFont7)
ELSE // SOMA NO ACUMULADO
SED->ED_ACUMULA:=SED->ED_ACUMULA+SE5->E5_VALOR
IF SE5->E5_DATA==MV_PAR01
SED->ED_REALDIA:=SED->ED_REALDIA+SE5->E5_VALOR
ENDIF
aadd(_Natureza,se5->e5_naturez+' '+dtoc(se5->e5_data)+' '+se5->e5_histor+'-'+se5->e5_benef+' '+TRANSFORM(se5->e5_valor,"@E 9,999,999.99"), oFont7)
ENDIF
ENDIF
MSUNLOCK()
ENDIF
ELSE
ALERT("Natureza "+SE5->E5_NATUREZ+" nao cadastrada na tabela SED "+ "DATA:" + DTOS(SE5->E5_DATA))
ENDIF
DBSELECTAREA("SE5")
ENDIF
SE5->(DBSKIP())
ENDDO

Data_ant:=dDataini-1
Dtini_ant:=(Data_ant-DAY(Data_ant))+1
DBSEEK(xFilial("SE5")+DTOS(Dtini_ant),.T.)

WHILE !EOF() .AND. E5_DATA<=Data_ant
IF !E5_SITUACA=="C" .AND. !E5_TIPODOC $ "ES%EC%DC%BA%CP%TR%" // NAO CONSIDERA CHEQUE%CHCANCELADO%DESCPGTIT"
INCPROC('Atualizando Natureza')
DBSELECTAREA("SED")
DBSEEK(xFilial("SED")+SE5->E5_NATUREZ)
IF FOUND()
IF SED->ED_CLASSE=="A"
IF RECLOCK("SED",.F.)
IF SE5->E5_TIPODOC<>"ES" // EXTORNO SUBTRAI
SED->ED_MESANT:=SED->ED_MESANT-SE5->E5_VALOR
ELSE // SOMA NO ACUMULADO
SED->ED_MESANT:=SED->ED_MESANT+SE5->E5_VALOR
ENDIF
ENDIF
MSUNLOCK()
ENDIF
ELSE
ALERT("Natureza "+SE5->E5_NATUREZ+" nao cadastrada na tabela SED"+ " DATA: " + DTOS(SE5->E5_DATA))
ENDIF
DBSELECTAREA("SE5")
ENDIF
SE5->(DBSKIP())
ENDDO

RETURN Nil

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 7 meses atrás #22155 por Djean
Respondido por Djean no tópico Fluxo de Caixa Sintético e Analitico
Segue tela do relatório.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.082 segundos
Joomla templates by a4joomla