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.