Anda di halaman 1dari 79

Criao de Variveis

Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:

A declarao
O tipo de varivel

A funo CRIAVAR()

A inicializao

Padronizao de variveis

A Declarao
Deve ser feita sempre no incio da rotina que for utiliz-la, como no exemplo:
Function a910VerCod()
Local cCod910 := 001
Return

O Tipo de Varivel
O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da rotina.
Toda varivel deve estar tipada durante sua criao. Quando programamos nativamente em
C, isto se torna obrigatrio. Devemos fazer o mesmo no AP5, pois isto demonstra que a
varivel foi conscientemente declarada.

Tipos Existentes
PUBLIC: Esta varivel ser inicializada em um valor lgico falso (.F.) at que seja
atribudo um valor especfico a ela. Esta varivel permanece definida por toda a durao da
aplicao e pode ser vista (assim como usada, alterada e avaliada) por qualquer funo.
Esta varivel gera um token (indicao) na tabela de smbolos, isto significa que o mdulo
principal conter smbolos para esta classe de varivel, o que, por sua vez, ocupa mais
espao de memria. Deve-se evitar a utilizao deste tipo, a no ser em casos extremos.
PRIVATE: Esta varivel ser inicializada em valor nulo (NIL) e uma vez declarada,
permanecer assim durante toda a durao do fluxo da funo, at que este volte ao
procedimento inicial que a chamou. Em essncia, uma varivel de memria PRIVATE
inicializada logo no incio do Protheus, agir como um varivel PUBLIC. Esta varivel

pode ser vista por uma sub-rotina da funo e modificada de maneira correspondente. Esta
varivel tambm gera um token na tabela de smbolos comentada acima.
LOCAL: Esta varivel de memria ser inicializada com valor nulo (NIL) e s visvel
dentro da funo que a inicializa, mesmo que esta ltima, contenha funes incorporadas a
seu contedo. Este tipo de varivel o mais adequado a ser utilizado em funes, pois no
gera smbolos na tabela de smbolos, por conseqncia ocupa pouco espao de memria e,
o compilador avalia as variveis LOCAL e STATIC mais rapidamente que os outros tipos
(PUBLIC e PRIVATE). Cuidado para no sucumbir teoria de que se pode obter economia
de memria, mudando qualquer referncia PRIVATE para uma referncia LOCAL. Se voc
fizer isso, as funes podem no funcionar corretamente, embora funcionassem na verso
anterior s alteraes.
STATIC: A varivel STATIC idntica classe de armazenamento LOCAL, com uma
exceo. Uma varivel STATIC retida dentro de sua sub-rotina, mesmo depois que o
fluxo da funo a tenha deixado. Isto particularmente til para funes independentes tipo
caixa-preta, que contm seu prprio conjunto de variveis exclusivas e devem manter
esses valores de interao em interao.

Inicializao
Quando no atribumos nenhum valor a uma varivel no momento de sua declarao,
corremos o risco de utiliz-la com valor NIL e causar erros fatais. Por isso, a
inicializao de uma varivel de extrema importncia.

Padronizao de Variveis
importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo
numrico, caracter, data ou lgico. O nome da varivel de get no deve coincidir com uma
varivel de outro programa, pois toda varivel de get possui um help especfico.
Exemplo:
a varivel DBaixa (get da baixa no programa de Ttulos a Receber), j possui um texto help
que indica seu conteudo e no dever ser criada outra varivel para outra finalidade com
este mesmo nome.
Para tanto, definimos a seguinte padronizao :
N -> Numricas
L -> Lgicas
D -> Data

C -> Caracter
A -> Array (matriz)
O -> Objeto
U -> Sem definio

Criando uma Varivel Utilizando a Funo CRIAVAR()


Esta funo cria uma varivel, retornando o valor do campo, de acordo com o dicionrio de
dados. Avalia o inicializador padro e retorna o contedo de acordo com o tipo de dado
definido no dicionrio.
Sintaxe
uRet := CriaVar(cCampo,lIniPad,cLado)
Onde :
Uret -> tipo de retorno de acordo com o dicionrio de dados, considerando inicializador
padro.
cCampo -> Nome do campo
LiniPad -> Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RELACAO)
Clado -> Lado para inicializao padro

Variveis de Relatrios
Na criao de um relatrio algumas variveis e seus tipos so convencionados para a
utilizao da biblioteca de funes de relatrio.
Varivel

Tipo

Contedo

wnRel

Local

Nome default do relatrio em disco

cbCont

Local

Contador

Cabec1

Local

1 linha do cabealho do relatrio

Cabec2

Local

2 linha do cabealho do relatrio

Cabec3

Local

3 linha do cabealho do relatrio

Tamanho

Local

Tamanho do Relatrio (P = Pequeno 80 colunas, M = Mdio 132


colunas, G = Grande, 220 colunas)

cDesc1

Local

1 linha da descrio do relatrio

cDesc2

Local

2 linha da descrio do relatrio

cDesc3

Local

3 linha da descrio do relatrio

Limite

Local

Quantidade de colunas no relatrio (80,132,220)

Titulo

Local

Ttulo do Relatrio

aReturn

Private

Matriz com as informaes para a tela de configurao de


impresso

Nomeprog

Private

Nome do programa do relatrio

cString

Private

Alias do arquivo principal do relatrio para o uso de filtro

Li

Private

Controle das linhas de impresso. Seu valor inicial a quantidade


mxima de linhas por pgina utilizada no relatrio

m_pag

Private

Controle do nmero de pginas do relatrio

aOrd

Private

Matriz contendo as ordens de layout para a impresso. Caso no


existam vrias ordens esta matriz deve estar vazia. Ex.: aOrd :=
{"Cdigo", "Descrio", "Telefone"} -> O layout do relatrio vai
depender da ordem selecionada na tela de configurao de
impresso

nLastKey

Private

Utilizado para controlar o cancelamento da impresso do relatrio

cPerg

Private

Nome da pergunta a ser exibida para o usurio

aLinha

Private

Matriz que contem informaes para impresso de relatrios


cadastrais

Tipos de Dados
O AdvPl no uma linguagem de tipos rgidos (strongly typed), o que significa que
variveis de memria podem diferentes tipos de dados durante a execuo do programa.
Variveis podem tambm conter objetos, mas os tipos primrios da linguagem so:

Numrico
O AdvPl no diferencia valores inteiros de valores com ponto flutuante, portanto pode-se
criar variveis numricas com qualquer valor dentro do intervalo permitido. Os seguintes
elementos so do tipo de dado numrico:

2
43.53
0.5
0.00001
1000000
5

Uma varivel do tipo de dado numrico pode conter um nmero de dezoito dgitos
incluindo o ponto flutuante, no intervalo de 2.2250738585072014 E308 at
1.7976931348623158 E+308.

Lgico
Valores lgicos em AdvPl so identificados atravs de .T. ou .Y. para verdadeiro e .F. ou .N.
para falso (independentemente se os caracteres estiverem em maisculo ou minsculo).

Caracter
Strings ou cadeias de caracteres so identificadas em AdvPl por blocos de texto entre aspas
duplas (") ou aspas simples ('):

"Ol mundo!"
'Esta uma string'
"Esta 'outra' string"

Uma varivel do tipo caracter pode conter strings com no mximo 1 Mb, ou seja, 1048576
caracteres.

Data
O AdvPl tem um tipo de dados especfico para datas. Internamente as variveis deste tipo
de dado so armazenadas como um nmero correspondente a data Juliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim atravs da
utilizao de funes especficas como por exemplo ctod que converte uma string para data.

Matriz (Array)
Matrizes so um tipo de dado especial. a disposio de outros elementos em colunas e
linhas. O AdvPl suporta matrizes uni ou multidimensionais. Os elementos de uma matriz
so acessados atravs de ndices numricos iniciados em 1, identificando a linha e coluna
para quantas dimenes existirem.

Uma matriz pode conter no mximo 100000 elementos, independentemente do nmero de


dimenses.
Matrizes devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a
memria do servidor.

Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues
escritas em AdvPl que podero ser executadas posteriormente.

Criao e Atribuio de Variveis


Variveis de memria so um dos recursos mais importantes de uma linguagem. So reas
de memria criadas para armazenar informaes utilizadas por um programa para a
execuo de tarefas. Por exemplo, quando o usurio digita uma informao qualquer, como
o nome de um produto, em uma tela de um programa esta informao armazenada em
uma varivel de memria para posteriormente ser gravada ou impressa.
A partir do momento que uma varivel criada, no necessrio mais se referenciar ao seu
contedo, e sim ao seu nome. O nome de uma varivel um identificador nico que segue
duas regras regras:
Mximo de 10 caracteres. O AdvPl no impede a criao de uma varivel de memria
cujo nome contenha mais de 10 caracteres, porm apenas os 10 primeiros sero
considerados para a localizao do contedo armazenado. Portanto se forem criadas duas
variveis cujos 10 primeiros caracteres forem iguais, como nTotalGeralAnual e
nTotalGeralMensal, as referncias a qualquer uma delas no programa resultaro o mesmo.
Ou seja, sero a mesma varivel:

nTotalGeralMensal := 100

nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))

Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300. Isso
acontece porque no momento que esse valor foi atribuido varivel nTotalGeralAnual, o
AdvPl considerou apenas os 10 primeiros caracteres (assim como o faz quando deve exibir
o valor da varivel nTotalGeralMensal), ou seja, considerou-as como a mesma varivel.
Assim o valor original de 100 foi substituido pelo de 300.
Limitao de caracteres no nome. Os nomes das variveis devem sempre comear por
uma letra ou o caracter de sublinhado ( _ ). No restante, pode conter letras, nmeros e o
caracter de sublinhado. Qualquer outro caracter, incluindo espaos em branco, no so
permitidos.
O AdvPl permite a criao ilimitada de variveis, dependendo apenas da memria
disponvel. A seguir esto alguns nomes vlidos para variveis:

TOT01
cNumero
VAR_QUALQUER
M_CARGO
A11

E alguns invlidos:

1CODIGO (Inicia por um nmero)


M CARGO (contm um espao em branco)
LOCAL (palavra reservada do AdvPl)

O AdvPl no uma linguagem de tipos rgidos para variveis, ou seja, no necessrio


informar o tipo de dados que determinada varivel ir conter no momento de sua
declarao, e o seu valor pode mudar durante a execuo do programa. Tambm no h
necessidade de declarar variveis em uma seo especfica do seu cdigo fonte, embora
seja aconselhvel declarar todas as variveis necessrias no comeo, tornando a
manuteno mais fcil e evitando a declarao de variveis desnecessrias.
Para declarar uma varivel deve-se utilizar um identificador de escopo, seguido de uma
lista de variveis separadas por vrgula (,). Um identificador de escopo uma palavra chave
que indica a que contexto do programa a varivel declarada pertence. O contexto de
variveis pode ser local (visualizadas apenas dentro do programa atual), pblico
(visualizadas por qualquer outro programa), entre outros. Os diferentes tipos de contexto de
variveis so explicados na documentao sobre escopo de variveis.
Considere as linhas de cdigo de exemplo:

nResultado := 250 * (1 + (nPercentual / 100))

Se esta linha for executada em um programa AdvPl, ocorrer um erro de execuo com a
mensagem "variable does not exist: nPercentual", pois esta varivel est sendo utilizada em
uma expresso de clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar
a varivel previamente:

Local nPercentual, nResultado


nResultado := 250 * (1 + (nPercentual / 100))

Neste exemplo, as variveis so declaradas previamente utilizando o identificador de


escopo local. Quando a linha de clculo for executada, o erro de varivel no existente no
mais ocorrer. Porm variveis no inicializadas tm sempre o valor default nulo (Nil) e
este valor no pode ser utilizado em um clculo pois tambm gerar erros de execuo
(nulo no pode ser dividido por 100). A resoluo deste problema efetuada inicializandose a varivel atravs de uma das formas:

Local nPercentual,nResultado

Store 10 To nPercentual
nResultado := 250 * (1 + (nPercentual / 100))

ou

Local nPercentual, nResultado


nPercentual := 10
nResultado := 250 * (1 + (nPercentual / 100))

ou

Local nPercentual := 10, nResultado


nResultado := 250 * (1 + (nPercentual / 100))

A diferena entre o ltimo exemplo e os dois anteriores que a varivel inicializada no


momento da declarao. Nos dois primeiros exemplos, a varivel primeiro declarada e
ento inicializada em uma outra linha de cdigo. O comando store existe apenas por
compatibilidade com verses anteriores e outras linguagens xBase, mas obsoleto. Deve-se
utilizar o operador de atribuio (:= ou somente =). aconselhvel optar pelo operador de
atribuio composto de dois pontos e sinal de igual, pois o operador de atribuio
utilizando somente o sinal de igual pode ser facilmente confundido com o operador
relacional (para comparao) durante a criao do programa.
Uma vez que um valor lhe seja atribudo, o tipo de dado de uma varivel igual ao tipo de
dado do valor atribudo. Ou seja, uma varivel passa a ser numrica se um nmero lhe
atribudo, passa a ser caracter se uma string de texto lhe for atribuda, etc. Porm mesmo
que uma varivel seja de determinado tipo de dado, pode-se mudar o tipo da varivel
atribuindo outro tipo a ela:

01 Local xVariavel // Declara a varivel inicialmente com valor nulo

10

02
03 xVariavel := "Agora a varivel caracter..."
04 Alert("Valor do Texto: " + xVariavel)
05
06 xVariavel := 22 // Agora a varivel numrica
07 Alert(cValToChar(xVariavel))
08
09 xVariavel := .T. // Agora a varivel lgica
10 If xVariavel
11 Alert("A varivel tem valor verdadeiro...")
12 Else
13

Alert("A varivel tem valor falso...")

14 Endif
15
16 xVariavel := Date() // Agora a varivel data
17 Alert("Hoje : " + DtoC(xVariavel))
18
19 xVariavel := nil // Nulo novamente
20 Alert("Valor nulo: " + xVariavel)
21
22 Return

No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar diversos


tipos de dados. A letra "x" em minsculo no comeo do nome utilizada para indicar uma

11

varivel que pode conter diversos tipos de dados, segundo a Notao Hngara (consulte
documentao especfica para detalhes). Este programa troca os valores da varivel e exibe
seu contedo para o usurio atravs da funo alert. Essa funo recebe um parmetro que
deve ser do tipo string de caracter, por isso dependendo do tipo de dado da varivel
xVariavel necessrio fazer uma converso antes.
Apesar dessa flexibilidade de utilizao de variveis, deve-se tomar cuidados na passagem
de parmetros para funes ou comandos, e na concatenao (ou soma) de valores. Note a
linha 20 do programa de exemplo. Quando esta linha executada, a varivel xVariavel
contem o valor nulo. A tentativa de soma de tipos de dados diferentes gera erro de execuo
do programa. Nesta linha do exemplo, ocorrer um erro com a mensagem "type mismatch
on +". Excetuando-se o caso do valor nulo, para os demais deve-se sempre utilizar funes
de converso quando necessita-se concatenar tipos de dados diferentes (por exemplo, nas
linhas 07 e 17.
Note tambm que quando uma varivel do tipo de dado lgico, ela pode ser utilizada
diretamente para checagem (linha 10):

If xVariavel

o mesmo que

If xVariavel = .T.

A declarao de variveis para os demais tipos de dados, matrizes e blocos de cdigo,


exatamente igual ao descrito at agora. Apenas existem algumas diferenas quanto a
inicializao, que podem ser consultadas na documentao de inicializao de matrizes e
blocos de cdigo.

12

Matrizes
Matrizes, ou arrays, so colees de valores. Ou, de uma maneira mais fcil de entender,
uma lista. Uma matriz pode ser criada atravs de diferentes maneiras. Consulte a
documentao sobre Inicializao de Matrizes para maiores detalhes.
Cada item em uma matriz referenciado pela indicao de sua posio numrica na lista,
iniciando pelo nmero 1. O exemplo a seguir declara uma varivel, atribui uma matriz de
trs elementos a ela, e ento exibe um dos elementos e o tamanho da matriz:

Local aLetras

// Declarao da varivel

aLetras := {"A", "B", "C"} // Atribuio da matriz varivel


Alert(aLetras[2])

// Exibe o segundo elemento da matriz

Alert(cValToChar(Len(aLetras))) // Exibe o tamanho da matriz

13

O AdvPl permite a manipulao de matrizes facilmente. Enquanto que em outras


linguagens como C ou Pascal necessrio alocar memria para cada elemento de uma
matriz (o que tornaria a utilizao de "pointeiros" necessria), o AdvPl se encarrega de
gerenciar a memria e torna simples adicionar elementos a uma matriz, utilizando a funo
aAdd:

aAdd(aLetras,"D") // Adiciona o quarto elemento ao final da matriz


Alert(aLetras[4]) // Exibe o quarto elemento
Alert(aLetras[5]) // Erro! No h um quinto elemento na matriz

Matrizes como Estruturas


Uma caracterstica interessante do AdvPl que uma matriz pode conter qualquer coisa:
nmeros, datas, lgicos, caracteres, objetos, etc. E ao mesmo tempo. Em outras palavras, os
elementos de uma matriz no precisam ser necessariamente do mesmo tipo de dado, em
contraste com outras linguagens como C e Pascal.

aFunct1 := {"Pedro",32,.T.}

Esta matriz contem uma string, um nmero e um valor lgico. Em outras linguagens como
C ou Pascal, este "pacote" de informaes pode ser chamado como um "struct" (estrutura
em C, por exemplo) ou um "record" (registro em Pascal, por exemplo). Como se fosse na
verdade um registro de um banco de dados, um pacote de informaes construdo com
diversos campos. Cada campo tendo um pedao diferente de dado.
Suponha que no exemplo anterior, o array aFunct1 contenha informaes sobre o nome de
uma pessoa, sua idade e sua situao matrimonial. Os seguintes #defines podem ser criados
para indicar cada posio dos valores dentro da matriz:

#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3

14

E considere mais algumas matrizes para representar mais pessoas:

aFunct2 := {"Maria" , 22, .T.}


aFunct3 := {"Antnio", 42, .F.}

Os nomes podem ser impressos assim:

Alert(aFunct1[FUNCT_NOME])
Alert(aFunct2[FUNCT_NOME])
Alert(aFunct3[FUNCT_NOME])

Agora, ao invs de trabalhar com variveis individuais, pode-se agrup-las em uma outra
matriz, do mesmo modo que muitos registros so agrupados em uma tabela de banco de
dados:

aFuncts := {aFunct1, aFunct2, aFunct3}

Que equivalente a isso:

aFuncts := { {"Pedro" , 32, .T.}, ;


{"Maria" , 22, .T.}, ;
{"Antnio", 42, .F.} }

aFuncts uma matriz com 3 linhas por 3 colunas. Uma vez que as variveis separadas
foram combinadas em uma matriz, os nomes podem ser exibidos assim:

15

Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount,FUNCT_NOME])
// O acesso a elementos de uma matriz multidimensional
// pode ser realizado tambm desta forma:
// aFuncts[nCount][FUNCT_NOME]
Next nCount

A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a
constante FUNCT_NOME seleciona a primeira coluna daquela linha.

Cuidados com Matrizes


Matrizes so listas de elementos, portanto memria necessria para armazenar estas
informaes. Como as matrizes podem ser multidimensionais, a memria necessria ser a
multiplicao do nmero de itens em cada dimenso da matriz, considerando-se o tamanho
do contedo de cada elemento contido nesta. Portanto o tamanho de uma matriz pode variar
muito.
A facilidade da utilizao de matrizes, mesmo que para armazenar informaes em pacotes
como descrito anteriormente, no compensada pela utilizao em memria quando o
nmero de itens em um array for muito grande. Quando o nmero de elementos for muito
grande deve-se procurar outras solues, como a utilizao de um arquivo de banco de
dados temporrio.
No h limitao para o nmero de dimenses que uma matriz pode ter, mas o nmero de
elementos mximo (independentes das dimenses onde se encontram) de 100000.

16

Inicializando Matrizes
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da
matriz s ser conhecido em tempo de execuo.

Se o tamanho da matriz conhecido


Se o tamanho da matriz conhecido no momento que o programa escrito, h diversas
maneiras de implementar o cdigo.

01 Local nCnt
02 Local aX[10]
03 Local aY := Array(10)
04 Local aZ := {0,0,0,0,0,0,0,0,0,0}
05
06 For nCnt := 1 To 10
17

07

aX[nCnt] := nCnt * nCnt

08 Next nCnt

Este cdigo preenche a matriz com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ...
81, 100. Note que a linha 07 se refere varivel aX, mas poderia tambm trabalhar com aY
ou aZ. O objetivo deste exemplo demonstrar trs modos de criar uma matriz de tamanho
conhecido no momento da criao do cdigo.
Na linha 02 a matriz criada usando aX[10]. Isto indica ao AdvPl para alocar espao para
10 elementos na matriz. Os colchetes [ e ] so utilizados para indicar o tamanho necessrio.
Na linha 03 utilizada a funo array com o parmetro 10 para criar a matriz, e o retorno
desta funo atribudo varivel aY.
Na linha 03 efetuado o que se chama "desenhar a imagen da matriz". Como pode-se notar,
existem dez 0s na lista encerrada entre chaves ({}). Claramente, este mtodo no o
utilizado para criar uma matriz de 1000 elementos. O terceiro mtodo difere dos anteriores
porque inicializa a matriz com os valores definitivos. Nos dois primeiros mtodos, cada
posio da matriz contm um valor nulo (Nil) e deve ser inicializado posteriormente.
A linha 07 demonstra como um valor pode ser atribudo para uma posio existente em
uma matriz especificando o ndice entre colchetes.

Se o tamanho da matriz no conhecido


Se o tamanho da matriz no conhecido at o momento da execuo do programa, h
algumas maneiras de criar uma matriz e adicionar elementos a ela. O exemplo a seguir
ilustra a idia de criao de uma matriz vazia (sem nenhum elemento) e adio de
elementos dinamicamente.

01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
18

07

aAdd(aX,nCnt*nCnt)

08 Next nCnt

A linha 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum
elemento, seu tipo de dado matriz.
Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento.
Na linha 04 est declarada a representao de uma matriz vazia em AdvPl. Mais uma vez,
esto sendo utilizadas as chaves para indicar que o tipo de dados da varivel matriz. Note
que {} uma matriz vazia (tem o tamanho 0), enquanto {Nil} uma matriz com um nico
elemento nulo (tem tamanho 1).
Porque cada uma destas matrizes no contem elementos, a linha 07 utiliza a funo aadd
para adicionar elementos sucessivamente at o tamanho necessrio (especificado por
exemplo na varivel nSize).

Blocos de Cdigo
Blocos de cdigo so um conceito existente h muito tempo em linguagens xBase. No
como algo que apareceu da noite para o dia, e sim uma evoluo progressiva utilizando a
combinao de muitos conceitos da linguagem para a sua implementao.

Um Primeiro Lembrete
O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim
como o operador de atribuio :=.
Assim, ao invs de escrever:

x := 10 // Atribui o valor 10 varivel chamada X


Alert("Valor de x: " + cValToChar(x))

Posde-se escrever:

19

// Atribui e ento exibe o valor da varivel X


Alert("Valor de x: " + cValtoChar(X := 10))

A expresso x:=10 avaliada primeiro, e ento seu resultado (o valor de X, que agora 10)
passada para a funo cvaltochar para a converso para caracter, e em seguida para a
funo alert para a exibio. Por causa desta regra de precedncia possvel atribuir um
valor a mais de uma varavel ao mesmo tempo:

Z := Y := X := 0

Por causa dessa regra, essa expresso avaliada como se fosse escrita assim:

Z := ( Y := (X := 0) )

Apesar do AdvPl avaliar expresses da esquerda para a direita, no caso de atribuies isso
acontece ao contrrio, da direita para a esquerda. O valor atribudo varivel X, que
retorna o valor para ser atribudo varivel Y e assim sucessivamente. Pode-se dizer que o
zero foi "propagado atravs da expresso".

Outro Lembrete
Em AdvPl pode-se juntar diversas linhas de cdigo em uma nica linha fscia do arquivo.
Por exemplo, o cdigo:

If lAchou
Alert("Cliente encontrado!")
Endif

pode ser escrito assim:


20

If lAchou ; Alert("Cliente encontrado!") ; Endif

O ponto-e-vrgula indica ao AdvPl que a nova linha de cdigo est para comear. Pode-se
ento colocar diversas linhas lgicas de cdigo na mesma linha fsica atravs do editor de
texto utilizado.

Apesar da possibilidade de se escrever todo o programa assim, em uma nica linha fsica,
isto no recomendado pois dificulta a legibilidade do programa e, conseqentemente, a
manuteno.

Lista de Expresses
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a
seguir, o smbolo ==> indicar o retorno da expresso aps sua avaliao (seja para atribuir
em uma varivel, exibir para o usurio ou imprimir em um relatrio), que ser impresso em
um relatrio por exemplo.

Duas Linhas de Cdigo


@00,00 PSAY x := 10

==>

10

@00,00 PSAY y := 20

==>

20

Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.

Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula


Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha:

Alert( cValToChar( x := 10 ; y := 20 ) )

==>

10

Apesar desse cdigo se encontrar em uma nica linha fsica, existem duas linhas lgicas
separadas pelo ponto e vrgula. Ou seja, esse cdigo equivalente a:

21

Alert( cValToChar( x := 10 ) )
y := 20

Portanto apenas o valor 10 da varivel x ser passado para as funes cvaltochar e alert
para ser exibido. E o valor 20 apenas ser atribudo varivel y.

Convertendo para uma Lista de Expresses


Quando parnteses so colocados ao redor do cdigo e o sinal de ponto-e-vrgula
substitudo por uma vrgula apenas, o cdigo torna-se uma lista de expresses:

Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) ==> 20

O valor de retorno resultante de uma lista de expresses o valor resultante da ltima


expresso ou elemento da lista. Funciona como se fosse um pequeno programa ou funo,
que retorna o resultado de sua ltima avaliao (efetuadas da esquerda para a direita).
Neste exemplo, a expresso x := 10 avaliada, e ento a expresso y := 20, cujo valor
resultante passado para a funo alert e cvaltochar, e ento exibido. Depois que essa linha
de cdigo executada, o valor de X igual a 10 e o de y igual a 20, e 20 ser exibido.
Teoricamente, no h limitao para o nmero de expresses que podem ser combinadas
em uma lista de expresses. Na prtica, o nmero mximo por volta de 500 smbolos.
Debugar listas de expresses difcil oprque as expresses no esto divididas em linhas de
cdigo fonte, o que torna todas as expresses associadas a uma mesma linha de cdigo. Isto
pode tornar muito difcil determinar onde um erro ocorreu.

Onde Pode-se Utilizar uma Lista de Expresses?


O propsito principal de uma lista de expresses agrup-las em uma nica unidade. Em
qualquer lugar do cdigo AdvPl que uma expresso simples pode ser utilizada, pode-se
utilizar uma lista de expresses. E ainda, pode-se fazer com que vrias coisas aconteam
onde normalmente apenas uma aconteceria.

22

X := 10 ; Y := 20

If X > Y
Alert("X")
Z := 1
Else
Alert("Y")
Z := -1
Endif

Aqui temos o mesmo conceito, escrito utilizando listas de expresses na funo iif:

X := 10 ; Y := 20

iif( X > Y , ;
( Alert("X"), Z := 1 ) , ;
( Alert("Y"), Z := -1 ) )

De Listas de Expresses para Blocos de Cdigo


Considere a seguinte lista de expresses:

Alert( cValToChar( ( x := 10, y := 20 ) ) ) ==> 20

O AdvPl permite criar funes, que so pequenos pedaos de cdigo, como se fosse um
pequeno programa, utilizados para diminuir partes de tarefas mais complexas e reaproveitar
23

cdigo em mais de um lugar num programa. Para maiores detalhes consulte a


documentao sobre a criao de funes em AdvPl. Porm, a idia neste momento que a
lista de expresses utilizada na linha anterior pode ser criada como uma funo:

Function Lista()
X := 10
Y := 20
Return Y

E a linha de exemplo com a lista de expresses pode ser substituda, tendo o mesmo
resultado, por:

Alert( cValToChar( Lista() ) ) ==> 20

Como mencionado anteriormente, uma lista de expresses como um pequeno programa


ou funo. Com poucas mudanas, uma lista de expresses pode se tornar um bloco de
cdigo:

( X := 10 , Y := 20 ) // Lista de Expresses
{|| X := 10 , Y := 20 } // Bloco de Cdigo

Note as chaves {} utilizadas no bloco de cdigo. Ou seja, um bloco de cdigo uma


matriz. Porm na verdade, no uma lista de dados, e sim uma lista de comandos, uma lista
de cdigo.

// Isto uma matriz de dados


A := {10, 20, 30}

24

// Isto um bloco de cdigo, porm funciona como


// se fosse uma matriz de comandos
B := {|| x := 10, y := 20}

Executando um Bloco de Cdigo


Diferentemente de uma matriz, no se pode acessar elementos de um bloco de cdigo
atravs de um ndice numrico. Porm blocos de cdigo so semelhantes a uma lista de
expresses, e a uma pequena funo. Ou seja, podem ser executados. Para a execuo, ou
avaliao, de um bloco de cdigo, deve-se utilizar a funo eval:

nRes := Eval(B) ==> 20

Essa funo recebe como parmero um bloco de cdigo e avalias todas as expresses
contidas neste bloco de cdigo, retornando o resultado da ltima expresso avaliada.

Passando Parmetros
J que blocos de cdigo so como pequenas funes, tambm possvel a passagem de
parmetros para um bloco de cdigo. Os parmetros devem ser informados entre as barras
verticais (||) separados por vrgulas, assim como em uma funo.

B := {| N | X := 10, Y := 20 + N}

Porm deve-se notar que j que o bloco de cdigo recebe um parmetro, um valor deve ser
passado quando o bloco de cdigo for avaliado.

C := Eval(B, 1) ==> 21

Utilizando Blocos de Cdigo

25

Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente so utilizados


para executar tarefas quando eventos de objetos so acionados ou para modificar o
comportamento padro de algumas funes.
Por exemplo, considere a matriz abaixo:

A := {"GARY HALL", "FRED SMITH", "TIM JONES"}

Esta matriz pode ser ordenada pelo primeiro nome, utilizando-se a chamada da funo
asort(A), resultado na matriz com os elementos ordenados dessa forma:

{"FRED SMITH", "GARY HALL", "TIM JONES"}

A ordem padro para a funo asort ascendente. Este comportamento pode ser modificado
atravs da informao de um bloco de cdigo que ordena a matriz de forma descendente:

B := { |X, Y| X > Y }
aSort(A, B)

O bloco de cdigo (de acordo com a documentao da funo asort) deve ser escrito para
aceitar dois parmetros que so os dois elementos da matriz para comparao. Note que o
bloco de cdigo no conhece que elementos est comparando - a funo asort seleciona os
elementos (talvez utilizando o algortmo QuickSort) e passa-os para o bloco de cdigo. O
bloco de cdigo compara-os e retorna verdadeiro (.T.) se se encontram na ordem correta, ou
falso (.F.) se no. Se o valor de retorno for falso, a funo asort ir ento trocar os valores
de lugar e seguir comparando o prximo par de valores.
Ento, no bloco de cdigo anterior, a comparao X > Y verdadeira se os elementos esto
em ordem descendente, o que significa que o primeiro valor maior que o segundo.
Para ordenar a mesma matriz pelo ltimo nome, tambm em orden descendente, pode-se
utilizar o seguinte bloco de cdigo:

26

B := { |X, Y| Substr(X,At(" ",X)+1) > Substr(Y,At(" ",Y)+1) }


Note que este bloco de cdigo procura e compara as partes dos caracteres imediatamente
seguinte a um espao em branco. Depois de utilizar esse bloco de cdigo para a funo
asort, a matriz conter:

{"GARY HALL", "TIM JONES", "FRED SMITH"}

Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, pode-se
utilizar o seguinte bloco de cdigo:

B := { |X, Y| X[1] > Y[1] }

27

Diferenciao entre variveis e nomes de


campos
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou tabela
aberto no momento. Neste caso, o AdvPl privilegiar o campo. Assim uma referncia a um
nome que identifique tanto uma varivel como um campo, resultar no contedo do campo.
Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de
identificao de apelido (->) e um dos dois identificadores de referncia, MEMVAR ou
FIELD.

cRes := MEMVAR->NOME

Esta linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da
varivel de memria chamada NOME.

cRes := FIELD->NOME

28

Neste caso, o valor atribudo varivel cRes ser o valor do campo NOME existente no
arquivo ou tabela aberto na rea atual.
O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela aberto,
para evitar a necessidade de selecionar a rea antes de acessar o contedo de terminado
campo.

cRes := CLIENTES->NOME

Para maiores detalhes sobre abertura de arquivos com atribuio de apelidos, consulte a
documentao sobre acesso a banco de dados ou a documentao da funo dbUseArea.

Operadores Comuns
Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a
uma varivel da forma mais simples. O AdvPl amplia significativamente a utilizao de
variveis atravs do uso de expresses e funes. Uma expresso um conjunto de
operadores e operandos cujo resultado pode ser atribudo a uma varivel ou ento analisado
para a tomada de decises. Por exemplo:

Local nSalario := 1000, nDesconto := 0.10


Local nAumento, nSalLiquido
nAumento := nSalario * 1.20
nSalLiquido := nAumento * (1-nDesconto)

Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps um
aumento. Os operandos de uma expresso podem ser uma varivel, uma constante, um
campo de arquivo ou uma funo.

Operadores Matemticos
Os operadores utilizados em AdvPl para clculos matemticos so:
29

Adio

Subtrao

Multiplicao

Diviso

** ou ^

Exponenciao

Mdulo (Resto da Diviso)

Operadores de String
Os operadores utilizados em AdvPl para tratamento de caracteres so:
+

Concatenao de strings (unio)

Concatenao de strings com eliminao dos brancos finais das strings intermedirias

Comparao de Substrings (contido em)

Operadores Relacionais
Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so:
<

Comparao Menor

>

Comparao Maior

Comparao Igual

==

Comparao Exatamente Igual (para caracteres)

<=

Comparao Menor ou Igual

>=
<>

Comparao Maior ou Igual


Comparao Diferente

30

ou
#
ou
!=

Operadores Lgicos
Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so:
.And.

E lgico

.Or.

OU lgico

.Not. ou !

NO lgico

Operadores de Atribuio
Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so:
=

Atribuio Simples

:=

Atribuio em Linha

+=

Adio e Atribuio em Linha

-=

Subtrao e Atribuio em Linha

*=

Multiplicao e Atribuio em Linha

31

/=

Diviso e Atribuio em Linha

**= ou ^=

Exponenciao e Atribuio em Linha

%=

Mdulo (resto da diviso) e Atribuio em Linha

Atribuio Simples
O sinal de igualdade utilizado para atribuir valor a uma varivel de memria.

nVariavel = 10

Atribuio em Linha
O operador de atribuio em linha caracterizado por dois pontos e o sinal de igualdade.
Tem a mesma funo do sinal de igualdade sozinho, porm aplia a atribuio s variveis.
Com ele pode-se atribuir mais de uma varivel ao mesmo tempo.

nVar1 := nVar2 := nVar3 := 0

Quando diversas variveis so inicializadas em uma mesma linha, a atribuio comea da


direita para a esquerda, ou seja, nVar3 recebe o valro zero inicialmente, nVar2 recebe o
contedo de nVar3 e nVar1 recebe o contedo de nVar2 por final.
Com o operador de atribuio em linha, pode-se substituir as inicializaes individuais de
cada varivel por uma inicializao apenas:

Local nVar1 := 0, nVar2 := 0, nVar3 := 0

por

32

Local nVar1 := nVar2 := nVar3 := 0

O operador de atribuio em linha tambm pode ser utilizado para substituir valores de
campos em um banco de dados.

Atribuio Composta
Os operadores de atribuio composta so uma facilidade da linguagem AdvPl para
expresses de clculo e atribuio. Com eles pode-se economizar digitao:
Operador

Exemplo

Equivalente a

+=

X += Y

X=X+Y

-=

X -= Y

X=X-Y

*=

X *= Y

X=X*Y

/=

X /= Y

X=X/Y

**= ou ^=

X **= Y

X = X ** Y

%=

X %= Y

X=X%Y

Operadores de Incremento/Decremento
A linguagem AdvPl possui operadores para realizar incremento ou decremento de variveis.
Entende-se por incremento aumentar o valor de uma varivel numrica em 1 e entende-se
por decremento diminuir o valor da varivel em 1. Os operadores so:

33

++

Incremento Ps ou Pr-fixado

--

Decremento Ps ou Pr-fixado

Os operadores de decremento/incremento podem ser colocados tanto antes (pr-fixado)


como depois (ps-fixado) do nome da varivel. Dentro de uma expresso, a ordem do
operador muito importante, podendo alterar o resultado da expresso. Os operadores
incrementais so executados da esquerda para a direita dentro de uma expresso.

Local nA := 10
Local nB := nA++ + nA

O valor da varivel nB resulta em 21, pois a primeira referncia a nA (antes do ++)


continha o valor 10 que foi considerado e imediatamente aumentado em 1. Na segunda
referncia a nA, este j possua o valor 11. O que foi efetuado foi a soma de 10 mais 11,
igual a 21. O resultado final aps a execuo destas duas linhas a varivel nB contendo 21
e a varivel nA contendo 11.
No entando:

Local nA := 10
Local nB := ++nA + nA

Resulta em 22, pois o operador incremental aumentou o valor da primeira nA antes que seu
valor fosse considerado.

Operadores Especiais
Alm dos operadores comuns, o AdvPl possui alguns outros operadores ou identificadores.
Estas so suas finalidades:
34

()

Agrupamento ou Funo

[]

Elemento de Matriz

{}

Definio de Matriz, Constante ou Bloco de Cdigo

->

Identificador de Apelido

&

Macrosubstituio

Passagem de parmetro por referncia

Os parnteses so utilizados para agrupar elementos em uma expresso mudando a ordem


de precedncia da avaliao da expresso (segundo as regras matemticas por exemplo).
Tambm servem para envolver os argumentos de uma funo. Veja a documentao sobre
precedncia de operadores para maiores detalhes.
Os colchetes so utilizados para especificar um elemento especfico de uma matriz. Por
exemplo, A[3,2], refere-se ao elemento da matriz A na linha 3, coluna 2.
As chaves so utilizadas para a especificao de matrizes literais ou blocos de cdigo. Por
exemplo, A:={10,20,30} cria uma matriz chamada A com trs elementos.
O smbolo -> identifica um campo de um arquivo diferenciando-o de uma varivel. Por
exemplo, FUNC->nome refere-se ao campo nome do arquivo FUNC. Mesmo que exista
uma varivel chamada nome, o campo nome que ser acessado.
O smbolo & identifica uma avaliao de expresso atravs de macro e visto em detalhes
na documentao sobre macrossubstituio.
O smbolo @ utilizado para indicar que durante a passagem de uma varivel para uma
funo ou procedimento ela seja tomada como uma referncia e no como valor.

35

Ordem de Precedncia dos Operadores


Dependendo do tipo de operador, existe uma ordem de precedncia para a avaliao dos
operandos. Em princpio, todas as operaes com os operadores so realizadas da esquerda
para a direita se eles tiverem o mesmo nvel de prioridade.
A ordem de precedncia, ou nvel de prioridade de execuo, dos operadores em AdvPl :
1. Operadores de Incremento/Decremento pr-fixado
2. Operadores de String
3. Operadores Matemticos
4. Operadores Relacionais
5. Operadores Lgicos
6. Operadores de Atribuio
7. Operadores de Incremento/Decremento ps-fixado
Em expresses complexas com diferentes tipos de operadores, a avaliao seguir essa
sequncia. Caso exista mais de um operador do mesmo tipo (ou seja, de mesmo nvel), a
avaliao se d da esquerda para direita. Para os operadores matemticos entretanto h uma
precedncia a seguir:
1. Exponenciao
2. Multiplicao e Diviso
3. Adio e Subtrao
Considere o exemplo:

Local nResultado := 2+10/2+5*3+2^3

O resultado desta expresso 30, pois primeiramente calculada a exponenciao 2^3(=8),


ento so calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e finalmente as
adies resultando em 2+5+15+8(=30).

Alterao da Precedncia
36

A utilizao de parnteses dentro de uma expresso altera a ordem de precedncia dos


operadores. Operandos entre parnteses so analisados antes dos que se encontram fora dos
parnteses. Se existirem mais de um conjunto de parnteses no-aninhados, o grupo mais a
esquerda ser avaliado primeiro e assim sucessivamente.

Local nResultado := (2+10)/(2+5)*3+2^3

No exemplo acima primeiro ser calculada a exponenciao 2^3(=8). Em seguida


2+10(=12) ser calculado, 2+5(=7) calculado, e finalmente a diviso e a multiplicao
sero efetuadas, o que resulta em 12/7*3+8(=13.14).
Se existirem vrios parnteses aninhados, ou seja, colocados um dentro do outro, a
avaliao ocorrer do parnteses mais intero em direo ao mais externo.

37

Macro Substituio
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado para a
avaliao de expresses em tempo de execuo. Funciona como se uma expresso
armazenada fosse compilada em tempo de execuo, antes de ser de fato executada.
Considere o exemplo:

01 X := 10
02 Y := "X + 1"
03 B := &Y // O contedo de B ser 11

A varivel X atribuda com o valor 10, enquanto a varivel Y atribuda com a string de
caracteres contendo "X + 1".
A terceira linha utiliza o operador de macro. Esta linha faz com que o nmero 11 seja
atribudo varivel B. Pode-se perceber que esse o valor resultante da expresso em
formato de caractere contida na varivel Y.
Utilizando-se uma tcnica matemtica elementar, a substituio, temos que na segunda
linha, Y definido como "X + 1", ento pode-se substituir Y na terceira linha:

03 B := &"X + 1"

O operador de macro cancela as aspas:

38

03 B := X + 1

Pode-se perceber que o operador de macro remove as aspas, o que deixa um pedao de
cdigo para ser executado. Deve-se ter em mente que tudo isso acontece em tempo de
eecuo, o que torna tudo muito dinmico. Uma utilizao interessante criar um tipo de
calculadora, ou avaliador de frmulas, que determina o resultado de algo que o usurio
digita.

O operador de macro tem uma limitao: variveis referenciadas dentro da string de


caracteres (X nos exemplos anteriores) no podem ser locais.

39

Controlando o Fluxo
O AdvPl suporta vrias estruturas de controle que permitem mudar a seqncia de fluxo de
execuo de um programa. Estas estruturas permitem a execuo de cdigo baseado em
condies lgica e a repetio da execuo de pedaos de cdigo qualquer nmero de
vezes.
Em AdvPl, todas as estruturas de controle podem ser "aninhadas" dentro de todas as demais
estruturas contanto que estejam aninhadas propriamente. Estruturas de controle tm um
identificador de incio e um de fim, e qualquer estrutura aninhada deve se encontrar entre
estes identificadores.
Tambm existem estruturas de controle para determinar que elementos, comandos, etc em
um programa sero compilados. Estas so as diretivas do pr-processador #ifdef...#endif e
#ifndef...#endif. Consulte a documentao sobre o pr-processador para maiores detalhes.
As estruturas de controle em AdvPl esto divididas em Estruturas de Repetio e Estruturas
de Deciso.

40

Repetio de Comandos
Estruturas de repetio so deseginadas para executar uma seo de cdigo mais de uma
vez. Por exemplo, imagiando-se a existncia de uma funo para imprimir um relatrio,
pode-se desejar imprimi-lo quatro vezes. Claro, pode-se simplesmente chamar a funo de
impresso quatro vezes em seqncia, mas isto se tornaria pouco profissional e no
resolveria o problema se o nmero de relatrios fosse varivel.
Em AdvPl existem dois comandos para a repetio de sees de cdigo. O comando
FOR...NEXT e o comando WHILE...ENDDO.

O Comando FOR...NEXT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma seo de
cdigo em um nmero determinado de vezes.
Sintaxe
FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos...
[EXIT]
[LOOP]
NEXT
Parmetros
Variavel

Especifica uma varivel ou um elemento de uma matriz para atuar como


um contador. A varivel ou o elemento da matriz no precisa ter sido
declarado antes da execuo do comando FOR...NEXT. Se a varivel no
existir, ser criada como uma varivel privada.

41

nValorInicial TO
nValorFinal

nValorInicial o valor inicial para o contador; nValorFinal o valor final


para o contador. Pode-se utilizar valores numricos literais, variveis ou
expresses, contanto que o resultado seja do tipo de dado numrico.

STEP
nIncremento

nIncremento a quandidade que ser incrementada ou decrementada no


contador aps cada execuo da seo de comandos. Se o valor de
nIncremento for negativo, o contador ser decrementado. Se a clusula
STEP for omitida, o contador ser incrementado em 1. Pode-se utilizar
valores numricos literais, variveis ou expresses, contanto que o
resultado seja do tipo de dado numrico.

Comandos

Especifica um ou mais instrues de comando AdvPl que sero


executadas.

EXIT

Transfere o controle de dentro do comando FOR...NEXT para o comando


imediatamente seguinte ao NEXT, ou seja, finaliza a repetio da seo
de comandos imediatamente. Pode-se colocar o comando EXIT em
qualquer lugar entre o FOR e o NEXT.

LOOP

Retorna o controle diretamente para a clusula FOR sem executar o


restante dos comandos entre o LOOP e o NEXT. O contador
incrementadou ou decrementado normalmente, como se o NEXT tivesse
sido alcanado. Pode-se colocar o comando LOOP em qualquer lugar
entre o FOR e o NEXT.

Comentrios
Uma varivel ou um elemento de uma matriz utilizado como um contador para especificar
quantas vezes os comandos AdvPl dentro da estrutura FOR...NEXT so executados. Os
comandos AdvPl depois do FOR so executados at que o NEXT seja alcanado. O
contador (Variavel) ento incrementado ou decremantado com o valor em nIncremento
(se a clusula STEP for omitida, o contador incrementado em 1). Ento, o contador
comparado com o valor em nValorFinal. Se for menor ou igual ao valor em nValorFinal, os
comandos seguintes ao FOR so executados novamente. Se o valor for maior que o contido
em nValorFinal, a estrutura FOR...NEXT terminada e o programa continua a execuo no
primeiro comando aps o NEXT.
Os valores de nValorInicial, nValorFinal e nIncremento so apenas considerados
inicialmente. Entretanto, mudar o valor da varivel utilizada como contador dentro da
estrutura afetar o nmero de vezes que a repetio ser executada. Se o valor de
nIncremento negativo e o valor de nValorInicial maior que o de nValorFinal, o contador
ser decrementado a cada repetio.
Exemplo

42

Local nCnt
Local nSomaPar := 0

For nCnt := 0 To 100 Step 2


nSomaPar += nCnt
Next

Alert( "A soma dos 100 primeiros nmeros pares : " + ;


cValToChar(nSomaPar) )

Return

Este exemplo imprime a soma dos 100 primerios nmeros pares. A soma obitida atravs
da repetio do clculo utilizando a prpria varivel de contador. Como a clusula STEP
est sendo utilizada, a varivel nCnt ser sempre incrementada em 2. E como o contador
comea com 0, seu valor sempre ser um nmero par.

O Comando WHILE...ENDDO
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma
seo de cdigo enquanto uma determinada expresso resultar em verdadeiro (.T.).
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]

43

[LOOP]
ENDDO
Parmetros
lExpressao

Especifica uma expresso lgica cujo valor determina quando os


comandos entre o WHILE e o ENDDO so executados. Enquanto o
resultado de lExpressao for avaliado como verdadeiro (.T.), o conjunto de
comandos so executados.

Comandos

Especifica um ou mais instrues de comando AdvPl que sero executadas


enquanto lExpressao for avaliado como verdadeiro (.T.).

EXIT

Transfere o controle de dentro do comando WHILE...ENDDO para o


comando imediatamente seguinte ao ENDDO, ou seja, finaliza a repetio
da seo de comandos imediatamente. Pode-se colocar o comando EXIT
em qualquer lugar entre o WHILE e o ENDO.

LOOP

Retorna o controle diretamente para a clusula WHILE sem executar o


restante dos comandos entre o LOOP e o ENDDO. A expresso em
lExpressao reavaliada para a deciso se os comandos continuaro sendo
executados.

Comentrios
Os comandos entre o WHILE e o ENDDO so executados enquanto o resultado da
avaliao da expresso em lExpressao permanecer verdadeiro (.T.). Cada palavra chave
WHILE deve ter uma palavra chave ENDDO correspondente.
Exemplo
Local nNumber := nAux := 350

nAux := Int(nAux / 2)

While nAux > 0


nSomaPar += nCnt
Next
44

Alert( "A soma dos 100 primeiros nmeros pares : " + ;


cValToChar(nSomaPar) )

Return

Desviando a Execuo
Estruturas de desvio so deseginadas para executar uma seo de cdigo se determinada
condio lgica resultar em verdadeiro (.T.). Em AdvPl existem dois comandos para
execuo de sees de cdigo de acordo com avaliaes lgicas. O comando IF...ENDIF e
o comando DO CASE...ENDCASE.

O Comando IF...ENDIF
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
Sintaxe
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Parmetros
lExpressao

Especifica uma expresso lgica que avaliada. Se lExpressao resultar em


verdadeiro (.T.), qualquer comando seguinte ao IF e antecedente ao ELSE

45

ou ENDIF (o que ocorrer primeiro) ser executado.


Se lExpressao resultar em falso (.F.) e a clusula ELSE for definida,
qualquer comando aps essa clusula e anterior ao ENDIF ser executada.
Se a clusula ELSE no for definida, todos os comandos entre o IF e o
ENDIF so ignorados. Neste caso, a execuo do programa continua com
o primeiro comando seguinte ao ENDIF.
Comandos

Conjunto de comandos AdvPl que sero executados dependendo da


avaliao da expresso lgica em lExpressao.

Comentrios
Pode-se aninhar um bloco de comando IF...ENDIF dentro de outro bloco de comando
IF...ENDIF. Porm, para a avaliao de mais de uma expresso lgica, deve-se utilizar o
comando DO CASE...ENDCASE.
Exemplo
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return

O Comando DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em
verdadeiro (.T.).
Sintaxe
DO CASE
CASE lExpressao1
46

Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
Parmetros
Quando a primeira expresso CASE resultante em verdadeiro (.T.) for
encontrada, o conjunto de comandos seguinte executado. A execuo
CASE
lExpressao1 do conjunto de comandos continua at que a prxima clusula CASE,
Comandos... OTHERWISE ou ENDCASE seja encontrada. Ao terminar de executar
esse conjunto de comandos, a execuo continua com o primeiro
comando seguinte ao ENDCASE.
Se uma expresso CASE resultar em falso (.F.), o conjunto de comandos
seguinte a esta at a prxima clusula ignorado.
Apenas um conjunto de comandos executado. Estes so os primeiros
comandos cuja expresso CASE avaliada como verdadeiro (.T.). Aps
a execuo, qualquer outra expresso CASE posterior ignorada
(mesmo que sua avaliao resultasse em verdadeiro).
OTHERWISE
Commandos

Se todas as expresses CASE forem avaliadas como falso (.F.), a


clusula OTHERWISE determina se um conjunto adicional de comandos
deve ser executado. Se essa clusula for incluida, os comandos seguintes
sero executados e ento o programa continuar com o primeiro
comando seguinte ao ENDCASE. Se a clusula OTHERWISE for
omitida, a execuo continuar normalmente aps a clusula
ENDCASE.

Comentrios

47

O Comando DO CASE...ENDCASE utilizado no lugar do comando IF...ENDIF quando


um nmero maior do que uma expresso deve ser avaliada, substituindo a necessidade de
mais de um comando IF...ENDIF aninhados.
Exemplo
Local nMes

:= Month(Date())

Local cPeriodo := ""

DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE

Return

48

tFont
Classe que encapsula fonte de edio.

Hierarquia
tFontAbs -> tFont

Descrio
Utilize objeto tFont para modificar a fonte padro de controles visuais.

Mtodos
New
Descrio
Construtor do objeto.
Sintaxe
New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8], [alItalic],
[alUnderline])
Parmetros
acName

Caractere, opcional. Nome da fonte, o padro Arial.

49

nPar2

Reservado.

anHeight

Numrico, opcional. Tamanho da fonte. O padro -11.

lPar4

Reservado.

alBold

Lgico, opcional. Se .T. o estilo da fonte ser negrito.

nPar6

Reservado.

lPar7

Reservado.

nPar8

Reservado.

alItalic

Lgico, opcional. Se .T. o estilo da fonte ser itlico.

alUnderline

Lgico, opcional. Se .T. o estilo da fonte ser sublinhado.

Retorno
O objeto criado.

Exemplo
#include protheus.ch

User Function Teste()

Local oDlg, oSay, oFont:= TFont():New(Courier New,,-14,.T.)


DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL
// apresenta o tSay com a fonte Courier New //
oSay:= tSay():New(10,10,{||para exibir},oDlg,,oFont,,;
,,.T.,CLR_WHITE,CLR_RED,100,20)
oSay:lTransparent:= .T.

50

ACTIVATE MSDIALOG oDlg CENTERED

Return

MSDialog
Classe de dilogo de entrada de dados.

Hierarquia
tSrvObject -> tWindow -> tDialog -> MSDialog

Caractersticas
MSDialog deve ser utilizada como padro de janela para entrada de dados. MSDialog um
tipo de janela dilogo modal, isto , no permite que outra janela ativa receba dados
enquanto esta estiver ativa.

Propriedades
Vide classes ancestrais.

Mtodos
New
51

Descrio
Mtodo construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8],
[nPar9], [anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16],
[lPar17])
Parmetros
anTop

Numrico, opcional. Coordenada vertical superior em pixels ou


caracteres.

anLeft

Numrico, opcional. Coordenada horizontal esquerda em pixels ou


caracteres.

anBottom
anRight
acCaption
cPar6
nPar7
lPar8
nPar9
anClrText
anClrBack
oPar12
aoWnd
alPixel
oPar15
oPar16
lPar17

Numrico, opcional. Coordenada vertical inferior em pixels ou


caracteres.
Numrico, opcional Coordenada horizontal direita em pixels ou
caracteres.
Caractere, opcional. Ttulo do dilogo.
Reservado.
Reservado.
Reservado.
Reservado.
Cor do texto.
Cor do fundo.
Reservado.
Objeto, opcional. Janela pai do dilogo, geralmente a janela principal
do programa.
Se .T. considera as coordenadas informadas em pixels, se .F. considera
as coordenadas em caracteres.
Reservado.
Reservado.
Reservado.

Retorno
O dilogo construdo.
52

Exemplo
#include protheus.ch

User Function Teste()

// cria dilogo
Local oDlg:=MSDialog():New(10,10,300,300,Meu dialogo;
,,,,,CLR_BLACK,CLR_WHITE,,,.T.)

// ativa dilogo centralizado


oDlg:Activate(,,,.T.,{||msgstop(validou!),.T.},;
,{||msgstop(iniciando) )

Return

53

MsGetDados
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em um
vetor.
Caractersticas
A MsGetDados precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.

Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao
que esta sendo executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no
formato:
Elemento

Contedo

Ttulo
54

Rotina

Reservado

Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 - alterao; 5 excluso)

Acesso relacionado a rotina, se esta posio no for informada nenhum acesso


ser validado

aHeader
Vetor com informaes das colunas no formato:
Elemento

Contedo

Ttulo

Campo

Mscara

Tamanho

Decimal

Validao

Reservado

Tipo

Reservado

10

Reservado

55

aCols
Vetor com as linhas a serem editadas. As colunas devem ser construdas com base no
aHeader mais uma ultima com valor lgico que determina se a linha foi excluda.

lRefresh
Varivel tipo lgica para uso reservado.
A MsGetDados cria a varivel publica n que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDados (cLinhaOk, cTudoOk, ...) no
podero ser declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver
cadastrado no Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
Cria o objeto MsGetDados.
Sintaxe
MSGETDADOS():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [
cTudoOk ], [ cIniCpos ], [ lApagar ], [ aAlter ], [ uPar1 ], [ lVazio ], [ nMax ], [ cCampoOk
], [ cSuperApagar ], [ uPar2 ], [ cApagaOk ], [ oWnd ] ) -> objeto
Argumentos

Descrio

nSuperior

Distancia entre a MsGetDados e o extremidade superior do objeto


que a contm.

nEsquerda

Distancia entre a MsGetDados e o extremidade esquerda do objeto


que a contm.

nInferior

Distancia entre a MsGetDados e o extremidade inferior do objeto


que a contm.
56

nDireita

Distancia entre a MsGetDados e o extremidade direita do objeto que


a contm.

nOpc

Posio do elemento do vetor aRotina que a MsGetDados usar


como referencia.

cLinhaOk

Funo executada para validar o contexto da linha atual do aCols.

cTudoOk

Funo executada para validar o contexto geral da MsGetDados


(todo aCols).

cIniCpos

Nome dos campos do tipo caracter que utilizaro incremento


automtico. Este parmetro deve ser no formato +<nome do
primeiro campo>+<nome do segundo campo>+....

lApagar

Habilita deletar linhas do aCols. Valor padro falso.

aAlter

Vetor com os campos que podero ser alterados.

uPar1

Parmetro reservado.

lVazio

Habilita validao da primeira coluna do aCols para esta no poder


estar vazia. Valor padro falso.

nMax

Nmero mximo de linhas permitidas. Valor padro 99.

cCampoOk

Funo executada na validao do campo.

cSuperApagar

Funo executada quando pressionada as teclas <Ctrl>+<Delete>.

uPar2

Parmetro reservado.

cApagaOk

Funo executada para validar a excluso de uma linha do aCols.

oWnd

Objeto no qual a MsGetDados ser criada.

Retorno
Objeto.

57

ForceRefresh
Descrio
Atualiza a MsGetDados com o aCols e posiciona na primeira linha.

Sintaxe

oObjeto:ForceRefresh()

Hide
Descrio
Esconde a MsGetDados.

Sintaxe

oObjeto:Hide()

Show
Descrio
Mostra a MsGetDados.

Sintaxe

58

oObjeto:Show()
Exemplo
User Function Exemplo()
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
Aadd(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;

59

SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
EndIf
DbSkip()
End
Aadd(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL
oGetDados := MSGETDADOS():NEW(05, 05, 145, 195, 4, "U_LINHAOK",
"U_TUDOOK", "+A1_COD", .T., {"A1_NOME"}, , .F., 200, "U_FIELDOK",
"U_SUPERDEL", , "U_DELOK", oDlg)
ACTIVATE MSDIALOG oDlg CENTERED
Return

User Function LINHAOK()

60

ApMsgStop("LINHAOK")
Return .T.

User Function TUDOOK()


ApMsgStop("LINHAOK")
Return .T.

User Function DELOK()


ApMsgStop("DELOK")
Return .T.

User Function SUPERDEL()


ApMsgStop("SUPERDEL")
Return .T.

User Function FIELDOK()


ApMsgStop("FIELDOK")
Return .T.

61

MXsGetDb
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em uma
tabela temporria.
Caractersticas
A MsGetDB precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.

Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao
que esta sendo executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no
formato:
Elemento

Contedo

Ttulo

Rotina

Reservado

Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 - alterao; 5 excluso)

Acesso relacionado a rotina, se esta posio no for informada nenhum acesso


ser validado

aHeader
Vetor com informaes das colunas no formato:
Elemento

Contedo

Ttulo

62

Campo

Mscara

Tamanho

Decimal

Validao

Reservado

Tipo

Reservado

10

Reservado

lRefresh
Varivel tipo lgica para uso reservado.
A tabela temporria utilizada pela MsGetDB dever ser criada com base no aHeader mais
um ltimo campo tipo lgico que determina se a linha foi excluda.
A MsGetDB cria a varivel publica nBrLin que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDB (cLinhaOk, cTudoOk, ...) no
podero ser declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver
cadastrado no Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
Cria o objeto MsGetDB.
Sintaxe
63

MSGETDB():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [


cTudoOk ], [ cIniCpos ], [ lApagar ], [ aAlter ], [ nCongelar ], [ lVazio ], [ uPar1 ], cTRB, [
cCampoOk ], [ lCondicional ], [ lAdicionar ], [ oWnd ], [ lDisparos ], [ uPar2 ], [
cApagarOk ], [ cSuperApagar ] ) -> objeto
Argumentos
Descrio
nSuperior

Distancia entre a MsGetDB e o extremidade superior do objeto que a


contm.

nEsquerda

Distancia entre a MsGetDB e o extremidade esquerda do objeto que


a contm.

nInferior

Distancia entre a MsGetDB e o extremidade inferior do objeto que a


contm.

nDireita

Distancia entre a MsGetDB e o extremidade direita do objeto que a


contm.

nOpc

Posio do elemento do vetor aRotina que a MsGetDB usar como


referncia.

cLinhaOk

Funo executada para validar o contexto da linha atual do aCols.

cTudoOk

Funo executada para validar o contexto geral da MsGetDB (todo


aCols).

cIniCpos

Nome dos campos do tipo caracter que utilizaro incremento


automtico. Este parmetro deve ser no formato +<nome do
primeiro campo>+<nome do segundo campo>+....

lApagar

Habilita a opo de deletar linhas do aCols. Valor padro falso.

aAlter

Vetor com os campos que podero ser alterados.

nCongelar

Indica qual coluna no ficara congelada na exibio.

lVazio

Habilita validao da primeira coluna do aCols para esta no poder


estar vazia. Valor padro falso.

uPar1
cTRB
cCampoOk

Parmetro reservado.
Alias da tabela temporria.
Funo executada na validao do campo.

64

lConditional

lAdacionar
oWnd

Reservado

Indica se a MsGetDB ira criar uma linha em branco


automaticamente quando for incluso.
Objeto no qual a MsGetDB ser criada.

lDisparos

Indica se ser utilizado o Dicionrio de Dados para consulta padro,


inicializao padro e gatilhos.

uPar2

Parmetro reservado.

cApagarOk

Funo executada para validar a excluso de uma linha do aCols.

cSuperApagar

-Funo executada quando pressionada as teclas <Ctrl>+<Delete>.

Retorno
Objeto.

ForceRefresh
Descrio
Atualiza a MsGetDB com a tabela e posiciona na primeira linha.
Sintaxe
ForceRefresh()
Exemplo
User Function Exemplo()
Local nI
Local oDlg
Local oGetDB

65

Local nUsado := 0
Local aStruct := {}
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluit", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
Aadd(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;

66

SX3->X3_TIPO,;
"",;
"" })
Aadd(aStruct,{SX3->X3_CAMPO,;
SX3->X3_TIPO,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
DbSkip()
End
Aadd(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL
oGetDB := MSGETDB():NEW(05, 05, 145, 195, 3, "U_LINHAOK", "U_TUDOOK",
"+A1_COD", .T., {"A1_NOME"}, 1, .F., , cCriaTrab, "U_FIELDOK", , .T., oDlg,
.T., ,"U_DELOK", "U_SUPERDEL")
ACTIVATE MSDIALOG oDlg CENTERED
DbSelectArea(cCriaTrab)
DbCloseArea()
Return

User Function LINHAOK()


ApMsgStop("LINHAOK")

67

Return .T.

User Function TUDOOK()


ApMsgStop("LINHAOK")
Return .T.

User Function DELOK()


ApMsgStop("DELOK")
Return .T.

User Function SUPERDEL()


ApMsgStop("SUPERDEL")
Return .T.

User Function FIELDOK()


ApMsgStop("FIELDOK")
Return .T.

68

MsmGet
Conjunto de objetos tipo MsGet/MsCombo para cadastramento de dados baseado no
Dicionrio de Dados.
Caractersticas
A MsMGet tambm poder criada a partir da funo Enchoice a qual recebe os mesmos
parmetros do mtodo New porm no retorna o objeto criado.
A MsMGet se baseia no Dicionrio de Dados para verificar campos obrigatrios,
validaes, gatilhos, consulta padro etc. assim como para a criao das Pastas de Cadastro.
A MsMGet pode usar tanto variveis de memria do tipo Private como diretamente os
campos da tabela a que se refere.
Mtodos

69

New
Descrio
Cria o objeto MsMGet.
Sintaxe
MSMGET():NEW( cAlias, nReg, nOpc, [ uPar1 ], [ uPar2 ], [ uPar3 ], [ aACho ], [ aPos ],
[ aCpos ], [ uPar4 ], [ uPar5 ], [ uPar6 ], [ uPar7 ], [ oWnd ], [ uPar8 ], [ lMemoria ], [
lColuna ], [ uPar9 ], [ lSemPastas ] ) -> objeto
Argumentos

Descrio

cAlias

Alias do dados a serem cadastrados.

nReg

Nmero do registro da tabela a ser editado.

uPar1

Parmetro reservado.

uPar2

Parmetro reservado.

uPar3

Parmetro reservado.

aAcho

Vetor com os campos que sero apresentados pela MsMGet.

aPos

Vetor com as coordenadas onde a MsMGet ser criada no formato


{coord. superior, coord. esquerda, coord. direita, coord.
inferior}.Funo executada para validar o contexto da linha atual do
aCols.

aCpos

Vetor com os campos que podero ser alterados.

uPar4

Parmetro reservado. Nome dos campos do tipo caracter que utilizaro


incremento automtico. Este parmetro deve ser no formato +<nome
do primeiro campo>+<nome do segundo campo>+....

uPar5

Parmetro reservado.

uPar6

Parmetro reservado.

uPar7

Parmetro reservado.

70

oWnd

Objeto no qual a MsMGet ser criada.

uPar8

Parmetro reservado.

lMemoria

Indica se ser usado variveis de memria ou os campos da tabela para


cadastramento dos dados. Valor padro falso.

lColuna

Indica se a MsMGet sera apresentada com um objeto por linha (uma


coluna). Valor padro falso. Parmetro reservado.

uPar9

Parmetro reservado.

lSemPastas

Indica se no ser usado as Pastas de Cadastro na MsMGet. Funo


executada para validar a excluso de uma linha do aCols.

Retorno
Objeto.

Refresh
Descrio
Atualiza os objetos contidos na MsMGet.
Sintaxe
Refresh()

Hide
Descrio
Esconde a MsMGet.
Sintaxe

71

Hide()

Show
Descrio
Mostra a MsMGet.
Sintaxe
Show()

Exemplo
User Function Exemplo()
Local i
Local oDlg
Local oMsMGet
Local lInit
Local cCampo
DbSelectArea("SA1")
For i := 1 To FCount()
cCampo := Field(i)
lInit := .F.
If ExistIni(cCampo)
lInit := .t.
M->&(cCampo) := InitPad(SX3->X3_RELACAO)
If ValType(M->&(cCampo)) = "C"

72

M->&(cCampo) := Padr(M->&(cCampo),SX3->X3_TAMANHO)
EndIf
If M->&(cCampo) == NIL
lInit := .F.
EndIf
EndIf
If !lInit
M->&(cCampo) := FieldGet(i)
If ValType(M->&(cCampo)) = "C"
M->&(cCampo) := Space(Len(M->&(cCampo)))
ElseIf ValType(M->&(cCampo)) = "N"
M->&(cCampo) := 0
ElseIf ValType(M->&(cCampo)) = "D"
M->&(cCampo) := CtoD(" / / ")
ElseIf ValType(M->&(cCampo)) = "L"
M->&(cCampo) := .F.
EndIf
EndIf
Next
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 19,80
MSMGET():NEW("SA1",0,3,,,,,,,,,,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED ON INIT EnchoiceBar(oDlg,{|| oDlg:End()},
{|| oDlg:End()})
Return

73

MBrowse
Monta um Browse com menu de opes.

74

Sintaxe
MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [
uPar5 ], [ cFun ], [ nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) ->
nil
Argumento

Obrigat.

Tipo

Descrio

uPar1

No

Parmetro reservado.

uPar2

No

Parmetro reservado.

uPar3

No

Parmetro reservado.

uPar4

No

Parmetro reservado.

cAlias

Sim

Alias do arquivo a ser visualizado no browse.

aFixos

No

Contendo os nomes dos campos fixos pr-definidos pelo


programador, obrigando a exibio de uma ou mais colunas.

cCpo

No

Campo a ser validado se est vazio ou no para exibio do bitmap


de status.

uPar5

No

Parmetro reservado.

cFun

No

Funo que retornar um valor lgico para exibio do bitmap de


status.

nPadrao

No

Nmero da rotina a executada quando for efetuado um duplo clique


em um registros do browse. Caso no seja informado o padro ser
executada visualizao ou pesquisa.

aCores

No

Este vetor possui duas dimenses, a primeira a funo de


validao para exibio do bitmap de status, e a segunda o bitmap a
ser exibido.

cExpIni

No

Funo que retorna o contedo inicial do filtro baseada na chave de


ndice selecionada.

cExpFim

No

Funo que retorna o contedo final do filtro baseada na chave de


ndice selecionada.

nCongela

No

Coluna a ser congelado no browse.

Descrio
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da
chamada da funo.

75

Apenas um dos parmetros ( cCpo, cFun, aColors ) deve ser informado.


(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser
executada (incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura
composta de 5 (cinco) dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1
- pesquisa; 2 - visualizao; 3 - incluso; 4 - alterao; 5 - excluso); 5 Acesso
relacionado a rotina, se esta posio no for informada no validar os acessos.
Exemplo
Private cCadastro := 'Cadastro de Clientes'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 },;
{ 'Visualizar' , 'AxVisual' , 0, 2 },;
{ 'Incluir' , 'AxInclui' , 0, 3 },;
{ 'Alterar' , 'AxAltera' , 0, 4 },;
{ 'Excluir' , 'AxExcluir', 0, 5 }}
MBROWSE( ,,,, 'SA1',, '!A1_COD',,, 4 )

76

IncProc
Incrementa rgua de progresso.
Sintaxe
INCPROC() -> nil
Descrio
Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc()
Exemplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
Processa( bAcao, cTitulo, cMsg, lAborta )
Return

Static Function Exemplo(lFim)


Local nI
ProcRegua(10000)
For nI := 1 To 10000

77

If lFim
Exit
EndIf
INCPROC()
Next nI
Return

78

25/11/2003

EXERCCIOS
Analisar a situao e verificar a possibilidade da utilizao de Pontos de Entrada,
validaes de usurio ou gatilhos.
1) Necessito limitar o nmero de Itens no Pedido de Venda, de modo que o
usurio informe apenas 6 Itens por Pedido, nao mais que isso. Dever ser
mostrada uma mensagem informando a limitao ao usurio.

2) No Documento de Entrada as NFs com valores maiores que R$ 5.000,00


(cinco mil reais) devero ser incluidas apenas aps a digitao de um usurio
e senha de validao (usurio: Master // senha: teste).

3) No Pedido de Vendas o Valor Unitrio dever ser alterado apenas pelo


usurio Administrador.

79

Anda mungkin juga menyukai