Função que altera a posição de um elemento de um Array

Olá pessoal…

Hoje vou mostrar uma função que desenvolve, que inverte a posição de uma determinada linha de um Array em AdvPL.

AdvPL

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.

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