No vídeo de hoje, vamos demonstrar em como agrupar / aglutinar as informações contidas dentro de um Array.
A dúvida de hoje, nos perguntaram, como seria possível em uma função percorrer as informações de um Array e deixar elas agrupadas num segundo Array.
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como fazer de duas formas, uma usando o laço de repetição com For e a segunda com a função aEval.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "tlpp-core.th"
//Declaração da namespace
Namespace custom.terminal.youtube
/*/{Protheus.doc} User Function video0153
Exemplo de como agrupar as informações de um array
@type Function
@author Atilio
@since 29/04/2024
@example
custom.terminal.youtube.u_video0153()
/*/
User Function video0153()
Local aArea := FWGetArea() As Array
Local aNormalArray := {} As Array
Local aGroupArray := {} As Array
Local cGroupText := "" As Character
Local nFoundPosition := 0 As Numeric
Local nUserChoice := 0 As Numeric
Local nCurrentPosition := 0 As Numeric
//Monta um Array, com um texto e uma quantidade na direita
aAdd(aNormalArray, {"CHOCOLATE", 15})
aAdd(aNormalArray, {"SORVETE", 30})
aAdd(aNormalArray, {"IOGURTE", 10})
aAdd(aNormalArray, {"CHOCOLATE", 15})
aAdd(aNormalArray, {"IOGURTE", 10})
//Mostra uma mensagem para ver o que o usuário prefere
nUserChoice := Aviso("Qual forma?", "De qual forma gostaria de agrupar?", {"For", "aEval"}, 2)
//Se o usuário clicou no For
If nUserChoice == 1
//Percorre o Array
For nCurrentPosition := 1 To Len(aNormalArray)
//Passo 1 - captura o Texto e a Quantidade
cGroupText := aNormalArray[nCurrentPosition][1]
nQuantity := aNormalArray[nCurrentPosition][2]
//Passo 2 - encontra a posição no Array agrupado
nFoundPosition := 0
If Len(aGroupArray) > 0
nFoundPosition := aScan(aGroupArray, {|y| y[1] == cGroupText})
EndIf
//Passo 3 - atualiza o Array agrupado (caso não encontre, cria a posição, senão incrementa a Quantidade)
If nFoundPosition == 0
aAdd(aGroupArray, {cGroupText, nQuantity})
Else
aGroupArray[nFoundPosition][2] += nQuantity
EndIf
Next
//Senão, o usuário clicou no aEVal
Else
aEVal(aNormalArray, {|x| ;
cGroupText := x[1] , ; //Passo 1 - captura o Texto
nQuantity := x[2] , ; //Passo 2 - captura a Quantidade
nFoundPosition := Iif(Len(aGroupArray) == 0, 0, aScan(aGroupArray, {|y| y[1] == cGroupText})) , ; //Passo 3 - busca a posição no array agrupado
Iif(nFoundPosition == 0, aAdd(aGroupArray, {cGroupText, nQuantity}), aGroupArray[nFoundPosition][2] += nQuantity) ; //Passo 4 - Se não encontrou a posição, cria um elemento no array agrupado, senão incrementa a quantidade
})
EndIf
//Exibe via ShowLog o Array Agrupado
ShowLog(VarInfo("Array", aGroupArray, , .F.))
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.