× Linguagem de Programação ADVPL

Perguntas Melhorar otimizar fonte, logica errada?

Mais
11 anos 2 meses atrás #10725 por paulobeto
Boa tarde!

Pessoal estou precisando de uma ajuda neste fonte que esta no anexo. Preciso melhorar a logica do programa, optimizando o processo da rotina em si. já fiz algumas alterações mas ainda continua lento o programa. Este fonte faz a importação de registro de uma tabela temporária (SZ0) para contabilidade(CT2) gerando o debito e credito. alguem pode dar alguma opnião?

Agradeço desde ja.

O local onde esta o erro de logica acredito que seja na parte de vermelho.

User Function Rctbi001_CT2()
Local cQuery, cCursor := 'TRB2', cArquivo := ""
Local _nLancamento, _nSequencia, _nValar, _nLancAnt
Local _dData, _xnTotDoc, _id_nf
Local _cParam, _cContaDeb, _cContaCre, _cHist, _cCcDeb, _cCcCre, _cLote, _cCompQ, _cUser
Local _aParam := {}

//Prepare Environment Empresa '02' Filial "53" Modulo "CTB" Tables 'CT2','SX2','SX5','SX6' //HCN

lMsErroAuto := .F.

//putMV("MV_PRELAN","N")
putMV("MV_CONTSB","S")
//putMV("MV_ATUSAL","N")

if ((SM0->M0_CODIGO)="01")
_cCompQ := "id_emp < 50 "
//_empresas := " 4, 6, 9, 14, 16, 17, 18, 19, 20"
elseif ((SM0->M0_CODIGO)="02")
_cCompQ := "id_emp >= 50 and id_emp < 100"
//_empresas := " 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62"
elseif ((SM0->M0_CODIGO)="05")
_cCompQ := "id_emp >= 100 and id_emp < 200"
//_empresas := "101, 102, 103, 104, 105, 108, 109, 111, 157, 183, 187, 189"
elseif ((SM0->M0_CODIGO)="04")
_cCompQ := "id_emp >= 200 and id_emp < 300"
//_empresas := "201"
elseif ((SM0->M0_CODIGO)="06")
_cCompQ := "id_emp >= 300 and id_emp < 400"
//_empresas := "301"
else
_cCompQ := ""
//_empresas := "0"
endif

cQuery := "select id_lancamento, id_sequencia, parametros, id_nf"
cQuery += " from lancamento_contabil "
cQuery += " where " + _cCompQ
cQuery += " and status = 'N' "
cQuery += " order by dt_referencia, id_lancamento"
dbUseArea(.T.,"TOPCONN", TcGenQry(,,cQuery),cCursor,.T.,.T.)

DbGoTop()
Do While !Eof()
_nLancamento :=(cCursor)->(id_lancamento)
_nSequencia :=(cCursor)->(id_sequencia)
_id_nf :=Str((cCursor)->(id_nf))

_cParam := (cCursor)->(parametros)
_aParam := split( _cParam,';' )
_dData := Ctod(_aParam[3]) // Data do lancamento
_cContaDeb := Substr(_aParam[4],1,15) // Conta Contabil Debito
_cContaCre := Substr(_aParam[5],1,15) // Conta Contabil Credito
_nValar := Val(_aParam[6]) // Valor Contabil
_cHist := Substr(_aParam[7],1,80) // Historico
_cCcDeb := Substr(_aParam[8],1,9) // Centro de Custo de Debito
_cCcCre := Substr(_aParam[9],1,9) // Centro de Custo de Credito
_cLote := Substr(_aParam[10],1,6) // Tabelas Genericas: Tabela 00; Chave 09; Descricao Lotes Contabilidade
// Alterar o tamanho do campo lote
// na tabela SZ0 de 3 para 6
RecLock("SZ0",.T.)
SZ0->Z0_Data := _dData
SZ0->Z0_ConDeb := _cContaDeb
SZ0->Z0_ConCre := _cContaCre
SZ0->Z0_Valor := _nValar
SZ0->Z0_Hist := _cHist
SZ0->Z0_CcDeb := _cCcDeb
SZ0->Z0_CcCre := _cCcCre
SZ0->Z0_Lote := _cLote
SZ0->Z0_Id_Lanc := _nLancamento
MsUnLock()

//dbSelectArea(cCursor)
dbSkip()
enddo

TCSQLExec("alter session set NLS_DATE_FORMAT='dd/mm/yyyy'")
cQuery := " update lancamento_contabil "
cQuery += " set status = 'I', dt_interfac = '" + dtoc(date()) + "'"
cQuery += " where " + _cCompQ
cQuery += " and status = 'N' "
TCSQLExec(cQuery)

//dbSelectArea(cCursor)
dbCloseArea()

dbSelectArea("SZ0")
dbGoTop()

_nLancAnt := 0
_cUser := Substr(cUsuario,7,6)

While (!Eof())
If !(deleted())
If (SZ0->Z0_Id_Lanc <> _nLancAnt)
xnHdlPrv := HeadProva(_cLote,"Rctbi001",_cUser,@cArquivo)
EndIf

If (Empty(SZ0->Z0_ConDeb))
cPadrao := "400" // Lancamento em partida simples a credito
ElseIf (Empty(SZ0->Z0_ConCre))
cPadrao := "300" // Lancamento em partida simples a debito
Else
cPadrao := "200" // Lancamento em partida dobrada
Endif
//lPadrao := VerPadrao(cPadrao)

_nLancAnt := SZ0->Z0_Id_Lanc
dbSkip()

If (SZ0->Z0_Id_Lanc <> _nLancAnt)
dbSkip(-1)
_xnTotDoc := DetProva(xnHdlPrv,cPadrao,"Rctbi001",SZ0->Z0_Lote)
RodaProva(xnHdlPrv,_xnTotDoc)
cA100Incl(cArquivo,xnHdlPrv,3,SZ0->Z0_Lote, .F., .F. , .T.,SZ0->Z0_Data)
dbSkip()
Else
dbSkip(-1)
_xnTotDoc := DetProva(xnHdlPrv,cPadrao,"Rctbi001",SZ0->Z0_Lote)
dbSkip()
Endif

Else
_nLancAnt := SZ0->Z0_Id_Lanc
dbSkip()
EndIf
EndDo


SZ0->( dbGoTop() )
Do While !SZ0->( Eof() )
recLock("SZ0",.F.)
SZ0->( dbDelete() )
SZ0->( dbSkip() )
MsUnLock()
EndDo

//putMV("MV_PRELAN","N")
putMV("MV_CONTSB","N")
//putMV("MV_ATUSAL","S")

If Select("SX6") == 0
RESET ENVIRONMENT
EndIf

//Reset environment

Return

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 2 meses atrás #10726 por paulobeto
Segue o fonte anexado!

Arquivo Anexo:

Nome do Arquivo: Rctbi001_CT2.rar
Tamanho do Arquivo:2 KB
Anexos:

Por favor Acessar ou Registrar para participar da conversa.

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