Olá pessoal…
Hoje vou mostrar como ordenar os produtos da DANFE do Protheus, utilizando o ponto de entrada PE01NFESEFAZ.
O ponto de entrada PE01NFESEFAZ, é chamado pelo fonte do nfesefaz antes da geração do XML, com todos os dados prontos.
Então, o array de produtos está pronto, e é a primeira posição do PARAMIXB, então, basta ordenar ele com um aSort, e pronto, os produtos estarão ordenados e tanto no XML como na DANFE, irão sair por ordem crescente.
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} PE01NFESEFAZ
Ponto de entrada no fim do NfeSefaz para manipular os arrays do XML
@author Atilio
@since 08/01/2018
@version 1.0
@type function
@see http://tdn.totvs.com/pages/releaseview.action?pageId=274327446
@obs Posições do ParamIXB:
001 - aProd - Produto
002 - cMensCli - Mensagem da nota
003 - cMensFis - Mensagem padrao
004 - aDest - Destinatario
005 - aNota - Numero da nota
006 - aInfoItem - Informações do Item
007 - aDupl - Duplicata
008 - aTransp - Transporte
009 - aEntrega - Entrega
010 - aRetirada - Retirada
011 - aVeiculo - Veiculo
012 - aReboque - Placa Reboque
013 - aNfVincRur - Nota Produtor Rural Referenciada
014 - aEspVol - Especie Volume
015 - aNfVinc - NF Vinculada
016 - aDetPag -
/*/
User Function PE01NFESEFAZ()
Local aArea := GetArea()
Local nAtual := 0
//Arrays originais
Local aDados := ParamIXB
Local aProdutos := aDados[1]
Local aInfoItem := aDados[6]
Local nLinDad := 0
//Indíce de produtos (posição 1 = posição do aProdutos, posição 2 = código do produto)
Local aProdInd := {}
//Arrays novos que irão conter Produto e Informações do Item
Local aProdNew := {}
Local aInfItNew := {}
//Percorrer todos os itens dos produtos e adiciona no nosso índice
For nAtual := 1 To Len(aProdutos)
//Adicionar o código do produto e o número da linha em um array auxiliar
aAdd(aProdInd, {nAtual, aProdutos[nAtual][2]})
Next
//Ordenar o array auxiliar por código do produto
aSort(aProdInd, , , { |x, y| x[2] < y[2] })
//Percorrer o array auxiliar
For nAtual := 1 To Len(aProdInd)
nLinDad := aProdInd[nAtual][1]
//Adicionar no novo array de produto e de itens, conforme a linha atual
aAdd(aProdNew, aClone(aProdutos[nLinDad]))
aAdd(aInfItNew, aClone(aInfoItem[nLinDad]))
Next
//Definir as novas posições do aDados referente a produto e informações complementares do produto
aDados[1] := aProdNew //Original é aProdutos
aDados[6] := aInfItNew //Original é aInfoItem
RestArea(aArea)
Return aDados
Agora, caso você tenha receio em mexer nesse ponto de entrada, ou prefere mexer direto no RDMAKE do nfesefaz, procure por “ORDER BY” no fonte, até encontrar onde ele ordena os dados da SD2, então você altera para a sequência que você deseja, como por exemplo:
//Antes //ORDER BY D2_FILIAL,D2_DOC,D2_SERIE,D2_CLIENTE,D2_LOJA,D2_ITEM,D2_COD //Depois ORDER BY D2_FILIAL,D2_DOC,D2_SERIE,D2_CLIENTE,D2_LOJA,D2_COD,D2_ITEM
Bom pessoal, por hoje é só.
Abraços e até a próxima.