- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Aglutinar itens de lotes diferentes no XML
×
Linguagem de Programação ADVPL
Perguntas Aglutinar itens de lotes diferentes no XML
- Bebeto
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 6
- Obrigados Recebidos: 0
8 anos 9 meses atrás #30142
por Bebeto
Respondido por Bebeto no tópico Aglutinar itens de lotes diferentes no XML
Olá pessoal!!!
Alguém conseguiu essa função para aglutinar os itens na SD2 ?
Em que rotina deve ser implementada, pelo NFESEFAZ ou em alguma rotina na gravação da SD2 ?
Se alguém tiver a função e puder compartilhar, agradeço.
Abraço!
Alguém conseguiu essa função para aglutinar os itens na SD2 ?
Em que rotina deve ser implementada, pelo NFESEFAZ ou em alguma rotina na gravação da SD2 ?
Se alguém tiver a função e puder compartilhar, agradeço.
Abraço!
Por favor Acessar ou Registrar para participar da conversa.
- icaroq
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 1
- Obrigados Recebidos: 0
- marcelocosta_1979
- Desconectado
- Membro Iniciado
Menos
Mais
- Postagens: 5
- Obrigados Recebidos: 0
7 anos 9 meses atrás #31715
por marcelocosta_1979
Respondido por marcelocosta_1979 no tópico Aglutinar itens de lotes diferentes no XML
Bom dia,,
Estou com essa necessidade aqui também, se puder disponibilizar o fonte para que eu possa dar uma olhada agradeço.
Estou com essa necessidade aqui também, se puder disponibilizar o fonte para que eu possa dar uma olhada agradeço.
Por favor Acessar ou Registrar para participar da conversa.
- admin
- Desconectado
- Administrador
Menos
Mais
- Postagens: 297
- Obrigados Recebidos: 21
7 anos 9 meses atrás #31716
por admin
Respondido por admin no tópico Aglutinar itens de lotes diferentes no XML
Brother veja se ajuda, peguei em outro forum:
1) Criar o vetor
Local aProdAgrup := {}, logo abaixo da criação do vetor Aprod e substituir em todas as chamadas o Aprod pelo AprodAgrup.
2) Acima do For nX := 1 To Len(aProdAgrup) chamar a função com a seguinte sintaxe:
u_fAgrupaItens(aProd,aProdAgrup,aICMS,aICMSAgrup,aIPI,aIPIAgrup,aPIS,aPISAgrup,aCOFINS,aCOFINSAgrup,cTipo)
Pronto !!!
*************************
User Function fAgrupaItens(aProd,aProdAgrup,aICMS,aICMSAgrup,aIPI,aIPIAgrup,aPIS,aPISAgrup,aCOFINS,aCOFINSAgrup,cTipo)
*************************
Local nQuant:=nTotal:=nQuant:=nValFre:=nSeguro:=nDesconto:=nBCICMS:=0
Local nVTICMS:=nQTICMS:=nBCIPI:=0 // Base Calculo IPI [6]
Local nVTIPI,nQTIPI:=0 // QTrib IPI [7]
Local nBCPIS:=0 // Base Calculo PIS [2]
Local nVTPIS:=0 // Vl Trib PIS [4]
Local nQTPIS:=0 // QTrib PIS [5]
Local nBCCOFINS:=0 // Base Calculo COFINS [2]
Local nVTCOFINS:=0 // Vl Trib COFINS [4]
Local nQTCOFINS:=0 // QTrib COFINS [5]
Local wX:=1
// ordem produto+Unid Med + Preco + CFOP
if cTipo="1" // nf saida
ASort(aProd,,,{|a,b| substr(a[2],1,4)+a[20]+str(a[21],15,2)+a[22] < substr(b[2],1,4)+b[20]+str(b[21],15,2)+b[22] })
endif
do while wX <= Len(aProd)
nQuant+=aProd[wX][9]
nTotal+=aProd[wX][10]
nQuant2+=aProd[wX][12]
nValFre+=aProd[wX][13]
nSeguro+=aProd[wX][14]
nDesconto+=aProd[wX][15]
if len(aICMS[1]) > 0
nBCICMS+=aICMS[aProd[wX][1]][5] // aProd[wX][1] = Item correspondente no aProd
nVTICMS+=aICMS[aProd[wX][1]][7]
nQTICMS+=aICMS[aProd[wX][1]][9]
endif
// 1 2 3 4 5 6 7 8 9 10
// ATail(aIPI) := {"","",0,"999",CD2->CD2_CST,CD2->CD2_BC,CD2->CD2_QTRIB,CD2->CD2_PAUTA,CD2->CD2_ALIQ,CD2->CD2_VLTRIB,CD2->CD2_MODBC,CD2->CD2_PREDBC}
// cString += '<vBC>' +ConvType(aIPIAgrup[06],15,2)+'</vBC>' // CD2->CD2_BC,
// cString += '<aliquota>'+ConvType(aIPIAgrup[09],5,2)+'</aliquota>' // CD2->CD2_ALIQ,
// cString += '<vlTrib>'+ConvType(aIPIAgrup[08],15,4)+'</vlTrib>' // CD2->CD2_PAUTA,
// cString += '<qTrib>'+ConvType(aIPIAgrup[07],16,4)+'</qTrib>' // CD2->CD2_QTRIB,
// cString += '<valor>'+ConvType(aIPIAgrup[10],15,2)+'</valor>' // CD2->CD2_VLTRIB,
if len(aIPI[1]) > 0
nBCIPI +=aIPI[aProd[wX][1]][6]
nVTIPI +=aIPI[aProd[wX][1]][10]
nQTIPI +=aIPI[aProd[wX][1]][7]
endif
if len(aPIS[1]) > 0
nBCPIS +=aPIS[aProd[wX][1]][2]
nVTPIS +=aPIS[aProd[wX][1]][4]
nQTPIS +=aPIS[aProd[wX][1]][5]
endif
if len(aCOFINS[1]) > 0
nBCCOFINS +=aCOFINS[aProd[wX][1]][2]
nVTCOFINS +=aCOFINS[aProd[wX][1]][4]
nQTCOFINS +=aCOFINS[aProd[wX][1]][5]
endif
// aProd[wX][19] == aProd[wX+1][19] .and.; B1_GRUPO,,alguns produtos estão em branco no arquivo,,então não pode participar
if (cTipo="1".and.aProd[wX][23]="PA" .and.wX < Len(aProd).and.;
subs(aProd[wX][2],1,4) == subs(aProd[wX+1][2],1,4).and.;
aProd[wX][20] == aProd[wX+1][20] .and.;
aProd[wX][21] == aProd[wX+1][21] .and.;
aProd[wX][22] == aProd[wX+1][22])
wX++
loop
endif
aadd(aProdAgrup,{Len(aProdAgrup)+1,iif(cTipo="1".and. SM0->M0_CODIGO="01",subs(aProd[wX][2],1,4),aProd[wX][2]),;
aProd[wX][3],aProd[wX][4],aProd[wX][5],aProd[wX][6],aProd[wX][7],;
aProd[wX][8],nQuant,nTotal,aProd[wX][11],nQuant2,nValFre,nSeguro,nDesconto,;
aProd[wX][16],aProd[wX][17],aProd[wX][18]})
if len(aICMS[1]) > 0
aadd(aICMSAgrup,{aICMS[wX][1],aICMS[wX][2],aICMS[wX][3],aICMS[wX][4],nBCICMS,aICMS[wX][6],nVTICMS,;
aICMS[wX][8],nQTICMS,aICMS[wX][10]})
else
aadd(aICMSAgrup,{})
endif
if len(aIPI[1]) > 0
aadd(aIPIAgrup,{aIPI[wX][1],aIPI[wX][2],aIPI[wX][3],aIPI[wX][4],aIPI[wX][5],nBCIPI,nQTIPI,;
aIPI[wX][8],aIPI[wX][9],nVTIPI,aIPI[wX][11],aIPI[wX][12]})
else
aadd(aIPIAgrup,{})
endif
if len(aPIS[1]) > 0
aadd(aPISAgrup,{aPIS[wX][1],nBCPIS,aPIS[wX][3],nVTPIS,nQTPIS,aPIS[wX][6]})
else
aadd(aPISAgrup,{})
endif
if len(aCOFINS[1]) > 0
aadd(aCOFINSAgrup,{aCOFINS[wX][1],nBCCOFINS,aCOFINS[wX][3],nVTCOFINS,nQTCOFINS,aCOFINS[wX][6]})
else
aadd(aCOFINSAgrup,{})
endif
nQuant:=0 ; nTotal:=0 ; nQuant2:=0 ; nValFre:=0 ; nSeguro:=0 ; nDesconto:=0
nBCICMS:=0 ; nVTICMS:=0 ; nQTICMS:=0
nBCIPI:=0 ; nVTIPI:=0 ; nQTIPI:=0
nBCPIS:=0 ; nVTPIS:=0 ; nQTPIS:=0
nBCCOFINS:=0 ; nVTCOFINS:=0 ; nQTCOFINS:=0
wX++
enddo
1) Criar o vetor
Local aProdAgrup := {}, logo abaixo da criação do vetor Aprod e substituir em todas as chamadas o Aprod pelo AprodAgrup.
2) Acima do For nX := 1 To Len(aProdAgrup) chamar a função com a seguinte sintaxe:
u_fAgrupaItens(aProd,aProdAgrup,aICMS,aICMSAgrup,aIPI,aIPIAgrup,aPIS,aPISAgrup,aCOFINS,aCOFINSAgrup,cTipo)
Pronto !!!
*************************
User Function fAgrupaItens(aProd,aProdAgrup,aICMS,aICMSAgrup,aIPI,aIPIAgrup,aPIS,aPISAgrup,aCOFINS,aCOFINSAgrup,cTipo)
*************************
Local nQuant:=nTotal:=nQuant:=nValFre:=nSeguro:=nDesconto:=nBCICMS:=0
Local nVTICMS:=nQTICMS:=nBCIPI:=0 // Base Calculo IPI [6]
Local nVTIPI,nQTIPI:=0 // QTrib IPI [7]
Local nBCPIS:=0 // Base Calculo PIS [2]
Local nVTPIS:=0 // Vl Trib PIS [4]
Local nQTPIS:=0 // QTrib PIS [5]
Local nBCCOFINS:=0 // Base Calculo COFINS [2]
Local nVTCOFINS:=0 // Vl Trib COFINS [4]
Local nQTCOFINS:=0 // QTrib COFINS [5]
Local wX:=1
// ordem produto+Unid Med + Preco + CFOP
if cTipo="1" // nf saida
ASort(aProd,,,{|a,b| substr(a[2],1,4)+a[20]+str(a[21],15,2)+a[22] < substr(b[2],1,4)+b[20]+str(b[21],15,2)+b[22] })
endif
do while wX <= Len(aProd)
nQuant+=aProd[wX][9]
nTotal+=aProd[wX][10]
nQuant2+=aProd[wX][12]
nValFre+=aProd[wX][13]
nSeguro+=aProd[wX][14]
nDesconto+=aProd[wX][15]
if len(aICMS[1]) > 0
nBCICMS+=aICMS[aProd[wX][1]][5] // aProd[wX][1] = Item correspondente no aProd
nVTICMS+=aICMS[aProd[wX][1]][7]
nQTICMS+=aICMS[aProd[wX][1]][9]
endif
// 1 2 3 4 5 6 7 8 9 10
// ATail(aIPI) := {"","",0,"999",CD2->CD2_CST,CD2->CD2_BC,CD2->CD2_QTRIB,CD2->CD2_PAUTA,CD2->CD2_ALIQ,CD2->CD2_VLTRIB,CD2->CD2_MODBC,CD2->CD2_PREDBC}
// cString += '<vBC>' +ConvType(aIPIAgrup[06],15,2)+'</vBC>' // CD2->CD2_BC,
// cString += '<aliquota>'+ConvType(aIPIAgrup[09],5,2)+'</aliquota>' // CD2->CD2_ALIQ,
// cString += '<vlTrib>'+ConvType(aIPIAgrup[08],15,4)+'</vlTrib>' // CD2->CD2_PAUTA,
// cString += '<qTrib>'+ConvType(aIPIAgrup[07],16,4)+'</qTrib>' // CD2->CD2_QTRIB,
// cString += '<valor>'+ConvType(aIPIAgrup[10],15,2)+'</valor>' // CD2->CD2_VLTRIB,
if len(aIPI[1]) > 0
nBCIPI +=aIPI[aProd[wX][1]][6]
nVTIPI +=aIPI[aProd[wX][1]][10]
nQTIPI +=aIPI[aProd[wX][1]][7]
endif
if len(aPIS[1]) > 0
nBCPIS +=aPIS[aProd[wX][1]][2]
nVTPIS +=aPIS[aProd[wX][1]][4]
nQTPIS +=aPIS[aProd[wX][1]][5]
endif
if len(aCOFINS[1]) > 0
nBCCOFINS +=aCOFINS[aProd[wX][1]][2]
nVTCOFINS +=aCOFINS[aProd[wX][1]][4]
nQTCOFINS +=aCOFINS[aProd[wX][1]][5]
endif
// aProd[wX][19] == aProd[wX+1][19] .and.; B1_GRUPO,,alguns produtos estão em branco no arquivo,,então não pode participar
if (cTipo="1".and.aProd[wX][23]="PA" .and.wX < Len(aProd).and.;
subs(aProd[wX][2],1,4) == subs(aProd[wX+1][2],1,4).and.;
aProd[wX][20] == aProd[wX+1][20] .and.;
aProd[wX][21] == aProd[wX+1][21] .and.;
aProd[wX][22] == aProd[wX+1][22])
wX++
loop
endif
aadd(aProdAgrup,{Len(aProdAgrup)+1,iif(cTipo="1".and. SM0->M0_CODIGO="01",subs(aProd[wX][2],1,4),aProd[wX][2]),;
aProd[wX][3],aProd[wX][4],aProd[wX][5],aProd[wX][6],aProd[wX][7],;
aProd[wX][8],nQuant,nTotal,aProd[wX][11],nQuant2,nValFre,nSeguro,nDesconto,;
aProd[wX][16],aProd[wX][17],aProd[wX][18]})
if len(aICMS[1]) > 0
aadd(aICMSAgrup,{aICMS[wX][1],aICMS[wX][2],aICMS[wX][3],aICMS[wX][4],nBCICMS,aICMS[wX][6],nVTICMS,;
aICMS[wX][8],nQTICMS,aICMS[wX][10]})
else
aadd(aICMSAgrup,{})
endif
if len(aIPI[1]) > 0
aadd(aIPIAgrup,{aIPI[wX][1],aIPI[wX][2],aIPI[wX][3],aIPI[wX][4],aIPI[wX][5],nBCIPI,nQTIPI,;
aIPI[wX][8],aIPI[wX][9],nVTIPI,aIPI[wX][11],aIPI[wX][12]})
else
aadd(aIPIAgrup,{})
endif
if len(aPIS[1]) > 0
aadd(aPISAgrup,{aPIS[wX][1],nBCPIS,aPIS[wX][3],nVTPIS,nQTPIS,aPIS[wX][6]})
else
aadd(aPISAgrup,{})
endif
if len(aCOFINS[1]) > 0
aadd(aCOFINSAgrup,{aCOFINS[wX][1],nBCCOFINS,aCOFINS[wX][3],nVTCOFINS,nQTCOFINS,aCOFINS[wX][6]})
else
aadd(aCOFINSAgrup,{})
endif
nQuant:=0 ; nTotal:=0 ; nQuant2:=0 ; nValFre:=0 ; nSeguro:=0 ; nDesconto:=0
nBCICMS:=0 ; nVTICMS:=0 ; nQTICMS:=0
nBCIPI:=0 ; nVTIPI:=0 ; nQTIPI:=0
nBCPIS:=0 ; nVTPIS:=0 ; nQTPIS:=0
nBCCOFINS:=0 ; nVTCOFINS:=0 ; nQTCOFINS:=0
wX++
enddo
Por favor Acessar ou Registrar para participar da conversa.
- Julieta
- Desconectado
- Membro Sénior
Menos
Mais
- Postagens: 52
- Obrigados Recebidos: 0
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Aglutinar itens de lotes diferentes no XML
Tempo para a criação da página:0.142 segundos