Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Code block. Ame-o ou suporte-o, pois no possvel a vida sem ele no ADVPL.
O code block ou bloco de cdigo uma varivel especial de memria que contm um
pedao de cdigo compilado. Quando chamada por funes especficas, o cdigo
avaliado e um retorno gerado.
Exemplo:
nCount := 0
bCount := {|| nCount++ }
SA1->( dbEval(bCount) )
// nCount = nmero de registros na tabela SA1
Argumentos
<bBloco> o code block a ser avaliado.
<Lista de Argumentos> a lista de argumentos que ser enviada para o code block
antes dele ser avaliado.
Retorno
EVAL() retorna o valor da ltima expresso contida no code block. Um code block pode
retornar um valor de qualquer tipo.
Descrio
EVAL() uma funo para code block. Esta a funo mais bsica para avaliar um code
block.
O code block compilado juntamente com a compilao do cdigo. Entretanto ele pode
ser montado em tempo de execuo e compilado imediatamente atravs do uso de
macro (&).
Exemplo:
Este exemplo contm um code block que incrementa 1 a um argumento passado quando
este for avaliado:
bBlock := { |nArg| nArg + 1 }
? EVAL(bBlock, 1) // Retorna: 2
Este exemplo demonstra como compilar um code block em tempo de execuo usando
macro (&):
bBlock := &("{ |nArg| nArg + 1 }")
? EVAL(bBlock, 1) // Retorna: 2
aEval
?
1 AEVAL(<aArray>,<bBloco>,[<nInicio>],[<nQtde>]) --> aArray
Argumentos
<aArray> a matriz que ser utilizada na avaliao.
<bBloco> o code block que ser executado para cada elemento da matriz.
<nInicio> o elemento de incio. Se no for especificado, ser assumido como padro o
valor 1.
<nQtde> o nmero de elementos a serem processados desde o <nInicio>. Se no for
especificado ser assumida a quantidade total de elementos da matriz.
Retorno
AEVAL() retorna uma referncia a matriz <aArray>.
Descrio
AEVAL() uma funo de matriz que avalia um code block uma vez para cada elemento
da matriz, passando como parmetros do code block o elemento avaliado e o ndice
deste elemento. Todos os elementos antes do <nInicio> e depois do <nQtde> sero
ignorados.
AEVAL() no determina o tipo de dado passado como parmetro para o code block. Est
implcito que o code block reconhece o tipo de dado de cada elemento.
Exemplo:
Este exemplo usa a AEVAL() para imprimir uma matriz com os nomes de arquivos e
tamanhos retornados pela funo DIRECTORY():
?
1#include "Directry.ch"
2LOCAL aFiles := DIRECTORY("*.dbf"), nTotal := 0
AEVAL(aFiles,{|aDbfFile| QOUT(PADR(aDbfFile[F_NAME],10),
3aDbfFile[F_SIZE]),nTotal+=aDbfFile[F_SIZE])})
4? "Total Bytes:", nTotal
Este exemplo usa a AEVAL() para construir uma lista consistindo de itens selecionados
de uma matriz multidimensional:
?
1 #include "Directry.ch"
2 LOCAL aFiles := DIRECTORY("*.dbf"), aNames := {}
3 AEVAL(aFiles,{ | file | AADD(aNames, file[F_NAME]) })
Este exemplo muda o contedo do elemento da matriz de acordo com a condio.
Observe o uso dos parmetros do code block:
?
1 LOCAL aArray[6]
2 AFILL(aArray,"old")
3 AEVAL(aArray,{|cValue,nIndex| IF(cValue == "old",aArray[nIndex] := "new")})
dbEval
?
1 DBEVAL(<bBloco>,[<bFor>],[<bWhile>],[<nNextRecords>],[<nRecord>],[<lRest>]) --> NIL
Argumentos
<bBloco> o code block que ser avaliado para cada registro processado.
<bFor> uma condio opcional que ser avaliada como um code block para cada
registro no escopo. Se o retorno de <bFor> for verdadeiro (.T.) o <bBloco> ser
avalidado.
<bWhile> uma condio opcional que ser avaliada como um code block para cada
registro. O processamento dos registros ser encerrado caso o retorno deste code block
seja falso (.F.)
<nNextRecords> um nmero opcional que especifica o nmero de registros que
dever ser processado desde o incio.
<nRecord> um nmero opcional que especifica o registro a ser processado. Se
espeficiado, o <bBloco> ser avalidado somente para o registro determinado.
<lRest> um valor lgico que determina se o <bBloco> ser avaliado a partir do
registro corrente (.T.) ou se para todos os registros na tabela (.F.).
Retorno
DBEVAL() sempre retorna NIL.
Descrio
DBEVAL() uma funo de tabelas de dados que avalia um code block para cada
registro na rea de trabalho corrente que combinam com o escopo ou com a condio
determinada. O processamento continuar at que <bWhile> retorne falso (.F.) ou
chegue o final da tabela (EOF()).
Exemplo
Preencher uma array com o cdigo de nome de todos os clientes da base de dados.
?
1 aCli := {}
2
3 SA1->( dbGoTop() )
4 SA1->( dbEval(aAdd(aCli,{A1_COD,A1_NOME})) )