Como ordenar produtos em uma nota no Protheus (NFe e Danfe)

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.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação