- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Fórmula da função SaldoSB2()
×
Linguagem de Programação ADVPL
Perguntas Fórmula da função SaldoSB2()
- marcio@rrparticipacoes.com.br
- Autor do Tópico
- Visitante
11 anos 1 mês atrás #17400
por marcio@rrparticipacoes.com.br
Fórmula da função SaldoSB2() foi criado por marcio@rrparticipacoes.com.br
Alguém sabe a fórmula utilizada ou tem o código da função SaldoSB2()?
Estou desenvolvendo uma view e preciso deste dado..
Estou desenvolvendo uma view e preciso deste dado..
Por favor Acessar ou Registrar para participar da conversa.
- admin
- Desconectado
- Administrador
Menos
Mais
- Postagens: 216
- Obrigados Recebidos: 0
11 anos 1 mês atrás #17402
por admin
Respondido por admin no tópico Fórmula da função SaldoSB2()
o SaldoSB2() que calcula o saldo atual do produto, levando em consideração os empenhos, reservas, etc.
Sintaxe:
nSaldo := SaldoSB2() // nSaldo recebe o saldo disponível
Exemplo:
(…)
dbSelectArea(“SB2″)
dbSeek(xFilial(“SB2″) + SB1->B1_COD + SB1->B1_LOCPAD)
nSaldo := Transform(SaldoSb2(),”@E 9,999,999.99″)
(…)
Sintaxe:
nSaldo := SaldoSB2() // nSaldo recebe o saldo disponível
Exemplo:
(…)
dbSelectArea(“SB2″)
dbSeek(xFilial(“SB2″) + SB1->B1_COD + SB1->B1_LOCPAD)
nSaldo := Transform(SaldoSb2(),”@E 9,999,999.99″)
(…)
Por favor Acessar ou Registrar para participar da conversa.
- marcio@rrparticipacoes.com.br
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 2
- Obrigados Recebidos: 0
11 anos 1 mês atrás #17405
por marcio@rrparticipacoes.com.br
Respondido por marcio@rrparticipacoes.com.br no tópico Fórmula da função SaldoSB2()
Pois é amigo, essa informação eu já tinha visto em outros sites, mas ela não ajuda muito porque é apenas uma breve descrição do que a função faz e um exemplo de utilização.
Como disse na postagem, gostaria de saber a fórmula que a função utiliza para calcular o saldo, mas pelo que estou vendo não está fácil e o jeito vai ser criar uma rotina em advpl para ser executada e gravar os saldos em uma tabela temporária.
Como disse na postagem, gostaria de saber a fórmula que a função utiliza para calcular o saldo, mas pelo que estou vendo não está fácil e o jeito vai ser criar uma rotina em advpl para ser executada e gravar os saldos em uma tabela temporária.
Por favor Acessar ou Registrar para participar da conversa.
- lalberto
- Desconectado
- Administrador
Menos
Mais
- Postagens: 3676
- Obrigados Recebidos: 6
11 anos 1 mês atrás #17408
por lalberto
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
Respondido por lalberto no tópico Fórmula da função SaldoSB2()
/*
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡…o ³ SaldoSB2 ³ Autor ³ Eveli Morasco ³ Data ³ 15/04/92 ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡…o ³ Calcula o saldo do arquivo SB2 ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Sintaxe ³ ExpN1 := SaldoSB2(ExpL1,ExpL2,ExpD1,ExpL3,ExpN1) ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ExpN1 = Saldo devolvido pela funcao ³±±
±±³ ³ ExpL1 = Flag que indica se chamada da funcao ‚ utilizada p/³±±
±±³ ³ calculo de necessidade. Caso .T. deve considerar quantidade³±±
±±³ ³ a distribuir, pois a mesma apenas nao pode ser utilizada, ³±±
±±³ ³ porem ja esta em estoque. ³±±
±±³ ³ ExpL2 = Flag que indica se deve substrair o empenho do ³±±
±±³ ³ saldo a ser retornado. ³±±
±±³ ³ ExpD1 = Data final para filtragem de empenhos. Empenhos ate³±±
±±³ ³ esta data serao considerados no caso de leitura do SD4. ³±±
±±³ ³ ExpL3 = Flag que indica se deve considerar o saldo de terc ³±±
±±³ ³ eiros em nosso poder ou nao (B2_QTNP). ³±±
±±³ ³ ExpL4 = Flag que indica se deve considerar nosso saldo em ³±±
±±³ ³ poder de terceiros ou nao (B2_QNPT). ³±±
±±³ ³ ExpN1 = Qtd empenhada para esse movimento que nao deve ser ³±±
±±³ ³ subtraida ³±±
±±³ ³ ExpN2 = Qtd empenhada do Projeto para esse movimento que ³±±
±±³ ³ nao deve ser subtraida ³±±
±±³ ³ ExpL5 = Subtrai a Reserva do Saldo a ser Retornado? ³±±
±±³ ³ ExpD2 = Data limite para composicao do saldo MV_TPSALDO="C"³±±
±±³ ³ ExpL6 = Subtrai a Quantidade Prevista no SA a ser Retornado³±±
±±³ ³ Obs.: Somente funciona se o MV_TPSALDO for "C" ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³ Uso ³ Generico ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*/
Function SaldoSB2(lNecessidade,lEmpenho,dDataFim,lConsTerc,lConsNPT,cAliasSB2,nQtdEmp,nQtdPrj,lSaldoSemR,dDtRefSld,lConsEmpSA)
Local aAreaAnt := GetArea()
Local aAreaSC2 := SC2->(GetArea())
Local aAreaSD4 := SD4->(GetArea())
Local aAreaSDC := SDC->(GetArea())
Local cSeekSDC := ""
Local cComparaSDC:= ""
Local nEmpenho := 0
Local nEmpProj := 0
Local nEmpenhoD4 := 0
Local nScanSD4 := 0
Local nRet := 0
Local lProcessD4 := .T.
Local lEmpPrj := .F.
Local lRastro := .F.
Local lLocaliza := .F.
Local lSaldoMov := .F.
Local lCondEmp := .F.
Local lQEmpNF := GetNewPar("MV_QEMPNF",.F.) //Considera o campo B2_QEMPN no calculo do Saldo
Local lAtuSGJ := SuperGetMV("MV_PVCOMOP",.F.,.F.) .And. FindFunction("ALIASINDIC") .And. AliasIndic("SGJ")
Default cAliasSB2 := "SB2"
Default lNecessidade := .F.
Default lEmpenho := .T.
Default lConsTerc := .T.
Default lConsNPT := .F.
Default lSaldoSemR := .T.
Default lConsEmpSA := .T.
Default nQtdEmp := 0
Default nQtdPrj := 0
If lAtuSGJ
lQEmpNF := .F.
Endif
lEmpPrj := ( nQtdPrj > 0 )
lSaldoMov := ( Valtype(dDtRefSld)=="D" .And. GetMV("MV_TPSALDO")=="C" )
lCondEmp := ( ValType(dDataFim) =="D" .And. GetMV("MV_CONDEMP")=="S" )
lLocaliza := Localiza((cAliasSB2)->B2_COD)
lRastro := Rastro((cAliasSB2)->B2_COD)
If (cAliasSB2)->B2_STATUS <> "2"
nEmpenho := (cAliasSB2)->(B2_QEMP)
nEmpProj := (cAliasSB2)->(B2_QEMPPRJ)
nEmpenhoD4 :=0
#IFDEF TOP
If !lEmpPrj .And. lEmpenho .And. ( lSaldoMov .Or. lCondEmp )
lQuery := .T.
cAliasSD4 := GetNextAlias()
aStructSD4 := SD4->( dbStruct() )
cQuery := "SELECT D4_FILIAL,D4_COD,D4_LOCAL,D4_DATA,D4_QUANT,D4_OP,D4_LOTECTL,D4_NUMLOTE,D4_TRT "
cQuery += "FROM " + RetSqlName("SD4") + " SD4," + RetSqlName("SC2") + " SC2 "
cQuery += "WHERE "
cQuery += "SD4.D4_FILIAL ='" + xFilial("SD4") + "' AND "
cQuery += "SD4.D4_COD ='" + (cAliasSB2)->B2_COD + "' AND "
cQuery += "SD4.D4_LOCAL ='" + (cAliasSB2)->B2_LOCAL + "' AND "
cQuery += "SD4.D4_DATA <='" + IIf(lSaldoMov,DTOS(dDtRefSld),DTOS(dDataFim)) + "' AND "
cQuery += "SD4.D4_QUANT > 0 AND "
cQuery += "SD4.D_E_L_E_T_ = ' ' AND "
cQuery += "SD4.D4_OP = SC2.C2_NUM||SC2.C2_ITEM||SC2.C2_SEQUEN AND "
cQuery += "SC2.C2_FILIAL='" + xFilial("SC2") + "' AND "
cQuery += "SC2.C2_TPOP IN (' ','F') AND "
cQuery += "SC2.D_E_L_E_T_ = ' '"
cQuery := ChangeQuery( cQuery )
dbUseArea( .T., "TOPCONN", TcGenQry( ,,cQuery ), cAliasSD4, .F., .T. )
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Ajusta campos data e numericos |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If !Empty( nScanSD4 := AScan( aStructSD4, { |x| x[1] == "D4_QUANT" } ) )
TcSetField( cAliasSD4, aStructSD4[nScanSD4,1],aStructSD4[nScanSD4,2],aStructSD4[nScanSD4,3],aStructSD4[nScanSD4,4] )
EndIf
If !Empty( nScanSD4 := AScan( aStructSD4, { |x| x[1] == "D4_DATA" } ) )
TcSetField( cAliasSD4, aStructSD4[nScanSD4,1],aStructSD4[nScanSD4,2],aStructSD4[nScanSD4,3],aStructSD4[nScanSD4,4] )
EndIf
While !Eof()
// Se existe algum empenho com lote preenchido, assume empenho do SB2
// pois os saldos dos lotes ja estao comprometidos com a colocacao
// do empenho
If lRastro .And. !Empty(D4_LOTECTL+D4_NUMLOTE)
lProcessD4:=.F.
EndIf
// Se existe algum empenho com localizacao, assume empenho do SB2
// pois os saldos das localizacoes ja estao comprometidos com a colocacao
// do empenho
If lProcessD4 .And. lLocaliza
cSeekSDC :=xFilial("SDC")+(cAliasSD4)->(D4_COD+D4_LOCAL+D4_OP+D4_TRT)
cComparaSDC:="DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT"
dbSelectArea("SDC")
dbSeek(cSeekSDC)
While lProcessD4 .And. !Eof() .And. cSeekSDC == &(cComparaSDC)
If QtdComp(DC_QUANT) > QtdComp(0)
lProcessD4:=.F.
Exit
EndIf
dbSkip()
End
EndIf
dbSelectArea(cAliasSD4)
// Soma quantidade do empenho
nEmpenhoD4+=(cAliasSD4)->D4_QUANT
dbSkip()
End
If lProcessD4
nEmpenho:=nEmpenhoD4
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Fecha a area de trabalho da query |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
(cAliasSD4)->(dbcloseArea())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Restaura Tabelas |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RestArea(aAreaSC2)
RestArea(aAreaSD4)
RestArea(aAreaSDC)
EndIf
#ELSE
If !lEmpPrj .And. lEmpenho .And. ( lSaldoMov .Or. lCondEmp )
// Varre empenhos ate a data estipulada
dbSelectArea("SC2")
dbSetOrder(1)
dbSelectArea("SDC")
dbSetOrder(2)
dbSelectArea("SD4")
dbSetOrder(3)
dbSeek(xFilial()+(cAliasSB2)->B2_COD+(cAliasSB2)->B2_LOCAL)
While lProcessD4 .And. !Eof() .And. D4_FILIAL+D4_COD+D4_LOCAL == xFilial()+(cAliasSB2)->B2_COD+(cAliasSB2)->B2_LOCAL
// Se existe algum empenho com lote preenchido, assume empenho do SB2
// pois os saldos dos lotes ja estao comprometidos com a colocacao
// do empenho
If lRastro .And. !Empty(D4_LOTECTL+D4_NUMLOTE)
lProcessD4:=.F.
EndIf
// Se existe algum empenho com localizacao, assume empenho do SB2
// pois os saldos das localizacoes ja estao comprometidos com a colocacao
// do empenho
If lProcessD4 .And. lLocaliza
cSeekSDC:=xFilial("SDC")+SD4->D4_COD+SD4->D4_LOCAL+SD4->D4_OP+SD4->D4_TRT
cComparaSDC:="DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT"
dbSelectArea("SDC")
dbSeek(cSeekSDC)
While lProcessD4 .And. !Eof() .And. cSeekSDC == &(cComparaSDC)
If QtdComp(DC_QUANT) > QtdComp(0)
lProcessD4:=.F.
Exit
EndIf
dbSkip()
End
EndIf
dbSelectArea("SD4")
// Soma quantidade do empenho
If QtdComp(D4_QUANT) > QtdComp(0) .And. D4_DATA <= IIf(lSaldoMov,dDtRefSld,dDataFim) .And. ;
SC2->(dbSeek(xFilial("SC2")+SD4->D4_OP)) .And. SC2->C2_TPOP $ " F"
nEmpenhoD4+=D4_QUANT
EndIf
dbSkip()
End
If lProcessD4
nEmpenho:=nEmpenhoD4
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Restaura Tabelas |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RestArea(aAreaSC2)
RestArea(aAreaSD4)
RestArea(aAreaSDC)
EndIf
#ENDIF
// Caso baixe empenho nao subtrai a qtd empenhada para esse item
If !lEmpPrj
nEmpenho-=nQtdEmp
nEmpenho:=Max(nEmpenho,0)
Else
nEmpProj-=nQtdPrj
nEmpProj:=Max(nEmpProj,0)
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Calculo do saldo Disponivel ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lSaldoMov
// Calcula saldo ate o momento da data de referencia - MV_TPSALDO = 'C'
nRet:=QtdComp( CalcEst((cAliasSB2)->B2_COD,(cAliasSB2)->B2_LOCAL,dDtRefSld+1)[1] - If(lSaldoSemR,(cAliasSB2)->B2_RESERVA,0) - If(lEmpenho,nEmpenho,0) - If(lNecessidade,0,(cAliasSB2)->B2_QACLASS) - Iif(lConsEmpSA,(cAliasSB2)->B2_QEMPSA,0) - If(lEmpenho,nEmpProj,0) - AvalQtdPre("SB2",1) - If(lConsTerc,0,(cAliasSB2)->B2_QTNP) - If(lQEmpNF,If(lSaldoSemR,(cAliasSB2)->B2_QEMPN,0),0) + If(lConsNPT,(cAliasSB2)->B2_QNPT,0) )
Else
// Calcula saldo da posicao atual - MV_TPSALDO = 'S'
nRet:=QtdComp((cAliasSB2)->B2_QATU - If(lSaldoSemR,(cAliasSB2)->B2_RESERVA,0) - If(lEmpenho,nEmpenho,0) - If(lNecessidade,0,(cAliasSB2)->B2_QACLASS) - (cAliasSB2)->B2_QEMPSA - If(lEmpenho,nEmpProj,0) - AvalQtdPre("SB2",1) - If(lConsTerc,0,(cAliasSB2)->B2_QTNP) - If(lQEmpNF,If(lSaldoSemR,(cAliasSB2)->B2_QEMPN,0),0) + If(lConsNPT,(cAliasSB2)->B2_QNPT,0) )
EndIf
RestArea(aAreaAnt)
EndIf
Return nRet
ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
±±ÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ¿±±
±±³Fun‡…o ³ SaldoSB2 ³ Autor ³ Eveli Morasco ³ Data ³ 15/04/92 ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄ´±±
±±³Descri‡…o ³ Calcula o saldo do arquivo SB2 ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Sintaxe ³ ExpN1 := SaldoSB2(ExpL1,ExpL2,ExpD1,ExpL3,ExpN1) ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³Parametros³ ExpN1 = Saldo devolvido pela funcao ³±±
±±³ ³ ExpL1 = Flag que indica se chamada da funcao ‚ utilizada p/³±±
±±³ ³ calculo de necessidade. Caso .T. deve considerar quantidade³±±
±±³ ³ a distribuir, pois a mesma apenas nao pode ser utilizada, ³±±
±±³ ³ porem ja esta em estoque. ³±±
±±³ ³ ExpL2 = Flag que indica se deve substrair o empenho do ³±±
±±³ ³ saldo a ser retornado. ³±±
±±³ ³ ExpD1 = Data final para filtragem de empenhos. Empenhos ate³±±
±±³ ³ esta data serao considerados no caso de leitura do SD4. ³±±
±±³ ³ ExpL3 = Flag que indica se deve considerar o saldo de terc ³±±
±±³ ³ eiros em nosso poder ou nao (B2_QTNP). ³±±
±±³ ³ ExpL4 = Flag que indica se deve considerar nosso saldo em ³±±
±±³ ³ poder de terceiros ou nao (B2_QNPT). ³±±
±±³ ³ ExpN1 = Qtd empenhada para esse movimento que nao deve ser ³±±
±±³ ³ subtraida ³±±
±±³ ³ ExpN2 = Qtd empenhada do Projeto para esse movimento que ³±±
±±³ ³ nao deve ser subtraida ³±±
±±³ ³ ExpL5 = Subtrai a Reserva do Saldo a ser Retornado? ³±±
±±³ ³ ExpD2 = Data limite para composicao do saldo MV_TPSALDO="C"³±±
±±³ ³ ExpL6 = Subtrai a Quantidade Prevista no SA a ser Retornado³±±
±±³ ³ Obs.: Somente funciona se o MV_TPSALDO for "C" ³±±
±±ÃÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´±±
±±³ Uso ³ Generico ³±±
±±ÀÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ±±
±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*/
Function SaldoSB2(lNecessidade,lEmpenho,dDataFim,lConsTerc,lConsNPT,cAliasSB2,nQtdEmp,nQtdPrj,lSaldoSemR,dDtRefSld,lConsEmpSA)
Local aAreaAnt := GetArea()
Local aAreaSC2 := SC2->(GetArea())
Local aAreaSD4 := SD4->(GetArea())
Local aAreaSDC := SDC->(GetArea())
Local cSeekSDC := ""
Local cComparaSDC:= ""
Local nEmpenho := 0
Local nEmpProj := 0
Local nEmpenhoD4 := 0
Local nScanSD4 := 0
Local nRet := 0
Local lProcessD4 := .T.
Local lEmpPrj := .F.
Local lRastro := .F.
Local lLocaliza := .F.
Local lSaldoMov := .F.
Local lCondEmp := .F.
Local lQEmpNF := GetNewPar("MV_QEMPNF",.F.) //Considera o campo B2_QEMPN no calculo do Saldo
Local lAtuSGJ := SuperGetMV("MV_PVCOMOP",.F.,.F.) .And. FindFunction("ALIASINDIC") .And. AliasIndic("SGJ")
Default cAliasSB2 := "SB2"
Default lNecessidade := .F.
Default lEmpenho := .T.
Default lConsTerc := .T.
Default lConsNPT := .F.
Default lSaldoSemR := .T.
Default lConsEmpSA := .T.
Default nQtdEmp := 0
Default nQtdPrj := 0
If lAtuSGJ
lQEmpNF := .F.
Endif
lEmpPrj := ( nQtdPrj > 0 )
lSaldoMov := ( Valtype(dDtRefSld)=="D" .And. GetMV("MV_TPSALDO")=="C" )
lCondEmp := ( ValType(dDataFim) =="D" .And. GetMV("MV_CONDEMP")=="S" )
lLocaliza := Localiza((cAliasSB2)->B2_COD)
lRastro := Rastro((cAliasSB2)->B2_COD)
If (cAliasSB2)->B2_STATUS <> "2"
nEmpenho := (cAliasSB2)->(B2_QEMP)
nEmpProj := (cAliasSB2)->(B2_QEMPPRJ)
nEmpenhoD4 :=0
#IFDEF TOP
If !lEmpPrj .And. lEmpenho .And. ( lSaldoMov .Or. lCondEmp )
lQuery := .T.
cAliasSD4 := GetNextAlias()
aStructSD4 := SD4->( dbStruct() )
cQuery := "SELECT D4_FILIAL,D4_COD,D4_LOCAL,D4_DATA,D4_QUANT,D4_OP,D4_LOTECTL,D4_NUMLOTE,D4_TRT "
cQuery += "FROM " + RetSqlName("SD4") + " SD4," + RetSqlName("SC2") + " SC2 "
cQuery += "WHERE "
cQuery += "SD4.D4_FILIAL ='" + xFilial("SD4") + "' AND "
cQuery += "SD4.D4_COD ='" + (cAliasSB2)->B2_COD + "' AND "
cQuery += "SD4.D4_LOCAL ='" + (cAliasSB2)->B2_LOCAL + "' AND "
cQuery += "SD4.D4_DATA <='" + IIf(lSaldoMov,DTOS(dDtRefSld),DTOS(dDataFim)) + "' AND "
cQuery += "SD4.D4_QUANT > 0 AND "
cQuery += "SD4.D_E_L_E_T_ = ' ' AND "
cQuery += "SD4.D4_OP = SC2.C2_NUM||SC2.C2_ITEM||SC2.C2_SEQUEN AND "
cQuery += "SC2.C2_FILIAL='" + xFilial("SC2") + "' AND "
cQuery += "SC2.C2_TPOP IN (' ','F') AND "
cQuery += "SC2.D_E_L_E_T_ = ' '"
cQuery := ChangeQuery( cQuery )
dbUseArea( .T., "TOPCONN", TcGenQry( ,,cQuery ), cAliasSD4, .F., .T. )
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Ajusta campos data e numericos |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If !Empty( nScanSD4 := AScan( aStructSD4, { |x| x[1] == "D4_QUANT" } ) )
TcSetField( cAliasSD4, aStructSD4[nScanSD4,1],aStructSD4[nScanSD4,2],aStructSD4[nScanSD4,3],aStructSD4[nScanSD4,4] )
EndIf
If !Empty( nScanSD4 := AScan( aStructSD4, { |x| x[1] == "D4_DATA" } ) )
TcSetField( cAliasSD4, aStructSD4[nScanSD4,1],aStructSD4[nScanSD4,2],aStructSD4[nScanSD4,3],aStructSD4[nScanSD4,4] )
EndIf
While !Eof()
// Se existe algum empenho com lote preenchido, assume empenho do SB2
// pois os saldos dos lotes ja estao comprometidos com a colocacao
// do empenho
If lRastro .And. !Empty(D4_LOTECTL+D4_NUMLOTE)
lProcessD4:=.F.
EndIf
// Se existe algum empenho com localizacao, assume empenho do SB2
// pois os saldos das localizacoes ja estao comprometidos com a colocacao
// do empenho
If lProcessD4 .And. lLocaliza
cSeekSDC :=xFilial("SDC")+(cAliasSD4)->(D4_COD+D4_LOCAL+D4_OP+D4_TRT)
cComparaSDC:="DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT"
dbSelectArea("SDC")
dbSeek(cSeekSDC)
While lProcessD4 .And. !Eof() .And. cSeekSDC == &(cComparaSDC)
If QtdComp(DC_QUANT) > QtdComp(0)
lProcessD4:=.F.
Exit
EndIf
dbSkip()
End
EndIf
dbSelectArea(cAliasSD4)
// Soma quantidade do empenho
nEmpenhoD4+=(cAliasSD4)->D4_QUANT
dbSkip()
End
If lProcessD4
nEmpenho:=nEmpenhoD4
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Fecha a area de trabalho da query |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
(cAliasSD4)->(dbcloseArea())
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Restaura Tabelas |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RestArea(aAreaSC2)
RestArea(aAreaSD4)
RestArea(aAreaSDC)
EndIf
#ELSE
If !lEmpPrj .And. lEmpenho .And. ( lSaldoMov .Or. lCondEmp )
// Varre empenhos ate a data estipulada
dbSelectArea("SC2")
dbSetOrder(1)
dbSelectArea("SDC")
dbSetOrder(2)
dbSelectArea("SD4")
dbSetOrder(3)
dbSeek(xFilial()+(cAliasSB2)->B2_COD+(cAliasSB2)->B2_LOCAL)
While lProcessD4 .And. !Eof() .And. D4_FILIAL+D4_COD+D4_LOCAL == xFilial()+(cAliasSB2)->B2_COD+(cAliasSB2)->B2_LOCAL
// Se existe algum empenho com lote preenchido, assume empenho do SB2
// pois os saldos dos lotes ja estao comprometidos com a colocacao
// do empenho
If lRastro .And. !Empty(D4_LOTECTL+D4_NUMLOTE)
lProcessD4:=.F.
EndIf
// Se existe algum empenho com localizacao, assume empenho do SB2
// pois os saldos das localizacoes ja estao comprometidos com a colocacao
// do empenho
If lProcessD4 .And. lLocaliza
cSeekSDC:=xFilial("SDC")+SD4->D4_COD+SD4->D4_LOCAL+SD4->D4_OP+SD4->D4_TRT
cComparaSDC:="DC_FILIAL+DC_PRODUTO+DC_LOCAL+DC_OP+DC_TRT"
dbSelectArea("SDC")
dbSeek(cSeekSDC)
While lProcessD4 .And. !Eof() .And. cSeekSDC == &(cComparaSDC)
If QtdComp(DC_QUANT) > QtdComp(0)
lProcessD4:=.F.
Exit
EndIf
dbSkip()
End
EndIf
dbSelectArea("SD4")
// Soma quantidade do empenho
If QtdComp(D4_QUANT) > QtdComp(0) .And. D4_DATA <= IIf(lSaldoMov,dDtRefSld,dDataFim) .And. ;
SC2->(dbSeek(xFilial("SC2")+SD4->D4_OP)) .And. SC2->C2_TPOP $ " F"
nEmpenhoD4+=D4_QUANT
EndIf
dbSkip()
End
If lProcessD4
nEmpenho:=nEmpenhoD4
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//| Restaura Tabelas |
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
RestArea(aAreaSC2)
RestArea(aAreaSD4)
RestArea(aAreaSDC)
EndIf
#ENDIF
// Caso baixe empenho nao subtrai a qtd empenhada para esse item
If !lEmpPrj
nEmpenho-=nQtdEmp
nEmpenho:=Max(nEmpenho,0)
Else
nEmpProj-=nQtdPrj
nEmpProj:=Max(nEmpProj,0)
EndIf
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³Calculo do saldo Disponivel ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
If lSaldoMov
// Calcula saldo ate o momento da data de referencia - MV_TPSALDO = 'C'
nRet:=QtdComp( CalcEst((cAliasSB2)->B2_COD,(cAliasSB2)->B2_LOCAL,dDtRefSld+1)[1] - If(lSaldoSemR,(cAliasSB2)->B2_RESERVA,0) - If(lEmpenho,nEmpenho,0) - If(lNecessidade,0,(cAliasSB2)->B2_QACLASS) - Iif(lConsEmpSA,(cAliasSB2)->B2_QEMPSA,0) - If(lEmpenho,nEmpProj,0) - AvalQtdPre("SB2",1) - If(lConsTerc,0,(cAliasSB2)->B2_QTNP) - If(lQEmpNF,If(lSaldoSemR,(cAliasSB2)->B2_QEMPN,0),0) + If(lConsNPT,(cAliasSB2)->B2_QNPT,0) )
Else
// Calcula saldo da posicao atual - MV_TPSALDO = 'S'
nRet:=QtdComp((cAliasSB2)->B2_QATU - If(lSaldoSemR,(cAliasSB2)->B2_RESERVA,0) - If(lEmpenho,nEmpenho,0) - If(lNecessidade,0,(cAliasSB2)->B2_QACLASS) - (cAliasSB2)->B2_QEMPSA - If(lEmpenho,nEmpProj,0) - AvalQtdPre("SB2",1) - If(lConsTerc,0,(cAliasSB2)->B2_QTNP) - If(lQEmpNF,If(lSaldoSemR,(cAliasSB2)->B2_QEMPN,0),0) + If(lConsNPT,(cAliasSB2)->B2_QNPT,0) )
EndIf
RestArea(aAreaAnt)
EndIf
Return nRet
Luiz Alberto Vieira Alves
Proprietário
55 (12) 9 8256-5905 (Vivo)
www.3lsystems.com.br
www.masteradvpl.com.br
Por favor Acessar ou Registrar para participar da conversa.
- marcio@rrparticipacoes.com.br
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 2
- Obrigados Recebidos: 0
11 anos 1 mês atrás #17416
por marcio@rrparticipacoes.com.br
Respondido por marcio@rrparticipacoes.com.br no tópico Fórmula da função SaldoSB2()
Muito bom Luiz Alberto!!
Vou estudar a função e ver o que consigo.
Obrigado.
Vou estudar a função e ver o que consigo.
Obrigado.
Por favor Acessar ou Registrar para participar da conversa.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Fórmula da função SaldoSB2()
Tempo para a criação da página:0.141 segundos