BlackTDN Search

quarta-feira, 21 de janeiro de 2009

Protheus :: Programação Básica em Advpl “Combo XXXIX”

Buscando um Array Bidimensional:

Existem várias funções de manipulação de Array. Uma delas é a aScan() que serve para efetuar pesquisa em um Array e retorna o numero do elemento do Array ( Índice ) se a pesquisa foi satisfeita e Zero (0) caso contrário. Essa função poderá ser utilizada tanto em Arrays unidimensionais como em Arrays Bidimensionais. aScan() recebe quatro parâmetros: O primeiro é o Array a ser pesquisado, o segundo é um Bloco de Código com as instruções para pesquisa, o terceiro é a posição inicial ( índice ou elemento inicial ) para pesquisa e o quarto é a posição final para pesquisa ( índice ou elemento final ). O primeiro parâmetro o Array a ser pesquisado é obrigatório, já do segundo ao quarto são opcionais. O segundo parâmetro deve ser passado quando o array a ser pesquisado for um array Multidimensional ou Bidimensional e, quando o Bloco de Codificação for passado aEval() se comportará de maneira diferente do usual. Em vez de aScan() comparar internamente elementos do Array com o que estamos procurando, ela permitirá que o bloco passado como parâmetro faça isso. aScan(), como aEval(), faz um Loop em cada elemento do Array passando cada elemento por sua vez para o bloco de codificação. O bloco de codificação, passado como parâmetro, deve retornar um valor lógico, indicando se o elemento que aScan() acabou de passar era o que estávamos procurando; .T. ( true = verdadeiro ) significa que o atual elemento é o que estamos procurando; .F. ( false = falso ) significa que não é. Se a avaliação do Bloco de Código for verdadeira, aScan() interrompe a busca e retorna o número do atual elemento. Se a avaliação do Bloco de Código for falsa, aScan() salta para o próximo elemento e efetua a avaliação do Bloco mais uma vez. aScan() prossegue seu processo de busca até terminar todos os elementos, em cujo caso retornará um Zero (0), ou até a avaliação do Bloco retornar verdadeiro. aScan() é semelhante a aEval(), exceto pelo fato de não existir uma maneira de interromper aEval() prematuramente.

Exemplos:

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}

Local bExemplo := { |uElem| ConOut( uElem ) }

aEval( aStru[1] , bExemplo )

/*/
Neste Caso, processamos apenas os elementos do sub-array aStru[1] e Teremos a seguida saída no Console do Server:

SNome
C
10
0

/*/

Para processar todos os elementos do array poderíamos fazê-lo da seguinte forma:

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}

Local bExemplo := { |uElem| ConOut( uElem ) }
Local nLoop
Local nLoops

//Utilizando um Loop For/Next
nLoops := Len( aStru )
For nLoop := 1 To nLoops
aEval( aStru[ nLoop ] , bExemplo )
Next nLoop

//Ou aEval de forma recursiva
aEval( aStru , { |aElem| aEval( aElem , bExemplo ) } )

/*/
Neste Caso, processamos Todos os elementos do Array e seus sub-arrays. Teremos, dessa forma, a seguida saída no Console do Server:

SNome
C
10
0
PNome
C
10
0
Ender1
C
30
0
Ender2
C
40
0
/*/

Quando usarmos um Bloco de Codificação com aScan(), ela passara cada elemento por vez para o bloco. Se esse elemento for outra Array o parâmetro formar conterá uma referência para esse Array. O bloco poderá então usar um só subscrito com seu parâmetro para acessar determinado elemento. Por exemplo, o seguinte fragmento de código localiza o número do elemento do Array que descreve o campo “PNome”

Local aStru := {;
{ “SNome” , “C” , 10 , 0 },;
{ “PNome” , “C” , 10 , 0 },;
{ “Ender1” , “C” , 30 , 0 },;
{ “Ender2” , “C” , 40 , 0 } ;
}
//Monto bloco para comparação exata
Local bAscan := { |aCpo| Upper( AllTrim( aCpo[1] ) ) == “PNOME” }
Local nPos

nPos := aScan( aStru , bAscan ) //nPos irá retornar 2
IF ( nPos > 0 )
ConOut( "A Posicao eh:" + Str( nPos ) )
ConOut( "Conteudo:" + aStru[ nPos , 1 ] )
Else
ConOut( "Elemento nao encontrado" )
EndIF

Nenhum comentário:

Postar um comentário