Escolar Documentos
Profissional Documentos
Cultura Documentos
Advpl
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.
Apostila
Advpl
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
Apostila
Advpl
A -> Array (matriz)
O -> Objeto
U -> Sem definio
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
wnRel
cbCont
Cabec1
Cabec2
Cabec3
Tipo
Local
Local
Local
Local
Local
Tamanho
Local
cDesc1
cDesc2
Local
Local
Contedo
Nome default do relatrio em disco
Contador
1 linha do cabealho do relatrio
2 linha do cabealho do relatrio
3 linha do cabealho do relatrio
Tamanho do Relatrio (P = Pequeno 80 colunas, M = Mdio 132
colunas, G = Grande, 220 colunas)
1 linha da descrio do relatrio
2 linha da descrio do relatrio
Apostila
Advpl
cDesc3
Limite
Titulo
aReturn
Nomeprog
cString
Local
Local
Local
Private
Private
Private
Li
Private
m_pag
Private
aOrd
Private
nLastKey
cPerg
Private
Private
aLinha
Private
Apostila
Advpl
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
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 ('):
Apostila
Advpl
"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.
Apostila
Advpl
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.
7
Apostila
Advpl
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:
Apostila
Advpl
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
Store 10 To nPercentual
nResultado := 250 * (1 + (nPercentual / 100))
ou
Apostila
Advpl
ou
10
Apostila
Advpl
09 xVariavel := .T. // Agora a varivel lgica
10 If xVariavel
11
12 Else
13
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
11
Apostila
Advpl
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.
12
Apostila
Advpl
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
Apostila
Advpl
Alert(aLetras[4]) // Exibe o quarto elemento
Alert(aLetras[5]) // Erro! No h um quinto elemento na matriz
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
Apostila
Advpl
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 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:
Local nCount
For nCount := 1 To Len(aFuncts)
15
Apostila
Advpl
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.
16
Apostila
Advpl
Inicializando Matrizes
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da
matriz s ser conhecido em tempo de execuo.
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
07
17
Apostila
Advpl
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.
01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
18
Apostila
Advpl
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:
Posde-se escrever:
19
Apostila
Advpl
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
20
Apostila
Advpl
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.
==>
10
@00,00 PSAY y := 20
==>
20
Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.
10
21
Apostila
Advpl
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:
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.
22
Apostila
Advpl
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.
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 ) )
23
Apostila
Advpl
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
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:
( X := 10 , Y := 20 ) // Lista de Expresses
{|| X := 10 , Y := 20 } // Bloco de Cdigo
24
Apostila
Advpl
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.
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}
25
Apostila
Advpl
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
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:
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
26
Apostila
Advpl
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:
Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, pode-se
utilizar o seguinte bloco de cdigo:
27
Apostila
Advpl
28
Apostila
Advpl
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
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:
Apostila
Advpl
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:
+
*
/
** ou ^
%
Adio
Subtrao
Multiplicao
Diviso
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
30
Apostila
Advpl
>= Comparao Maior ou Igual
<> Comparao Diferente
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:
=
:=
+=
-=
*=
/=
**= ou ^=
%=
Atribuio Simples
Atribuio em Linha
Adio e Atribuio em Linha
Subtrao e Atribuio em Linha
Multiplicao e Atribuio em Linha
Diviso e Atribuio em Linha
Exponenciao e Atribuio em Linha
Mdulo (resto da diviso) e Atribuio em Linha
31
Apostila
Advpl
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.
por
32
Apostila
Advpl
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
+=
-=
*=
/=
**= ou ^=
%=
Exemplo
X += Y
X -= Y
X *= Y
X /= Y
X **= Y
X %= Y
Equivalente a
X=X+Y
X=X-Y
X=X*Y
X=X/Y
X = 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:
++ Incremento Ps ou Pr-fixado
-- Decremento Ps ou Pr-fixado
33
Apostila
Advpl
Local nA := 10
Local nB := nA++ + nA
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:
()
[]
{}
->
&
@
Agrupamento ou Funo
Elemento de Matriz
Definio de Matriz, Constante ou Bloco de Cdigo
Identificador de Apelido
Macrosubstituio
Passagem de parmetro por referncia
34
Apostila
Advpl
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.
Apostila
Advpl
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:
Alterao da Precedncia
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.
36
Apostila
Advpl
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"
37
Apostila
Advpl
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"
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.
38
Apostila
Advpl
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.
39
Apostila
Advpl
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.
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.
40
Apostila
Advpl
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
nValorInicial TO
nValorFinal
STEP
nIncremento
Comandos
EXIT
LOOP
Apostila
Advpl
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
Local nCnt
Local nSomaPar := 0
Return
42
Apostila
Advpl
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]
[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
43
Apostila
Advpl
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)
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
44
Apostila
Advpl
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
ou ENDIF (o que ocorrer primeiro) ser executado.
Comandos
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
45
Apostila
Advpl
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
Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
46
Apostila
Advpl
Parmetros
CASE
lExpressao1
Comandos...
OTHERWISE
Commandos
Comentrios
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())
DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
47
Apostila
Advpl
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
tFont
48
Apostila
Advpl
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
nPar2
anHeight
lPar4
alBold
nPar6
lPar7
nPar8
alItalic
alUnderline
Retorno
O objeto criado.
Exemplo
49
Apostila
Advpl
#include protheus.ch
Return
MSDialog
50
Apostila
Advpl
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
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
Numrico, opcional. Coordenada vertical superior em pixels ou
caracteres.
Numrico, opcional. Coordenada horizontal esquerda em pixels ou
anLeft
caracteres.
Numrico, opcional. Coordenada vertical inferior em pixels ou
anBottom
caracteres.
Numrico, opcional Coordenada horizontal direita em pixels ou
anRight
caracteres.
acCaption
Caractere, opcional. Ttulo do dilogo.
cPar6
Reservado.
anTop
51
Apostila
Advpl
nPar7
lPar8
nPar9
anClrText
anClrBack
oPar12
aoWnd
alPixel
oPar15
oPar16
lPar17
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.
Exemplo
#include protheus.ch
// cria dilogo
Local oDlg:=MSDialog():New(10,10,300,300,Meu dialogo;
,,,,,CLR_BLACK,CLR_WHITE,,,.T.)
52
Apostila
Advpl
Return
53
Apostila
Advpl
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
1
2
3
4
5
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
1
2
3
4
5
6
Contedo
Ttulo
Campo
Mscara
Tamanho
Decimal
Validao
54
Apostila
Advpl
7
8
9
10
Reservado
Tipo
Reservado
Reservado
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
55
Apostila
Advpl
Distancia entre a MsGetDados e o extremidade superior do objeto
que a contm.
Distancia entre a MsGetDados e o extremidade esquerda do objeto
nEsquerda
que a contm.
Distancia entre a MsGetDados e o extremidade inferior do objeto
nInferior
que a contm.
Distancia entre a MsGetDados e o extremidade direita do objeto que
nDireita
a contm.
Posio do elemento do vetor aRotina que a MsGetDados usar
nOpc
como referencia.
cLinhaOk
Funo executada para validar o contexto da linha atual do aCols.
Funo executada para validar o contexto geral da MsGetDados
cTudoOk
(todo aCols).
Nome dos campos do tipo caracter que utilizaro incremento
cIniCpos
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.
Habilita validao da primeira coluna do aCols para esta no poder
lVazio
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.
nSuperior
Retorno
Objeto.
ForceRefresh
Descrio
Atualiza a MsGetDados com o aCols e posiciona na primeira linha.
56
Apostila
Advpl
Sintaxe
oObjeto:ForceRefresh()
Hide
Descrio
Esconde a MsGetDados.
Sintaxe
oObjeto:Hide()
Show
Descrio
Mostra a MsGetDados.
Sintaxe
oObjeto:Show()
Exemplo
User Function Exemplo()
57
Apostila
Advpl
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,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
58
Apostila
Advpl
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
59
Apostila
Advpl
User Function TUDOOK()
ApMsgStop("LINHAOK")
Return .T.
MXsGetDb
60
Apostila
Advpl
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
1
2
3
4
5
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
1
2
3
4
5
6
7
8
9
10
Contedo
Ttulo
Campo
Mscara
Tamanho
Decimal
Validao
Reservado
Tipo
Reservado
Reservado
61
Apostila
Advpl
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
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
Distancia entre a MsGetDB e o extremidade superior do objeto que a
nSuperior
contm.
Distancia entre a MsGetDB e o extremidade esquerda do objeto que
nEsquerda
a contm.
Distancia entre a MsGetDB e o extremidade inferior do objeto que a
nInferior
contm.
Distancia entre a MsGetDB e o extremidade direita do objeto que a
nDireita
contm.
Posio do elemento do vetor aRotina que a MsGetDB usar como
nOpc
referncia.
cLinhaOk
Funo executada para validar o contexto da linha atual do aCols.
62
Apostila
Advpl
Funo executada para validar o contexto geral da MsGetDB (todo
aCols).
Nome dos campos do tipo caracter que utilizaro incremento
cIniCpos
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.
Habilita validao da primeira coluna do aCols para esta no poder
lVazio
estar vazia. Valor padro falso.
uPar1
Parmetro reservado.
cTRB
Alias da tabela temporria.
cCampoOk
Funo executada na validao do campo.
lConditional
Reservado
Indica se a MsGetDB ira criar uma linha em branco
lAdacionar
automaticamente quando for incluso.
oWnd
Objeto no qual a MsGetDB ser criada.
Indica se ser utilizado o Dicionrio de Dados para consulta padro,
lDisparos
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>.
cTudoOk
Retorno
Objeto.
ForceRefresh
Descrio
Atualiza a MsGetDB com a tabela e posiciona na primeira linha.
Sintaxe
ForceRefresh()
Exemplo
63
Apostila
Advpl
User Function Exemplo()
Local nI
Local oDlg
Local oGetDB
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,;
64
Apostila
Advpl
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
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()
65
Apostila
Advpl
Return
66
Apostila
Advpl
MsmGet
Conjunto de objetos tipo MsGet/MsCombo para cadastramento de dados baseado no
Dicionrio de Dados.
Caractersticas
67
Apostila
Advpl
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
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
cAlias
nReg
uPar1
uPar2
uPar3
aAcho
aPos
aCpos
uPar4
uPar5
uPar6
uPar7
oWnd
Descrio
Alias do dados a serem cadastrados.
Nmero do registro da tabela a ser editado.
Parmetro reservado.
Parmetro reservado.
Parmetro reservado.
Vetor com os campos que sero apresentados pela MsMGet.
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.
Vetor com os campos que podero ser alterados.
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>+....
Parmetro reservado.
Parmetro reservado.
Parmetro reservado.
Objeto no qual a MsMGet ser criada.
68
Apostila
Advpl
uPar8
lMemoria
lColuna
uPar9
lSemPastas
Parmetro reservado.
Indica se ser usado variveis de memria ou os campos da tabela para
cadastramento dos dados. Valor padro falso.
Indica se a MsMGet sera apresentada com um objeto por linha (uma
coluna). Valor padro falso. Parmetro reservado.
Parmetro reservado.
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
Hide()
Show
69
Apostila
Advpl
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"
M->&(cCampo) := Padr(M->&(cCampo),SX3->X3_TAMANHO)
EndIf
If M->&(cCampo) == NIL
70
Apostila
Advpl
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
71
Apostila
Advpl
MBrowse
Monta um Browse com menu de opes.
Sintaxe
72
Apostila
Advpl
MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [
uPar5 ], [ cFun ], [ nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) ->
nil
Argumento Obrigat.
Tipo
Descrio
uPar1
uPar2
uPar3
uPar4
cAlias
No
No
No
No
Sim
N
N
N
N
C
aFixos
No
cCpo
No
uPar5
No
cFun
No
nPadrao
No
aCores
No
cExpIni
No
cExpFim
No
nCongela
No
Parmetro reservado.
Parmetro reservado.
Parmetro reservado.
Parmetro reservado.
Alias do arquivo a ser visualizado no browse.
Contendo os nomes dos campos fixos pr-definidos pelo
programador, obrigando a exibio de uma ou mais colunas.
Campo a ser validado se est vazio ou no para exibio do bitmap
de status.
Parmetro reservado.
Funo que retornar um valor lgico para exibio do bitmap de
status.
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.
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.
Funo que retorna o contedo inicial do filtro baseada na chave de
ndice selecionada.
Funo que retorna o contedo final do filtro baseada na chave de
ndice selecionada.
Coluna a ser congelado no browse.
Descrio
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da
chamada da funo.
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 },;
73
Apostila
Advpl
{ 'Incluir' , 'AxInclui' , 0, 3 },;
{ 'Alterar' , 'AxAltera' , 0, 4 },;
{ 'Excluir' , 'AxExcluir', 0, 5 }}
MBROWSE( ,,,, 'SA1',, '!A1_COD',,, 4 )
IncProc
Incrementa rgua de progresso.
Sintaxe
74
Apostila
Advpl
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
75
Apostila
Advpl
25/11/2003
EXERCCIOS
76
Apostila
Advpl
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.
77