Olá pessoal…
Hoje vou mostrar uma função que desenvolve, que inverte a posição de uma determinada linha de um Array em AdvPL.
Essa função tem como objetivo, inverter duas linhas, por exemplo, se você tem um array, com essa estrutura:
001 - Daniel 002 - Alison 003 - Vinicius 004 - Bruno
Ai se você quiser alterar a posição do Bruno com o Alison, porém reordenando a sequência, dessa forma:
001 - Daniel 002 - Bruno 003 - Vinicius 004 - Alison
Para isso, criei a função onde você passa o array, a coluna de sequência, e as linhas que você quer inverter.
Abaixo o fonte criado:
//Bibliotecas #Include "Protheus.ch" /*/{Protheus.doc} zElemAlt Função que altera a posição de um elemento do Array @author Atilio @since 02/08/2017 @version 1.0 @param aArray, array, Array com os dados que serão ordenados @param nColSeq, numeric, Coluna que possui a sequência @param nLinOld, numeric, Linha antiga que será alterada @param nLinNew, numeric, Linha nova que será alterada @type function @example Exemplo abaixo aDados := {} aAdd(aDados, {"001", "ARROZ"}) aAdd(aDados, {"002", "FEIJÃO"}) aAdd(aDados, {"003", "BELUGA"}) aAdd(aDados, {"004", "MARMOTA"}) nColuna := 1 nLinhaAntiga := 4 nLinhaNova := 2 //Altera a marmota da posição 4 para 2 u_zElemAlt(@aDados, nColuna, nLinhaAntiga, nLinhaNova) /*/ User Function zElemAlt(aArray, nColSeq, nLinOld, nLinNew) Local aArea := GetArea() Local aLinhaBkp := {} Local nTamanOrig := 0 Local nLinAtu := 0 Local cSeqAtu := "" Default aArray := {} Default nColSeq := 1 Default nLinOld := 0 Default nLinNew := 0 //Se tiver dados no Array, e tiver linha antiga e nova If Len(aArray) > 0 .And. nLinOld != 0 .And. nLinNew != 0 .And. nLinOld != nLinNew //Fazendo um backup da linha, e do tamanho do array aLinhaBkp := aClone(aArray[nLinOld]) nTamanOrig := Len(aArray) //Redimensiona, aumentando o array aSize(aArray, nTamanOrig + 1) //Excluo da linha antiga aDel(aArray, nLinOld) //Insiro na linha nova aIns(aArray, nLinNew) //Agora a linha nova, vai ter o valor da antiga que foi excluída aArray[nLinNew] := aClone(aLinhaBkp) //Refaço o tamanho do array aSize(aArray, nTamanOrig) //Percorre os elementos do array, e refaz a coluna de sequência cSeqAtu := Replace(Space(Len(aArray[1][nColSeq])), ' ', '0') For nLinAtu := 1 To Len(aArray) cSeqAtu := Soma1(cSeqAtu) aArray[nLinAtu][nColSeq] := cSeqAtu Next EndIf RestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.