Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1.1.
1.2.
2.
ESTRUTURAS DE PROGRAMAO...........................................................15
2.1.
2.2.
4.1.
4.2.
Declarao de variveis.......................................................................44
4.3.
Escopo de variveis.............................................................................46
4.4.
4.5.
5.
5.1.
5.2.
Pgina 2
ADVPL 1
6.
6.1.
6.1.1.
6.1.2.
6.1.3.
6.2.
6.2.1.
6.2.2.
6.2.3.
6.2.4.
7.
8.
FUNES................................................................................................. 121
7.1.
7.2.
9.2.
9.3.
9.3.1.
9.3.2.
9.3.3.
9.4.
9.4.1.
9.4.2.
9.4.3.
9.4.4.
9.4.5.
9.4.6.
9.4.7.
Ttulo ADVPL 1
Pgina 3
11.3.
11.4.
12.1.1.
12.1.2.
12.2.
12.3.
12.3.1.
12.3.2.
12.4.
13.2.
13.2.1.
13.2.2.
13.2.3.
Pgina 4
ADVPL 1
Ttulo ADVPL 1
Pgina 5
OBJETIVOS DO CURSO
Objetivos especficos do curso:
Ao final do curso o treinando dever ter desenvolvido os seguintes conceitos, habilidades e
atitudes:
Pgina 6
ADVPL 1
Com foco nesta necessidade, este tpico descrever resumidamente os conceitos envolvidos
no processo de desenvolvimento de um programa, atravs dos conceitos relacionados a:
Lgica de programao
Algoritmos
Diagramas de blocos
Lgica
Sequncia Lgica
Estes pensamentos podem ser descritos como uma sequncia de instrues, que devem ser
seguidas para que seja cumprida determinada tarefa.
Ttulo ADVPL 1
Pgina 7
Instrues
Por exemplo, se quisermos fazer uma omelete de batatas, precisaremos colocar em prtica
uma srie de instrues: descascar as batatas, bater os ovos, fritar as batatas, etc. evidente
que essas instrues devem ser executadas em uma ordem adequada no se podem
descascar as batatas depois de frit-las.
Dessa maneira, uma instruo tomada isoladamente no tem muito sentido para obtermos o
resultado. Precisamos colocar em prtica o conjunto de todas as instrues, e na ordem
correta.
Algoritmo
Um algoritmo formalmente uma sequncia finita de passos que levam execuo de uma
tarefa. Podemos pensar em algoritmo como uma receita, uma sequncia de instrues que
do cabo de uma meta especfica. Estas tarefas no podem ser redundantes nem subjetivas
na sua definio, devem ser claras e precisas.
Como exemplos de algoritmos possvel citar os algoritmos das operaes bsicas (adio,
multiplicao, diviso e subtrao) de nmeros reais decimais. Outros exemplos seriam os
Pgina 8
ADVPL 1
manuais de aparelhos eletrnicos que explicam passo-a-passo como, por exemplo, gravar um
evento.
At mesmo as coisas mais simples podem ser descritas por sequncias lgicas, tais como:
O algoritmo deve ser fcil de interpretar e fcil de codificar. Ou seja, ele deve ser o
intermedirio entre a linguagem falada e a linguagem de programao.
Ttulo ADVPL 1
Pgina 9
Fases
11..22..11..
EEssttuuddaannddoo aallggoorriittm
mooss
Neste tpico sero demonstrados alguns algoritmos do cotidiano que foram implementados
utilizando os princpios descritos nos tpicos anteriores.
Mascar um chiclete
Utilizar um telefone pblico carto
Fritar um ovo
Trocar lmpadas
Descascar batatas
Jogar o jogo da forca
Calcular a mdia de notas
Jogar o jogo da velha contra o algoritmo
Pgina 10
ADVPL 1
Mascar um chiclete
1.
2.
3.
4.
Pegar o chiclete.
Retirar o papel.
Mastigar.
Jogar o papel no lixo.
1.
2.
3.
4.
5.
6.
Fritar um ovo
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Trocar lmpadas
1.
2.
3.
4.
5.
Ttulo ADVPL 1
Pgina 11
Descascar batatas
1. Escolher a palavra.
2. Montar o diagrama do jogo.
3. Enquanto houver lacunas vazias e o corpo estiver incompleto:
3.1.
Se acertar a letra: escrever na lacuna correspondente.
3.2.
Se errar a letra: desenhar uma parte do corpo na forca.
Pgina 12
ADVPL 1
11..22..22..
TTeessttee ddee m
meessaa
Todo algoritmo desenvolvido, deve ser testado. Este teste chamado TESTE DE MESA, que
significa seguir as instrues do algoritmo de maneira precisa para verificar se o
procedimento utilizado est correto ou no.
Teste de mesa:
ID
Nota
2. Ao trmino das notas, a tabela dever conter todas as notas informadas, como abaixo:
ID
Nota
8.0
7.0
3
8.0
Ttulo ADVPL 1
Pgina 13
8.0
7.0
7.0
Exerccio 01
Vamos aprimorar os seguintes algoritmos descritos na apostila:
1)
2)
Fritar um ovo.
3)
Mascar um chiclete
4)
Trocar lmpadas.
5)
Descascar batatas.
6)
7)
Pgina 14
ADVPL 1
2. ESTRUTURAS DE PROGRAMAO
2.1. Diagrama de bloco
O diagrama de blocos uma padronizao que
determinado processamento.
Com o diagrama definimos uma sequncia de smbolos com significado bem definido.
Portanto, sua principal funo a de facilitar a visualizao dos passos de um processamento.
Simbologia
Smbolo
Funo
Indica o incio e o fim de um
processamento.
Terminador
Processamento em geral.
Processame
nto
Ttulo ADVPL 1
Pgina 15
Entrada
Manual
Indica um ponto no qual dever
ser efetuada uma escolha entre
duas situaes possveis.
Deciso
Mostra os resultados obtidos com
um processamento.
Exibio
Indica um documento utilizado pelo
processamento, seja para entrada de
informaes ou para exibio dos dados
disponveis aps um processamento.
Documento
Pgina 16
ADVPL 1
Ttulo ADVPL 1
Pgina 17
Pgina 18
ADVPL 1
Ttulo ADVPL 1
Pgina 19
Estruturas de deciso
o
o
IF...ELSE
DO CASE ... CASE
Estruturas de repetio
o
o
22..22..11..
WHILE...END
FOR...NEXT
IF...ELSE
DO CASE ... CASE
IF...ELSE
A estrutura IF...ELSE (Se/Seno) permite a anlise de uma condio e a partir da qual ser
executada uma de duas aes possveis: Se a anlise da condio resultar em um valor
verdadeiro ou, se a anlise da condio resultar em um valor falso.
Representao 01: IF...ELSE com aes para ambas as situaes
Pgina 20
ADVPL 1
Esta estrutura permite ainda que seja executada apenas uma ao, na situao em que a
anlise da condio resultar em um valor verdadeiro.
Representao 02: IF...ELSE somente com ao para situao verdadeira
Aes anteriores
...
Anlise da
condio
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Continuao do
fluxo aps a
tomada da
deciso
Ttulo ADVPL 1
Pgina 21
Pgina 22
ADVPL 1
DO CASE...CASE
Aes anteriores
...
Falso
Anlise da
condio 1
Verdadeiro
Ao vinculada a
condio 1
Verdadeiro
Ao vinculada a
condio 2
Verdadeiro
Ao vinculada a
condio N
Falso
Anlise da
condio 2
Falso
Anlise da
condio N
Falso
Continuao do
fluxo aps a
tomada da
deciso
Ttulo ADVPL 1
Pgina 23
Pgina 24
ADVPL 1
22..22..22..
WHILE...END
FOR...TO...NEXT
WHILE...END
Aes anteriores
...
Anlise da
condio
Loop
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Continuao do
fluxo
...
Ttulo ADVPL 1
Pgina 25
Pgina 26
ADVPL 1
FOR...TO...NEXT
Para cada passo realizado pela estrutura FOR...TO...NEXT, avaliada uma condio que
verifica se foi atingido o nmero de execues previamente definido. Dessa forma, a estrutura
compreende um controle de nmero de passos executados e incrementado na anlise da
expresso NEXT.
Representao: FOR...TO...NEXT
Ttulo ADVPL 1
Pgina 27
Exerccio 02
Vamos montar os diagramas de blocos para os algoritmos desenvolvidos no
exerccio anterior:
1. Usar telefone pblico carto.
2. Fritar um ovo.
3. Mascar um chiclete.
4. Trocar lmpadas.
5. Descascar batatas.
6. Jogar o Jogo da Forca
Pgina 28
ADVPL 1
Podero ser criadas rotinas para a customizao do sistema ERP Microsiga Protheus, desde
processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o Ambiente
montado pelos mdulos do ERP Microsiga Protheus. Porm, com o ADVPL possvel at
mesmo criar toda uma aplicao, ou mdulo, do comeo.
Rotinas escritas em ADVPL podem ser iniciadas como processos individuais (sem interface),
no Protheus Server atravs de duas maneiras: Iniciadas por outra rotina ADVPL por meio da
chamada de funes como StartJob() ou CallProc(), ou iniciadas automaticamente, na
inicializao do Protheus Server (quando propriamente configurado).
Programao de RPC
Pgina 30
ADVPL 1
Programao Web
O Protheus Server pode tambm ser executado como um servidor Web, respondendo a
requisies HTTP. No momento dessas requisies, pode executar rotinas escritas em ADVPL
como processos individuais, enviando o resultado das funes como retorno das requisies
para o cliente HTTP (como por exemplo, um Browser de Internet). Qualquer rotina escrita em
ADVPL que no contenha comandos de interface, pode ser executada atravs de requisies
HTTP. O Protheus permite a compilao de arquivos HTML, contendo cdigo ADVPL
embutido. So os chamados arquivos ADVPL ASP para a criao de pginas dinmicas.
Programao TelNet
Ttulo ADVPL 1
Pgina 31
Linhas de Programa
As linhas existentes dentro de um arquivo texto de cdigo de programa podem ser linhas de
comando, linhas de comentrio, ou linhas mistas.
Linhas de Comando
Linhas de comando possuem os comandos, ou instrues que sero executadas. Por exemplo:
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Pgina 32
ADVPL 1
Linhas de Comentrio
Ttulo ADVPL 1
Pgina 33
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento
(indicada pelos caracteres */) considerado como comentrio.
Linhas Mistas
O ADVPL tambm permite que existam linhas de comando com comentrio. Isto possvel
adicionando-se as duas barras transversais (//) ao final da linha de comando e adicionando-se
o texto do comentrio:
Local nCnt
Local nSoma := 0 // Inicializa a varivel com zero para a soma.
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Pgina 34
ADVPL 1
Tamanho da Linha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no
editor de textos utilizado, existe uma linha considerada linha lgica. A linha lgica aquela
considerada para a compilao como uma nica linha de comando.
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Nesse exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como
a linha torna-se muito grande, possvel dividi-la em mais de uma linha fsica, utilizando o
sinal de ponto-e-vrgula. Se um sinal de ponto-e-vrgula for esquecido nas duas primeiras
linhas, durante a execuo do programa ocorrer um erro, pois a segunda linha fsica ser
considerada como uma segunda linha de comando na compilao. E durante a execuo esta
linha no ter sentido.
Ttulo ADVPL 1
Pgina 35
#include protheus.ch
/*
+===========================================+
| Programa: Clculo do Fatorial
| Data
: 02 de outubro de 2001
+===========================================+
*/
Local nCnt
Local nResultado := 1 // Resultado do fatorial
Local nFator
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
// Termina o programa
Return
ADVPL 1
rea de Identificao
Declarao dos includes
Declarao da funo
Identificao do programa
Corpo do Programa
Preparao para o processamento
Processamento
rea de Encerramento
rea de Identificao
O formato para esta rea no definido. possvel escrever qualquer tipo de informao
desejada e ainda, escolher a formatao apropriada.
Ttulo ADVPL 1
Pgina 37
#include protheus.ch
/*
+==========================================+
| Programa: Clculo do Fatorial
| Data
: 02 de outubro de 2001
+==========================================+
*/
Local nCnt
Local nResultado := 0 // Resultado do fatorial
Local nFator
Corpo do Programa
Nessa rea encontram-se as linhas de cdigo do programa. Nela realiza a tarefa necessria
por meio da organizao lgica dessas linhas de comando. Espera-se que as linhas de
comando estejam organizadas de tal modo que no final da mesma, o resultado esperado seja
Pgina 38
ADVPL 1
obtido, seja ele armazenado em um arquivo, ou em variveis de memria, pronto para ser
exibido ao usurio atravs de um relatrio ou na tela.
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
Ttulo ADVPL 1
Pgina 39
// Clculo do fatorial
nFator := GetFator()
// GetFator funo ilustrativa na qual a varivel recebe a informao do usurio.
If nFator <= 0
Alert(Informao invlida)
Return
Endif
Pgina 40
ADVPL 1
rea de Encerramento
// Termina o programa
Return
Ttulo ADVPL 1
Pgina 41
As 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, possvel
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).
Pgina 42
ADVPL 1
Caractere
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 caractere 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 desse tipo de
dado so armazenadas como um nmero correspondente data Juliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim com a
utilizao de funes especficas como, por exemplo, CTOD() que converte uma string para
data.
Ttulo ADVPL 1
Pgina 43
Array
Arrays 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.
A partir do momento que uma varivel criada, no mais necessrio referenciar ao seu
contedo, e sim, seu nome.
Pgina 44
ADVPL 1
O nome de uma varivel um identificador nico que deve respeitar um nmero 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 em que esse valor foi atribudo 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 substitudo pelo de 300.
Ttulo ADVPL 1
Pgina 45
Local nNmero := 10
Esta linha de cdigo declara uma varivel chamada nNmero, indicando que aonde pertence
seu escopo local.
Local
Static
Private
Public
Pgina 46
ADVPL 1
Devido a essa caracterstica, quando se pretende fazer uma atribuio a uma varivel
declarada previamente, mas escreve-se o nome da varivel de forma incorreta, o ADVPL no
gerar nenhum erro de compilao ou de execuo. Assim, compreender o nome da varivel
escrito de forma incorreta como se fosse a criao de uma nova varivel. Dessa forma, ser
alterada a lgica do programa, e um erro muitas vezes difcil de identificar.
Ttulo ADVPL 1
Pgina 47
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a
funo Filha executada, nVar ainda existe mas no pode ser acessada. Quando a execuo
da funo Pai terminar, a varivel nVar destruda. Qualquer varivel, com o mesmo nome no
programa que chamou a funo Pai, no afetada.
Variveis de escopo local so criadas automaticamente, cada vez que a funo onde forem
declaradas for ativada. Elas continuam a existir e mantm seu valor at o fim da ativao da
funo (ou seja, at que a funo retorne o controle para o cdigo que a executou). Se uma
funo chamada recursivamente (por exemplo, chama a si mesma), cada chamada em
recurso cria um novo conjunto de variveis locais.
Pgina 48
ADVPL 1
Variveis de escopo static funcionam basicamente como as variveis de escopo local, mas
mantm seu valor atravs da execuo e devem ser declaradas explicitamente no cdigo, com
o identificador STATIC.
O escopo das variveis static depende de onde so declaradas. Se forem declaradas dentro
do corpo de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem
declaradas fora do corpo de qualquer rotina, seu escopo afeta a todas as funes declaradas
no fonte.
Ttulo ADVPL 1
Pgina 49
Neste exemplo, a varivel nVar declarada como static e inicializada com o valor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente
de variveis declaradas como LOCAL ou PRIVATE, nVar continua a existir e mantm seu valor
atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por
execues subseqentes da funo Pai.
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente
com o identificador PRIVATE.
possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente.
Entretanto, a nova (duplicada) varivel pode apenas ser criada em um nvel de ativao
inferior ao nvel onde a varivel foi declarada pela primeira vez (ou seja, apenas em uma
funo chamada pela funo onde a varivel j havia sido criada). A nova varivel privada
esconder qualquer outra varivel privada ou pblica (veja a documentao sobre variveis
pblicas) com o mesmo nome enquanto existir.
Pgina 50
ADVPL 1
Uma vez criada, uma varivel privada visvel em todo o programa, enquanto no for
destruda automaticamente. Quando a rotina que a criou terminar, ou uma outra varivel
privada com o mesmo nome for criada em uma subfuno chamada (neste caso, a varivel
existente torna-se inacessvel at que a nova varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as
funes chamadas por esta, a menos que uma funo chamada crie sua prpria varivel
privada com o mesmo nome.
Ttulo ADVPL 1
Pgina 51
Por exemplo:
Function Pai()
Private nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar criada com escopo private e inicializada com o valor 10.
Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel de escopo
local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda
e qualquer declarao de nVar anterior se tornar acessvel novamente.
Pgina 52
ADVPL 1
Uma vez criada, uma varivel de escopo public visvel em todo o programa em que foi
declarada, at que seja escondida por uma varivel de escopo private, criada com o mesmo
nome. A nova varivel de escopo private criada esconde a varivel de escopo public existente,
e esta se tornar inacessvel at que a nova varivel private seja destruda. Por exemplo:
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Nesse exemplo, nVar criada como public e inicializada com o valor 10. Quando a funo
Filha executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou
privates, nVar ainda existe aps o trmino da a execuo da funo Pai.
Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como
pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).
Ttulo ADVPL 1
Pgina 53
Pgina 54
ADVPL 1
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 esse erro, deve-se declarar
a varivel previamente:
ou
Ttulo ADVPL 1
Pgina 55
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.
Pgina 56
ADVPL 1
44..55..11..
A
Attrriibbuuiioo ddee vvaarriivveeiiss
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 caractere se uma string de texto lhe for atribuda etc. Porm, mesmo
que uma varivel seja de determinado tipo de dado, possvel mudar o tipo de varivel
atribuindo outro tipo a ela:
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
Ttulo ADVPL 1
Pgina 57
Excetuando-se o caso do valor nulo, para os demais devem ser utilizadas funes de
converso, quando necessrio 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.
Pgina 58
ADVPL 1
44..55..22..
O
Oppeerraaddoorreess ddaa lliinngguuaaggeem
mA
AD
DV
VPPLL
Operadores comuns
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:
Nesse 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.
Ttulo ADVPL 1
Pgina 59
Operadores Matemticos
Adio
Subtrao
Multiplicao
Diviso
** ou ^
Exponenciao
Operadores de String
Pgina 60
ADVPL 1
Operadores Relacionais
<
Comparao Menor
>
Comparao Maior
Comparao Igual
==
<=
>=
Operadores Lgicos
.And.
E lgico
.Or.
OU lgico
.Not. ou !
NO lgico
Ttulo ADVPL 1
Pgina 61
Operadores de Atribuio
:=
Atribuio Simples
+=
-=
*=
/=
**= ou ^=
%=
Atribuio Simples
Pgina 62
ADVPL 1
Atribuio em Linha
O operador de atribuio em linha tambm pode ser utilizado para substituir valores de
campos em um banco de dados.
Ttulo ADVPL 1
Pgina 63
Atribuio Composta
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
++
Incremento Ps ou Pr-fixado
--
Decremento Ps ou Pr-fixado
Local nA := 10
Local nB := nA++ + nA
Pgina 64
ADVPL 1
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 dessas duas linhas a varivel nB contendo 21 e a varivel nA
contendo 11.
No entanto:
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
{}
->
Identificador de Apelido
&
Macro substituio
||
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.
Ttulo ADVPL 1
Pgina 65
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 macro substituio.
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.
O smbolo || utilizado para indicar que durante a passagem de uma varivel para
uma funo ou procedimento, ela seja tomada como um e valor no como referncia.
Pgina 66
ADVPL 1
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.
1.
2.
3.
4.
5.
6.
7.
1.
2.
3.
Exponenciao
Multiplicao e Diviso
Adio e Subtrao
Considere o exemplo:
Alterao da Precedncia
Pgina 68
ADVPL 1
44..55..33..
O
Oppeerraaoo ddee M
Maaccrroo SSuubbssttiittuuiioo
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. possvel 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 possvel substituir Y na terceira linha:
03 B := &"X + 1"
O operador de macro cancela as aspas:
03 B := X + 1
O operador de macro remove as aspas, o que deixa uma parte do cdigo para ser executado.
Deve-se ter em mente que tudo isso acontece em tempo de execuo, o que torna tudo
muito dinmico. Uma utilizao interessante criar um tipo de calculadora ou, um avaliador
de frmulas, que determina o resultado de algo que o usurio digita.
Ttulo ADVPL 1
Pgina 69
Pgina 70
ADVPL 1
44..55..44..
FFuunneess ddee m
maanniippuullaaoo ddee vvaarriivveeiiss
As funes mais utilizadas nas operaes entre converso entre tipos de variveis so:
CTOD()
CVALTOCHAR()
DTOC()
DTOS()
STOD()
STR()
STRZERO()
VAL()
Ttulo ADVPL 1
Pgina 71
CTOD()
Sintaxe
CTOD(cData)
Descrio
CVALTOCHAR()
Sintaxe
CVALTOCHAR(nValor)
Descrio
DTOC()
Sintaxe
DTOC(dData)
Descrio
Pgina 72
ADVPL 1
DTOS()
Sintaxe
DTOS(dData)
Descrio
STOD()
Sintaxe
STOD(sData)
Descrio
STR()
Sintaxe
STR(nValor)
Descrio
Ttulo ADVPL 1
Pgina 73
STRZERO()
Sintaxe
STRZERO(nValor, nTamanho)
Descrio
VAL()
Sintaxe
VAL(cValor)
Descrio
Manipulao de strings
ALLTRIM()
ASC()
AT()
CHR()
CSTUFF()
LEN()
RAT()
SUBSTR()
Pgina 74
ADVPL 1
ALLTRIM()
Sintaxe
ALLTRIM(cString)
Retorna uma string sem os espaos direita e esquerda, referente ao
contedo informado como parmetro.
Descrio
ASC()
Sintaxe
Descrio
ASC(cCaractere)
Converte uma informao caractere em seu valor, de acordo com a tabela ASCII.
AT()
Sintaxe
AT(cCaractere, cString )
Descrio
Ttulo ADVPL 1
Pgina 75
CHR()
Sintaxe
CHR(nASCII)
Descrio
LEN()
Sintaxe
LEN(cString)
Descrio
LOWER()
Sintaxe
LOWER(cString)
Descrio
Retorna uma string com todos os caracteres minsculos, tendo como base a
string passada como parmetro.
RAT()
Sintaxe
RAT(cCaractere, cString)
Descrio
Pgina 76
ADVPL 1
STUFF()
Sintaxe
Descrio
SUBSTR()
Sintaxe
Descrio
UPPER()
Sintaxe
UPPER(cString)
Descrio
Retorna uma string com todos os caracteres maisculos, tendo como base a
string passada como parmetro.
ABS()
INT()
NOROUND()
ROUND()
Ttulo ADVPL 1
Pgina 77
ABS()
Sintaxe
ABS(nValor)
Descrio
INT()
Sintaxe
INT(nValor)
Descrio
NOROUND()
Sintaxe
NOROUND(nValor, nCasas)
Descrio
ROUND()
Sintaxe
ROUND(nValor, nCasas)
Descrio
Pgina 78
ADVPL 1
TYPE()
VALTYPE()
TYPE()
Sintaxe
TYPE(cVariavel)
Descrio
VALTYPE()
Sintaxe
VALTYPE(cVarivel)
Descrio
Ttulo ADVPL 1
Pgina 79
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.
Estruturas de repetio.
Estruturas de deciso.
O Comando FOR...NEXT
Pgina 80
ADVPL 1
Sintaxe
Parmetros
Varivel
Comandos
EXIT
Transfere
comando
repetio
adicionar
NEXT.
LOOP
Ttulo ADVPL 1
Pgina 81
Pgina 82
ADVPL 1
Esse exemplo imprime a soma dos 100 primeiros nmeros pares. A soma obtida 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
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpressao
Comandos
EXIT
LOOP
Ttulo ADVPL 1
Pgina 83
Exemplo :
Pgina 84
ADVPL 1
55..11..11..
LOOP
EXIT
LOOP
A instruo LOOP utilizada para forar um desvio no fluxo do programa de volta a anlise
da condio de repetio. Dessa forma, todas as operaes, que seriam realizadas dentro da
estrutura de repetio aps o LOOP, sero desconsideradas.
Exemplo:
aItens:= ListaProdutos() // funo ilustrativa que retorna um array com dados dos produtos.
nQuantidade := Len(aItens)
nItens := 0
nItens++
IF BLOQUEADO(aItens [nItens]) // funo ilustrativa que verifica se o produto est
LOOP
// bloqueado.
ENDIF
IMPRIME() // funo ilustrativa que realiza a impresso de um item liberado para uso.
End
Ttulo ADVPL 1
Pgina 85
EXIT
A instruo EXIT utilizada para forar o trmino de uma estrutura de repetio. Dessa forma,
todas as operaes que seriam realizadas dentro da estrutura de repetio aps o EXIT sero
desconsideradas, e o programa continuar a execuo a partir da prxima instruo posterior
ao trmino da estrutura (END ou NEXT).
Exemplo:
While .T.
MSGINFO(Final de Jogo)
Pgina 86
ADVPL 1
Em ADVPL existem dois comandos para execuo de sees de cdigo, de acordo com as
avaliaes lgicas, que so os comandos IF...ELSE...ENDIF e o comando DO
CASE...ENDCASE.
O Comando IF...ELSE...ENDIF
Sintaxe
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Parmetros
LExpressao
Comandos
Ttulo ADVPL 1
Pgina 87
Exemplo:
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
Pgina 88
ADVPL 1
O Comando IF...ELSEIF...ELSE...ENDIF
Sintaxe
IF lExpressao1
Comandos
[ELSEIF lExpressaoX
Comandos]
[ELSE
Comandos...]
ENDIF
Parmetros
lExpressao1
lExpressaoX Especifica uma expresso lgica que ser avaliada para cada comando
ELSEIF. Esta expresso somente ser avaliada se a expresso lgica,
especificada no comando IF, resultar em falso (.F.).
Se a lExpressaoX avaliada resulte em falso (.F.) ser avaliada a prxima
expresso lExpressaoX, vinculada ao prximo comando ELSEIF, ou se o
mesmo no existir ser executada a ao definida para o comando
ELSE.
Comandos
Ttulo ADVPL 1
Pgina 89
Pgina 90
ADVPL 1
Exemplo:
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
ElseIf Date() == dVencto
Alert("Vencimento na data!")
Else
Alert("Vencimento dentro do prazo!")
Endif
Return
O Comando DO CASE...ENDCASE
Sintaxe
DO CASE
CASE lExpressao1
Comandos
[CASE lExpressao2
Comandos
...
CASE lExpressaoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
Ttulo ADVPL 1
Pgina 91
Parmetros
CASE
lExpressao1
Comandos...
OTHERWISE
Comandos
Pgina 92
ADVPL 1
Exemplo:
Local nMes
:= Month(Date())
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
Ttulo ADVPL 1
Pgina 93
Exerccio 04
Desenvolver um programa que implemente o algoritmo de descascar batatas,
utilizando a estrutura de repetio FOR, demonstrando quantas batatas foram
descascadas:
Exerccio 05
Desenvolver um programa que implemente o algoritmo de descascar batatas,
utilizando a estrutura de repetio FOR, demonstrando quantas batatas faltam para
serem descascadas:
Exerccio 06
Desenvolver um programa que implemente o algoritmo do Jogo da Forca:
Exerccio 07
Desenvolver um programa que implemente o algoritmo do Jogo da Velha:
Pgina 94
ADVPL 1
Ttulo ADVPL 1
Pgina 95
O exemplo a seguir declara uma varivel, atribui um array de trs elementos a ela, e ento
exibe um dos elementos e o tamanho do array:
Local aLetras
// Declarao da varivel
Uma caracterstica interessante do ADVPL que um array pode conter qualquer tipo de dado:
nmeros, datas, lgicos, caracteres, objetos, etc., e ao mesmo tempo. Em outras palavras, os
elementos de um array no precisam ser necessariamente do mesmo tipo de dado, em
contraste com outras linguagens como C e Pascal.
aFunct1 := {"Pedro",32,.T.}
Pgina 96
ADVPL 1
Este array 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 uma parte diferente de um 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 de um array:
#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
Ttulo ADVPL 1
Pgina 97
Alert(aFunct1[FUNCT_NOME])
Alert(aFunct2[FUNCT_NOME])
Alert(aFunct3[FUNCT_NOME])
aFuncts um array com 3 linhas por 3 colunas. Uma vez que as variveis separadas foram
combinadas em um array, os nomes podem ser exibidos assim:
Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount, FUNCT_NOME])
// O acesso a elementos de um array multidimensional.
// pode ser realizado tambm desta forma:
// aFuncts[nCount][FUNCT_NOME]
Next nCount
Pgina 98
ADVPL 1
A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a constante
FUNCT_NOME seleciona a primeira coluna daquela linha.
Ttulo ADVPL 1
Pgina 99
66..11..11..
IInniicciiaalliizzaannddoo aarrrraayyss
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
08 Next nCnt
Este cdigo preenche o array 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 um array de tamanho conhecido,
no momento da criao do cdigo.
1.
Na linha 02 o array criado usando aX[10]. Isto indica ao ADVPL para alocar espao
para 10 elementos no array. Os colchetes [e ] so utilizados para indicar o tamanho
necessrio.
2.
Na linha 03 utilizada a funo array com o parmetro 10 para criar o array, e o
retorno desta funo atribudo varivel aY. Na linha 03 efetuado o que se chama
"desenhar a imagen do array". Como se pode notar, existem dez 0s na lista encerrada entre
chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de 1000
elementos.
Pgina 100
ADVPL 1
3.
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.
4.
A linha 07 demonstra como um valor pode ser atribudo para uma posio existente
em uma matriz, especificando o ndice entre colchetes.
Ttulo ADVPL 1
Pgina 101
01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
07
AADD(aX, nCnt*nCnt)
08 Next nCnt
1.
A linha 02 utiliza os colchetes para criar um array vazio. Apesar de no ter nenhum
elemento, seu tipo de dado array.
2.
Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento.
3.
Na linha 04 est declarada a representao de um array vazio em ADVPL. Mais uma
vez, esto sendo utilizadas as chaves para indicar que o tipo de dados da varivel array.
Note que {} um array vazio (tem o tamanho 0), enquanto {Nil} um array com um nico
elemento nulo (tem tamanho 1).
Porque cada uma destes arrays no contm elementos, a linha 07 utiliza a funo AADD()
para adicionar elementos sucessivamente at o tamanho necessrio (especificado por
exemplo na varivel nSize).
Pgina 102
ADVPL 1
66..11..22..
FFuunneess ddee m
maanniippuullaaoo ddee aarrrraayyss
A linguagem ADVPL possui diversas funes que auxiliam na manipulao de arrays, dentre
as quais podemos citar as mais utilizadas:
ARRAY()
AADD()
ACLONE()
ADEL()
ASIZE()
AINS()
ASORT()
ASCAN()
Ttulo ADVPL 1
Pgina 103
ARRAY()
Sintaxe
ARRAY(nLinhas, nColunas)
Descrio
AADD()
Sintaxe
AADD(aArray, xItem)
Descrio
ACLONE()
Sintaxe
AADD(aArray)
Descrio
A funo ACLONE() realiza a cpia dos elementos de um array para outro array
integralmente.
ADEL()
Sintaxe
ADEL(aArray, nPosio)
Descrio
ASIZE()
Sintaxe
ASIZE(aArray, nTamanho)
Descrio
Pgina 104
ADVPL 1
ASORT()
Sintaxe
Descrio
Ttulo ADVPL 1
Pgina 105
ASCAN()
Sintaxe
ASCAN(aArray, bSeek)
Descrio
A funo ASCAN() permite que seja identificada a posio do array que contm
uma determinada informao, atravs da anlise de uma expresso descrita em
um bloco de cdigo.
AINS()
Sintaxe
Descrio
66..11..33..
AINS(aArray, nPosicao)
A funo AINS() permite a insero de um elemento, no array especificado, em
qualquer ponto da estrutura do mesmo, diferindo desta forma da funo
AADD(), a qual sempre insere um novo elemento ao final da estrutura j
existente.
Conforme comentado anteriormente, um array uma rea na memria, o qual possui uma
estrutura que permite as informaes serem armazenadas e organizadas das mais diversas
formas.
Com base nesse conceito, o array pode ser considerado apenas como um mapa ou um
guia de como as informaes esto organizadas e de como elas podem ser armazenadas ou
consultadas. Para se copiar um array deve-se levar este conceito em considerao, pois caso
contrrio o resultado esperado no ser obtido na execuo da cpia.
Pgina 106
ADVPL 1
Para copiar o contedo de uma varivel, utiliza-se o operador de atribuio :=, conforme
abaixo:
nPessoas := 10
nAlunos := nPessoas
A varivel aPessoas representa uma rea de memria que contm a estrutura de um array
(mapa), no as informaes do array, pois cada informao est em sua prpria rea de
memria.
Ttulo ADVPL 1
Pgina 107
Desta forma, ao atribuir o contedo representado pela varivel aPessoas, a varivel aAlunos
no est se copiando as informaes e sim o mapa das reas de memria, em que as
informaes esto realmente armazenadas.
Por esta razo deve ser utilizado o comando ACLONE(), quando se deseja obter um array com
a mesma estrutura e informaes que compe outro array j existente.
Pgina 108
ADVPL 1
Ttulo ADVPL 1
Pgina 109
66..22..11..
PPrreem
miissssaass ppaarraa uuttiilliizzaaoo ddee B
Bllooccooss ddee CCddiiggoo
Primeira premissa
Escreve-se:
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 caractere, e em seguida para a
funo alert para a exibio. Por causa dessa regra de precedncia possvel atribuir um valor
a mais de uma varivel ao mesmo tempo:
Z := Y := X := 0
Por causa dessa regra, essa expresso avaliada como se fosse escrita assim:
Z := ( Y := (X := 0) )
Pgina 110
ADVPL 1
Segunda premissa
Em ADVPL junta-se diversas linhas de cdigo em uma nica linha fsica de comando. Por
exemplo, o cdigo:
If lAchou
Alert("Cliente encontrado!")
Endif
pode ser escrito assim:
If lAchou ; Alert("Cliente encontrado!") ;
Endif
O ponto-e-vrgula indica ao ADVPL que a nova linha de cdigo est para comear. possvel
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, consequentemente, a sua
manuteno.
Ttulo ADVPL 1
Pgina 111
66..22..22..
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a seguir,
o smbolo ==> indicar o retorno da expresso aps a sua avaliao (seja para atribuir em
uma varivel, exibir para o usurio ou imprimir em um relatrio), que ser impressa em um
relatrio, por exemplo.
@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.
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:
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.
Pgina 112
ADVPL 1
X := 10 ; Y := 20
If X > Y
Alert("X")
Z := 1
Else
Alert("Y")
Z := -1
Endif
Ttulo ADVPL 1
Pgina 113
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 ) )
O ADVPL permite criar funes, que so pequenas partes de um cdigo, como se fosse um
pequeno programa, utilizados para diminuir em 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:
Alert( cValToChar( Lista() ) ) ==> 20
( X := 10 , Y := 20 ) // Lista de Expresses
{|| X := 10 , Y := 20 } // Bloco de Cdigo
Pgina 114
ADVPL 1
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.
Ttulo ADVPL 1
Pgina 115
66..22..33..
B
Bllooccooss ddee CCddiiggoo
Ou seja, podem ser executados. Para a execuo, ou avaliao de um bloco de cdigo, devese utilizar a funo Eval():
Essa funo recebe como parmetro um bloco de cdigo e avalia todas as expresses
contidas neste bloco de cdigo, retornando o resultado da ltima expresso avaliada.
Passando Parmetros
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
Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente so utilizados para
executar tarefas quando os eventos de objetos so acionados ou, para modificar o
comportamento padro de algumas funes. Como no exemplo, considere a matriz abaixo:
Pgina 116
ADVPL 1
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
bloco de cdigo no conhece que elementos esto comparando - a funo asort seleciona os
elementos (talvez utilizando o algoritmo QuickSort) e passa-os para o bloco de cdigo. O
bloco de cdigo compara-os e retorna verdadeiro (.T.) se encontram na ordem correta, ou
falso (.F.) se no. Se o valor de retorno for falso, a funo asort 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 ordem descendente, possvel
utilizar o seguinte bloco de cdigo:
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:
Ttulo ADVPL 1
Pgina 117
Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, utiliza-se o
seguinte bloco de cdigo:
Pgina 118
ADVPL 1
66..22..44..
FFuunneess ppaarraa m
maanniippuullaaoo ddee bbllooccooss ddee ccddiiggoo
EVAL()
DBEVAL()
AEVAL()
EVAL()
Sintaxe
Descrio
DBEVAL()
Sintaxe
Descrio
AEVAL()
Sintaxe
Descrio
Ttulo ADVPL 1
Pgina 119
Pgina 120
ADVPL 1
7. FUNES
A maior parte das rotinas escritas em programas so compostas de um conjunto de
comandos. Essas rotinas se repetem ao longo de todo o desenvolvimento. Uma funo
nada mais do que um conjunto de comandos que para ser utilizada, basta cham-la pelo
seu nome.
Para tornar uma funo mais flexvel, ao cham-la possvel a passagem de parmetros, que
contm os dados e as informaes que definem o processamento da funo.
Return ...
A funo tambm tem a faculdade de retornar uma varivel, podendo inclusive ser um Array.
Para tal, encerra-se a funo com:
Return(campo)
Ttulo ADVPL 1
Pgina 121
No TDN (TOTVS Developer Network) mais de 500 esto documentadas, e este nmero
tende a aumentar exponencialmente com os novos processos de documentao que esto
em implantao na Tecnologia e Inteligncia Protheus.
Nos tpicos a seguir sero detalhados os tipos de funes disponveis na linguagem ADVPL,
suas formas de utilizao e respectivas diferenas.
Pgina 122
ADVPL 1
20
Function()
User Function()
Static Function()
Main Function()
Function()
Exemplo:
// Fonte MATA100INCL.PRW
#INCLUDE "protheus.ch"
Function MATA100INCL01()
ALERT("01")
Return
Function MATA100INCL02()
ALERT("02")
Return
Ttulo ADVPL 1
Pgina 123
User Function()
O interpretador ADVPL considera que o nome de uma User Function composto pelo nome
definido para a funo, precedido dos caracteres U_. Desta forma a User Function XMAT100I
ser tratada pelo interpretador como U_XMAT100I.
Pgina 124
ADVPL 1
Ttulo ADVPL 1
Pgina 125
Static Function()
Funes ADVPL tradicionais, cuja visibilidade est restrita s funes descritas no mesmo
arquivo de cdigo fonte no qual esto definidas.
Exemplo:
//Fonte FINA010.PRW
Function FINA010()
CriaSx1(FIN010)
Return
CriaSx1(FIN020)
Return
Este recurso permite isolar funes de uso exclusivo de um arquivo de cdigo fonte, evitando
a sobreposio ou a duplicao de funes na aplicao.
Pgina 126
ADVPL 1
1. Padronizar o nome de uma determinada funo, que possui a mesma finalidade, mas
que sua implementao pode variar de acordo com a necessidade da funo principal
/ aplicao.
O Ambiente de desenvolvimento utilizado na aplicao ERP (MPIDE) valida se existem Functions(), Main Functions() ou User
Functions() com o mesmo nome, mas em arquivos de cdigos
fontes distintos, evitando a duplicidade ou sobreposio de
funes.
Main Function()
Main Function() outro tipo de funo especial do ADVPL incorporado para permitir
tratamentos diferenciados na aplicao ERP.
Uma Main Function() tem a caracterstica de poder ser executada atravs da tela inicial de
parmetros do client do ERP (Microsiga Protheus Remote), da mesma forma que uma User
Function, com a diferena que as Main Functions somente podem ser desenvolvidas com o
uso da autorizao de compilao, tornando sua utilizao restrita Inteligncia Protheus da
Totvs.
Na aplicao ERP comum o uso das Main Functions(), nas seguintes situaes:
Complementando esta definio, podem ser utilizadas duas formas distintas de passagens de
parmetros para funes descritas na linguagem ADVPL:
Local nCnt
Local nResultado := 0
Return
Pgina 128
ADVPL 1
Avaliando a funo CalcFator() descrita anteriormente, podemos verificar que a mesma recebe
como parmetro para a sua execuo varivel nFator.
Com base nesta funo, podemos descrever duas formas de passagem de parmetros por
contedo:
Local nResultado := 0
nResultado := CalcFator(5)
Ttulo ADVPL 1
Pgina 129
Pgina 130
ADVPL 1
Local nResultado := 0
Local nFatorUser := 0
nFatorUser := GetFator() // Funo ilustrativa na qual o usurio informa o fator a ser utilizado.
nResultado := CalcFator(nFatorUser)
Ttulo ADVPL 1
Pgina 131
Pgina 132
ADVPL 1
Ttulo ADVPL 1
Pgina 133
Passagem de parmetros por referncia Duas variveis x uma nica rea de memria
Pgina 134
ADVPL 1
Dessa forma, a funo chamada tem acesso no apenas ao contedo, mas varivel em
si, pois a rea de memria a varivel e qualquer alterao ser visvel funo
chamadora quando tiver o retorno desta funo.
Local nCnt
Local nResultado := 0
Default nFator := 1
Ttulo ADVPL 1
Pgina 135
Return nResultado
Local nCnt
Local nResultado := 0
For nCnt := nFator To 1 Step -1 // nFator est como Nulo, portando nCnt nulo
nResultado *= nCnt
Next nCnt // Ao efetuar o Next, o interpretador realiza a ao nCnt += 1.
Return nResultado
Pgina 136
ADVPL 1
Ttulo ADVPL 1
Pgina 137
8. DIRETIVAS DE COMPILAO
O compilador ADVPL possui uma funcionalidade denominada pr-processador. O prprocessador um programa que examina o programa fonte escrito em ADVPL e executa
certas modificaes nele, baseadas nas Diretivas de Compilao.
As diretivas de compilao so comandos que no so compilados, sendo dirigidos ao prprocessador, o qual executado pelo compilador antes da execuo do processo de
compilao propriamente dito. Portanto, o pr-processador modifica o programa fonte,
entregando para o compilador um programa modificado de acordo com as diretivas de
compilao. Estas so iniciadas pelo caractere #.
#INCLUDE
#DEFINE
#IFDEF
#IFNDEF
#ELSE
#ENDIF
#COMMAND
Diretiva: #INCLUDE
A diretiva #INCLUDE indica em que arquivo de extenso CH (padro ADVPL) esto os UDCs
a serem utilizados pelo pr-processador.
Pgina 138
ADVPL 1
A aplicao ERP possui diversos includes que devem ser utilizados segundo a aplicao que
ser desenvolvida. Dessa forma, ser permitida a utilizao de recursos adicionais definidos
para a linguagem, implementados pela rea de Tecnologia da Totvs.
Os includes mais utilizados nas aplicaes ADVPL, desenvolvidas para o ERP so:
Ttulo ADVPL 1
Pgina 139
o
o
o
o
o
DIALOG.CH
FONT.CH
INI.CH
PTMENU.CH
PRINT.CH
o
o
o
o
o
o
o
o
TCQUERY
ADVPL 1
o
o
o
o
o
o
o
o
CREATE RPCCONN
CLOSE RPCCONN
PREPARE ENVIRONMENT
RESET ENVIRONMENT
OPEN REMOTE TRANSACTION
CLOSE REMOTE TRANSACTION
CALLPROC IN
OPEN REMOTE TABLES
o
o
o
o
o
o
o
CREATE XMLSTRING
CREATE XMLFILE
SAVE XMLSTRING
SAVE XMLFILE
ADDITEM TAG
ADDNODE NODE
DELETENODE
Ttulo ADVPL 1
Pgina 141
Diretiva: #DEFINE
A diretiva #DEFINE permite que o desenvolvedor crie novos termos para serem utilizados no
cdigo fonte. Este termo tem o efeito de uma varivel de escopo PUBLIC, mas que afeta
somente o fonte na qual o #DEFINE est definido com a caracterstica de no permitir a
alterao de seu contedo.
Dessa forma, um termo definido atravs da diretiva #DEFINE pode ser considerado como uma
constante.
Pgina 142
ADVPL 1
Por essa razo a aplicao ERP possui trs repositrios distintos para
cada uma das bases de dados homologadas pela Microsiga, pois cada
compilao utiliza uma diretiva referente ao seu idioma.
Ttulo ADVPL 1
Pgina 143
Com essas diretivas, podem ser verificados parmetros do Sistema, tais como o idioma com
o qual est parametrizado e a base de dados utilizada para armazenar e gerenciar as
informaes do ERP. Assim, ao invs de escrever dois, ou mais cdigos fontes que realizam a
mesma funo, mas utilizando recursos distintos para cada base de dados, ou exibindo
mensagem para cada um dos idiomas tratados pela aplicao. O desenvolvedor pode
preparar seu cdigo fonte para ser avaliado pelo pr-processador, que ir gerar um cdigo
compilado de acordo com a anlise dos parmetros de ambiente.
#IFDEF SPANISH
#DEFINE STR0001 Hola !!!
#ELSE
#IFDEF ENGLISH
#DEFINE STR0001 Hello !!!
#ELSE
#DEFINE STR0001 Ol !!!
#ENDIF
#ENDIF
Pgina 144
ADVPL 1
Banco de Dados: Verifica as variveis AXS e TOP para determinar se o banco de dados
em uso pela aplicao est no formado ISAM (DBF, ADS, CTREE, etc.) ou, se est
utilizando a ferramenta TOPCONNECT (DbAcess).
#IFDEF TOP
#ELSE
DbSelectArea(SA1)
#ENDIF
Ttulo ADVPL 1
Pgina 145
Diretiva: #COMMAND
Essa diretiva permite que o desenvolvedor defina para o compilador como uma expresso
deve ser interpretada.
Pgina 146
ADVPL 1
Ttulo ADVPL 1
Pgina 147
Exerccio 08
Vamos Desenvolver um programa que permita ao usurio pesquisar um cliente,
informando seu CNPJ e se o mesmo existir na base, exibir suas principais
informaes.
Exerccio 09
Utilizando a interface visual desenvolvida para o exerccio anterior, desenvolver a
funo genrica GetTexto(), para ser utilizada nas aplicaes do Jogo da Velha e
Jogo da Forca.
Exerccio 10
Utilizando a interface visual desenvolvida para o exerccio anterior, desenvolver a
funo genrica GetTexto(), para ser utilizada nas aplicaes do Jogo da Velha e
Jogo da Forca.
Exerccio 11
Utilizando a funo AVISO(), desenvolver um programa que permita ao usurio
selecionar a opo de busca de CNPJ por cliente ou fornecedor, e se encontrar,
exiba os seus dados principais.
Pgina 148
ADVPL 1
Exerccio 12
Desenvolver uma rotina que capture vrios CNPJs de clientes informados pelo
usurio, e verifique para cada um deles se o mesmo existe ou no na base de dados.
Ao final informar quais CNPJs foram informados, e de acordo com a seleo do
usurio, exibir os dados principais de um destes clientes.
Ttulo ADVPL 1
Pgina 149
Exerccio 13
Utilizando a funo FORMBATCH(), desenvolver uma rotina que verifique se para
cada item de uma nota fiscal de entrada existe o respectivo cabealho, e se for
encontrado algum item inconsistente, comunique a ocorrncia ao usurio que est
realizando o processamento.
Exerccio 14
Vamos Desenvolver uma rotina que, atravs do uso de um bloco de cdigo, converta
a estrutura da tabela SA1, obtida com a funo DBSTRUCT(), em uma string
denominada cCampo.
Pgina 150
ADVPL 1
MDULO
03:
CUSTOMIZAES
DESENVOLVENDO
PEQUENAS
O Sistema Protheus, por outro lado, uma plataforma tecnolgica que engloba um Servidor
de Aplicao, um Dicionrio de Dados e as Interfaces para a conexo com o usurio. o
Protheus que executa o cdigo ADVPL, assim como o devido acesso base da dados.
O Protheus composto pelo ERP (que engloba, alm das funcionalidades descritas nos
captulos anteriores, mais de trinta verticais aplicadas s reas especficas de negcios) e
pelo Configurador (programa que permite customizar o Sistema s necessidades do
usurio de forma fcil).
Ttulo ADVPL 1
Pgina 151
Para executar um programa desenvolvido em ADVPL, preciso antes de mais nada escrev-lo
e compil-lo. Este procedimento feito atravs da ferramenta TOTVS DevStudio do
Protheus (Totvs Development Studio).
Pgina 152
ADVPL 1
Proteger o programa fonte, evitando que seja alterado indevidamente, pois somente
os objetos so distribudos com uma execuo mais rpida em funo da compilao
no DEV-Studio;
Ttulo ADVPL 1
Pgina 153
Que o Sistema cresa de forma ilimitada, pois os objetos ficam fora do executvel;
Pgina 154
ADVPL 1
Ela demonstra tambm que os dados a serem processados podem estar armazenados em
bases ISAM ou em Bancos de Dados padro SQL. No primeiro caso, o server comunica- se
diretamente com os dados. Em Bancos SQL a interface TOPCONNECT / DBACCESS que
converte os comandos de entrada e sada, adequando-os ao SQL utilizado (SQl Server
Microsoft, Oracle, DB2, etc.).
Ttulo ADVPL 1
Pgina 155
Protheus Monitor / TOTVS Monitor: Programa de anlise que verifica quem est
usando o Sistema e possibilita o envio de mensagens, ou mesmo derrubar conexes
(TOTVSMONITOR.EXE).
Caso exista algum Firewall ou Proxy entre o WEB Server e o Browser que vai acessar o
SmartClient ActiveX, eles devero ser configurados para permitir o seu download.
Pgina 156
ADVPL 1
Ttulo ADVPL 1
Pgina 157
Apesar da estrutura ilustrada anteriormente, indicar que as pastas esto subordinadas pasta
PROTHEUS, possvel que algumas delas possam estar em mquinas diferentes, ou at
mesmo em Ambientes computacionais diferentes.
Pgina 158
ADVPL 1
Para isso, necessrio configurar, ou seja, informar ao Protheus onde est cada uma delas.
Esse tipo de informao consta nos arquivos de parmetros de configurao do Sistema
(TOTVSAPPSERVER.INI e TOTVSSMARTCLIENT.INI) existentes nas respectivas pastas
APPSERVER e SMARTCLIENT.
Ttulo ADVPL 1
Pgina 159
Pgina 160
ADVPL 1
Destino:
c:\protheus\bin\appserver\totvsappserve
- console
Iniciar
em:
c:\protheus\bin\appserver
-Console ou -Debug
Executado como uma JanelaConsole, as informaes recebidas das conexes com o TOTVS
Application Server conectados so exibidas diretamente na tela do console do TOTVS
Application Server, bem como informaes de No Conformidades.
-Install
-Remove
Para remov-lo da Lista de Servios do NT, possvel execut-lo com a opo de Linha
de Comando.
Destino:
c:\protheus\bin\smartclient\totvssmartc
M
Iniciar
em:
c:\protheus\bin\smartclient
-Q (Quiet)
Indica que o TOTVS Smart Client no dever mostrar o Splash (Imagem de Apresentao) e a
tela de identificao de Parmetros Iniciais, necessita ser acompanhada da (Clusula P).
Ttulo ADVPL 1
Pgina 161
-P (Main Program)
-E (Environment)
Nome da Seo de Environment, no (Ini do Server) que ser utilizada, para definies gerais.
-C (Connection)
Nome da Seo de Conexo que ser utilizada para a conexo ao TOTVS Application Server.
-M (AllowMultiSession)
Permite as mltiplas instncias (Cpias) do TOTVS Smart Client, na mesma mquina, o que
por Default no permitido.
Pgina 162
ADVPL 1
Os parmetros que configuram o local do RPO, o Banco de Dados (ISAM ou SQL), os arquivos
de menus, configuraes e customizaes do sistema no arquivo INI so:
RootPath: Aponta para a pasta raiz (inicial), a partir da qual sero localizados os
dados (no caso de ISAM), bem como o prprio Dicionrio de Dados (Exemplo:
RootPath=C:\PROTHEUS\PROTHEUS_DATA).
Ttulo ADVPL 1
Pgina 163
[ENVIRONMENT]
SOURCEPATHC:\PROTHEU
S\APO
ROOTPATH=
C:\MP811\PROTHEUS_DAT
A
STARTPATH=\
PROTHEUS\
RPODB=TOP
RPOLANGUAGE=PORTUG
UESE
RPOVERSION=101
LOCALFILES=ADS
TRACE=0
LOCALDBEXTENSION=.DB
F
PICTFORMAT=DEFAULT
DATEFORMAT=DEFAULT
[DRIVERS]
ACTIVE=TCP
[TCP]
TYPE=TCPIP
PORT=1234
Pgina 164
ADVPL 1
[CONFIG]
LASTMAINPROG=SIGA
CFG
LANGUAGE=1
[DRIVERS]
ACTIVE=TCP
[TCP]
SERVER=172.16.72.41
PORT=1234
Port: Indica o nmero da porta a ser utilizada para a comunicao entre o Protheus
Server e o Protheus Remote. necessrio que a porta utilizada na comunicao seja a
mesma em ambos (no TOTVSAPPSERVER.INI e no TOTVSSMARTCLIENT.INI). Vale
ressaltar que a porta 80 reservada para a Internet e pode causar conflitos caso seja
utilizada na comunicao do Protheus.
Server: Aponta para o endereo do servidor que pode ser a prpria mquina
(localhost) ou o nome da mquina (Server= Servidor_01) ou mesmo um endereo IP
(exemplo Server=172.16.72.41).
Exemplo:
Ttulo ADVPL 1
Pgina 165
99..33..11..
FFuunncciioonnaalliiddaaddeess A
Abboorrddaaddaass
Para contextualizar a estrutura da aplicao ERP no tpico a seguir detalhada a forma como
as tabelas de dados do Sistema esto divididas entre os diversos mdulos que compe o
Sistema Protheus.
99..33..22..
Arquivo
Descrio
Pgina 166
SIGAPSS
SIX
SX1
Perguntas e respostas
SX2
Mapeamento de tabelas
SX3
Dicionrio de Dados
ADVPL 1
SX4
SX5
Tabelas
SX6
Parmetros
SX7
Gatilhos de Interface
SX8
Fora de uso
SX9
SXA
SXB
SXD
SXE
SXF
SXG
SXK
SXO
SXP
SXQ
SXR
SXS
SXT
Ttulo ADVPL 1
Pgina 167
Ambientes e tabelas
Na aplicao PROTHEUS as tabelas de dados podem ter uma estrutura mais simples e
econmica, com tabelas em DBF/ADS do fabricante Extended System ou CTREE do fabricante
FAIRCOM ou uma estrutura mais robusta e complexa, em bases SQL (SQLSERVER da
Microsoft, ORACLE, DB II da IBM, SYBASE, MYSQL, POSTGREE, etc.).
Para permitir uma utilizao adequada das tabelas de dados do Sistema por cada um dos
Ambientes da aplicao ERP, as tabelas foram divididas em grupos denominados famlias.
Cada mdulo pode utilizar uma ou mais famlias de tabelas especificas para suas atividades, e
ainda compartilhar informaes com outros mdulos, atravs de famlias comuns a todas as
operaes realizadas no Sistema.
Pgina 168
ADVPL 1
A tabela a seguir demonstra alguns dos mdulos que compe a aplicao ERP PROTHEUS
atualmente:
Ambiente
SIGAATF
Identificao
ATIVO FIXO
SIGACOM COMPRAS
SIGACON CONTABILIDADE
SIGAEST
ESTOQUE E CUSTOS
SIGAFAT
FATURAMENTO
SIGAFIN
FINANCEIRO
SIGAFIS
LIVROS FISCAIS
SIGAPCP
SIGAGPE
GESTO DE PESSOAL
SIGAFAS
FATURAMENTO DE SERVIOS
SIGAVEI
VECULOS
OFICINAS
SIGAPON
PONTO ELETRNICO
SIGAEIC
SIGATCF
TERMINAL
SIGAQIE
Ttulo ADVPL 1
Pgina 169
O nome de cada tabela no Protheus constitudo de seis dgitos que so utilizados para
formar a seguinte representao:
SF
Onde:
A tabela a seguir demonstra algumas das principais famlias de tabelas utilizadas pela
aplicao ERP Protheus:
Famlia
Descrio
Pgina 170
ADVPL 1
Famlia
Descrio
Cadastros
e
movimentaes
ambiente Financeiro
Cadastros
do
Ambiente
de
Planejamento e Controle de Produo
Movimentos
do
Ambiente
de
Planejamento e Controle de Produo
Gesto de Projetos
Contabilidade Gerencial
do
Ttulo ADVPL 1
Pgina 171
Famlia
Descrio
Contabilidade Gerencial
Contabilidade Gerencial
Contabilidade Gerencial
Transportadoras e derivados
Gesto Hospitalar
Gesto Educacional
Servios Pblicos
Qualidade e derivados
Plano de Sade
Workflow
Pgina 172
ADVPL 1
ndices
Cada tabela do Sistema possui seus ndices definidos no arquivo de configurao SIX, o qual
pode ser atualizado com a utilizao do mdulo Configurador.
Os arquivos de ndices das tabelas de Sistema sero criados de acordo com o banco de dados
utilizado (ISAM ou conexo via TOPCONNECT).
Para os bancos de dados ISAM sero gerados arquivos com a mesma nomenclatura da tabela
de dados, mas com uma extenso diferenciada (atualmente .CDX). No caso da utilizao de
um banco de dados, cada ndice ser uma numerao sequencial em funo do nome da
tabela original.
As especificaes das chaves de ndices de cada um das tabelas est disponvel no arquivo de
sistema SIX, e a chave nica da tabela utilizada para banco de dados est descrita na tabela
SX2.
Menus
Cada mdulo da aplicao ERP possui um menu padro com todas as funcionalidades
disponveis para o Ambiente, menu este definido atravs de sintaxe XML (arquivos .XNU).
Os menus possuem uma estrutura padro que permite ao usurio localizar e identificar
facilmente cada uma das funcionalidades oferecidas pelo Ambiente.
Ttulo ADVPL 1
Pgina 173
99..33..33..
A
Acceessssaannddoo oo m
mdduulloo CCoonnffiigguurraaddoorr
Para executar o mdulo Configurador necessrio que a aplicao Protheus Server esteja em
execuo e atravs da aplicao Protheus Remote dever ser informada como programa
inicial a opo SIGACFG.
Pgina 174
ADVPL 1
Ttulo ADVPL 1
Pgina 175
Logo aps a sua confirmao do usurio e senha com direito de administrador, ser
apresentada a tela inicial do configurador, conforme mostra a figura a seguir:
Pgina 176
ADVPL 1
Ttulo ADVPL 1
Pgina 177
99..44..11..
D
Diicciioonnrriioo ddee D
Daaddooss ddaa aapplliiccaaoo EER
RPP
A idia do Dicionrio de Dados permitir que o usurio possa incluir ou inibir campos, ou
mesmo alterar as propriedades dos campos existentes. Pode, ainda, criar novas tabelas. Ou
seja, os programas ao invs de terem os campos definidos em seu cdigo original, lem o
Dicionrio em tempo de execuo, montando arrays com as propriedades de cada um. A
partir da, sua utilizao normal, atravs do uso de funes do ADVPL que tornam o
trabalho do desenvolvedor transparente a esta arquitetura.
O objetivo do Dicionrio de Dados permitir que o prprio usurio crie novas tabelas ou
altere os campos nas tabelas existentes quanto ao seu uso, sua ordem de apresentao,
legenda (nos trs idiomas), validao, help, obrigatoriedade de preenchimento, inicializao
etc.
Pgina 178
ADVPL 1
99..44..22..
A
Addiioo ddee ttaabbeellaass aaoo D
Diicciioonnrriioo ddee D
Daaddooss
Procedimento
1. Para adicionar uma tabela ao dicionrio de dados de uma empresa, selecione a opo
Dicionrio de Dados abaixo da empresa que ser atualizada. (rvore de opes da
parte esquerda da interface visual do Gerenciador de Bases de Dados).
Ttulo ADVPL 1
Pgina 179
o boto Incluir (
). Ao utilizar esta opo ser exibida a tela para definio dos
dados referentes nova tabela que ser criada:
Pgina 180
ADVPL 1
).
Ttulo ADVPL 1
Pgina 181
O nome da tabela preenchido automaticamente, adicionando 990. Esse dado referese empresa 99 (Teste Matriz) a qual est sendo adicionado tabela.
O Path refere-se pasta que conter efetivamente os dados das tabelas, quando
ISAM, As verses com banco de dados relacional no so utilizadas. Essa pasta ser
criada dentro da pasta indicada na configurao do Sistema como ROOTTPATH.
Pgina 182
ADVPL 1
99..44..33..
A
Addiioo ddee ccaam
mppooss ss ttaabbeellaass ddoo D
Diicciioonnrriioo ddee D
Daaddooss
Procedimento
Pgina 184
ADVPL 1
opo Incluir (
). Ao utilizar esta opo ser exibida a tela para definio dos
dados referentes ao novo campo que ser criado:
Ttulo ADVPL 1
Pgina 185
boto Confirmar (
).
).
).
Pgina 186
ADVPL 1
Tipo do campo: Indica se caractere, numrico, lgico, data ou memo. claro que a
mudana do tipo de campo deve ser feita com muito cuidado, pois, se tivermos um
campo numrico usado em clculos e ele for alterado para caractere, certamente
teremos um erro.
Tamanho do campo: Tambm aqui necessrio certo cuidado ao alter-lo, pois
poderemos ter truncamentos em relatrios e consultas em que h espao para
contedos maiores que o original.
Formato de edio: Define como o campo aparece nas telas e nos relatrios.
Contexto: Pode ser real ou virtual. O contexto virtual cria o campo somente na
memria e no na tabela armazenada no disco. Isso necessrio porque os
programas de cadastramento e de consulta genrica apresentam somente uma tabela
de cada vez. Assim, se quisermos apresentar um campo de uma outra tabela, ou
mesmo o resultado de um clculo, sem que tal informao ocupe espao fsico no HD,
utilizamos o contexto virtual. Campos virtuais normalmente so alimentados por
gatilhos.
Guia: Campo
Ttulo ADVPL 1
Pgina 187
20
Ttulo: a legenda que aparece nas telas/relatrios. H inclusive trs campos para
esta finalidade: em portugus, espanhol e ingls. Esta propriedade pode ser alterada
vontade, pois no interfere em nenhum processamento.
Guia: Opes
Guia: Validaes
Guia: Uso
Pgina 188
ADVPL 1
Guia: Mdulos
Ttulo ADVPL 1
Pgina 189
99..44..44..
A
Addiioo ddee nnddiicceess ppaarraa aass ttaabbeellaass ddoo D
Diicciioonnrriioo ddee D
Daaddooss
Conforme mencionado anteriormente, no Ambiente Protheus uma tabela pode ter vrios
ndices, os quais sero gerados de acordo com o banco de dados configurado para o Sistema.
Procedimento
Pgina 190
ADVPL 1
Ttulo ADVPL 1
Pgina 191
5. Aps a visualizao dos ndices j cadastrados no SIX para a tabela selecionada, utilize
Pgina 192
ADVPL 1
a opo Incluir (
). Ao utilizar esta opo, ser exibida a tela para definio dos
dados referentes ao novo ndice que ser criado:
Confirmar (
).
).
Ttulo ADVPL 1
Pgina 193
).
Pgina 194
ADVPL 1
Campos (
O campo relativo filial sempre faz parte dos ndices, com exceo do SM2, para que
os registros nas tabelas estejam agrupados por filiais, independente desta tabela ser
compartilhada entre as filiais.
99..44..55..
A
Addiioo ddee ggaattiillhhooss ppaarraa ooss ccaam
mppooss ddaass ttaabbeellaass ddoo SSiisstteem
maa
Procedimento
Ttulo ADVPL 1
Pgina 195
Pgina 196
ADVPL 1
o boto Incluir (
boto Confirmar (
).
A regra pode ser uma expresso que resulta em um valor a ser preenchido no Contra
Domnio.
Ttulo ADVPL 1
Pgina 197
Pgina 198
ADVPL 1
99..44..66..
Procedimento
1. Para adicionar uma tabela genrica, selecione os menus Ambiente, Cadastros, Tabelas.
o boto Incluir (
Ttulo ADVPL 1
Pgina 199
boto Confirmar (
Pgina 200
).
ADVPL 1
99..44..77..
Procedimento
Ttulo ADVPL 1
Pgina 201
boto Confirmar (
Pgina 202
).
ADVPL 1
10.
Projeto
Um programa para ser compilado deve ser vinculado a um projeto. Normalmente, programas
que fazem parte de um determinado mdulo ou ambiente esto em um mesmo projeto.
A vinculao dos programas a um projeto feita por meio dos arquivos do tipo PRW. Na
verdade, um projeto pode ser constitudo de um ou mais arquivos deste tipo, que por sua
vez, podem ter uma ou mais funes, conforme ilustra o diagrama a seguir:
Compilao
Uma vez adicionado a um projeto e compilado sem incidncias de erros de cdigo, o objeto
resultante ser cadastrado no RPO (Repositrio de Objetos) e poder ser utilizado pela
aplicao ERP.
A compilao dos itens de um projeto pode ser realizada individualmente, por grupo de
fontes (pastas) ou ainda selecionando-o inteiramente. Cada um dos fontes ser processado e
compilado separadamente, permitindo a visualizao do progresso da operao e das
mensagens de aviso (warnings) ou erros (critical errors) na guia Mensagens.
Execuo
Para que os objetos compilados e disponveis n RPO sejam utilizados, devem ser observadas
as seguintes regras:
Para identificar as causas de erros, a ferramenta DEV-Studio possui diversos recursos que
auxiliam o DEBUG.
Pgina 204
ADVPL 1
Variveis Locais
Variveis Privates
Variveis Publics
Variveis Statics
Janela da Watchs
Janela de Tabelas e Campos
Pilha de Chamadas
Atravs da Janela de Watchs possvel determinar quais variveis devem ser exibidas;
Na pilha de chamadas, verifica-se a sequncia de chamadas das funes;
Na pasta de Comandos, pode-se, enquanto o programa estiver pausado, escrever
qualquer comando e ao dar Enter, ele executado, permitindo pesquisar palavras e
expresses no prprio fonte ou em qualquer fonte armazenado no HD;
Interface da aplicao
Ttulo ADVPL 1
Pgina 205
Pgina 206
ADVPL 1
11.
Desta forma a linguagem possui dois grupos de funes distintos para atuar com os bancos
de dados:
As funes de manipulao de dados, ditos como genricos, permitem que uma aplicao
ADVPL seja escrita da mesma forma, independente se a base de dados configurada para o
sistema ERP for do tipo ISAM ou padro SQL.
Muitas destas funes foram inicialmente herdadas da linguagem CLIPPER, e mediante novas
implementaes da rea de Tecnologia da Microsiga foram melhoradas e adequadas s
necessidades do ERP. Por esta razo possvel encontrar em documentaes da linguagem
CLIPPER informaes sobre funes de manipulao de dados utilizados na ferramenta ERP.
Ttulo ADVPL 1
Pgina 207
Pgina 208
ADVPL 1
O acesso direto feito atravs de ndices que so tabelas paralelas s tabelas de dados e que
contm a chave e o endereo do registro, de forma anloga ao ndice de um livro. Para cada
chave, criado um ndice prprio.
Nas bases de dados padro ISAM os ndices so armazenados em um nico arquivo do tipo
CDX, j nos bancos de dados padro SQL cada ndice criado com uma numerao
sequencial, tendo como base o nome da tabela a qual ele est relacionado.
Nas bases de dados padro ISAM cada registro possui um identificador nativo ou ID
sequencial e ascendente que funciona como o endereo base daquela informao.
Este ID, mais conhecido como RECNO ou RECNUMBER gerado no momento de incluso do
registro na tabela e somente ser alterado se a estrutura dos dados dessa tabela sofra alguma
manuteno. Dentre as manutenes que uma tabela de dados ISAM pode sofrer, possvel
citar a utilizao do comando PACK, o qual apagar fisicamente os registros deletados da
tabela, forando uma renumerao dos identificadores de todos os registros. Essa
Ttulo ADVPL 1
Pgina 209
situao tambm torna necessria a recriao de todos os ndices vinculados quela tabela.
Isso ocorre nas bases de dados ISAM devido ao conceito de excluso lgica de registros que
as mesmas possuem. J os bancos de dados padro SQL nativamente utilizam apenas o
conceito de excluso fsica de registros, o que para outras aplicaes seria transparente, mas
no o caso do ERP Protheus.
Para manter a compatibilidade das aplicaes desenvolvidas para as bases de dados padro
ISAM, a rea de Tecnologia e Banco de Dados da Microsiga implementou, nos bancos de
dados padro SQL, o conceito de excluso lgica de registros existente nas bases de dados
ISAM, por meio da criao de campos de controle especficos: R_E_C_N_O_, D_E_L_E_T_ e
R_E_C_D_E_L.
Esses campos permitem que a aplicao ERP gerencie as informaes do banco de dados, da
mesma forma que as informaes em bases de dados ISAM.
Com isso o campo R_E_C_N_O_ ser um identificador nico do registro dentro da tabela,
funcionando como o ID ou RECNUMBER de uma tabela ISAM, mas utilizando um recurso
adicional disponvel nos bancos de dados relacionais conhecido com Chave Primria.
O campo D_E_L_E_T_ tratado internamente pela aplicao ERP como um flag ou marca de
excluso. Dessa forma, os registros que estiverem com este campo marcado sero
considerados como excludos logicamente. A execuo do comando PACK, em uma tabela de
um banco de dados padro SQL, visa excluir fisicamente os registros com o campo
D_E_L_E_T_ marcado, mas no causar o efeito de renumerao de RECNO (no caso
R_E_C_N_O_) que ocorre na tabela de bases de dados ISAM.
Pgina 210
ADVPL 1
SELECT()
DBSELECTAREA()
DBSETORDER()
DBSEEK() E MSSEEK()
DBSKIP()
DBGOTO()
DBGOTOP()
DBGOBOTTON()
DBSETFILTER()
RECLOCK()
SOFTLOCK()
MSUNLOCK()
DBDELETE()
DBUSEAREA()
DBCLOSEAREA()
DBRLOCK()
Ttulo ADVPL 1
Pgina 211
Sintaxe
DBRLOCK(xIdentificador)
Funo de base de dados, que efetua o lock (travamento) do registro
identificado pelo parmetro xIdentificador. Esse parmetro pode ser o Recno()
para tabelas em formado ISAM, ou a chave primria para bancos de dados
relacionais.
Descrio
Se o parmetro xIdentificador no for especificado, todos os locks da rea de
trabalho sero liberados e o registro posicionado ser travado e adicionado em
uma lista de registros bloqueados.
DBCLOSEAREA()
Sintaxe
DbCloseArea()
Descrio
DBCOMMIT()
Sintaxe
DBCOMMIT()
Descrio
DBCOMMITALL()
Sintaxe
DBCOMMITALL()
Descrio
DBDELETE()
Sintaxe
Pgina 212
DbDelete()
ADVPL 1
Descrio
DBGOTO()
Sintaxe
DbGoto(nRecno)
Descrio
Ttulo ADVPL 1
Pgina 213
DBGOTOP()
Sintaxe
DbGoTop()
Descrio
DBGOBOTTON()
Sintaxe
DbGoBotton()
Descrio
DBRLOCKLIST()
Sintaxe
DBRLOCKLIST()
Descrio
DBSEEK() E MSSEEK()
Sintaxe
Descrio
MsSeek(): Funo desenvolvida pela rea de Tecnologia da Microsiga, a qual
possui as mesmas funcionalidades bsicas da funo DbSeek(), com a vantagem
de no necessitar acessar novamente a base de dados para localizar uma
informao j utilizada pela thread (conexo) ativa.
DBSKIP()
Pgina 214
ADVPL 1
Sintaxe
DbSkip(nRegistros)
Descrio
DBSELECTAREA()
Sintaxe
DbSelectArea(nArea | cArea)
Descrio
Ttulo ADVPL 1
Pgina 215
DBSETFILTER()
Sintaxe
DbSetFilter(bCondicao, cCondicao)
Descrio
Define um filtro para a rea de trabalho ativa, o qual pode ser descrito na forma
de um bloco de cdigo ou atravs de uma expresso simples.
DBSETORDER()
Sintaxe
DbSetOrder(nOrdem)
Descrio
Define qual ndice ser utilizado pela rea de trabalho ativa, ou seja, pela rea
previamente selecionada atravs do comando DbSelectArea(). As ordens
disponveis no Ambiente Protheus so aquelas definidas no SINDEX /SIX, ou as
ordens disponibilizadas por meio de ndices temporrios.
DBORDERNICKNAME()
Sintaxe
DbOrderNickName(NickName)
Descrio
Define qual ndice criado pelo usurio ser utilizado. O usurio pode incluir os
seus prprios ndices e no momento da incluso deve criar o NICKNAME para o
mesmo.
DBUNLOCK()
Sintaxe
DBUNLOCK()
Mesma funcionalidade da funo UNLOCK(), s que recomendada para
ambientes de rede nos quais os arquivos so compartilhados.
Descrio
Libera o travamento do registro posicionado na rea de trabalho ativa e
confirma as atualizaes efetuadas naquele registro.
DBUNLOCKALL()
Pgina 216
ADVPL 1
Sintaxe
DBUNLOCKALL()
Descrio
DBUSEAREA()
Sintaxe
Descrio
MSUNLOCK()
Sintaxe
MsUnLock()
Descrio
RECLOCK()
Sintaxe
RecLock(cAlias,lInclui)
Descrio
RLOCK()
Sintaxe
RLOCK() lSucesso
Descrio
SELECT()
Ttulo ADVPL 1
Pgina 217
Sintaxe
Select(cArea)
Descrio
SOFTLOCK()
Sintaxe
SoftLock(cAlias)
Permite a reserva do registro posicionado na rea de trabalho ativa de forma
que outras operaes, com exceo da atual, no possam atualizar este registro.
Difere da funo RecLock() pois no gera uma obrigao de atualizao, e pode
ser sucedido por ele.
Descrio
Na aplicao ERP Protheus, o SoftLock() utilizado nos browses, antes da
confirmao da operao de alterao e excluso, pois neste momento a mesma
ainda no foi efetivada, mas outras conexes no podem acessar aquele registro
pois o mesmo est em manuteno, o que implementa da integridade da
informao.
UNLOCK()
Sintaxe
Descrio
Pgina 218
UNLOCK()
Libera o travamento do registro posicionado na rea de trabalho ativa e
confirma as atualizaes efetuadas naquele registro.
ADVPL 1
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou de uma
tabela aberta no momento. Neste caso, o ADVPL privilegiar o campo, de forma que 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
Essa linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da
varivel de memria chamada NOME.
cRes := FIELD->NOME
Nesse 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 abertos,
para evitar a necessidade de selecionar a rea antes de acessar o contedo de determinado
campo.
cRes := CLIENTES->NOME
As tabelas de dados, utilizadas pela aplicao ERP, recebem automaticamente do Sistema
o apelido ou ALIAS, especificado para as mesmas no arquivo de sistema SX2. Assim, se o
campo NOME pertence a uma tabela da aplicao PROTHEUS, o mesmo poder ser
referenciado com a indicao do ALIAS pr-definido dessa tabela.
Ttulo ADVPL 1
Pgina 219
Pgina 220
ADVPL 1
Semforos
que o solicitou;
Com isso, mesmo que tenhamos vrios processos solicitando as numeraes sequenciais para
uma mesma tabela, como por exemplo incluses simultneas de pedidos de vendas, teremos
para cada pedido um nmero exclusivo e sem o intervalos e numeraes no utilizadas.
Ttulo ADVPL 1
Pgina 221
A linguagem ADVPL permite a utilizao das seguintes funes para o controle das
numeraes sequenciais utilizadas nas tabelas da aplicao ERP:
GETSXENUM()
CONFIRMSXE()
ROLLBACKSXE()
GETSXENUM()
Sintaxe
Descrio
CONFIRMSXE()
Sintaxe
CONFIRMSXE(lVerifica)
Descrio
ROLLBACKSXE()
Sintaxe
ROLLBACKSXE()
Descrio
Pgina 222
ADVPL 1
12.
Nesse tpico sero abordadas as formas pelas quais a aplicao ERP Protheus pode ser
customizada, com a utilizao da linguagem ADVPL.
Ttulo ADVPL 1
Pgina 223
1122..11..11..
V
Vaalliiddaaeess ddee ccaam
mppooss ee ppeerrgguunnttaass
Com base nessa premissa, a utilizao de validaes, no Dicionrio de Dados (SX3), ou nas
Perguntas de Processos e Relatrios (SX1), dever estar focada sempre na utilizao de
funes, ou expresses que resultem em um retorno lgico.
VAZIO()
NAOVAZIO()
EXISTCPO()
EXISTCHAV()
PERTENCE()
POSITIVO()
NEGATIVO()
TEXTO()
EXISTCHAV()
Sintaxe
Descrio
Esta funo utilizada normalmente para verificar se um determinado cdigo de
cadastro j existe na tabela na qual a informao ser inserida, como por
exemplo, o CNPJ no cadastro de clientes, ou fornecedores.
Pgina 224
ADVPL 1
EXISTCPO()
Sintaxe
Descrio
Essa Funo utilizada normalmente para verificar se a informao digitada em
um campo, que dependente de outra tabela, realmente existe na mesma.
Como por exemplo, o cdigo de um cliente em um pedido de venda.
NAOVAZIO()
Sintaxe
NaoVazio()
Descrio
NEGATIVO()
Sintaxe
Negativo()
Descrio
PERTENCE()
Sintaxe
Pertence(cString)
Descrio
Retorna .T. ou .F. se o contedo digitado para o campo est contido na string,
definida como o parmetro da funo. Normalmente utilizada em campos com
a opo de combo, pois caso contrrio seria utilizada a funo ExistCpo().
Ttulo ADVPL 1
Pgina 225
POSITIVO()
Sintaxe
Positivo()
Descrio
TEXTO()
Sintaxe
Texto()
Descrio
VAZIO()
Sintaxe
Vazio()
Descrio
Pgina 226
ADVPL 1
1122..11..22..
Funes
Contedo Funcionalidade
A
S<n>
Templates
Contedo Funcionalidade
X
Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para
numricos
Ttulo ADVPL 1
Pgina 227
A1_NOME Caracter - 40
Picture: @!
Pgina 228
ADVPL 1
SAY e PSAY
Funes
Contedo Funcionalidade
C
Templates
Contedo Funcionalidade
X
Ttulo ADVPL 1
Pgina 229
Pgina 230
ADVPL 1
de
de
de
de
Ttulo ADVPL 1
Pgina 231
Na definio da regra de retorno deve ser considerado o tipo do campo que ser
atualizado, pois esse campo que determina qual o tipo do retorno ser
considerado vlido para o gatilho.
GETMV()
SUPERGETMV()
GETNEWPAR()
Pgina 232
ADVPL 1
1122..33..11..
FFuunneess ppaarraa aa m
maanniippuullaaoo ddee ppaarrm
meettrrooss
GETMV()
SUPERGETMV()
GETNEWPAR()
PUTMV()
GETMV()
Sintaxe
GETMV(cParametro)
Descrio
Ttulo ADVPL 1
Pgina 233
GETNEWPAR()
Sintaxe
Descrio
Difere do SuperGetMV() pois considera que o parmetro pode no existir na
verso atual do Sistema, e por consequncia no ser exibida a mensagem de
help.
PUTMV()
Sintaxe
PUTMV(cParametro, cConteudo)
Descrio
SUPERGETMV()
Sintaxe
Descrio
Difere do GetMv() pois os parmetros consultados so adicionados em uma rea
de memria que permite que em uma nova consulta no seja necessrio acessar
e pesquisar o parmetro na base de dados.
Pgina 234
ADVPL 1
1122..33..22..
Dessa forma, qualquer alterao na base realizada por uma rotina, configurada em um
Ttulo ADVPL 1
Pgina 235
Um ponto de entrada uma User Function desenvolvida com a finalidade de interagir com
uma rotina padro da aplicao ERP.
ERP;
Premissas e Regras
Um ponto de entrada no deve ser utilizado para outras finalidades seno para as
quais foi pr-definido, sob pena de causar a perda da integridade das informaes da
base de dados, ou provocar eventos de erro durante a execuo da rotina padro.
Um ponto de entrada deve ser transparente para o processo padro, de forma que
todas as tabelas, acessadas pelo ponto de entrada e que sejam utilizadas pela rotina
padro, devero ter a sua situao imediatamente anterior execuo do ponto
Pgina 236
ADVPL 1
chamado como uma funo, ele no recebe parmetros. A aplicao ERP disponibiliza
uma varivel de Sistema denominada PARAMIXB, a qual recebe os parmetros da
funo chamadora e os disponibiliza para serem utilizados pela rotina customizada.
aplicao ERP, desta forma seu tipo pode variar de um contedo simples (caractere,
numrico, lgico e etc.) a um tipo complexo como um array ou um objeto. Assim,
necessrio sempre avaliar a documentao sobre o ponto, bem como proteger a
funo customizada de tipos de PARAMIXB no tratados por ela.
Ttulo ADVPL 1
Pgina 237
13.
INTERFACES VISUAIS
A linguagem ADVPL possui duas formas distintas para definio de interfaces visuais no
Ambiente ERP: sintaxe convencional, nos padres da linguagem CLIPPER e a sintaxe orientada
a objetos.
Alm das diferentes sintaxes disponveis para definio das interfaces visuais, o ERP Protheus
possui funcionalidades pr-definidas, as quais j contm todos os tratamentos necessrios
para atender as necessidades bsicas de acesso e manuteno das informaes do Sistema.
Neste tpico sero abordadas as sintaxes convencionais para definio das interfaces visuais
da linguagem ADVPL e as interfaces de manuteno, disponveis no Ambiente ERP Protheus.
utilizao
da
sintaxe
CLIPPER
na
definio
dos
Pgina 238
ADVPL 1
Os componentes da interface visual que sero tratados neste tpico, utilizando a sintaxe
ADVPL so:
MSDIALOG()
MSGET()
SAY()
BUTTON()
SBUTTON()
BUTTON()
Sintaxe
nLargura,nAltura UNIDADE OF
Descrio
MSDIALOG()
Sintaxe
Descrio
Ttulo ADVPL 1
Pgina 239
MSGET()
Sintaxe
Descrio
SAY()
Sintaxe
Descrio
SBUTTON()
Sintaxe
Descrio
Pgina 240
ADVPL 1
@ 010,050 MSGET
99.999.999/9999-99";
VALID !Vazio()
cCGC
SIZE
55,
11
OF
oDlg
PIXEL
PICTURE
"@R
Ttulo ADVPL 1
Pgina 241
AxCadastro
Mbrowse
Ambos modelos utilizam como premissa que a estrutura da tabela a ser utilizada esteja
definida no dicionrio de dados do sistema (SX3).
1133..22..11..
A
AxxCCaaddaassttrroo(())
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros
cAlias
cTitulo
Ttulo da Janela
cVldExc
cVldAlt
Pgina 242
ADVPL 1
Exemplo:
#include "protheus.ch"
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
Ttulo ADVPL 1
Pgina 243
1133..22..22..
M
MB
Brroow
wssee(())
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros
nLin1,
nCol1, Coordenadas dos cantos aonde o browse ser exibido. Para seguir o
nLin2, nCol2
padro da AXCADASTRO() use 6,1,22,75 .
cAlias
Pgina 244
ADVPL 1
aRotina
cCadastro
AADD(aRotina,{"Pesquisar"
,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar"
,"AxVisual",0,2})
AADD(aRotina,{"Incluir"
,"AxInclui" ,0,3})
AADD(aRotina,{"Alterar"
,"AxAltera",0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta",0,5})
Exemplo:
#include "protheus.ch"
:= {}
AADD(aRotina,{"Pesquisar"
,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar"
,"AxVisual",0,2})
AADD(aRotina,{"Incluir"
,"AxInclui",0,3})
AADD(aRotina,{"Alterar"
,"AxAltera",0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta",0,5})
Ttulo ADVPL 1
Pgina 245
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
1 Pesquisar;
2 Visualizar;
3 Incluir;
Pgina 246
ADVPL 1
4 Alterar;
5 Excluir;
6 Livre.
Ttulo ADVPL 1
Pgina 247
#include "protheus.ch"
:= {}
AADD(aRotina,{"Pesquisar"
,"AxPesqui"
,0,1})
AADD(aRotina,{"Visualizar"
,"AxVisual"
,0,2})
AADD(aRotina,{"Incluir"
,"U_BInclui" ,0,3})
AADD(aRotina,{"Alterar"
,"AxAltera"
,0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta"
,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
RETURN
Pgina 248
ADVPL 1
Ttulo ADVPL 1
Pgina 249
1133..22..33..
A
AxxFFuunnccttiioonnss(())
Conforme foi mencionado nos tpicos sobre as interfaces padres AxCadastro() e Mbrowse(),
existem funes padres da aplicao ERP que permitem a visualizao, incluso, alterao e
excluso de dados em formato simples.
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
AXALTERA()
Sintaxe
Descrio
AXDELETA()
Sintaxe
Descrio
AXINCLUI()
Pgina 250
ADVPL 1
Sintaxe
Descrio
AXPESQUI()
Sintaxe
AXPESQUI()
Descrio
Ttulo ADVPL 1
Pgina 251
AXVISUAL()
Sintaxe
Descrio
Exerccio 15
Desenvolver uma validao para um campo especfico do tipo caractere, cujo
contedo esteja relacionado a outra tabela e que exiba uma mensagem de aviso
caso o cdigo informado no exista nessa tabela relacionada.
Exerccio 16
Desenvolver uma validao para um campo caractere existente na base, para que
seja avaliado se aquele cdigo j existe cadastrado, e se positivo, exiba uma
mensagem de aviso alertando sobre a ocorrncia.
Exerccio 17
Desenvolver um gatilho que retorne uma descrio complementar para um campo
vinculado ao campo cdigo utilizado nos exerccios anteriores.
Pgina 252
ADVPL 1
Exerccio 18
Customizar o parmetro que define o prefixo do ttulo de contas a pagar, gerado
pela integrao COMPRAS -> FINANCEIRO atravs da incluso de uma nota fiscal de
entrada, de forma que o prefixo do ttulo seja gerado com o cdigo da filial corrente.
Exerccio 19
Proteger a rotina desenvolvida no exerccio anterior, de forma a garantir que na
utilizao da filial como prefixo do ttulo, no ocorrer duplicidade de dados em
contas a pagar do financeiro.
Exerccio 20
Vamos Implementar uma validao adicional no cadastro de clientes, com a
utilizao do ponto de entrada adequado, de forma que o campo CNPJ (A1_CGC)
seja obrigatrio para todos os tipos de clientes, exceto os definidos como Exterior.
Ttulo ADVPL 1
Pgina 253
APNDICES
BOAS PRTICAS DE PROGRAMAO
14.
UTILIZAO DE IDENTAO
obrigatria a utilizao da identao, pois torna o cdigo muito mais legvel. Veja os
exemplos abaixo:
A utilizao da identao, seguindo as estruturas de controle de fluxo (while, if, caso etc),
torna a compreenso do cdigo muito mais fcil:
Para identar o cdigo utilize a tecla <TAB> e a ferramenta DEV-Studio, a qual pode ser
configurada atravs da opo Preferncias:
Pgina 254
ADVPL 1
Ttulo ADVPL 1
Pgina 255
15.
CAPITULAO DE PALAVRAS-CHAVE
dbSeek()
dbSelectArea()
Pgina 256
ADVPL 1
16.
Notao
Tipo
dado
de
Exemplo
Array
aValores
Bloco de
cdigo
bSeek
Caracter
c
cNome
Data
d
dDataBase
Lgico
l
lContinua
Numrico
n
nValor
Ttulo ADVPL 1
Pgina 257
Objeto
o
oMainWindow
Indefinido
x
Pgina 258
xConteudo
ADVPL 1
17.
PALAVRAS RESERVADAS
AADD
DTOS
INKEY
REPLICATE VAL
ABS
ELSE
INT
RLOCK
VALTYPE
ASC
ELSEIF
LASTREC
ROUND
WHILE
AT
EMPTY
LEN
ROW
WORD
BOF
ENDCASE
LOCK
RTRIM
YEAR
BREAK
ENDDO
LOG
SECONDS
CDOW
ENDIF
LOWER
SELECT
CHR
EOF
LTRIM
SETPOS
CMONTH
EXP
MAX
SPACE
COL
FCOUNT
MIN
SQRT
CTOD
FIELDNAME MONTH
STR
DATE
FILE
PCOL
SUBSTR
DAY
FLOCK
PCOUNT
TIME
DELETED
FOUND
PROCEDURE
TRANSFORM DEVPOS
FUNCTION
PROW
TRIM
DOW
IF
RECCOUNT TYPE
DTOC
IIF
RECNO
UPPER
AS
CATCH
THROW
TRY
Ttulo ADVPL 1
Pgina 259
Pgina 260
ADVPL 1
CTOD()
Sintaxe: CTOD(cData)
Parmetros
cData
Exemplo:
cData := 31/12/2006
dData := CTOD(cData)
CVALTOCHAR()
Ttulo ADVPL 1
Pgina 261
Realiza a converso de uma informao do tipo numrico em uma string, sem a adio de
espaos a informao.
Sintaxe: CVALTOCHAR(nValor)
Parmetros
nValor
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
Pgina 262
ADVPL 1
DTOC()
Realiza a converso de uma informao do tipo data para caractere, sendo o resultado no
formato DD/MM/AAAA.
Sintaxe: DTOC(dData)
Parmetros
dData
Exemplo:
DTOS()
Sintaxe: DTOS(dData)
Parmetros
dData
Exemplo:
Ttulo ADVPL 1
Pgina 263
STOD()
Sintaxe: STOD(sData)
Parmetros
sData
Exemplo:
sData := LERSTR(01,08) // Funo que realiza a leitura de uma string de um txt previamente
// aberto
dData := STOD(sData)
STR()
Sintaxe: STR(nValor)
Parmetros
nValor
Pgina 264
ADVPL 1
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
STRZERO()
Realiza a converso de uma informao do tipo numrico em uma string, adicionando zeros
esquerda do nmero convertido, de forma que a string gerada tenha o tamanho especificado
no parmetro.
nValor
nTamanho
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
Ttulo ADVPL 1
Pgina 265
VAL()
Sintaxe: VAL(cValor)
Parmetros
cValor
Exemplo:
Pgina 266
ADVPL 1
TYPE()
Sintaxe: TYPE(cVariavel)
Parmetros
cVariavel
Exemplo:
IF TYPE(dDataBase) == D
MSGINFO(Database do sistema: +DTOC(dDataBase))
ELSE
MSGINFO(Varivel indefinida no momento)
Ttulo ADVPL 1
Pgina 267
VALTYPE()
Sintaxe: VALTYPE(cVariavel)
Parmetros
cVariavel
Exemplo:
LOCAL cTexto :=
LOCAL nColF
:= 0
LOCAL nLargGet
:= 0
PRIVATE oDlg
:= 1
:= 1
ENDIF
cTexto
:= Space(nTamanho)
nLargGet
:= Round(nTamanho * 2.5,0)
nColf
ADVPL 1
cTexto := IIF(nOpca==1,cTexto,"")
RETURN cTexto
Ttulo ADVPL 1
Pgina 269
Manipulao de arrays
Array()
A funo Array() utilizada na definio de variveis de tipo array, como uma opo a sintaxe
utilizando chaves ({}).
nLinhas
nColunas
Exemplo:
aDados := Array(3,3) // Cria um array de trs linhas, cada qual com 3 colunas.
AADD()
Pgina 270
ADVPL 1
A funo AADD() permite a insero de um item em um array j existente, sendo que este
item podem ser um elemento simples, um objeto ou outro array.
aArray
xItem
Ttulo ADVPL 1
Pgina 271
Exemplo:
aDados := {} // Define que a varivel aDados um array, sem especificar suas dimenses.
aItem := {} // Define que a varivel aItem um array, sem especificar suas dimenses.
// Neste ponto o array a Item possui 03 elementos os quais podem ser acessados com:
// aItem[1] -> corresponde ao contedo de cVariavel1
// aItem[2] -> corresponde ao contedo de cVariavel2
// aItem[3] -> corresponde ao contedo de cVariavel3
AADD(aDados, aItem)
AADD(aDados, aItem)
// Neste ponto, o array aDados possui 03 elementos, aonde cada qual um array com outros
// 03 elementos, sendo:
Pgina 272
ADVPL 1
// Desta forma, o array aDados montando com uma estrutura de 03 linhas e 03 colunas, com
// o contedo definido por variveis externas, mas com a mesma forma obtida com o uso do
// comando: aDados := ARRAY(3,3).
ACLONE()
A funo ACLONE() realiza a cpia dos elementos de um array para outro array integralmente.
Sintaxe: AADD(aArray)
Parmetros
aArray
Array pr-existente que ter seu contedo copiado para o array especificado.
Exemplo:
// Neste ponto, o array aItens possui exatamente a mesma estrutura e informaes do array
// aDados.
Ttulo ADVPL 1
Pgina 273
ADEL()
aArray
nPosio
Exemplo:
Pgina 274
ADVPL 1
ASIZE()
aArray
nTamanho
Ttulo ADVPL 1
Pgina 275
Exemplo:
// Utilizando o array aItens, o qual teve um elemento excludo pelo uso da funo ADEL()
ASIZE(aItens,Len(aItens-1)).
// Nesse ponto o array aItens possui 02 elementos, ambos com contedos vlidos.
ASORT()
A funo ASORT() permite que os itens de um array sejam ordenados a partir de um critrio
pr-estabelecido.
aArray
nInicio
nItens
bOrdem
Pgina 276
ADVPL 1
aSort(aAlunos)
Ttulo ADVPL 1
Pgina 277
// Durante a execuo da funo aSort(), a varivel x receber o contedo do item que est
// posicionado. Como o item que est posicionado a posio aAlunos[x] e aAlunos[x] ->
// string contendo o nome de um aluno, possvel substituir x por cNomeAtu.
// A varivel y receber o contedo do prximo item a ser avaliado, e usando a mesma
// analogia de x, possvel substituir y por cNomeProx. Dessa forma o bloco de cdigo
// bOrdem pode ser re-escrito como:
aSort(aAlunos,,bOrdem)
ASCAN()
A funo ASCAN() permite que seja identificada a posio do array que contm uma
determinada informao, atravs da anlise de uma expresso descrita em um bloco de
cdigo.
aArray
bSeek
Pgina 278
ADVPL 1
Exemplo:
Ttulo ADVPL 1
Pgina 279
AINS()
aArray
nPosicao
Exemplo:
AINS(aAlunos,3)
Pgina 280
ADVPL 1
Ttulo ADVPL 1
Pgina 281
EVAL()
bBloco
xParamZ
Exemplo:
nInt := 10
bBloco := {|N| x:= 10, y:= x*N, z:= y/(x*N)}
Pgina 282
ADVPL 1
DBEVAL()
A funo DBEval() permite que todos os registros de uma determinada tabela sejam
analisados, e para cada registro ser executado o bloco de cdigo definido.
bBloco
bFor
bWhile
Ttulo ADVPL 1
Pgina 283
Exemplo 01
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
nCnt++
dbSkip()
End
Exemplo 02
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
Capital(X5_DESCRI)})
dbSkip()
End
Pgina 284
ADVPL 1
Exemplo 02 (continuao):
Ttulo ADVPL 1
Pgina 285
AEVAL()
A funo AEVAL() permite que todos os elementos de um determinada array sejam analisados
e para cada elemento ser executado o bloco de cdigo definido.
aArray
bBloco
nInicio
nFim
Exemplo 01:
Pgina 286
ADVPL 1
Manipulao de strings
ALLTRIM()
Retorna uma string sem os espaos direita e esquerda, referente ao contedo informado
como parmetro.
A funo ALLTRIM() implementa as aes das funes RTRIM (right trim) e LTRIM (left
trim).
Sintaxe: ALLTRIM(cString)
Parmetros
cString
String que ser avaliada para remoo dos espaos direita e esquerda.
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
ASC()
Converte uma informao caractere em seu valor, de acordo com a tabela ASCII.
Sintaxe: ASC(cCaractere)
Parmetros
cCaractere
Ttulo ADVPL 1
Pgina 287
Exemplo:
Pgina 288
ADVPL 1
EndCase
cRet := cRet+cLetra
Next
Return UPPER(cRet)
AT()
cCaractere
cString
Exemplo:
LOCAL cNoMascara
:= ""
LOCAL nX
:= 0
Ttulo ADVPL 1
Pgina 289
CHR()
Converte um valor nmero, referente a uma informao da tabela ASCII, no caractere que
esta informao representa.
Sintaxe: CHR(nASCII)
Parmetros
nASCII
Exemplo:
LEN()
Sintaxe: LEN(cString)
Parmetros
cString
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
Pgina 290
ADVPL 1
LOWER()
Retorna uma string com todos os caracteres minsculos, tendo como base a string passada
como parmetro.
Sintaxe: LOWER(cString)
Parmetros
cString
Exemplo:
cTexto := ADVPL
MSGINFO(Texto:+LOWER(cTexto))
Ttulo ADVPL 1
Pgina 291
RAT()
cCaractere
cString
STUFF()
Exemplo:
cLin
SUBSTR()
Retorna parte do contedo de uma string especificada, de acordo com a posio inicial deste
contedo na string e a quantidade de caracteres que dever ser retornada a partir daquele
ponto (inclusive).
Pgina 292
ADVPL 1
cString
nPosInicial
nCaracteres
Exemplo:
cCampo
:= A1_NOME
nPosUnder := AT(cCampo)
Ttulo ADVPL 1
Pgina 293
UPPER()
Retorna uma string com todos os caracteres maisculos, tendo como base a string passada
como parmetro.
Sintaxe: UPPER(cString)
Parmetros
cString
Exemplo:
cTexto := advpl
MSGINFO(Texto:+LOWER(cTexto))
ABS()
Sintaxe: ABS(nValor)
Parmetros
nValor
Exemplo:
nPessoas := 20
nLugares := 18
Pgina 294
ADVPL 1
Ttulo ADVPL 1
Pgina 295
INT()
nValor
Exemplo:
RETURN nQuantidade
Pgina 296
ADVPL 1
NOROUND()
nValor
nCasas
Exemplo:
nBase := 2.985
nValor := NOROUND(nBase,2) 2.98
Ttulo ADVPL 1
Pgina 297
ROUND()
nValor
nCasas
Exemplo:
nBase := 2.985
nValor := ROUND(nBase,2) 2.99
Pgina 298
ADVPL 1
Manipulao de arquivos
SELECT()
Sintaxe: Select(cArea)
Parmetros
cArea
Exemplo:
nArea := Select(SA1)
DBGOTO()
Move o cursor da rea de trabalho ativa para o record number (recno) especificado,
realizando um posicionamento direto, sem a necessidade uma busca (seek) prvio.
Sintaxe: DbGoto(nRecno)
Parmetros
nRecno
Ttulo ADVPL 1
Pgina 299
Exemplo:
DbSelectArea(SA1)
DbGoto(100) // Posiciona no registro 100
Pgina 300
ADVPL 1
DBGOTOP()
Sintaxe: DbGoTop()
Parmetros
Nenhum
Exemplo:
Ttulo ADVPL 1
Pgina 301
DBGOBOTTON()
Sintaxe: DbGoBotton()
Parmetros
Nenhum
Exemplo:
DBSELECTAREA()
Define a rea de trabalho especificada como sendo a rea ativa. Todas as operaes
subsequentes que fizerem referncia a uma rea de trabalho para utilizao, a menos que a
rea desejada seja informada explicitamente.
Pgina 302
ADVPL 1
nArea
cArea
Ttulo ADVPL 1
Pgina 303
DBSETORDER()
Define qual ndice ser utilizado pela rea de trabalho ativa, ou seja, pela rea previamente
selecionada atravs do comando DbSelectArea(). As ordens disponveis no Ambiente
Protheus so aquelas definidas no SINDEX /SIX, ou as ordens disponibilizadas por meio de
ndices temporrios.
Sintaxe: DbSetOrder(nOrdem)
Parmetros
nOrdem
Nmero de referncia da ordem que deseja ser definida como ordem ativa para
a rea de trabalho
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // De acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
DBORDERNICKNAME()
Define qual ndice criado pelo usurio ser utilizado. O usurio pode incluir os seus prprios
ndices e no momento da incluso deve criar o NICKNAME para o mesmo.
Sintaxe: DbOrderNickName(NickName)
Parmetros
NickName
Exemplo:
DbSelectArea(SA1)
DbOrderNickName(Tipo) // De acordo com o arquivo SIX -> A1_FILIAL+A1_TIPO
NickName: Tipo
Pgina 304
ADVPL 1
DBSEEK() E MSSEEK()
cChave
lSoftSeek
lLast
DbSelectArea(SA1)
DbSetOrder(1) // acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
Else
MsgAlert(Cliente no encontrado, Consulta por cliente)
Endif
Ttulo ADVPL 1
Pgina 305
DbSelectArea(SA1)
DbSetOrder(1) // acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
Pgina 306
Filial:
+ A1_FILIAL
+ CRLF +;
Cdigo:
+ A1_COD
+ CRLF +;
Loja:
+ A1_LOJA
+ CRLF +;
Nome:
ADVPL 1
DBSKIP()
Sintaxe: DbSkip(nRegistros)
Parmetros
nRegistros
DbSelectArea(SA1)
DbSetOrder(2) // A1_FILIAL + A1_NOME
DbGotop() // Posiciona o cursor no incio da rea de trabalho ativa.
While !EOF() // Enquanto o cursor da rea de trabalho ativa no indicar fim de arquivo
MsgInfo(Voc est no cliente: + A1_NOME)
DbSkip()
End
Ttulo ADVPL 1
Pgina 307
DbSelectArea(SA1)
DbSetOrder(2) // A1_FILIAL + A1_NOME
DbGoBotton() // Posiciona o cursor no final da rea de trabalho ativa.
While !BOF() // Enquanto o cursor da rea de trabalho ativa no indicar incio de arquivo
MsgInfo(Voc est no cliente: + A1_NOME)
DbSkip(-1)
End
Pgina 308
ADVPL 1
DBSETFILTER()
Define um filtro para a rea de trabalho ativa, o qual pode ser descrito na forma de um bloco
de cdigo ou atravs de uma expresso simples.
bCondicao
cCondicao
While !EOF()
MsgInfo(Voc est no cliente:+A1_COD)
DbSkip()
End
Ttulo ADVPL 1
Pgina 309
While !EOF()
MsgInfo(Voc est no cliente:+A1_COD)
DbSkip()
End
Pgina 310
ADVPL 1
DBSTRUCT()
Retorna um array contendo a estrutura da rea de trabalho (alias) ativo. A estrutura ser um
array bidimensional conforme abaixo:
I
D
*
No
me
ca
mp
o
Tip
o
ca
mp
o
Tama
nho
Deci
mais
*ndice do array
Sintaxe: DbStruct()
Parmetros
Nenhum
Exemplo:
cCampos :=
DbSelectArea(SA1)
aStructSA1 := DbStruct()
FOR nX := 1 to Len(aStructSA1)
cCampos += aStructSA1[nX][1] + /
NEXT nX
ALERT(cCampos)
Ttulo ADVPL 1
Pgina 311
RECLOCK()
Sintaxe: RecLock(cAlias,lInclui)
Parmetros
cAlias
lInclui
Exemplo 01 - Incluso
DbSelectArea(SA1)
RecLock(SA1,.T.)
SA1->A1_FILIAL := xFilial(SA1) // Retorna a filial de acordo com as configuraes do ERP.
SA1->A1_COD := 900001
SA1->A1_LOJA := 01
MsUnLock() // Confirma e finaliza a operao.
Exemplo 02 - Alterao
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
ADVPL 1
ENDIF
A linguagem ADVPL
RecLock(), as quais so:
possui
variaes
da
funo
RLOCK()
DBRLOCK()
MSUNLOCK()
Sintaxe: MsUnLock()
Parmetros
Nenhum
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
Pgina 314
ADVPL 1
UNLOCK()
DBUNLOCK()
DBUNLOCKALL()
SOFTLOCK()
Permite a reserva do registro posicionado na rea de trabalho ativa de forma que outras
operaes, com exceo da atual, no possam atualizar este registro. Difere da funo
RecLock(), pois no gera uma obrigao de atualizao, e pode ser sucedido por ele.
Sintaxe: SoftLock(cAlias)
Parmetros
cAlias
Ttulo ADVPL 1
Pgina 315
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1)
DbSeek(cChave)
IF Found()
SoftLock() // Reserva o registro localizado
lConfirma := AlteraSA1() // Funo ilustrativa que exibe os dados do registro
// posicionado e pemite a alterao dos mesmos.
IF lConfirma
RecLock(SA1,.F.)
GravaSA1() // Funo ilustrativa que altera os dados conforme a AlertaSA1().
MsUnLock() // Liberado o RecLock() e o SoftLock() do registro.
Endif
Endif
Pgina 316
ADVPL 1
DBDELETE()
Efetua a excluso lgica do registro posicionado na rea de trabalho ativa, sendo necessria
sua utilizao em conjunto com as funes RecLock() e MsUnLock().
Sintaxe: DbDelete()
Parmetros
Nenhum
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
IF Found()
RecLock(SA1,.F.) // Define que ser realizada uma alterao no registro posicionado.
DbDelete() // Efetua a excluso lgica do registro posicionado.
MsUnLock() // Confirma e finaliza a operao.
ENDIF
DBUSEAREA()
Define um arquivo de base de dados como uma rea de trabalho disponvel na aplicao.
lSoLeitura)
Ttulo ADVPL 1
Pgina 317
Parmetros
lNovo
cDriver
cAlias
Exemplo:
DbUserArea(.T., DBFCDX, \SA1010.DBF, SA1DBF, .T., .F.)
DbSelectArea(SA1DBF)
MsgInfo(A tabela SA1010.DBF possui: + STRZERO(RecCount(),6) + registros.)
DbCloseArea()
DBCLOSEAREA()
Permite que um alias presente na conexo seja fechado, o que viabiliza novamente seu uso
em outro operao. Este comando tem efeito apenas no alias ativo na conexo, sendo
necessria sua utilizao em conjunto com o comando DbSelectArea().
Sintaxe: DbCloseArea()
Parmetros
Nenhum
Exemplo:
Pgina 318
ADVPL 1
GETSXENUM()
cAlias
cCampo
cAliasSXE
nOrdem
CONFIRMSXE()
Sintaxe: CONFIRMSXE(lVerifica)
Parmetros
Ttulo ADVPL 1
Pgina 319
lVerifica
ROLLBACKSXE()
Sintaxe: ROLLBACKSXE()
Parmetros
Nenhum
Validao
EXISTCHAV()
Retorna .T. ou .F. se o contedo especificado existe no alias especificado. Se existir ser
exibido um help de sistema com um aviso informando da ocorrncia.
cAlias
cConteudo
Pgina 320
ADVPL 1
nIndice
EXISTCPO()
Retorna .T. ou .F. se o contedo especificado no existe no alias especificado. Caso no exista
ser exibido um help de sistema com um aviso informando da ocorrncia.
cAlias
cConteudo
nIndice
Ttulo ADVPL 1
Pgina 321
NAOVAZIO()
Sintaxe: NaoVazio()
Parmetros
Nenhum
NEGATIVO()
Sintaxe: Negativo()
Parmetros
Nenhum
PERTENCE()
Retorna .T. ou .F. se o contedo digitado para o campo est contido na string definida como
parmetro da funo. Normalmente utilizada em campos com a opo de combo, pois caso
contrrio seria utilizada a funo ExistCpo().
Sintaxe: Pertence(cString)
Parmetros
cString
POSITIVO()
Pgina 322
ADVPL 1
Sintaxe: Positivo()
Parmetros
Nenhum
TEXTO()
Retorna .T. ou .F. se o contedo digitado para o campo contm apenas nmeros ou
alfanumricos.
Sintaxe: Texto()
Parmetros
Nenhum
VAZIO()
Sintaxe: Vazio()
Parmetros
Nenhum
Parmetros
GETMV()
Sintaxe: GETMV(cParametro)
Parmetros
Ttulo ADVPL 1
Pgina 323
cParametro
GETNEWPAR()
Difere do SuperGetMV() pois considera que o parmetro pode no existir na verso atual do
sistema, e por consequncia no ser exibida a mensagem de help.
cParametro
cPadrao
cFilial
Define para qual filial ser efetuada a consulta do parmetro. Padro filial
corrente da conexo.
Pgina 324
ADVPL 1
PUTMV()
cParametro
cConteudo
SUPERGETMV()
cParametro
lHelp
cPadrao
Ttulo ADVPL 1
Pgina 325
cFilial
Pgina 326
Define para qual filial ser efetuada a consulta do parmetro. Padro filial
corrente da conexo.
ADVPL 1
MSDIALOG()
Define o componente MSDIALOG() que utilizado como base para os demais
componentes da interface visual, pois um componente MSDIALOG() uma janela da
aplicao.
Sintaxe:
Parmetros
oObjetoDLG
cTitulo
nLinIni, nColIni
nLiFim, nColFim
oObjetoRef
UNIDADE
Exemplo:
Ttulo ADVPL 1
Pgina 327
Pgina 328
ADVPL 1
MSGET()
Define o componente visual MSGET, o qual utilizado para captura de informaes
digitveis na tela da interface.
Sintaxe:
Parmetros
nLinha, nColuna
VARIAVEL
nLargura,nAltura
UNIDADE
oObjetoRef
cF3
VALID
WHEN
cPicture
Ttulo ADVPL 1
Pgina 329
Exemplo:
@ 010,050 MSGET cCGC SIZE 55, 11 OF oDlg PIXEL PICTURE "@R 99.999.999/9999-99";
VALID !Vazio()
Pgina 330
ADVPL 1
SAY()
Define o componente visual SAY, o qual utilizado para exibio de textos em uma tela
de interface.
Sintaxe:
Parmetros
nLinha, nColuna
cTexto
nLargura,nAltura
UNIDADE
oObjetoRef
Exemplo:
BUTTON()
Define o componente visual Button, o qual permite a incluso de botes de operao na
tela da interface, os quais sero visualizados somente com um texto simples para sua
identificao.
Sintaxe: BUTTON()
Ttulo ADVPL 1
Pgina 331
Parmetros
nLinha,nColuna
cTexto
nLargura,nAltura
UNIDADE
oObjetoRef
AO
Exemplo:
SBUTTON()
Define o componente visual SButton, que permite a incluso de botes de operao na
tela da interface, os quais sero visualizados dependendo da interface do sistema ERP
utilizada somente com um texto simples para sua identificao, ou com uma imagem
(BitMap) pr-definida.
Sintaxe: SBUTTON()
Parmetros
nLinha, nColuna
TYPE N
Pgina 332
ADVPL 1
AO
STATUS
oObjetoRet
Exemplo:
DEFINE SBUTTON FROM 020, 120 TYPE 2 ACTION (nOpca := 2,oDlg:End());
ENABLE OF oDlg
Interfaces de cadastro
AXCADASTRO()
Sintaxe
Descrio
Ttulo ADVPL 1
Pgina 333
MBROWSE()
Sintaxe
Descrio
AXPESQUI()
Funo de pesquisa padro em registros exibidos pelos browses do sistema, a qual
posiciona o browse no registro pesquisado. Exibe uma tela que permite a seleo do
ndice a ser utilizado na pesquisa e a digitao das informaes que compe a chave de
busca.
Sintaxe: AXPESQUI()
Parmetros
Nenhum
Pgina 334
ADVPL 1
AXVISUAL()
Funo de visualizao padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Sintaxe: AXVISUAL(cAlias, nReg, nOpc, aAcho, nColMens, cMensagem, cFunc,;
aButtons, lMaximized )
Parmetros
cAlias
nReg
nOpc
aAcho
Vetor com nome dos campos que sero exibidos. Os campos de usurio
sempre sero exibidos se no existir no parmetro um elemento com a
expresso "NOUSER"
nColMens
Parmetro no utilizado
cMensagem
Parmetro no utilizado.
cFunc
Funo que dever ser utilizada para carregar as variveis que sero
utilizadas pela Enchoice. Neste caso o parmetro lVirtual definido
internamente pela AxFunction() executada como .T.
Botes adicionais para a EnchoiceBar, no formato:
aButtons
aArray[n][1]
->
Imagem
aArray[n][2] -> bloco de cdigo contendo
aArray[n][3] -> ttulo do boto.
lMaximized
do
ao
do
boto;
boto;
AXINCLUI()
Funo de incluso padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Sintaxe: AxInclui(cAlias, nReg, nOpc, aAcho, cFunc, aCpos, cTudoOk, lF3,;
cTransact, aButtons, aParam, aAuto, lVirtual, lMaximized)
Ttulo ADVPL 1
Pgina 335
Parmetros
cAlias
nReg
nOpc
aAcho
Vetor com nome dos campos que sero exibidos. Os campos de usurio
sempre sero exibidos se no existir no parmetro um elemento com a
expresso "NOUSER"
cFunc
Funo que dever ser utilizada para carregar as variveis que sero
utilizadas pela Enchoice. Neste caso, o parmetro lVirtual definido
internamente pela AxFunction(), executada como .T.
aCpos
cTudoOk
(Func1(), Func2(), ...,FuncX(), .T. )
lF3
cTransact
aButtons
aArray[n][1]
->
Imagem
aArray[n][2] -> bloco de cdigo contendo
aArray[n][3] -> ttulo do boto
do
ao
do
boto
boto
Pgina 336
ADVPL 1
AxFunction().
aParam[4] := Bloco de cdigo que ser executado fora da transao da
AxFunction().
Array no formato utilizado pela funcionalidade MsExecAuto(). Caso seja
informado este array, no ser exibida a tela de interface, e ser executada
a funo EnchAuto().
aAuto[n][1] := Nome do campo
aAuto
lMaximized
AXALTERA()
Funo de alterao padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Sintaxe: AXALTERA(cAlias, nReg, nOpc, aAcho, aCpos, nColMens, cMensagem,;
cTudoOk, cTransact, cFunc, aButtons, aParam, aAuto, lVirtual, lMaximized)
Parmetros
Ttulo ADVPL 1
Pgina 337
AXDELETA()
Funo de excluso padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Sintaxe: AXDELETA(cAlias, nReg, nOpc, cTransact, aCpos, aButtons, aParam,;
aAuto, lMaximized)
Parmetros
cAlias
nReg
nOpc
cTransact
aCpos
aButtons
aArray[n][1]
->
Imagem
aArray[n][2] -> bloco de cdigo contendo
aArray[n][3] -> ttulo do boto
do
a ao
do
boto
boto
aAuto
Pgina 338
ADVPL 1
Ttulo ADVPL 1
Pgina 339
ALERT()
Sintaxe: AVISO(cTexto)
Parmetros
cTexto
AVISO()
Parmetros
cTitulo
Ttulo da janela
cTexto
Texto do aviso
aBotoes
nTamanho
Tamanho (1,2 ou 3)
Pgina 340
ADVPL 1
Ttulo ADVPL 1
Pgina 341
FORMBACTH()
cTitulo
Ttulo da janela
aTexto
Array simples (vetor) contendo cada uma das linhas de texto que sero exibidas
no corpo da tela
Array com os botes do tipo SBUTTON(), com a seguinte estrutura:
aBotoes
{nTipo,lEnable,{|| Ao() }}
bValid
nAltura
nLargura
Pgina 342
ADVPL 1
MSGFUNCTIONS()
Parmetros
cTexto
cTitulo
MSGALERT
MSGINFO
MSGSTOP
Ttulo ADVPL 1
Pgina 343
MSGYESNO
Pgina 344
ADVPL 1
GETAREA()
Funo utilizada para proteger o ambiente ativo no momento de algum processamento
especfico. Para salvar uma outra rea de trabalho (alias) que no o ativo, a funo
GetArea() deve ser executada dentro do alias: ALIAS->(GetArea()).
Sintaxe: GETAREA()
Retorno: Array contendo {Alias(),IndexOrd(),Recno()}
Parmetros
Nenhum
RESTAREA()
Funo utilizada para devolver a situao do ambiente salva, atravs do comando
GETAREA(). Deve-se observar que a ltima rea restaurada a rea que ficar ativa para
a aplicao.
Sintaxe: RESTAREA(aArea)
Parmetros
aArea
Exemplo:
LOCAL cVar
LOCAL aArea := GetArea()
LOCAL lRet := .T.
Ttulo ADVPL 1
Pgina 345
cVar := &(ReadVar())
dbSelectArea("SX5")
IF !dbSeek(xFilial()+"Z1"+cVar)
ENDIF
RestArea(aArea)
Return( lRet )
Pgina 346
ADVPL 1
REFERNCIAS BIBLIOGRFICAS
Referncias bibliogrficas
Educao corporativa
Educao corporativa
Ttulo ADVPL 1
Pgina 347
Colaboradores Totvs
Pgina 348
ADVPL 1