Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
0072 - Programao
ADVPL I
Protheus
11
SUMRIO
OBJETIVOS DO CURSO .............................................................................................. 8
MDULO 01: INTRODUO PROGRAMAO......................................................... 9
LGICA DE PROGRAMAO E ALGORITMOS ............................................................. 9
Lgica de Programao ............................................................................................. 9
Desenvolvendo algoritmos ..................................................................................... 11
Estudando algoritmos..................................................................................................... 11
Teste de mesa ................................................................................................................. 13
ESTRUTURAS DE PROGRAMAO ........................................................................... 15
Diagrama de bloco ................................................................................................. 15
Estruturas de deciso e repetio ........................................................................... 19
Estruturas de deciso ..................................................................................................... 19
Estruturas de repetio .................................................................................................. 23
MDULO 02: A LINGUAGEM ADVPL........................................................................ 27
ESTRUTURA DE UM PROGRAMA ADVPL.................................................................. 30
reas de um Programa ADVPL ................................................................................ 32
DECLARAO E ATRIBUIO DE VARIVEIS ............................................................ 36
Tipo de Dados ........................................................................................................ 36
Declarao de variveis .......................................................................................... 37
Escopo de variveis ................................................................................................ 38
Entendendo a influncia do escopo das variveis .................................................... 43
Operaes com Variveis........................................................................................ 44
Atribuio de variveis ................................................................................................... 44
Operadores da linguagem ADVPL................................................................................... 45
Operao de Macro Substituio ................................................................................... 51
Funes de manipulao de variveis ............................................................................ 52
ESTRUTURAS BSICAS DE PROGRAMAO ............................................................. 58
Estruturas de repetio .......................................................................................... 58
Influenciando o fluxo de repetio................................................................................. 61
Estruturas de deciso ............................................................................................. 63
AXCADASTRO().............................................................................................................. 211
MBROWSE() .................................................................................................................. 212
AXPESQUI() ................................................................................................................... 212
AXVISUAL() .................................................................................................................... 212
AXINCLUI() .................................................................................................................... 213
AXALTERA() ................................................................................................................... 214
AXDELETA() ................................................................................................................... 214
Funes visuais para aplicaes ............................................................................ 215
ALERT() .......................................................................................................................... 215
AVISO() .......................................................................................................................... 215
FORMBACTH()............................................................................................................... 216
MSGFUNCTIONS() ......................................................................................................... 217
Funes ADVPL para aplicaes ............................................................................ 218
GETAREA()..................................................................................................................... 218
RESTAREA() ................................................................................................................... 218
REFERNCIAS BIBLIOGRFICAS ............................................................................. 219
OBJETIVOS DO CURSO
Objetivos especficos do curso:
Ao final do curso o treinando dever ter desenvolvido os seguintes conceitos,
habilidades e atitudes:
a) Conceitos a serem aprendidos
Lgica de programao
Algoritmos
Diagramas de blocos
Lgica de Programao
Lgica
A lgica de programao necessria para pessoas que desejam trabalhar com
desenvolvimento de sistemas e programas, ela permite definir a seqncia lgica para
o desenvolvimento. Ento o que lgica?
Seqncia Lgica
Estes pensamentos podem ser descritos como uma seqncia de instrues, que
devem ser
seguidas para se cumprir uma determinada tarefa.
Instrues
Na linguagem comum, entende-se por instrues um conjunto de regras ou normas
definidas para a realizao ou emprego de algo.
Algoritmo
Um algoritmo formalmente uma seqncia finita de passos que levam execuo de
uma tarefa. Podemos pensar em algoritmo como uma receita, uma seqncia 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 podemos citar os algoritmos das operaes bsicas
(adio, multiplicao, diviso e subtrao) de nmeros reais decimais. Outros
exemplos seriam os manuais de aparelhos eletrnicos, como um videocassete, que
explicam passo-a-passo como, por exemplo, gravar um evento.
At mesmo as coisas mais simples podem ser descritas por seqncias lgicas, tais
como:
Desenvolvendo algoritmos
Pseudocdigo
Os algoritmos so descritos em uma linguagem chamada pseudocdigo. Este nome
uma aluso posterior implementao em uma linguagem de programao, ou seja,
quando for utilizada a linguagem de programao propriamente dita como, por
exemplo, ADVPL.
Por isso os algoritmos so independentes das linguagens de programao, sendo que
ao contrrio de uma linguagem de programao, no existe um formalismo rgido de
como deve ser escrito o algoritmo.
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.
Regras para construo do Algoritmo
Para escrever um algoritmo precisamos descrever a seqncia de instrues, de
maneira simples e objetiva. Para isso utilizaremos algumas tcnicas:
1. Usar somente um verbo por frase;
2. Imaginar que voc est desenvolvendo um algoritmo para pessoas que no
trabalham com informtica;
3. Usar frases curtas e simples;
4. Ser objetivo;
5. Procurar usar palavras que no tenham sentido dbio.
Fases
Para implementar de um algoritmo de simples interpretao e codificao necessrio
inicialmente dividir o problema apresentado em trs fases fundamentais, as quais so:
ENTRADA: So os dados de entrada do algoritmo;
PROCESSAMENTO: So os procedimentos utilizados para chegar ao resultado
final;
SADA: So os dados j processados.
Estudando algoritmos
Neste tpico sero demonstrados alguns algoritmos do cotidiano, os quais foram
implementados utilizando os princpios descritos nos tpicos anteriores.
- 11 Introduo programao e ADVPL Bsico
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
Mascar um chiclete
1.
2.
3.
4.
Pegar o chiclete.
Retirar o papel.
Mastigar.
Jogar o papel no lixo.
Fritar um ovo
1. Pegar frigideira, ovo, leo e sal.
2. Colocar leo na frigideira.
3. Ascender o fogo.
4. Colocar a frigideira no fogo.
5. Esperar o leo esquentar.
6. Quebrar o ovo na frigideira.
7. Jogar a casca no lixo.
8. Retirar a frigideira do fogo quando o ovo estiver no ponto.
9. Desligar o fogo.
10. Colocar sal a gosto.
Trocar lmpadas
1. Se a lmpada estiver fora do alcance, pegar uma escada.
2. Pegar a lmpada nova.
3. Se a lmpada queimada estiver quente, pegar um pano.
- 12 Introduo programao e ADVPL Bsico
Teste de mesa
Aps desenvolver um algoritmo, ele dever sempre ser testado. Este teste chamado
de TESTE DE MESA, que significa seguir as instrues do algoritmo de maneira precisa
para verificar se o procedimento utilizado est correto ou no.
Para avaliar a aplicao do teste de mesa, utilizaremos o algoritmo de calcular a mdia
de notas:
- 13 Introduo programao e ADVPL Bsico
Teste de mesa:
1. Para cada nota informada, receber e registrar na tabela abaixo:
ID
Nota
2. Ao trmino das notas, a tabela dever conter todas as notas informadas, como
abaixo:
ID
1
2
3
4
5
6
Nota
8.0
7.0
8.0
8.0
7.0
7.0
Exerccios
Aprimorar os seguintes algoritmos descritos na apostila:
ESTRUTURAS DE PROGRAMAO
Diagrama de bloco
O diagrama de blocos uma forma padronizada e eficaz para representar os passos
lgicos de um determinado processamento.
Com o diagrama podemos definir uma seqncia de smbolos, com significado bem
definido, portanto, sua principal funo a de facilitar a visualizao dos passos de um
processamento.
Simbologia
Existem diversos smbolos em um diagrama de bloco. No quadro abaixo esto
representados alguns dos smbolos mais utilizados:
Smbolo
Funo
Indica o incio e o fim de um processamento.
Terminador
Processamento em geral.
Processamento
Indica a entrada de dados atravs do teclado.
Entrada Manual
obtidos
com
um
Exibio
Documento
Estruturas de deciso
o IF...ELSE
o DO CASE ... CASE
Estruturas de repetio
o WHILE...END
o FOR...NEXT
Estruturas de deciso
Os comandos de deciso so utilizados em algoritmos cuja soluo no obtida
atravs da utilizao de aes meramente seqenciais, permitindo que estes
comandos de deciso avaliem as condies necessrias para optar por uma ou outra
maneira de continuar seu fluxo.
As estruturas de deciso que sero analisadas so:
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.
Verdadeiro
Anlise da
condio
Ao vinculada ao
resultado
verdadeiro
Falso
Ao vinculada ao
resultado falso
Continuao do
fluxo aps a
tomada da
deciso
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
DO CASE...CASE
A estrutura DO CASE...ENDCASE (Caso) permite a anlise de diversas condies
consecutivas, para as quais somente a condio para a primeira condio verdadeira
ser sua ao vinculada e executada.
O recurso de anlise de mltiplas condies necessrio para soluo de problemas
mais complexos, nos quais as possibilidades de soluo superam a mera anlise de um
nico resultado verdadeiro ou falso.
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
Estruturas de repetio
Os comandos de repetio so utilizados em algoritmos nas situaes em que
necessrio realizar uma determinada ao ou um conjunto de aes para um nmero
definido ou indefinido de vezes, ou ainda enquanto uma determinada condio for
verdadeira.
As estruturas de deciso que sero analisadas so:
WHILE...END
FOR...TO...NEXT
WHILE...END
Nesta estrutura, o conjunto de aes ser executado enquanto a anlise de uma
condio de referncia resultar em um valor verdadeiro. importante verificar que o
bloco somente ser executado, inclusive se na primeira anlise a condio resultar em
um valor verdadeiro.
Representao: WHILE...END
Aes anteriores
...
Anlise da
condio
Loop
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Continuao do
fluxo
...
FOR...TO...NEXT
Nesta estrutura, o conjunto de aes ser executado uma quantidade de vezes
definida, normalmente referenciada como passo.
Para cada passo realizado pela estrutura FOR...TO...NEXT, ser avaliada uma
condio que verificar se foi atingido o nmero de execues previamente definido.
Desta forma a estrutura compreende um controle de nmero de passos executados,
o qual incrementado na anlise da expresso NEXT.
Semelhante a estrutura WHILE...END, a primeira ao somente ser realizada
mediante um resultado verdadeiro na anlise da condio.
Representao: FOR...TO...NEXT
Aes anteriores
...
Anlise da
condio
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Incrementa o
contador de
passos
Continuao do
fluxo
...
Exerccios
Montar os diagramas de blocos para os algoritmos desenvolvidos no exerccio anterior:
Ambiente montado pelos mdulos do ERP Microsiga Protheus. Porm, com o ADVPL
possvel at mesmo criar toda uma aplicao, ou mdulo, do comeo.
Todo o cdigo do sistema ERP Microsiga Protheus escrito em ADVPL.
Programao Sem Interface Prpria com o Usurio
As rotinas criadas sem interface so consideradas nesta categoria porque geralmente
tm uma utilizao mais especfica do que um processo adicional ou um relatrio
novo. Tais rotinas no tm interface com o usurio atravs do Protheus Remote, e
qualquer tentativa nesse sentido (como a criao de uma janela padro) ocasionar
uma exceo em tempo de execuo. Estas rotinas so apenas processos, ou Jobs,
executados no Protheus Server. Algumas vezes, a interface destas rotinas fica a cargo
de aplicaes externas, desenvolvidas em outras linguagens, que so responsveis por
iniciar os processos no servidor Protheus, por meio dos meios disponveis de
integrao e conectividade no Protheus.
De acordo com a utilizao e com o meio de conectividade utilizado, estas rotinas so
subcategorizadas assim:
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
Programao TelNet
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 Comentrio
Existem trs formas de se comentar linhas de texto. A primeira delas utilizar o sinal
de * (asterisco) no comeo da linha:
* Programa para clculo do total
* Autor: Microsiga Software S.A.
* Data: 2 de outubro de 2001
Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio.
Pode-se utilizar a palavra NOTE ou dois smbolos da letra "e" comercial (&&) para
realizar a funo do sinal de asterisco. Porm todas estas formas de comentrio de
linhas so obsoletas e existem apenas para compatibilizao com o padro xBase. A
melhor maneira de comentar linhas em ADVPL utilizar duas barras transversais:
// Programa para clculo do total
// Autor: Microsiga Software S.A.
// Data: 2 de outubro de 2001
Outra forma de documentar textos utilizar as barras transversais juntamente com o
asterisco, podendo-se comentar todo um bloco de texto sem precisar comentar linha a
linha:
/*
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
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.
A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento
da tecla <Enter>. Ou seja, a linha lgica a linha fsica no arquivo. Porm algumas
vezes, por limitao fsica do editor de texto ou por esttica, pode-se "quebrar" a linha
lgica em mais de uma linha fsica no arquivo texto. Isto efetuado utilizando-se o
sinal de ponto-e-vrgula (;).
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas.
Como a linha torna-se muito grande, pode-se 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.
Local nCnt
Local nResultado := 1 // Resultado do fatorial
Local nFator := 5 // Nmero para o clculo
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
A estrutura de um programa ADVPL composta pelas seguintes reas:
rea de Identificao
Declarao dos includes
Declarao da funo
Identificao do programa
rea de Ajustes Iniciais
Declarao das variveis
Corpo do Programa
Preparao para o processamento
Processamento
rea de Encerramento
rea de Identificao
Esta uma rea que no obrigatria e dedicada a documentao do programa.
Quando existente, contm apenas comentrios explicando a sua finalidade, data de
criao, autor, etc., e aparece no comeo do programa, antes de qualquer linha de
comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao
desejada e escolher a formatao apropriada.
#include protheus.ch
/*
+==========================================+
| Programa: Clculo do Fatorial
|
| Autor : Microsiga Software S.A.
|
| Data : 02 de outubro de 2001
|
+==========================================+
*/
User Function CalcFator()
// 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
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
rea de Encerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so
fechados, e o resultado da execuo do programa utilizado. Pode-se exibir o
resultado armazenado em uma varivel ou em um arquivo ou simplesmente finalizar,
caso a tarefa j tenha sido toda completada no corpo do programa. nesta rea que se
encontra o encerramento do programa. Todo programa em ADVPL deve sempre
terminar com a palavra chave return.
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
- 35 Introduo programao e ADVPL Bsico
Data
O ADVPL tem um tipo de dados especfico para datas. Internamente as variveis deste
tipo de dado so armazenadas como um nmero correspondente data Juliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim atravs
da utilizao de funes especficas como, por exemplo, CTOD() que converte uma
string para data.
Array
O Array um tipo de dado especial. a disposio de outros elementos em colunas e
linhas. O ADVPL suporta arrays unidimensionais (vetores) ou multidimensionais
(matrizes). Os elementos de um array so acessados atravs de ndices numricos
iniciados em 1, identificando a linha e coluna para quantas dimenses existirem.
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.
Declarao de variveis
Variveis de memria so um dos recursos mais importantes de uma linguagem. So
reas de memria criadas para armazenar informaes utilizadas por um programa
para a execuo de tarefas. Por exemplo, quando o usurio digita uma informao
qualquer, como o nome de um produto, em uma tela de um programa esta informao
armazenada em uma varivel de memria para posteriormente ser gravada ou
impressa.
A partir do momento que uma varivel criada, no necessrio mais se referenciar
ao seu contedo, e sim ao seu nome.
O nome de uma varivel um identificador nico o qual deve respeitar um 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:
- 37 Introduo programao e ADVPL Bsico
nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))
Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300.
Isso acontece porque no momento que esse valor foi 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.
Escopo de variveis
O ADVPL no uma linguagem de tipos rgidos para variveis, ou seja, no
necessrio informar o tipo de dados que determinada varivel ir conter no momento
de sua declarao, e o seu valor pode mudar durante a execuo do programa.
Tambm no h necessidade de declarar variveis em uma seo especfica do seu
cdigo fonte, embora seja aconselhvel declarar todas as variveis necessrias no
comeo, tornando a manuteno mais fcil e evitando a declarao de variveis
desnecessrias.
Para declarar uma varivel deve-se utilizar um identificador de escopo. Um
identificador de escopo uma palavra chave que indica a que contexto do programa a
varivel declarada pertence. O contexto de variveis pode ser local (visualizadas
apenas dentro do programa atual), pblico (visualizadas por qualquer outro programa),
entre outros.
O Contexto de Variveis dentro de um Programa
As variveis declaradas em um programa ou funo, so visveis de acordo com o
escopo onde so definidas. Como tambm do escopo depende o tempo de existncia
das variveis. A definio do escopo de uma varivel efetuada no momento de sua
declarao.
Local nNmero := 10
Esta linha de cdigo declara uma varivel chamada nNmero, indicando que aonde
pertence seu escopo local.
Os identificadores de escopo so:
Local
Static
Private
- 38 Introduo programao e ADVPL Bsico
Public
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
- 39 Introduo programao e ADVPL Bsico
criada termine (ou seja, at que a funo onde foi feita retorne para o cdigo que a
executou). Neste momento, automaticamente destruda.
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.
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.
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.
No ambiente ERP Protheus, existe uma conveno adicional a qual
deve ser respeitada que variveis, em uso pela aplicao, no sejam
incorretamente manipuladas. Por esta conveno deve ser adicionado
o caractere _ antes do nome das variveis PRIVATE e PUBLIC.
Maiores informaes avaliar o tpico: Boas Prticas de Programao.
Exemplo: Private _dData
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste 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).
No ambiente ERP Protheus, existe uma conveno adicional a qual
deve ser respeitada que variveis em uso pela aplicao no sejam
incorretamente manipuladas. Por esta conveno deve ser adicionado
o caractere _ antes do nome de variveis PRIVATE e PUBLIC.
Maiores informaes avaliar o tpico: Boas Prticas de Programao.
Exemplo: Public _cRotina
If xVariavel
o mesmo que
If xVariavel = .T.
Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps
um aumento. Os operandos de uma expresso podem ser uma varivel, uma
constante, um campo de arquivo ou uma funo.
Operadores Matemticos
Os operadores utilizados em ADVPL para clculos matemticos so:
+
*
/
** ou ^
%
Adio
Subtrao
Multiplicao
Diviso
Exponenciao
Mdulo (Resto da Diviso)
Operadores de String
Os operadores utilizados em ADVPL para tratamento de caracteres so:
+
$
Operadores Relacionais
Os operadores utilizados em ADVPL para operaes e avaliaes relacionais so:
<
>
=
==
<=
>=
<> ou #
ou !=
Comparao Menor
Comparao Maior
Comparao Igual
Comparao Exatamente Igual (para caracteres)
Comparao Menor ou Igual
Comparao Maior ou Igual
Comparao Diferente
Operadores Lgicos
Os operadores utilizados em ADVPL para operaes e avaliaes lgicas so:
.And.
.Or.
.Not. ou !
E lgico
OU lgico
NO lgico
Operadores de Atribuio
Os operadores utilizados em ADVPL para atribuio de valores a variveis de memria
so:
:=
+=
-=
*=
/=
**= ou ^=
%=
Atribuio Simples
Adio e Atribuio em Linha
Subtrao e Atribuio em Linha
Multiplicao e Atribuio em Linha
Diviso e Atribuio em Linha
Exponenciao e Atribuio em Linha
Mdulo (resto da diviso) e Atribuio em Linha
Atribuio Simples
Atribuio em Linha
Atribuio Composta
Exemplo
Equivalente a
+=
-=
*=
/=
**= ou ^=
%=
X
X
X
X
X
X
+= Y
-= Y
*= Y
/= Y
**= Y
%= Y
X
X
X
X
X
X
=
=
=
=
=
=
X
X
X
X
X
X
+Y
-Y
*Y
/Y
** Y
%Y
Operadores de Incremento/Decremento
A linguagem ADVPL possui operadores para realizar incremento ou decremento de
variveis. Entende-se por incremento aumentar o valor de uma varivel numrica
em 1 e entende-se por decremento diminuir o valor da varivel em 1. Os
operadores so:
++
--
Incremento Ps ou Pr-fixado
Decremento Ps ou Pr-fixado
Os operadores de decremento/incremento podem ser colocados tanto antes (prfixado) como depois (ps-fixado) do nome da varivel. Dentro de uma expresso, a
ordem do operador muito importante, podendo alterar o resultado da expresso.
Os operadores incrementais so executados da esquerda para a direita dentro de
uma expresso.
Local nA := 10
Local nB := nA++ + nA
O valor da varivel nB resulta em 21, pois a primeira referncia a nA (antes do ++)
continha o valor 10 que foi considerado e imediatamente aumentado em 1. Na
segunda referncia a nA, este j possua o valor 11. O que foi efetuado foi a soma
de 10 mais 11, igual a 21. O resultado final aps a execuo destas duas linhas a
varivel nB contendo 21 e a varivel nA contendo 11.
No 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
Definio de Matriz, Constante ou Bloco de Cdigo
Identificador de Apelido
Macro substituio
Passagem de parmetro por referncia
Passagem de parmetro por valor
Operadores
Operadores
Operadores
Operadores
Operadores
Operadores
Operadores
de Incremento/Decremento pr-fixado
de String
Matemticos
Relacionais
Lgicos
de Atribuio
de Incremento/Decremento ps-fixado
Exponenciao
Multiplicao e Diviso
Adio e Subtrao
Considere o exemplo:
Local nResultado := 2+10/2+5*3+2^3
O resultado desta expresso 30, pois primeiramente calculada a exponenciao
2^3(=8), ento so calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e
finalmente as adies resultando em 2+5+15+8(=30).
Alterao da Precedncia
que deixa um
que tudo isso
Uma utilizao
frmulas, que
CTOD()
CVALTOCHAR()
DTOC()
DTOS()
STOD()
STR()
STRZERO()
VAL()
CTOD()
Sintaxe
CTOD(cData)
Descrio
CVALTOCHAR()
Sintaxe
CVALTOCHAR(nValor)
Descrio
DTOC()
Sintaxe
DTOC(dData)
Descrio
DTOS()
Sintaxe
DTOS(dData)
Descrio
STOD()
Sintaxe
STOD(sData)
Descrio
STR()
Sintaxe
STR(nValor)
Descrio
STRZERO()
Sintaxe
STRZERO(nValor, nTamanho)
Descrio
VAL()
Sintaxe
VAL(cValor)
Descrio
Manipulao de strings
As funes mais utilizadas nas operaes de manipulao do contedo de strings
so:
ALLTRIM()
ASC()
AT()
CHR()
CSTUFF()
LEN()
RAT()
SUBSTR()
ALLTRIM()
Sintaxe
ALLTRIM(cString)
Retorna uma string sem os espaos direita e esquerda,
referente ao contedo informado como parmetro.
Descrio
ASC()
Sintaxe
ASC(cCaractere)
Descrio
AT()
Sintaxe
AT(cCaractere, cString )
Descrio
CHR()
Sintaxe
CHR(nASCII)
Descrio
LEN()
Sintaxe
LEN(cString)
Descrio
LOWER()
Sintaxe
LOWER(cString)
Descrio
RAT()
Sintaxe
RAT(cCaractere, cString)
Descrio
STUFF()
Sintaxe
Descrio
SUBSTR()
Sintaxe
Descrio
UPPER()
Sintaxe
UPPER(cString)
Descrio
ABS()
INT()
NOROUND()
ROUND()
ABS()
Sintaxe
ABS(nValor)
Descrio
INT()
Sintaxe
INT(nValor)
Descrio
NOROUND()
Sintaxe
Descrio
NOROUND(nValor, nCasas)
Retorna um valor, truncando a parte decimal do valor
especificado no parmetro de acordo com a quantidade de casas
decimais solicitadas.
ROUND()
Sintaxe
ROUND(nValor, nCasas)
Descrio
TYPE()
VALTYPE()
TYPE()
Sintaxe
TYPE(cVariavel)
Descrio
VALTYPE()
Sintaxe
VALTYPE(cVarivel)
Descrio
Estruturas de repetio.
Estruturas de deciso.
Estruturas de repetio
Estruturas de repetio so designadas para executar uma seo de cdigo mais de
uma vez. Por exemplo, imaginando-se a existncia de uma funo para imprimir
um relatrio, pode-se desejar imprimi-lo quatro vezes. Claro, pode-se
simplesmente chamar a funo de impresso quatro vezes em seqncia, mas isto
se tornaria pouco profissional e no resolveria o problema se o nmero de
relatrios fosse varivel.
Em ADVPL existem dois comandos para a repetio de sees de cdigo, que so os
comandos FOR...NEXT e o comando WHILE...ENDDO.
O Comando FOR...NEXT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma
seo de cdigo em um nmero determinado de vezes.
Sintaxe
Parmetros
Varivel
nValorInicial
TO nValorFinal
STEP
nIncremento
Comandos
EXIT
LOOP
Exemplo:
Local nCnt
Local nSomaPar := 0
For nCnt := 0 To 100 Step 2
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
Este exemplo imprime a soma dos 100 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
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete
uma seo de cdigo enquanto uma determinada expresso resultar em verdadeiro
(.T.).
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpressao
Comandos
EXIT
LOOP
Exemplo :
Local nNumber := nAux := 350
nAux := Int(nAux / 2)
While nAux > 0
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
EXIT
A instruo EXIT utilizada para forar o trmino de uma estrutura de repetio.
Desta 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.
IF MSGYESNO(Deseja jogar o jogo da forca?)
JFORCA() // Funo ilustrativa que implementa o algoritmo do jogo
da forca.
ELSE
EXIT
ENDIF
End
MSGINFO(Final de Jogo)
// Enquanto no for respondido No para a pergunta: Deseja jogar o
jogo da
// forca, ser executada a funo do jogo da forca.
// Caso seja selecionada a opo No, ser executada a instruo EXIT
que provocar o trmino do LOOP, permitindo a execuo da mensagem de
Final de Jogo.
Estruturas de deciso
Estruturas de desvio so designadas para executar uma seo de cdigo se
determinada condio lgica resultar em verdadeiro (.T.).
Em ADVPL existem dois comandos para execuo de sees de cdigo, de acordo
com avaliaes lgicas, que so os comandos IF...ELSE...ENDIF e o comando DO
CASE...ENDCASE.
O Comando IF...ELSE...ENDIF
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
Sintaxe
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Parmetros
LExpressao
Comandos
Exemplo:
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
O Comando IF...ELSEIF...ELSE...ENDIF
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em
verdadeiro (.T.).
Sintaxe
IF lExpressao1
Comandos
[ELSEIF lExpressaoX
Comandos]
[ELSE
Comandos...]
ENDIF
Parmetros
lExpressao1
lExpressaoX
Comandos
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
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em
verdadeiro (.T.).
Sintaxe
DO CASE
CASE lExpressao1
Comandos
[CASE lExpressao2
Comandos
...
CASE lExpressaoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
Parmetros
CASE
lExpressao1
Comandos...
OTHERWISE
Comandos
Exemplo:
Local nMes
:= Month(Date())
Local cPeriodo := ""
DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
Exerccio
Desenvolver um programa que implemente o algoritmo de descascar batatas,
utilizando a estrutura de repetio While, demonstrando quantas batatas foram
descascadas:
Exerccio
Desenvolver um programa que implemente o algoritmo de descascar batatas,
utilizando a estrutura de repetio FOR, demonstrando quantas batatas foram
descascadas:
Exerccio
Desenvolver um programa que implemente o algoritmo de descascar batatas,
utilizando a estrutura de repetio FOR, demonstrando quantas batatas faltam para
serem descascadas:
Exerccios
Desenvolver um programa que implemente o algoritmo do Jogo da Forca:
Exerccios
Desenvolver um programa que implemente o algoritmo do Jogo da Velha:
Inicializando arrays
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o
tamanho do array somente ser conhecido em tempo de execuo.
Se o tamanho do array conhecido
Se o tamanho do array conhecido no momento que o programa escrito, h
diversas maneiras de implementar o cdigo:
01
02
03
04
05
06
07
08
Local
Local
Local
Local
nCnt
aX[10]
aY := Array(10)
aZ := {0,0,0,0,0,0,0,0,0,0}
For nCnt := 1 To 10
aX[nCnt] := nCnt * nCnt
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.
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.
Local
Local
Local
Local
nCnt
aX[0]
aY := Array(0)
aZ := {}
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).
ARRAY()
AADD()
ACLONE()
ADEL()
ASIZE()
AINS()
ASORT()
ASCAN()
ARRAY()
Sintaxe
ARRAY(nLinhas, nColunas)
Descrio
AADD()
Sintaxe
AADD(aArray, xItem)
Descrio
ACLONE()
Sintaxe
AADD(aArray)
Descrio
ADEL()
Sintaxe
ADEL(aArray, nPosio)
Descrio
ASIZE()
Sintaxe
ASIZE(aArray, nTamanho)
Descrio
ASORT()
Sintaxe
Descrio
ASCAN()
Sintaxe
ASCAN(aArray, bSeek)
Descrio
AINS()
Sintaxe
Descrio
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.
Cpia de arrays
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.
Para copiar o contedo de uma varivel, utiliza-se o operador de atribuio :=,
conforme abaixo:
nPessoas := 10
nAlunos := nPessoas
Lista de expresses
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos
a seguir, o smbolo ==> indicar o retorno da expresso aps sua avaliao (seja
para atribuir em uma varivel, exibir para o usurio ou imprimir em um relatrio),
que ser impressa em um relatrio, por exemplo.
Duas Linhas de Cdigo
@00,00 PSAY x := 10
@00,00 PSAY y := 20
==>
==>
10
20
Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento
impresso.
Duas linhas de cdigo em uma , utilizando ponto-e-vrgula
Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha:
Alert( cValToChar( x := 10 ; y := 20 ) )
==>
10
Apesar desse cdigo se encontrar em uma nica linha fsica, existem duas linhas
lgicas separadas pelo ponto e vrgula. Ou seja, esse cdigo equivalente a:
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.
==>
20
Blocos de Cdigo
Diferentemente de uma matriz, no se pode acessar elementos de um bloco de
cdigo, atravs de um ndice numrico. Porm blocos de cdigo so semelhantes a
uma lista de expresses, e a uma pequena funo.
Ou seja, podem ser executados. Para a execuo, ou avaliao de um bloco de
cdigo, deve-se utilizar a funo Eval():
nRes := Eval(B) ==> 20
Essa funo recebe como parmetro um bloco de cdigo e avalia todas as
expresses contidas neste bloco de cdigo, retornando o resultado da ltima
expresso avaliada.
Passando Parmetros
J que blocos de cdigo so como pequenas funes, tambm possvel a
passagem de parmetros para um bloco de cdigo. Os parmetros devem ser
informados entre as barras verticais (||), separados por vrgulas, assim como em
uma funo.
B := {| N | X := 10, Y := 20 + N}
Porm deve-se notar que j que o bloco de cdigo recebe um parmetro, um valor
deve ser passado quando o bloco de cdigo for avaliado.
C := Eval(B, 1) ==> 21
Utilizando Blocos de Cdigo
Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente, so
utilizados para executar tarefas quando eventos de objetos so acionados ou para
modificar o comportamento padro de algumas funes.
Por exemplo, considere a matriz abaixo:
A := {"GARY HALL", "FRED SMITH", "TIM JONES"}
Esta matriz pode ser ordenada pelo primeiro nome, utilizando-se a chamada da
funo asort(A), resultado na matriz com os elementos ordenados dessa forma:
{"FRED SMITH", "GARY HALL", "TIM JONES"}
A ordem padro para a funo asort ascendente. Este comportamento pode ser
modificado atravs da informao de um bloco de cdigo que ordena a matriz de
forma descendente:
B := { |X, Y| X > Y }
aSort(A, B)
O bloco de cdigo (de acordo com a documentao da funo asort) deve ser
escrito para aceitar dois parmetros que so os dois elementos da matriz para
comparao. Note que o bloco de cdigo no conhece que elementos 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,
pode-se utilizar o seguinte bloco de cdigo:
B := { |X, Y| SUBSTR(X, At(" ",X)+1) > SUBSTR(Y, At(" ",Y)+1) }
Note que este bloco de cdigo procura e compara as partes dos caracteres,
imediatamente seguinte a um espao em branco. Depois de utilizar esse bloco de
cdigo para a funo asort, a matriz conter:
{"GARY HALL", "TIM JONES", "FRED SMITH"}
EVAL()
DBEVAL()
AEVAL()
EVAL()
Sintaxe
Descrio
DBEVAL()
Sintaxe
Descrio
AEVAL()
Sintaxe
Descrio
FUNES
A maior parte das rotinas que queremos escrever em programas so compostas de
um conjunto de comandos, rotinas estas que 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 pode-se passar parmetros, os
quais contm os dados e informaes que definem o processamento da funo.
Os parmetros das funes descritas utilizando a linguagem ADVPL so posicionais,
ou seja, na sua passagem no importa o nome da varivel e sim a sua posio,
dentro da lista de parmetros, o que permite executar uma funo escrevendo:
Calcula(parA, parB, parC) // Chamada da funo em uma rotina
E a funo deve estar escrita:
User Function Calcula(x, y, z)
... Comandos da Funo
Return ...
Function()
User Function()
Static Function()
Main Function()
Function()
Funes ADVPL convencionais, restritas ao desenvolvimento da rea de Inteligncia
Protheus da Microsiga.
O interpretador ADVPL distingue nomes de funes do tipo Function() com at dez
caracteres. A partir do dcimo caracter, apesar do compilador no indicar quaisquer
tipos de erros, o interpretador ignorar os demais caracteres.
Exemplo:
// Fonte MATA100INCL.PRW
#INCLUDE "protheus.ch"
Function MATA100INCL01()
ALERT("01")
Return
Function MATA100INCL02()
ALERT("02")
Return
Ao executar a funo MATA100INCL01() ser exibida a mensagem 01, mas ao
executar a funo MATA100INCL02() tambm ser exibida a mensagem 01, pois
o interpretador considera o nome da funo como MATA100INC.
1. Funes do tipo Function() somente podem ser executadas
atravs dos mdulos do ERP.
2. Somente podero ser compiladas funes do tipo Function()
se o MP-IDE possuir uma autorizao especial fornecida pela
Microsiga.
User Function()
As User Defined Functions ou funes definidas pelos usurios, so tipos especiais
de funes implementados pelo ADVPL, para garantir que desenvolvimentos
especficos no realizados pela Inteligncia Protheus da Microsiga sobreponham as
funes padres desenvolvidas para o ERP.
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.
1. Como ocorre o acrscimo dos caracteres U_ no nome da
funo e o interpretador considera apenas os dez primeiros
caracteres da funo, para sua diferenciao recomendado
que os nomes das User Functions tenham apenas oito
caracteres, evitando resultados indesejados durante a
execuo da aplicao.
2. Funes do tipo User Function so acessveis por quaisquer
outras funes em uso pela aplicao, desde que em sua
chamada sejam utilizados os caracteres U_, em conjunto
com o nome da funo.
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
Static Function CRIASX1()
//Fonte FINA020.PRW
Function FINA020()
CriaSx1(FIN020)
Return
Static Function CRIASX1()
Local nResultado := 0
nResultado := CalcFator(5)
Function CalcFator(nFator)
...
Passagem de parmetros por referncia Duas variveis x uma nica rea de memria
DIRETIVAS DE COMPILAO
O compilador ADVPL possui uma funcionalidade denominada pr-processador, o
qual nada mais do que 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 pr-processador, 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 #.
As diretivas podem ser colocadas em qualquer parte do programa, sendo que as
implementadas pela linguagem ADVPL so:
#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.
A aplicao ERP possui diversos includes, os quais devem ser utilizados segundo a
aplicao que ser desenvolvida, o que permitir a utilizao de recursos adicionais
definidos para a linguagem, implementados pela rea de Tecnologia da Microsiga.
Os includes mais utilizados nas aplicaes ADVPL, desenvolvidas para o ERP so:
PROTHEUS.CH: Diretivas de compilao como padres para a linguagem.
Contm a especificao da maioria das sintaxes utilizadas nos fontes,
inclusive permitindo a compatibilidade da sintaxe tradicional do Clipper para
os novos recursos implementados no ADVPL.
DIALOG.CH
FONT.CH
INI.CH
PTMENU.CH
PRINT.CH
Fique atento
TCQUERY
CREATE RPCCONN
CLOSE RPCCONN
PREPARE ENVIRONMENT
RESET ENVIRONMENT
OPEN REMOTE TRANSACTION
CLOSE REMOTE TRANSACTION
CALLPROC IN
OPEN REMOTE TABLES
CREATE XMLSTRING
CREATE XMLFILE
SAVE XMLSTRING
o
o
o
o
SAVE XMLFILE
ADDITEM TAG
ADDNODE NODE
DELETENODE
Os recursos de tratamentos de e-mails, integrao com a
ferramenta TOPCONNECT (DbAcess), preparao de ambientes e
manipulao de arquivos e strings do padro XML, sero abordados
no curso de ADVPL Avanado.
Diretiva: #DEFINE
A diretiva #DEFINE permite que o desenvolvedor crie novos termos para serem
utilizadas 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.
Desta forma, um termo definido atravs da diretiva #DEFINE pode ser considerado
como uma constante.
Os arquivos de include definidos para os fontes da aplicao ERP
contm diretivas #DEFINE para as strings de textos de mensagens
exibidas para os usurios nos trs idiomas com os quais a aplicao
distribuda: Portugus, Ingls e Espanhol.
Por esta 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.
esto
normalmente
associadas
as
seguintes
#IFDEF SPANISH
#DEFINE STR0001 Hola !!!
#ELSE
#IFDEF ENGLISH
#DEFINE STR0001 Hello !!!
#ELSE
#DEFINE STR0001 Ol !!!
#ENDIF
#ENDIF
A aplicao ERP disponibiliza a varivel de escopo PUBLIC __LANGUAGE, a qual contm uma string que identifica o
idioma em uso pelo Sistema, cujo os contedos possveis so:
PORTUGUESE
SPANISH
ENGLISH
#IFDEF TOP
cQuery := SELECT * FROM +RETSQLNAME(SA1)
dbUseArea(.T., "TOPCONN", TcGenQry(,,cQuery), SA1QRY,.T.,.T.)
#ELSE
DbSelectArea(SA1)
#ENDIF
bancos
deve
ser
utilizada
sintaxe
ADVPL
Diretiva: #COMMAND
A diretiva #COMMAND utilizada principalmente nos includes da linguagem ADVPL
para efetuar a traduo de comandos em sintaxe CLIPPER, para as funes
implementadas pela Tecnologia Microsiga.
Esta diretiva permite que o desenvolvedor defina para o compilador como uma
expresso dever ser interpretada.
Trecho do arquivo PROTHEUS.CH
#xcommand @ <nRow>, <nCol> SAY [ <oSay> <label: PROMPT,VAR > ] <cText>
;
[ PICTURE <cPict> ] ; [ <dlg: OF,WINDOW,DIALOG > <oWnd> ] ;
[ FONT <oFont> ] ; [ <lCenter: CENTERED, CENTER > ] ;
[ <lRight: RIGHT > ] ; [ <lBorder: BORDER > ] ;
[ <lPixel: PIXEL, PIXELS > ] ; [ <color: COLOR,COLORS > <nClrText>
[,<nClrBack> ] ] ;
[ SIZE <nWidth>, <nHeight> ] ; [ <design: DESIGN > ] ;
[ <update: UPDATE > ] ; [ <lShaded: SHADED, SHADOW > ] ;
[ <lBox: BOX > ] ; [ <lRaised: RAISED > ] ;
=> ;
[ <oSay> := ] TSay():New( <nRow>, <nCol>, <{cText}>,;
[<oWnd>], [<cPict>], <oFont>, <.lCenter.>, <.lRight.>, <.lBorder.>,;
<.lPixel.>, <nClrText>, <nClrBack>, <nWidth>, <nHeight>,;
<.design.>, <.update.>, <.lShaded.>, <.lBox.>, <.lRaised.> )
Exerccio
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
Utilizando a funo AVISO(), desenvolver um programa que permita ao usurio
selecionar a opo de busca de CNPJ por cliente ou fornecedor, e caso encontre
exiba seus dados principais.
Exerccio
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.
Exerccio
Utilizando a funo FORMBATCH(), desenvolver uma rotina que verifique se para
cada item de um nota fiscal de entrada existe o respectivo cabealho, e caso seja
encontrado algum item inconsistente, comunique esta ocorrncia ao usurio que
est realizando o processamento.
Exerccio
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.
O Ambiente Protheus
O Protheus constitudo de um conjunto de Softwares que compem as
camadas de funcionalidades bsicas aos servios de aplicao, interface,
banco de dados e repositrio, conforme o diagrama da figura abaixo:
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.
Os
parmetros
do
TOTVSAPPSERVER.INI
so
lidos
pelo
programa
TOTVSAPPSERVER.EXE, logo no incio de sua execuo. O mesmo procedimento
ocorre em relao aos parmetros do TOTVSSMARTCLIENT.INI pelo programa
TOTVSSMARTCLIENT.EXE. A execuo desses dois programas feita por meio de
ao do usurio, facilitada pelos atalhos TOTVS APPSERVER e TOTVS
SMARTCLIENT.
Destino:
c:\protheus\bin\appserver\totvsappse
rver.exe
- 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
Se o TOTVS Application Server, no for instalado como um Servio do NT, durante
a Instalao, isto pode ser realizado, executando-o com a opo de Linha de
Comando.
-Remove
Para remov-lo da Lista de Servios do NT, pode-se execut-lo com a opo de
Linha de Comando.
Destino:
c:\protheus\bin\smartclient\totvssmartclien
te.exe 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).
-P (Main Program)
Identifica o Programa (APO) Inicial.
-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 mltiplas instncias (Cpias) do TOTVS Smart Client, na mesma mquina,
[CONFIG]
LASTMAINPROG=SIGACFG
LANGUAGE=1
[DRIVERS]
ACTIVE=TCP
[TCP]
SERVER=172.16.72.41
PORT=1234
O Configurador do Protheus
Funcionalidades Abordadas
O objetivo deste tpico no abranger toda a estrutura e recursos do mdulo
Configurador da aplicao ERP, mas permitir a realizao de tarefas de
configurao simples que sero necessrias no desenvolvimento de pequenas
customizaes.
Com foco neste objetivo, sero detalhadas as seguintes operaes:
Configurao e criao de novas tabelas no Dicionrio de Dados.
Atualizao das estruturas do Dicionrio de Dados.
o Tabelas do sistema
o Validaes de campos
o ndices de tabelas
o Gatilhos de campos
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 PROTHEUS.
Descrio
Cadastro de empresas e filiais do sistema
Arquivo de usurios, grupos e senhas do sistema
ndices dos arquivos
Perguntas e respostas
Mapeamento de tabelas
Dicionrio de Dados
Agenda do Schedule de processos
Tabelas
Parmetros
Gatilhos de Interface
Fora de uso
Relacionamentos entre tabelas
Pastas cadastrais apontadas no SX3
Consulta por meio da tecla F3 (Consulta Padro)
Controle do Schedule de processos
Seqncia de documentos (+1)
Seqncia de documentos (Prximo)
Tamanho padro para campos apontado pelo SX3
Resposta de Perguntas (SX1) por usurios
Controle de LOGs por tabela
Histrico de Logs cadastrados no SXO
Cadastro de filtros inteligentes da mbrowse (contm as
informaes necessrias para a criao do filtro).
Cadastro de relacionamento entre programa x filtro
(utilizada internamente pelo Protheus para verificar em
quais programas os filtros podero ser utilizados).
SXS
SXT
Identificao
ATIVO FIXO
COMPRAS
CONTABILIDADE
ESTOQUE E CUSTOS
FATURAMENTO
FINANCEIRO
LIVROS FISCAIS
PLANEJAMENTO E CONTROLE DA PRODUO
GESTO DE PESSOAL
FATURAMENTO DE SERVIOS
VECULOS
CONTROLE DE LOJAS/AUTOMAO COMERCIAL
CALL CENTER
OFICINAS
PONTO ELETRNICO
EASY IMPORT CONTROL
TERMINAL
MANUTENO DE ATIVOS
RECRUTAMENTO E SELEO DE PESSOAL
INSPEO DE ENTRADA QUALIDADE
METODOLOGIA QUALIDADE
Onde:
F
SF
S
S
S
S
S
A
C
C
C
C
D
E
G
J
N
P
Q
R
T
I
N
R
X
Z
T
V
W
-
Descrio
Tabelas pertencentes ao sistema bsico, tambm chamado
Classic.
Cadastros de entidades compartilhadas entre os Ambientes
(Clientes, Fornecedores, Bancos entre outros).
Cadastros dos Ambientes de Materiais (Produtos, Saldos entre
outros).
Arquivos de movimentaes diversas, utilizados pelos ambientes
de Materiais (Solicitao ao Almoxarifado, Solicitao de
Compras, Pedido de Compras, Pedido de Vendas, Ordens de
Produo entre outros).
Arquivos de movimentaes de estoque (Itens de notas fiscais de
entrada e sada, movimentos internos de estoque entre outros).
Cadastros e movimentaes do ambiente Financeiro.
Cadastros e movimentaes Fiscais (Cabealhos das notas fiscais
de entrada e sada, cadastro de tipos de entrada e sada, livros
fiscais, entre outros).
Cadastros do Ambiente de Planejamento e Controle de Produo
Movimentos do Ambiente de Planejamento e Controle de
Produo
Cadastros e movimentos do Ambiente Contbil (descontinuado)
Cadastros e movimentos do Ambiente Ativo Fixo
Cadastros e movimentos do Ambiente Gesto de Pessoal
Tabelas de configurao do Sistema
Tabelas livres para utilizao e projetos especficos em clientes.
Gesto de Projetos
Contabilidade Gerencial
Contabilidade Gerencial
Contabilidade Gerencial
Contabilidade Gerencial
Transportadoras e derivados
Comrcio exterior e derivados
Gesto Hospitalar
Gesto Educacional
Servios Pblicos
Reservado para projetos da fbrica de software
Qualidade e derivados
Recursos Humanos e derivados
Plano de Sade
Famlia
W
Z
-
Descrio
Workflow
Tabelas livres para utilizao e projetos especficos em clientes
em adio famlia SZ.
ndices
Cada tabela do Sistema possui seus ndices definidos no arquivo de configurao
SIX, o qual pode ser atualizado atravs 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 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
seqencial 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.
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:
Funcionalidades do Configurador
A customizao de um Sistema como o Protheus consiste em adaptar o Sistema de
forma a melhor atender as necessidades do cliente.
A flexibilidade de um Sistema, ou seja, sua capacidade de adaptar-se
(polimorfismo, aquele que assume vrias formas) uma das mais importantes
caractersticas de uma soluo ERP.
As funcionalidades tratadas pelo Configurador definem a flexibilidade do ERP
Protheus. Flexibilizar sem despadronizar, ou seja, tudo que foi customizado
permanece vlido, mesmo com o desenvolvimento de novas verses.
).
boto Editar (
). Ao utilizar esta opo ser exibida a tela de
manuteno de campos da tabela selecionada:
).
).
Guia: Campo
O campo Decimal ser solicitado somente para os campos de tipo
numrico.
O formato ! indica que o caractere ser sempre maisculo,
independente da ao do usurio. O formato @! indica que essa
caracterstica estende-se por todo o campo.
O contexto real indica que o campo existir efetivamente no banco de
dados e o contexto virtual significa que o campo existir apenas no
dicionrio de dados e no fisicamente.
A propriedade alterar indica que o campo pode ser alterado.
Nesta janela, os dados esto classificados em seis pastas com objetivos
de preenchimento bem especficos:
Guia: Informaes
Contm as informaes a respeito dos ttulos.
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.
Descrio e Help: So propriedades que objetivam documentar o campo.
Guia: Opes
Contm os dados que facilitam a digitao.
Guia: Validaes
Representam as regras de validao do campo.
Validaes: Nesta propriedade, escreve-se uma funo de validao do
campo que est sendo digitado. Existe um conjunto de funes disponveis
no ADVPL apropriadas para esse caso.
Todas as validaes informadas sero executadas no momento do
preenchimento do prprio campo. Uma validao pode ser uma expresso
lgica ou uma funo de usurio que retorna um valor lgico Verdadeiro ou
Falso. O sistema s permitir o avano para o prximo campo quando o
boto Editar (
). Ao utilizar esta opo ser exibida a tela de
manuteno de campos da tabela selecionada:
).
).
boto Campos (
campos de descrio.
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.
Uma tabela poder ter vrios ndices cadastrados no Dicionrio de Dados.
Em determinado momento, porm, apenas um deles oferecer acesso ao
registro. Essa ordem pode ser alterada em tempo de execuo pelos
programas da aplicao, atravs do comando DBSetOrder(), ou atravs da
definio de uma ordem especfica na utilizao de queries para acesso aos
dados diretamente em bancos de dados de Ambientes TOPCONNECT
(DbAcess).
).
tabela
).
Criao de Parmetros
Procedimento
1. Para adicionar um Parmetro, selecione os menus Ambiente, Cadastros,
Parmetros.
2. Aps a seleo da opo Tabelas sero exibidos os itens j cadastradas no
arquivo de sistema SX6.
).
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:
Se o programa no manipula arquivos, pode-se cham-lo diretamente do
DEV-Studio (nome no lado direito da barra de ferramentas);
Se o programa manipula tabelas existem duas opes:
Adicionar o programa no menu de um dos Ambientes e execut-lo
atravs do Remote.
Realizar a preparao do Ambiente na prpria rotina, permitindo sua
execuo diretamente pelo DEV-Studio.
No se pode compilar um programa com o Remote e o Monitor abertos,
tenha este finalizado ou no por erro.
Anlise e depurao de erros
Para identificar as causas de erros, a ferramenta DEV-Studio possui diversos
recursos que auxiliam o DEBUG.
A ao de DEBUG necessita que o programa seja executado a partir do DEV-Studio,
sendo necessrio observar as seguintes regras:
Definir e marcar os pontos de parada mais adequados a anlise do fonte;
Executar a rotina atravs do DEV-Studio, selecionando seu nome
diretamente, ou o mdulo que contm a opo ou a ao que a executar;
A partir do momento em que o DEV-Studio pausar o processamento em um
dos pontos de parada especificados previamente, podem ser utilizadas as
janelas de visualizao, disponveis no DEV-Studio, que so:
Variveis Locais
Variveis Privates
Variveis Publics
Variveis Statics
Janela da Watchs
Janela de Tabelas e Campos
Pilha de Chamadas
Ambientes TOPCONNECT
Isto 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 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.
Estes 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.
Para a aplicao ERP Protheus o campo de controle R_E_C_N_O_ definido em
todas as tabelas como sendo sua chave primria, o que transfere o controle de sua
numerao seqencial ao banco de dados.
O campo D_E_L_E_T_ tratado internamente pela aplicao ERP como um flag
ou marca de excluso. Desta 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.
SELECT()
DBSELECTAREA()
DBSETORDER()
DBSEEK() E MSSEEK()
DBSKIP()
- 139 Introduo programao e ADVPL Bsico
DBGOTO()
DBGOTOP()
DBGOBOTTON()
DBSETFILTER()
RECLOCK()
SOFTLOCK()
MSUNLOCK()
DBDELETE()
DBUSEAREA()
DBCLOSEAREA()
DBRLOCK()
Sintaxe
DBRLOCK(xIdentificador)
Funo de base de dados, que efetua o lock (travamento) do
registro identificado pelo parmetro xIdentificador. Este
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
DbDelete()
Descrio
DBGOTO()
Sintaxe
DbGoto(nRecno)
Descrio
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()
Sintaxe
DbSkip(nRegistros)
Descrio
DBSELECTAREA()
Sintaxe
DbSelectArea(nArea | cArea)
Descrio
DBSETFILTER()
Sintaxe
DbSetFilter(bCondicao, cCondicao)
Descrio
DBSETORDER()
Sintaxe
DbSetOrder(nOrdem)
Descrio
DBORDERNICKNAME()
Sintaxe
DbOrderNickName(NickName)
Descrio
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()
Sintaxe
DBUNLOCKALL()
Descrio
DBUSEAREA()
Sintaxe
Descrio
DbUseArea(lNovo,
cDriver,
cArquivo,
cAlias,
lComparilhado,; lSoLeitura)
Define um arquivo de base de dados como uma rea de trabalho
disponvel na aplicao.
MSUNLOCK()
Sintaxe
MsUnLock()
Descrio
RECLOCK()
Sintaxe
RecLock(cAlias,lInclui)
Descrio
RLOCK()
Sintaxe
RLOCK() lSucesso
Descrio
SELECT()
Sintaxe
Descrio
Select(cArea)
Determina o nmero de referncia de um determinado alias em
um ambiente de trabalho. Caso o alias especificado no esteja
em uso no Ambiente, ser retornado o valor 0 (zero).
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
UNLOCK()
Sintaxe
UNLOCK()
Descrio
GETSXENUM()
CONFIRMSXE()
ROLLBACKSXE()
GETSXENUM()
Sintaxe
Descrio
CONFIRMSXE()
Sintaxe
CONFIRMSXE(lVerifica)
Descrio
Confirma o nmero
GETSXENUM().
alocado
atravs
do
ltimo
comando
ROLLBACKSXE()
Sintaxe
ROLLBACKSXE()
Descrio
no
mdulo
VAZIO()
NAOVAZIO()
EXISTCPO()
EXISTCHAV()
- 148 Introduo programao e ADVPL Bsico
PERTENCE()
POSITIVO()
NEGATIVO()
TEXTO()
EXISTCHAV()
Sintaxe
Descrio
EXISTCPO()
Sintaxe
Descrio
NAOVAZIO()
Sintaxe
NaoVazio()
Descrio
NEGATIVO()
Sintaxe
Negativo()
Descrio
PERTENCE()
Sintaxe
Pertence(cString)
Descrio
POSITIVO()
Sintaxe
Positivo()
Descrio
TEXTO()
Sintaxe
Texto()
Descrio
VAZIO()
Sintaxe
Vazio()
Descrio
Funcionalidade
Permite apenas caracteres alfabticos.
Exibe CR depois de nmeros positivos.
Exibe numrico com o ponto e vrgula invertidos (formato Europeu).
Insere caracteres diferentes dos caracteres de template na exibio,
mas no os insere na varivel do GET.
Permite rolamento horizontal do texto dentro do GET, <n> um
nmero inteiro que identifica o tamanho da regio.
Exibe DB depois de nmeros negativos.
Exibe zeros como brancos.
Exibe nmeros negativos entre parnteses com os espaos em branco
iniciais.
Exibe nmeros negativos entre parnteses sem os espaos em branco
iniciais.
Converte caracteres alfabticos para maisculo.
Templates
Contedo Funcionalidade
X
Permite qualquer caractere.
9
Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal
para numricos.
#
Permite dgitos, sinais e espaos em branco para qualquer tipo de
!
*
.
,
dado.
Converte caracteres alfabticos para maisculo.
Exibe um asterisco no lugar dos espaos em branco iniciais em
nmeros.
Exibe o ponto decimal.
Exibe a posio do milhar.
SAY e PSAY
Funes
Contedo
C
E
R
X
Z
(
!
Funcionalidade
Exibe CR depois de nmeros positivos.
Exibe numrico com o ponto e a vrgula invertidos (formato Europeu).
Insere caracteres diferentes dos caracteres de template.
Exibe DB depois de nmeros negativos.
Exibe zeros como brancos.
Envolve nmeros negativos entre parnteses.
Converte todos os caracteres alfabticos para maisculo.
Templates
Contedo
X
9
#
!
*
.
,
Funcionalidade
Exibe dgitos para qualquer tipo de dado.
Exibe dgitos para qualquer tipo de dado.
Exibe dgitos para qualquer tipo de dado.
Converte caracteres alfabticos para maisculo.
Exibe asterisco no lugar de espaos em branco e inicias em nmeros.
Exibe a posio do ponto decimal.
Exibe a posio do milhar.
independente
em
relao
s
movimentaes e outros cadastros do Sistema.
Exemplos:
Cadastro
Cadastro
Cadastro
Cadastro
de
de
de
de
GETMV()
SUPERGETMV()
GETNEWPAR()
GETMV()
SUPERGETMV()
GETNEWPAR()
PUTMV()
GETMV()
Sintaxe
GETMV(cParametro)
Descrio
GETNEWPAR()
Sintaxe
Descrio
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.
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 a 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.
MSDIALOG()
MSGET()
SAY()
BUTTON()
SBUTTON()
BUTTON()
Sintaxe
Descrio
MSDIALOG()
Sintaxe
Descrio
MSGET()
Sintaxe
Descrio
SAY()
Sintaxe
Descrio
SBUTTON()
Sintaxe
Descrio
AxCadastro()
O AxCadastro() uma funcionalidade de cadastro simples, com poucas opes de
customizao, a qual composta de:
Parmetros
cAlias
cTitulo
Ttulo da Janela.
cVldExc
cVldAlt
Exemplo:
#include "protheus.ch"
User Function XCadSA2()
Local
Local
Local
Local
cAlias := "SA2"
cTitulo := "Cadastro de Fornecedores"
cVldExc := ".T."
cVldAlt := ".T."
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
MBrowse()
A Mbrowse() uma funcionalidade de cadastro que permite a utilizao de recursos
mais aprimorados na visualizao e manipulao das informaes do Sistema,
possuindo os seguintes componentes:
Parmetros
nLin1, nCol1,
nLin2, nCol2
cAlias
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})
cCadastro
Exemplo:
#include "protheus.ch"
User Function MBrwSA2()
Local cAlias := "SA2"
Private cCadastro := "Cadastro de Fornecedores"
Private aRotina
:= {}
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})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
Pesquisar
Visualizar
Incluir
Alterar
Excluir
Livre
AxFunctions()
Conforme 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.
Estas funes so padres na definio da interface AxCadastro() e podem ser
utilizadas tambm da construo no array aRotina, utilizado pela Mbrowse(), as
quais esto listadas a seguir:
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
AXALTERA()
Sintaxe
Descrio
AXDELETA()
Sintaxe
Descrio
AXINCLUI()
Sintaxe
Descrio
AXPESQUI()
Sintaxe
AXPESQUI()
Descrio
AXVISUAL()
Sintaxe
Descrio
AXVISUAL(cAlias,
nReg,
nOpc,
aAcho,
nColMens,
cMensagem, cFunc,; aButtons, lMaximized )
Funo de visualizao padro das informaes de um registro, no
formato Enchoice, conforme demonstrado no tpico sobre a
interface AxCadastro().
Exerccio
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 nesta tabela relacionada.
Exerccio
Desenvolver uma validao para um campo caractere existente na base, para que
seja avaliado se aquele cdigo j existe cadastrado, e caso positivo exiba uma
mensagem de aviso alertando desta ocorrncia.
Exerccio
Desenvolver um gatilho que retorne uma descrio complementar para um campo
vinculado ao campo cdigo utilizado nos exerccios anteriores.
Exerccio
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
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.
Exercico
Implementar uma validao adicional no cadastro de clientes, atravs do ponto de
entrada adequado, de forma que o campo CNPJ (A1_CGC) seja obrigatrio para
todos os tipos de cliente, exceto os definidos como Exterior.
APNDICES
BOAS PRTICAS DE PROGRAMAO
UTILIZAO DE IDENTAO
obrigatria a utilizao da identao, pois torna o cdigo muito mais legvel. Veja
os exemplos abaixo:
Para identar o cdigo utilize a tecla <TAB> e a ferramenta DEV-Studio, a qual pode
ser configurada atravs da opo Preferncias:
CAPITULAO DE PALAVRAS-CHAVE
Uma conveno amplamente utilizada a de capitular as palavras chaves, funes,
variveis e campos utilizando uma combinao de caracteres em maisculo e
minsculo, visando facilitar a leitura do cdigo fonte. O cdigo a seguir:
local ncnt while ( ncnt++ < 10 ) ntotal += ncnt * 2 enddo
Ficaria melhor com as palavras chaves e variveis capituladas:
Local nCnt While ( nCnt++ < 10 ) nTotal += nCnt * 2 EndDo
Palavras em maisculo
A regra utilizar caracteres em maisculo para:
Constantes:
#define NUMLINES 60 #define NUMPAGES 1000
Variveis de memria:
M-> CT2_CRCONV M->CT2_MCONVER := CriaVar("CT2_CONVER")
Campos:
SC6->C6_NUMPED
Querys:
SELECT * FROM...
Tipo de dado
Array
Bloco de cdigo
Caracter
Data
Lgico
Numrico
Objeto
Indefinido
Exemplo
aValores
bSeek
cNome
dDataBase
lContinua
nValor
oMainWindow
xConteudo
PALAVRAS RESERVADAS
AADD
ABS
ASC
AT
BOF
BREAK
ENDIF
LTRIM
SPACE
CTOD
FILE
PCOUNT
TRANSFORM
DOW
IIF
CATCH
DTOS
ELSE
ELSEIF
EMPTY
ENDCASE
ENDDO
LOWER
SETPOS
COL
FIELDNAME
PCOL
TIME
DEVPOS
IF
RECNO
THROW
INKEY
INT
LASTREC
LEN
LOCK
LOG
SELECT
CMONTH
FCOUNT
MONTH
SUBSTR
DELETED
FUNCTION
RECCOUNT
UPPER
REPLICATE
RLOCK
ROUND
ROW
RTRIM
SECONDS
CHR
EXP
MIN
STR
DAY
FOUND
PROW
TYPE
TRY
VAL
VALTYPE
WHILE
WORD
YEAR
CDOW
EOF
MAX
SQRT
DATE
FLOCK
PROCEDURE
TRIM
DTOC
AS
Sintaxe: CTOD(cData)
Parmetros
cData
Exemplo:
cData := 31/12/2006
dData := CTOD(cData)
IF dDataBase >= dData
MSGALERT(Data do sistema fora da competncia)
ELSE
MSGINFO(Data do sistema dentro da competncia)
ENDIF
CVALTOCHAR()
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
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:
MSGINFO(Database do sistema: +DTOC(dData)
DTOS()
Realiza a converso de uma informao do tipo data em um caractere, sendo o
resultado no formato AAAAMMDD.
Sintaxe: DTOS(dData)
Parmetros
dData
Exemplo:
cQuery := SELECT A1_COD, A1_LOJA, A1_NREDUZ FROM SA1010 WHERE
cQuery += A1_DULTCOM >=+DTOS(dDataIni)+
STOD()
Realiza a converso de uma informao do tipo caractere, com contedo no
formato AAAAMMDD em data.
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()
Realiza a converso de uma informao do tipo numrico em uma string,
adicionando espaos direita.
Sintaxe: STR(nValor)
Parmetros
nValor
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.
nTamanho
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
VAL()
Realiza a converso de uma informao do tipo caracter em numrica.
Sintaxe: VAL(cValor)
Parmetros
cValor
Exemplo:
Static Function Modulo11(cData)
LOCAL L, D, P := 0
L := Len(cdata)
D := 0
P := 1
While L > 0
P := P + 1
D := D + (Val(SubStr(cData, L, 1)) * P)
If P = 9
P := 1
End
L := L - 1
End
D := 11 - (mod(D,11))
If (D == 0 .Or. D == 1 .Or. D == 10 .Or. D == 11)
D := 1
End
Return(D)
Sintaxe: TYPE(cVariavel)
Parmetros
cVariavel
Exemplo:
IF TYPE(dDataBase) == D
MSGINFO(Database do sistema: +DTOC(dDataBase))
ELSE
MSGINFO(Varivel indefinida no momento)
VALTYPE()
Sintaxe: VALTYPE(cVariavel)
Parmetros
cVariavel
Exemplo:
STATIC FUNCTION GETTEXTO(nTamanho, cTitulo, cSay)
LOCAL cTexto
LOCAL nColF
LOCAL nLargGet
PRIVATE oDlg
:=
:= 0
:= 0
Default cTitulo
Default cSay
Default nTamanho
:= Space(nTamanho)
:= Round(nTamanho * 2.5,0)
:= Round(195 + (nLargGet * 1.75) ,0)
Manipulao de arrays
Array()
A funo Array() utilizada na definio de variveis de tipo array, como uma
opo a sintaxe utilizando chaves ({}).
nColunas
Exemplo:
aDados := Array(3,3) // Cria um array de trs linhas, cada qual com 3 colunas.
AADD()
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.
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.
AADD(aItem, cVariavel1) // Adiciona um elemento no array aItem de acordo com o
cVariavel1
AADD(aItem, cVariavel2) // Adiciona um elemento no array aItem de acordo com o
cVariavel2
ACLONE()
A funo ACLONE() realiza a cpia dos elementos de um array para outro array
integralmente.
Sintaxe: AADD(aArray)
Parmetros
aArray
Exemplo:
// Utilizando o array aDados, utilizado no exemplo da funo AADD()
aItens := ACLONE(aDados).
// Neste ponto, o array aItens possui exatamente a mesma estrutura e informaes
do array
// aDados.
nPosio
Exemplo:
// Utilizando o array aItens do exemplo da funo ACLONE() temos:
ADEL(aItens,1) // Ser removido o primeiro elemento do array aItens.
// Neste ponto, o array aItens continua com 03 elementos, aonde:
// aItens[1] -> antigo aItens[2], o qual foi reordenado como efeito da excluso do
item 1.
// aItens[2] -> antigo aItens[3], o qual foi reordenado como efeito da excluso do
item 1.
// aItens[3] -> contedo nulo, por se tratar do item excludo.
ASIZE()
nTamanho
Exemplo:
// Utilizando o array aItens, o qual teve um elemento excludo pelo uso da funo
ADEL()
ASIZE(aItens,Len(aItens-1)).
// Neste ponto o array aItens possui 02 elementos, ambos com contedos vlidos.
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.
Exemplo:
aAlunos := {Mrcio, Denis, Arnaldo, Patrcia}
bSeek := {|x| x == Denis}
nPosAluno := aScan(aAlunos,bSeek) // retorno esperado 2
AINS()
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.
nPosicao
Exemplo:
aAlunos := {Edson, Robson, Renato, Tatiana}
AINS(aAlunos,3)
// Neste ponto o array aAlunos ter o seguinte contedo:
// {Edson, Robson, nulo, Renato, Tatiana}
xParamZ
Exemplo:
nInt := 10
bBloco := {|N| x:= 10, y:= x*N, z:= y/(x*N)}
nValor := EVAL(bBloco, nInt)
// O retorno ser dado pela avaliao da ultima ao da lista de expresses, no
caso z.
// Cada uma das variveis definidas, em uma das aes da lista de expresses, fica
disponvel
// para a prxima ao.
// Desta forma temos:
// N recebe nInt como parmetro (10)
// X tem atribudo o valor 10 (10)
// Y resultado da multiplicao de X por N (100)
// Z resultado da diviso de Y pela multiplicao de X por N ( 100 / 100) 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.
bFor
bWhile
Exemplo 01
Considerando o trecho de cdigo abaixo:
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And.; X5_TABELA <= mv_par02
nCnt++
dbSkip()
End
O mesmo pode ser re-escrito com o uso da funo DBEVAL():
dbEval(
{|x|
nCnt++
X5_TABELA<=mv_par02})
},,{||X5_FILIAL==xFilial("SX5")
.And.
Exemplo 02
Considerando o trecho de cdigo abaixo:
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
While !Eof() .And. X5_TABELA == cTabela
AADD(aTabela,{X5_CHAVE, Capital(X5_DESCRI)})
dbSkip()
End
Exemplo 02 (continuao):
O mesmo pode ser re-escrito com o uso da funo DBEVAL():
dbEval({||
X5_TABELA==cTabela})
aAdd(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})},,{||
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.
bBloco
nInicio
nFim
Exemplo 01:
Considerando o trecho de cdigo abaixo:
AADD(aCampos,A1_FILIAL)
AADD(aCampos,A1_COD)
SX3->(dbSetOrder(2))
For nX:=1 To Len(aCampos)
SX3->(dbSeek(aCampos[nX]))
aAdd(aTitulos,AllTrim(SX3->X3_TITULO))
Next nX
O mesmo pode ser re-escrito com o uso da funo AEVAL():
aEval(aCampos,{|x| SX3->(dbSeek(x)),IIF(Found(), AAdd(aTitulos,;
AllTrim(SX3->X3_TITULO)))})
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
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
MSGINFO(Dados do campo A1_NOME:+CRLF
Tamanho: + CVALTOCHAR(LEN(SA1->A1_NOME))+CRLF
Texto: + CVALTOCHAR(LEN(cNome)))
ASC()
Converte uma informao caractere em seu valor, de acordo com a tabela ASCII.
Sintaxe: ASC(cCaractere)
Parmetros
cCaractere
Exemplo:
USER FUNCTION NoAcento(Arg1)
Local nConta := 0
Local cLetra := ""
Local cRet := ""
Arg1 := Upper(Arg1)
For nConta:= 1 To Len(Arg1)
cLetra := SubStr(Arg1, nConta, 1)
Do Case
Case (Asc(cLetra) > 191 .and. Asc(cLetra) < 198) .or.;
(Asc(cLetra) > 223 .and. Asc(cLetra) < 230)
cLetra := "A"
Case (Asc(cLetra) > 199 .and. Asc(cLetra) < 204) .or.;
(Asc(cLetra) > 231 .and. Asc(cLetra) < 236)
cLetra := "E"
cCaractere
cString
Exemplo:
STATIC FUNCTION NOMASCARA(cString,cMascara,nTamanho)
LOCAL cNoMascara
LOCAL nX
:= ""
:= 0
ENDIF
RETURN cNoMascara
CHR()
Converte um valor nmero, referente a uma informao da tabela ASCII, no
caractere que esta informao representa.
Sintaxe: CHR(nASCII)
Parmetros
nASCII
Exemplo:
#DEFINE CRLF CHR(13)+CHR(10) // FINAL DE LINHA
LEN()
Retorna o tamanho da string especificada no parmetro.
Sintaxe: LEN(cString)
Parmetros
cString
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
MSGINFO(Dados do campo A1_NOME:+CRLF
Tamanho: + CVALTOCHAR(LEN(SA1->A1_NOME))+CRLF
Texto: + CVALTOCHAR(LEN(cNome)))
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))
RAT()
Retorna a ltima posio de um caracter ou string dentro de outra string
especificada.
Sintaxe: RAT(cCaractere, cString)
Parmetros
cCaractere
cString
STUFF()
Permite substituir um contedo caractere em uma string j existente, especificando
a posio inicial para esta adio e o nmero de caracteres que sero substitudos.
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).
Sintaxe: SUBSTR(cString, nPosInicial, nCaracteres)
Parmetros
cString
nPosInicial
nCaracteres
Exemplo:
cCampo := A1_NOME
nPosUnder := AT(cCampo)
cPrefixo := SUBSTR(cCampo,1, nPosUnder) // A1_
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))
Sintaxe: ABS(nValor)
Parmetros
nValor
Exemplo:
nPessoas := 20
nLugares := 18
IF nPessoas < nLugares
MSGINFO(Existem +CVALTOCHAR(nLugares- nPessoas)+disponveis)
ELSE
MSGSTOP(Existem +CVALTOCHAR(ABS(nLugares- nPessoas))+faltando)
ENDIF
INT()
Retorna a parte inteira de um valor especificado no parmetro.
Sintaxe: INT(nValor)
Parmetros
nValor
Exemplo:
STATIC FUNCTION COMPRAR(nQuantidade)
LOCAL nDinheiro := 0.30
LOCAL nPrcUnit := 0.25
IF nDinheiro >= (nQuantidade*nPrcUnit)
RETURN nQuantidade
ELSEIF nDinheiro > nPrcUnit
nQuantidade := INT(nDinheiro / nPrcUnit)
ELSE
nQuantidade := 0
ENDIF
RETURN nQuantidade
NOROUND()
Retorna um valor, truncando a parte decimal do valor especificado no parmetro,
de acordo com a quantidade de casas decimais solicitadas.
nCasas
Exemplo:
nBase := 2.985
nValor := NOROUND(nBase,2) 2.98
ROUND()
Retorna um valor, arredondando a parte decimal do valor especificado no
parmetro, de acordo com a quantidades de casas decimais solicitadas, utilizando o
critrio matemtico.
nCasas
Exemplo:
nBase := 2.985
nValor := ROUND(nBase,2) 2.99
Manipulao de arquivos
SELECT()
Determina o nmero de referncia de um determinado alias em um ambiente de
trabalho. Caso o alias especificado no esteja em uso no ambiente, ser retornado
o valor 0 (zero).
Sintaxe: Select(cArea)
Parmetros
cArea
Exemplo:
nArea := Select(SA1)
ALERT(Referncia do alias SA1: +STRZERO(nArea,3)) // 10 (proposto)
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
Exemplo:
DbSelectArea(SA1)
DbGoto(100) // Posiciona no registro 100
IF !EOF() // Se a rea de trabalho no estiver em final de arquivo
MsgInfo(Voc est no cliente:+A1_NOME)
ENDIF
DBGOTOP()
Move o cursor da rea de trabalho ativa para o primeiro registro lgico.
Sintaxe: DbGoTop()
Parmetros
Nenhum
Exemplo:
nCount := 0 // Varivel para verificar quantos registros h no intervalo
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbGoTop()
While !BOF() // Enquanto no for o incio do arquivo
nCount++ // Incrementa a varivel de controle de registros no intervalo
DbSkip(-1)
End
MsgInfo(Existem :+STRZERO(nCount,6)+ registros no intervalo).
// Retorno esperado :000001, pois o DbGoTop posiciona no primeiro registro.
DBGOBOTTON()
Move o cursor da rea de trabalho ativa para o ltimo registro lgico.
Sintaxe: DbGoBotton()
Parmetros
Nenhum
Exemplo:
nCount := 0 // Varivel para verificar quantos registros h no intervalo
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbGoBotton()
While !EOF() // Enquanto no for o incio do arquivo
nCount++ // Incrementa a varivel de controle de registros no intervalo
DbSkip(1)
End
MsgInfo(Existem :+STRZERO(nCount,6)+ registros no intervalo).
// Retorno esperado :000001, pois o DbGoBotton posiciona no ltimo registro.
DBSELECTAREA()
Define a rea de trabalho especificada como sendo a rea ativa. Todas as
operaes subseqentes que fizerem referncia a uma rea de trabalho para
utilizao, a menos que a rea desejada seja informada explicitamente.
nArea
cArea
Sintaxe: DbSetOrder(nOrdem)
Parmetros
nOrdem
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)
DBSEEK() E MSSEEK()
DbSeek(): Permite posicionar o cursor da rea de trabalho ativo no registro com
as informaes especificadas na chave de busca, fornecendo um retorno lgico e
indicando se o posicionamento foi efetuado com sucesso, ou seja, se a informao
especificada, na chave de busca, foi localizada na rea de trabalho.
Sintaxe: DbSeek(cChave, lSoftSeek, lLast)
Parmetros
cChave
lSoftSeek
lLast
Cdigo: + A1_COD
+ CRLF +;
Loja:
+ A1_LOJA
+ CRLF +;
Nome:
+ A1_NOME + CRLF, Consulta por cliente)
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 novamente do acesso da base de dados para localizar uma
informao j utilizada pela thread (conexo) ativa.
Desta forma, a thread mantm em memria os dados necessrios para reposicionar
os registros j localizados atravs do comando DbSeek (no caso o Recno()), de
forma que a aplicao pode simplesmente efetuar o posicionamento sem executar
novamente a busca.
A diferena entre o DbSeek() e o MsSeek() notada em aplicaes com grande
volume de posicionamentos, como relatrios, que necessitam referenciar diversas
vezes o mesmo registro, durante uma execuo.
DBSKIP()
Move o cursor do registro posicionado para o prximo (ou anterior dependendo do
parmetro), em funo da ordem ativa para a rea de trabalho.
Sintaxe: DbSkip(nRegistros)
Parmetros
nRegistros
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.
cCondicao
DBSTRUCT()
Retorna um array contendo a estrutura da rea de trabalho (alias) ativo. A
estrutura ser um array bidimensional conforme abaixo:
ID*
Nome campo
Tipo campo
Tamanho
Decimais
*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)
RECLOCK()
Efetua o travamento do registro posicionado na rea de trabalho ativa, permitindo a
incluso ou alterao das informaes do mesmo.
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
IF Found() // Avalia o retorno do ltimo DbSeek realizado
RecLock(SA1,.F.)
SA1->A1_NOME := CLIENTE CURSO ADVPL BSICO
SA1->A1_NREDUZ := ADVPL BSICO
MsUnLock() // Confirma e finaliza a operao
ENDIF
Sintaxe: MsUnLock()
Parmetros
Nenhum
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
IF Found() // Avalia o retorno do ltimo DbSeek realizado
RecLock(SA1,.F.)
SA1->A1_NOME := CLIENTE CURSO ADVPL BSICO
SA1->A1_NREDUZ := ADVPL BSICO
MsUnLock() // Confirma e finaliza a operao
ENDIF
Sintaxe: SoftLock(cAlias)
Parmetros
cAlias
Exemplo:
cChave := GetCliente() // Funo ilustrativa que retorna os dados de busca de um
cliente.
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
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.
Sintaxe:
lComparilhado,;
lSoLeitura)
DbUseArea(lNovo,
cDriver,
cArquivo,
cAlias,
Parmetros
lNovo
cDriver
cArquivo
cAlias
lComparilhado
lSoLeitura
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:
DbUserArea(.T., DBFCDX, \SA1010.DBF, SA1DBF, .T., .F.)
DbSelectArea(SA1DBF)
MsgInfo(A tabela SA1010.DBF possui: + STRZERO(RecCount(),6) + registros.)
DbCloseArea()
CONFIRMSXE()
Confirma o nmero alocado atravs do ltimo comando GETSXENUM().
Sintaxe: CONFIRMSXE(lVerifica)
Parmetros
lVerifica
ROLLBACKSXE()
Descarta o nmero fornecido pelo ltimo comando GETSXENUM(), retornando a
numerao disponvel para outras conexes.
Sintaxe: ROLLBACKSXE()
Parmetros
Nenhum
Validao
EXISTCHAV()
Retorna .T. ou .F. se o contedo especificado existe no alias especificado. Caso
exista ser exibido um help de sistema com um aviso informando da ocorrncia.
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.
cConteudo
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.
Funo utilizada normalmente para verificar se a informao digitada em um
campo, a qual depende de outra tabela, realmente existe nesta outra tabela, como
por exemplo o cdigo de um cliente em um pedido de venda.
cAlias
cConteudo
nIndice
NAOVAZIO()
Retorna .T. ou .F. se o contedo do campo posicionado no momento no est vazio.
Sintaxe: NaoVazio()
Parmetros
Nenhum
NEGATIVO()
Retorna .T. ou .F. se o contedo digitado para o campo 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()
Retorna .T. ou .F. se o contedo digitado para o campo positivo.
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()
Retorna .T. ou .F. se o contedo do campo posicionado no momento est vazio.
Sintaxe: Vazio()
Parmetros
Nenhum
Parmetros
GETMV()
Retorna o contedo do parmetro especificado no arquivo SX6, considerando a filial
parametrizada na conexo. Caso o parmetro no exista, ser exibido um help do
sistema informando a ocorrncia.
Sintaxe: GETMV(cParametro)
Parmetros
cParametro
GETNEWPAR()
Retorna o contedo do parmetro especificado no arquivo SX6, considerando a filial
parametrizada na conexo. Caso o parmetro no exista, ser exibido um help do
sistema informando a ocorrncia.
Difere do SuperGetMV() pois considera que o parmetro pode no existir na verso
atual do sistema, e por conseqncia no ser exibida a mensagem de help.
cParametro
cPadrao
cFilial
PUTMV()
Atualiza o contedo do parmetro especificado no arquivo SX6, de acordo com as
parametrizaes informadas.
cConteudo
SUPERGETMV()
Retorna o contedo do parmetro especificado no arquivo SX6, considerando a filial
parametrizada na conexo. Caso o parmetro no exista, ser exibido um help do
sistema informando a ocorrncia.
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.
cParametro
lHelp
cPadrao
cFilial
Sintaxe:
Parmetros
oObjetoDLG
cTitulo
nLinIni, nColIni
nLiFim, nColFim
oObjetoRef
UNIDADE
Exemplo:
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 000,000 TO 080,300 PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
MSGET()
Define o componente visual MSGET, o qual utilizado para captura de informaes
digitveis na tela da interface.
Sintaxe:
UNIDADE
OF
Parmetros
nLinha, nColuna
VARIAVEL
nLargura,nAltura
UNIDADE
oObjetoRef
cF3
VALID
WHEN
cPicture
Exemplo:
@ 010,050 MSGET cCGC
99.999.999/9999-99";
VALID !Vazio()
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:
@ 010,010 SAY
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()
Parmetros
nLinha,nColuna
cTexto
nLargura,nAltura
UNIDADE
oObjetoRef
AO
Exemplo:
010, 120 BUTTON Confirmar SIZE 080, 047 PIXEL OF oDlg;
ACTION (nOpca := 1,oDlg:End())
SBUTTON()
Define o componente visual SButton, o qual 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-definido.
Sintaxe: SBUTTON()
N ACTION AO STATUS OF
Parmetros
nLinha, nColuna
TYPE N
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
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
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,
cMensagem, cFunc,; aButtons, lMaximized )
nOpc,
aAcho,
nColMens,
Parmetros
cAlias
nReg
nOpc
aAcho
nColMens
Parmetro no utilizado.
cMensagem
Parmetro no utilizado.
cFunc
aButtons
lMaximized
AXINCLUI()
Funo de incluso padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
cAlias
nReg
nOpc
aAcho
cFunc
aCpos
cTudoOk
lF3
cTransact
aButtons
aParam
aAuto
lVirtual
lMaximized
AXALTERA()
Funo de alterao padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Parmetros
AXDELETA()
Funo de excluso padro das informaes de um registro, no formato Enchoice,
conforme demonstrado no tpico sobre a interface AxCadastro().
Parmetros
cAlias
nReg
nOpc
cTransact
aCpos
aButtons
aParam
transao da AxFunction().
aAuto
lMaximized
Sintaxe: AVISO(cTexto)
Parmetros
cTexto
AVISO()
Parmetros
cTitulo
Ttulo da janela.
cTexto
Texto do aviso.
aBotoes
nTamanho
FORMBACTH()
Sintaxe: FORMBATCH(cTitulo,
nLargura )
Parmetros
cTitulo
aTexto
aBotoes
aTexto,
aBotoes,
bValid,
nAltura,
Ttulo da janela.
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:
{nTipo,lEnable,{|| Ao() }}
bValid
nAltura
nLargura
MSGFUNCTIONS()
Sintaxe:
Sintaxe:
Sintaxe:
Sintaxe:
MSGALERT(cTexto, cTitulo)
MSGINFO(cTexto, cTitulo)
MSGSTOP(cTexto, cTitulo)
MSGYESNO(cTexto, cTitulo)
Parmetros
cTexto
cTitulo
MSGALERT
MSGINFO
MSGSTOP
MSGYESNO
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:
REFERNCIAS BIBLIOGRFICAS
Referncias bibliogrficas
Gesto empresarial com ERP
Ernesto Haberkorn, 2006
Lgica de Programao A Construo de Algoritmos e Estruturas de Dados
Forbellone, Andr Luiz Villar - MAKRON, 1993
Introduo Programao - 500 Algoritmos Resolvidos
Anita Lopes, Guto Garcia CAMPUS / ELSEVIER, 2002
Apostila de Treinamento - ADVPL
Educao corporativa
Apostila de Treinamento Introduo programao
Educao corporativa
Apostila de Treinamento Boas Prticas de Programao
Inteligncia Protheus e Fbrica de Software
Curso Bsico de Lgica de Programao
Paulo Srgio de Moraes PUC Campinas
DEM Documentao Eletrnica Microsiga
Microsiga Software S.A.
Materiais diversos de colaboradores Microsiga
Colaboradores Microsiga