Você está na página 1de 78

________Educao Corporativa

Programao e Tecnologia
ADVPL I - Plus
Julho/2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Contedo
Captulo 01 ADVPL .......................................................................................4
Interface com o Usurio............................................................................... 4
Processos .................................................................................................. 4
Captulo 02 Programao ..............................................................................5
Linhas de Programa .................................................................................... 5
Tamanho de Linha ...................................................................................... 6
Captulo 03 Estruturao...............................................................................7
Captulo 04 Documentao............................................................................9
Captulo 05 Funcionalidades ........................................................................ 11
Criao de Variveis ...................................................................................11
Captulo 06 Operadores Bsicos ................................................................... 13
Matemticos..............................................................................................13
String .......................................................................................................13
Relacionais................................................................................................13
Lgicos .....................................................................................................13
Atribuies ................................................................................................14
Especiais ..................................................................................................14
Procedncias .............................................................................................14
Macro Substituio .....................................................................................15
Captulo 07 - Utilizao de Vetores.................................................................. 17
Cuidados com Vetores ................................................................................18
Matrizes como Estruturas ............................................................................18
Captulo 08 Controle de Fluxo ...................................................................... 19
Comandos de Repetio..............................................................................19
Comandos de Deciso ................................................................................21
Problemas Comuns ....................................................................................22
Captulo 09 Development Studio .................................................................. 25
Configurao de Ambiente ..........................................................................26
Criao de Projetos ....................................................................................27
Utilizando assistentes de Programas .............................................................28
Compilao ...............................................................................................30
Depurao ................................................................................................30
Captulo 10 Customizao ........................................................................... 32
Parmetros ...............................................................................................32
Tabelas ....................................................................................................34
Perguntas .................................................................................................35
Expresses ADVPL .....................................................................................35
Pontos de Entrada......................................................................................36
Dicionrio de Dados Ativos ..........................................................................37
ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Gatilhos ....................................................................................................37
Captulo 11 Conceitos de Filiais .................................................................... 38
Arquivos Compartilhados ............................................................................38
Arquivos Exclusivos....................................................................................39
Captulo 12 Programando............................................................................ 40
Criando um Programa Simples.....................................................................40
Incluindo Item no Menu ..............................................................................43
Captulo 13 Funes Pr-Existentes .............................................................. 47
Manipulao de Stings ................................................................................47
Manipulao de Dados ................................................................................49
Manipulao de Nmeros ............................................................................51
Manipulao de Vetores ..............................................................................52
Captulo 14 Tratamento de Base de Dados .................................................... 54
Criando Arquivos .......................................................................................54
Criando Indices Temporrios .......................................................................54
Posicionamento de Registros .......................................................................55
Funes de Base de Dados ..........................................................................57
Captulo 15 Blocos de Cdigos ..................................................................... 59
Definio ..................................................................................................59
Funes de Bloco .......................................................................................60
Captulo 16 Funes Diversas ...................................................................... 62
Funes de Ambientes ................................................................................62
Funes de Servidor ...................................................................................62
Funes de Comunicao Server x Client ......................................................64
Funes de Servidor ...................................................................................65
Captulo 17 Tela de Padro Microsiga............................................................ 66
AxCadastro().............................................................................................66
Pergunte() ................................................................................................67
PutSx1() ...................................................................................................67
mBrowse() ................................................................................................69
Modelo 2...................................................................................................71
Modelo 3...................................................................................................72
Capitulo 18 MSEXECAUTO ........................................................................... 74
Vantagens ................................................................................................74
Exemplo de Automao de Rotinas...............................................................76

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 01 ADVPL
ADVPL (Advanced Protheus Language) surgiu com a tecnologia Protheus em 1994,
derivada do Clipper e bibliotecas Fivewin, incorpora o padro xBase para a
manuteno de todo o cdigo j existente do sistema de ERP Siga Advanced, possui
comandos e funes, operadores, estruturas de controle de fluxo e palavras
reservadas, contando tambm com funes e comandos criados pela prpria
Microsiga que a torna uma linguagem completa para a criao de aplicaes ERP.
Tambm uma linguagem orientada a objetos e eventos, permitindo ao
programador desenvolver aplicaes visuais e criar suas prprias classes de
objetos.
A Microsiga criou seu prprio ambiente de desenvolvimento (IDE) que edita
programas, compila, interpreta e depura as funes de usurio que ficam
armazenadas nas unidades de inteligncia bsicas, chamados APOs (de Advanced
Protheus Objects), que ficam guardados em um repositrio carregado pelo Protheus
no momento de sua execuo. Toda funo criada em AdvPl pode ser executada em
qualquer ponto do ambiente Protheus.
Os programas em AdvPl so subdivididos nas seguintes categorias:

Interface com o Usurio


So funes que realizem algum tipo de interface remota utilizando o protocolo de
comunicao do Protheus. Podem ser criadas rotinas para a customizao desde
processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o
ambiente montado pelos mdulos, utilizando telas e funes padronizadas. Com o
ADVPL possvel criar uma aplicao do comeo ao fim.

Processos
So funes sem interface com o usurio, so rotinas como processos internos ou
Jobs. Essas rotinas so executadas de forma transparente ao usurio.
Existem rotinas que so responsveis por iniciar os processos executados atravs
dos meios disponveis de integrao e conectividade no Protheus, subdivididas em:
Programao de RPC
Executada atravs de uma biblioteca de funes disponveis diretamente pelo
Server do Protheus ou atravs de aplicaes externas escritas em outras
linguagens. Essa execuo pode ser feita em outros servidores Protheus atravs de
conexo TCP.
Programao Web
So requisies http feitas em ADPVL que so executadas como um servidor Web,
como processos individuais, enviando ou recebendo resultado das funes.
Lembrando que as funes no devem ter comandos de interface com o usurio,
nesse caso utiliza-se arquivos HTML contendo cdigo ADVPL, conhecidos como
ADVPL ASP, para a criao de pginas dinmicas.
Programao TelNet
O Protheus Server pode emular um terminal TelNet, atravs da execuo de rotinas
escritas em ADVPL,cuja interface final ser um terminal TelNet ou um coletor de
dados mvel.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 02 Programao
Um programa de computador nada mais do que um algoritmo escrito numa
linguagem de computador com o objetivo de executar determinada tarefa. Esses
comandos so gravados em um arquivo texto que transformado em uma
linguagem executvel por um computador atravs da compilao. A compilao
substitui os comandos que esto numa linguagem que ns entendemos por
linguagem de mquina. No caso do AdvPl, esse cdigo compilado ser executado
pelo Protheus Server a partir do Repositrio.
Para programar em qualquer linguagem devem ser seguidas regras da linguagem,
a qual chamamos de sintaxe da linguagem, se no obedecida essa sintaxe o
programa causar erros que podem ser de compilao ou de execuo.
Compilao: no permite nem que o cdigo seja compilado, so comandos
especificados incorretamente, operadores utilizados de forma errada, sintaxe
incorreta, dentre outros.
Execuo: so os que ocorrem no momento da execuo. Podem ocorrer por
muitas razes, dentre elas, funes no existentes, ou variveis no criadas ou
no inicializadas, etc.

Linhas de Programa
As linhas existentes dentro de um arquivo texto de cdigo de programa podem ser:
Linhas de comando: possuem os comandos ou instrues que sero executadas.
Linhas de comentrio: possuem um texto qualquer, que no so executadas
muito utilizado para documentao e facilitar o entendimento do programa.
Podemos comentar informaes no programa utilizando os seguintes caracteres:
&&

&&Programa para recalculo do custo mdio

//

// Programa para recalculo do custo mdio

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Podemos documentar blocos de texto inicializando com /* e finalizando com */
/*
Programa para recalculo do custo mdio
Autor: Biale ADVPL e Consultoria em Informtica
Data: 15 de dezembro de 2006
*/
Linhas Mistas: possuem comandos ou instrues juntamente com comentrios
Local nSoma := 0 //Utilizada para totalizar o relatrio.

Tamanho de Linha
Linha fsica: delimitada pela quantidade de caracteres que pode ser digitado no
editor de textos utilizado. Cada linha fsica separada por um <Enter>.
Linha lgica: aquela considerada para a compilao como uma nica linha de
comando. Quando queremos que mais de uma linha fsica componha a mesma
linha de comando utilizamos o ; (ponto e virgula)
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 03 Estruturao
A linguagem ADVPL no tem padres rgidos de estrutura do programa, mas
normalmente utilizamos a seguinte estruturao:
Identificao: rea reservada para documentao do programa, como finalidade,
data, autor, etc.
/******************************************************************
|Funcao para separao de nmeros pares e impares
|Autor: Cristiane C. Figueiredo
|Data : 01/03/06
|*****************************************************************/
Inicializao: rea reservada a declaraes de variveis, abertura de arquivos.
Apesar de em ADVPL ser permitido o uso de variveis no declaradas
anteriormente, importante declara-las aqui para tornar o programa mais legvel.
User Function fSeparaNum
Local nBI
Local cBIImpares := ""
Local cBIPares := ""

//Numeros Impares
//Nmeros Pares

Corpo do programa: rea reservada para a lgica do programa.


For nBI:=1 to 12
If mod(nBI,2)== 0
cBIPares += Alltrim(str(nBI)) +
Else
cBIImpares += Alltrim(str(nBI)) +
Endif
Next
Encerramento: rea reservada ao fechamento dos arquivos abertos, mostrar o
resultado do processamento e encerramento do programa.
// Exibe em tela o resultado encontrado
Msginfo("Pares + cBIPares + " Impares + cBIImpares)
// Termina o programa
Return
Geralmente utilizamos na declarao de varivel um prefixo de acordo com a tipo
de cada varivel e um nome sugestivo, em seguida atribumos valores s variveis.
A atribuio tambm pode ser feita no momento da declarao.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Veja como ficou nosso exemplo obedecendo as caractersticas da estrutura do
cdigo escrito em ADVPL:
/******************************************************************
|Funcao para separao de nmeros pares e impares
|
|Autor: Cristiane C. Figueiredo
|
|Data : 01/03/10|
\*****************************************************************/
User Function fSeparaNum
Local nBI
Local cBIImpares := ""
//Numeros Impares
Local cBIPares := ""
//Nmeros Pares
For nBI:=1 to 12
If mod(nBI,2)== 0
cBIPares += Alltrim(str(nBI)) + " "
Else
cBIImpares += Alltrim(str(nBI)) + " "
Endif
Next
//Exibe em tela o resultado encontrado
Msginfo("Pares " + cBIPares + " Impares " + cBIImpares)
Return

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 04 Documentao
Toda customizao deve ser bem documentada, com informaes relevantes e
conceituais. O cabealho das funes deve conter o nome do autor, data de criao,
uma descrio sumria de sua funcionalidade, a sintaxe e a descrio dos
argumentos de entrada e sada. Pode tambm ser colocada a localizao no menu,
agendamento, etc.
/*==================================================|
|Funo |ADV0070A |Autor|Cristiane C. Figueiredo
| Data |23/07/04
|
|======|============================|===============|
|Descrio |Verifica se campo do E2 pode ser alterado ou no.
|
|==========|======================================= |
|Modulo | SIGAFIN
|
|==========|======================================= |
|OBS
| Especifico para BIALE
|
|==========|======================================= |
|Alteraes solicitadas
|
|==================================================|
|Descrio
|Sol.por|Atend.por |Data
|
|==================================================|
|Incluida verificao de chamada por MsExecAuto
|
|ISInCallStack('msexecauto').
|Gerente|Lucas Borges|30/01/07|
|==================================================*/
Documentao em Funes:
User Function ADV0070A(nCampo)
Comandos...
Return
Documentao de solicitao de Customizaes:
Tambm necessria para uma melhor visualizao a documentao e de todas as
solicitaes efetuadas pelos usurios ou gerentes com as devidas assinaturas.
Veja na pgina seguinte o exemplo de uma documentao de solicitao de
customizao.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Dados da Requisio
Data Solicitao
rea
Responsvel
Analista de Negcio
Volume de esforo
Previsto
Data de entrega
Prevista

<data da solicitao>
<nome da rea solicitante/centro de custo>
<nome do solicitante responsvel>
< nome do analista de negcio >
<quantidade de horas necessrias para o desenvolvimento/testes>
<data de entrega prevista (uso da rea de TI)>

Objetivo
Esta rotina tem por objetivo ... (descrever aqui o objetivo macro que a rotina dever atender. Neste
espao no devem ser descritas as regras de negcio, pois h uma seo mais adiante pra atender a
esta necessidade. Descrever o objetivo em uma linguagem que o usurio entenda).

Programas envolvidos (anlise inicial)

Comentrios/Observaes do Responsvel pela Customizao

Aprovaes
Nome

Assinatura

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Data

Todos os Direitos Reservados 2010

10

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 05 Funcionalidades
Em ADVPL utilizamos funes da seguinte forma:
Function
User Function
Static Function

Limitada a programas padres, no permitindo ser compilada por clientes.


Funes de usurio, podendo ser utilizadas para fazer customizaes.
Funes chamadas pelas User Functions e pelas Functions.

Especificamente Functions e User Functions podem ser chamadas de qualquer


ponto do Sistema, se estiverem compiladas no repositrio.

Criao de Variveis
As variveis devem ser declaradas no incio da funo que for utiliz-la.
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.
Identificadores
Public: Visvel a partir do momento que criada at o termino da aplicao, no
deve ser utilizada para qualquer coisa pois ocupa espao de memria.
Private: Visvel na funo que a criou e nas demais chamadas por ela, at que a
funo que a criou seja finalizada, e so criadas automaticamente quando no
declaradas.
Local: Visveis somente na funo que a criou, variveis locais ocupam pouco
espao de memria. E so criadas automaticamente quando provierem de
parametrizao de funo.
Tipos: O tipo de varivel identifica sua utilizao na funo. Toda varivel deve
estar tipada durante sua criao.
convencional utilizarmos letras iniciais em variveis para que possamos saber se
o seu tipo numrico, caracter, data ou lgico.
As variveis tm os seguintes tipos:

Tipo
Caracter
Numrica
Data
Lgica
Array
Objeto

Exemplo
cVar
nVar
dVar
LVar
aVar
oVar

Descritivo
Aceita nmeros e letras
Aceita apenas nmeros
Aceita apenas Datas
Aceita Verdadeira ou Falsa
Aceita Vetores
Usada em objetos

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

11

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Variveis e nomes de campos
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo
ou tabela aberta no momento. Neste caso, o AdvPl privilegiar o campo. Assim uma
referncia a um nome que identifique tanto uma varivel como um campo,
resultar no contedo do campo.
Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador
de identificao de apelido (->) e um dos dois identificadores de referncia,
MEMVAR ou FIELD.
cRes := MEMVAR->NOME
cRes := FIELD->NOME
O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela
aberto, para evitar a necessidade de selecionar a rea antes de acessar o contedo
de terminado campo.
cRes := CLIENTES->NOME
Inicializao de Variveis
Quando no atribumos nenhum valor a uma varivel no momento de sua
declarao, corremos o risco de utiliz-la com valor NIL e isso pode causar erros
fatais. Por isso, a inicializao de uma varivel de extrema importncia.
Utilizao da Funo CRIAVAR( )
Esta funo cria uma varivel, retornando o valor do campo, de acordo com o
dicionrio de dados. Avalia o inicializador padro e retorna o contedo de acordo
com o tipo de dado definido no dicionrio.
Sintaxe:
URet

uRet := CriaVar(cCampo,lIniPad)

CCampo

tipo de retorno de acordo com o dicionrio de dados, considerando inicializador


padro.
Nome do campo

LiniPad

Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RELACAO)

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

12

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 06 Operadores Bsicos


Matemticos
Os operadores utilizados para clculos matemticos so:
+

Adio

Subtrao

Multiplicao

Diviso

** ou ^

Exponenciao

Mdulo (Resto da Diviso)

String
Os operadores utilizados para tratamento de caracteres so:
+

Concatenao de strings (unio)

Concatenao de strings com eliminao dos brancos finais das strings intermedirias

Comparao de Substrings (contido em)

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

Menor que

>

Maior que

Igual

==

Exatamente Igual (para caracteres)

<=

Menor ou Igual

>=

Maior ou Igual

<> ou # ou Diferente
!=

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

.Or.
.Not. ou !

OU
NO

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

13

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

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

Atribuio Simples

:=

Atribuio em Linha

+=

Adio e Atribuio em Linha

-=

Subtrao e Atribuio em Linha

*=

Multiplicao e Atribuio em Linha

/=

Diviso e Atribuio em Linha

**= ou ^= Exponenciao e Atribuio em Linha


%=
Mdulo (resto da diviso) e Atribuio em Linha
++
Incremento Ps ou Pr-fixado
-Decremento Ps ou Pr-fixado

Especiais
Alm dos operadores comuns, o AdvPl possui alguns operadores especiais. Estas
so suas finalidades:
()

[]
{}
->

&
@

||

Utilizados para agrupar elementos em uma expresso priorizando essas condies, ao qual
damos o nome de ordem de precedncia da avaliao da expresso (da mesma forma
que as regras matemticas). Tambm servem para envolver os argumentos de uma funo
Elemento de Matriz. Utilizados para especificar um elemento especfico de uma matriz. Por
exemplo, aArray[1,5], refere-se ao elemento da matriz aArray na linha 1, coluna 5.
Definio de Matriz, Constante ou Bloco de Cdigo. Por exemplo:
aArray := {1,2,3,4,5} cria uma matriz chamada aArray com cinco elementos.
Identificador de Apelido (Alias). identifica um campo de um arquivo diferenciando-o de uma
varivel. Exemplo:
SA1->A1_NOME, o campo A1_NOME da tabela SA1, mesmo que haja uma varivel com o
nome A1_NOME, a partir desse Alias o campo da tabela que ser acessado.
Identifica uma avaliao de expresso atravs macrossubstituio.
Passagem de parmetro por referncia. Utilizado para indicar que durante a passagem de
uma varivel para uma funo ou procedimento ela seja tomada como uma referncia e no
como valor.
Passagem de parmetro por valor. Utilizado para indicar que durante a passagem de uma
varivel para uma funo ou procedimento ela seja tomada como um e valor no como
referncia.

Procedncias
A ordem de precedncia, ou nvel de prioridade de execuo, dos operadores a
seguinte:
1.
2.
3.
4.
5.
6.
7.

Incremento/Decremento pr-fixado
String
Matemticos
Relacionais
Lgicos
Atribuio
Incremento/Decremento ps-fixado

Caso as expresses complexas sejam de mesmo nvel a avaliao ser feita da


esquerda para direita, exceto as matemticas que obedecem o seguinte:
1. Exponenciao
2. Multiplicao e Diviso
3. Adio e Subtrao
ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

14

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Exemplo:
Local nVar := 15+12/3+7*3-2^3
Calcula-se a exponenciao: 2^3 =8
Calcula-se diviso: 12/3 =4
Calcula-se a multiplicao: 7*3 =21
Efetua a soma e subtrao: 15 + 4 + 21 - 8
O resultado desta expresso 32
Para alterarmos a precedncia utilizamos os parnteses, o grupo mais a esquerda
ser avaliado primeiro e assim por diante, como tambm o mais interno para o
mais externo, caso haja parnteses dentro de parnteses.
Local nVar := := (15+12)/(3+7)*3-2^3
Calcula-se a exponenciao: 2^3 =8
Calcula-se o primeiro grupo de parnteses: 15+12 = 27
Calcula-se o segundo grupo: 3+7=10
Calcula-se a diviso: 27/10 = 2.7
Calcula-se a multiplicao: 2.7 * 3 = 8.1
Efetua a soma e subtrao: 8.1-8
O resultado desta expresso 0.1

Macro Substituio
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado
para a avaliao de expresses em tempo de execuo, ou seja, o resultado ser
sobre o contedo do resultado da varivel.
cConteudo := MACRO
cVar := cConteudo
cVar1 := &cVar
cVar1 ser igual a MACRO
o mesmo que:
cVar1 := cConteudo
cVar := MACRO
O varivel cVar substituda pelo seu contedo (cConteudo) e essa varivel que
ser resolvida pelo AdvPL.
Outro Exemplo:
nVar := 20
cVar := nVar + 35
nResult := &cVar
nResult := nVar + 35
nResult := 20 + 35
nResult := 55
lVar := .T.
cVar := lVar .or. .F.
lResult := &cVar
lResult := lVar .or. ..F.
lResult := .T. .or. .F.
lResult := .T.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

15

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Exerccios
1. De acordo com a instruo fazendo um teste de mesa, informe ao final qual o
tipo e contedo de cada varivel criada.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

User Function fProcVar()


Local cVal, nTotGer, lVarl, cTem, lCont, lTudo
Local cNom :=
Local nVal := 5
Private nVal1:= 7 + 6, lVal, lQuas, nValor
Public lVar := nVal == 5
nVal1 += 15
nValor := (((nVal1- nVal)/2) * 3^2 + 1 )* -1
nTempo := nValor * 3
nTotGer:= &nTempo
nTotGer++
cTem := So Paulo
cTem += , 15 de Dezembro
lCont := Dez $ cTem
lTudo := cTem = So
lQuas := cTem == So Paulo
lVal := nVal > 5
lValc := (nVal1 8) <= 13
fMudaFun(@nValor, lTudo, lQuas, lVal)
msginfo(nValor)
Return
Static Function fMudaFun(_val, _lTudo, _lQuas, _lVal)
msginfo(nVal1)
Return
User Function fContinua()
Msginfo(lVar)
Return

2. De acordo com o exerccio anterior responda Verdadeiro ou Falso, nas


afirmaes a seguir e justifique:
a. (

) _lTudo na linha 25ser nula.

b. (

) nTempo do tipo caracter.

c. (

) lcont tem o contedo Verdadeiro.

d. (

) lVar no esta visvel na linha 29

e. (

) lTudo na linha 25 tem seu identificador Local

f. (

) cNom na linha 18 nula

g. (

) lVar no pode ser acessada na linha 25

h. (

) nValor pode ser acessada na linha 25

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

16

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 07 - Utilizao de Vetores


Um vetor uma lista com linhas e colunas. Comparando com uma tabela, as linhas
so os registros e as colunas so os campos, podemos ento dizer que uma
tabela virtual. Vetores podem ser chamados de Array ou matrizes.
Cada item do vetor referenciado pela sua posio na lista, iniciando pelo nmero
1, veja exemplo:
AArray

Col1

Col2

Col3

Lin1
Lin2
Lin3

A
D
G

B
E
H

C
F
I

A montagem deste array em AdvPL se d da seguinte forma:


Local aArray
//Declarao da varivel
aArray := {{"A", "B", "C"}, {"D", "E", "F"}, {"G", "H", "I"}} //Atribuio da matriz
varivel
Para exibirmos seu contedo utilizamos a seguinte sintaxe:
MsgInfo(aArray[nLin][nCol])
Onde:
nLin -> Linha onde se encontra o contedo que se quer exibir
nCol -> Coluna onde se encontra o contedo que se quer exibir
MsgInfo(aArray[2][3]) //Exibe o Contedo da 2. Linha e 3a. Coluna, (F)
MsgInfo(aArray[1][1]) //Exibe o Contedo da 1. Linha e 1a. Coluna, (A)
MsgInfo(aArray[3][2]) //Exibe o Contedo da 3. Linha e 2a. Coluna, (H)
Para atribuirmos outro contedo utilizamos a seguinte sintaxe:
aArray[nLin][nCol] := cVar
Onde:
nLin -> Linha onde se encontra o contedo que se quer alterar
nCol -> Coluna onde se encontra o contedo que se quer alterar
cVar -> Novo Contedo
aArray[2][3] := X // Altera o Contedo da 2. Linha e 3a. Coluna de F para X
aArray[1][1] := Y // Altera o Contedo da 1. Linha e 1a. Coluna de A para Y
aArray[3][2] := Z // Altera o Contedo da 3. Linha e 2a. Coluna de H para Z
Aps essa alterao a nossa lista virtual ficar assim:
AArray

Col1

Col2

Col3

Lin1
Lin2
Lin3

Y
D
G

B
E
Z

C
X
I

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

17

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Cuidados com Vetores


Vetores so listas de elementos virtuais, utilizamos ento a memria necessria
para
armazenar
estas
informaes.
Como
as
matrizes
podem
ser
multidimensionais, a memria necessria ser a multiplicao do nmero de itens
em cada dimenso da matriz, portanto precisamos us-las com certo
conscientemente.
Quando seu contedo por algum motivo comear a ficar muito complexo,
recomendvel utilizarmos outros recursos, com criao de tabelas temporrias.
No h limitao para o nmero de dimenses que uma matriz pode ter, mas o
nmero de elementos mximo (independentes das dimenses onde se encontram)
de 100000.

Matrizes como Estruturas


Uma caracterstica interessante do AdvPl que uma matriz pode conter qualquer
coisa: nmeros, datas, lgicos, caracteres, objetos, etc. E ao mesmo tempo. Em
outras palavras, os elementos de uma matriz no precisam ser necessariamente do
mesmo tipo de dado.
Exerccios
1. Criar um vetor de 5 linhas com 3 Colunas e dar o nome de aArray1.
2. Criar um vetor de 10 linhas com 1 Coluna e dar o nome de aArray2.
3. Atribuir ao Vetor a Array1 linha 1 coluna 1 o contedo X
4. Atribuir ao Vetor a Array1 linha 3 coluna 2 o contedo 9
5. Atribuir ao Vetor a Array1 linha 5 coluna 3 o contedo .T.
6. Atribuir ao Vetor a Array1 linha 1 coluna 3 o contedo do aArray2 Linha 5 coluna 1.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

18

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 08 Controle de Fluxo


Podemos mudar a seqncia de fluxo de execuo de um programa baseado em
condies lgicas e a repetio da execuo de pedaos de cdigo quantas vezes
forem necessrias para tal utilizamos estruturas de controle com um identificador
de incio e um de fim, e o que deve ser executado deve estar entre estes
identificadores. Essas estruturas em AdvPl esto divididas em :
Estruturas de Repetio: Execuo de uma seo de cdigo mais de uma vez.
Ex. For / While
Estruturas de Deciso: Execuo de uma seo de cdigo de acordo com uma
condio lgica. Ex. If / Case.

Comandos de Repetio
Em AdvPl existem dois comandos para a repetio de sees de cdigo. O comando
FOR...NEXT e o comando WHILE...ENDDO.
FOR...NEXT
A estrutura de controle FOR...NEXT repete uma seo de cdigo em um nmero
determinado de vezes.
Sintaxe
FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos...
[EXIT]
[LOOP]
NEXT
Parmetros
Varivel
nValorInicial TO
nValorFinal
STEP nIncremento

Comandos
EXIT
LOOP

Varivel utilizada como contador. Se a varivel no existir, ser criada


como uma varivel privada.
nValorInicial o valor inicial para o contador; nValorFinal o valor final
para o contador. Pode-se utilizar valores numricos literais, variveis ou
expresses, contanto que o resultado seja do tipo de dado numrico.
nIncremento a quandidade que ser incrementada ou decrementada no
contador aps cada execuo da seo de comandos. Se o valor de
nIncremento for negativo, o contador ser decrementado. Se a clusula
STEP for omitida, o contador ser incrementado em 1. Pode-se utilizar
valores numricos literais, variveis ou expresses, contanto que o
resultado seja do tipo de dado numrico.
Especifica uma ou mais instrues de comando AdvPl que sero
executadas.
Finaliza a repetio da seo de comandos imediatamente.
Retorna ao Inicio do FOR sem executar o restante dos comandos,
incrementando ou decrementando normalmente.

Este exemplo separa os nmeros pares e impares em variveis para imprimir ou


mostrar em tela.
For nBI:=1 to 12
If mod(nBI,2)== 0
cBIPares += Alltrim(str(nBI)) +
Else
cBIImpares += Alltrim(str(nBI)) +
Endif
Next
WHILE...ENDDO

A estrutura de controle WHILE...ENDDO, repete uma seo de cdigo enquanto


ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

19

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
uma determinada condio resultar em verdadeiro (.T.)
Sintaxe:
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
LExpressao

Comandos
EXIT

LOOP

Especifica uma expresso lgica cujo valor determina quando os comandos


entre o WHILE e o ENDDO so executados. Enquanto o resultado de
lExpressao for avaliado como verdadeiro (.T.), o conjunto de comandos so
executados.
Especifica um ou mais instrues de comando AdvPl que sero executadas
enquanto lExpressao for avaliado como verdadeiro (.T.).
Transfere o controle de dentro do comando WHILE...ENDDO para o
comando imediatamente seguinte ao ENDDO, ou seja, finaliza a repetio
da seo de comandos imediatamente. Pode-se colocar o comando EXIT
em qualquer lugar entre o WHILE e o ENDO.
Retorna o controle diretamente para a clusula WHILE sem executar o
restante dos comandos entre o LOOP e o ENDDO. A expresso em
lExpressao reavaliada para a deciso se os comandos continuaro sendo
executados.

Este exemplo separa os nmeros pares e impares em variveis para imprimir ou


mostrar em tela.
Local nSomaPar := 0, nNumber := 350
nNumber := Int(nNumber / 2)
While nNumber > 0
nSomaPar++
nNumber:= nNumber - 2
Enddo
Alert( "A quantidade de pares : " + str(nSomaPar) )
Return

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

20

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Comandos de Deciso
Em AdvPl existem dois comandos de deciso. O comando IF...ENDIF e o comando
CASE...ENDCASE.
IF...ENDIF
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
Sintaxe
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Parmetros
LExpressao

Comandos

Especifica uma expresso lgica que avaliada. Se lExpressao resultar em


verdadeiro (.T.), qualquer comando seguinte ao IF e antecedente ao ELSE
ou ENDIF (o que ocorrer primeiro) ser executado.
Se lExpressao resultar em falso (.F.) e a clusula ELSE for definida,
qualquer comando aps essa clusula e anterior ao ENDIF ser executada.
Se a clusula ELSE no for definida, todos os comandos entre o IF e o
ENDIF so ignorados. Neste caso, a execuo do programa continua com o
primeiro comando seguinte ao ENDIF.
Conjunto de comandos AdvPl que sero executados dependendo da
avaliao da expresso lgica em lExpressao.

Exemplo
Local dVencto := CTOD("31/12/2010")
If Date() > dVencto
Alert("Titulo vencido!")
Else
Alert("Titulo a vencer!")
Endif
Return
DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta
em verdadeiro (.T.).
Sintaxe
DO CASE
CASE lExpressao1
Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

21

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Parmetros
CASE
Comandos...

lExpressao1 Quando a primeira expresso CASE resultante em verdadeiro (.T.) for


encontrada, o conjunto de comandos seguinte executado. A execuo do
conjunto de comandos continua at que a prxima clusula CASE,
OTHERWISE ou ENDCASE seja encontrada. Ao terminar de executar esse
conjunto de comandos, a execuo continua com o primeiro comando
seguinte ao ENDCASE.
Se uma expresso CASE resultar em falso (.F.), o conjunto de comandos
seguinte a esta at a prxima clusula ignorado.
Aps a execuo, qualquer outra expresso CASE posterior ignorada
(mesmo que sua avaliao resultasse em verdadeiro).
OTHERWISE Comandos
Se todas as expresses CASE forem avaliadas como falso (.F.), a clusula
OTHERWISE determina se um conjunto adicional de comandos deve ser
executado. Se essa clusula for incluida, os comandos seguintes sero
executados e ento o programa continuar com o primeiro comando
seguinte ao ENDCASE. Se a clusula OTHERWISE for omitida, a execuo
continuar normalmente aps a clusula ENDCASE.

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

Problemas Comuns
- Looping, uma repetio infinita, ou seja, por um erro na lgica do programa,o
mesmo no finaliza, com isso o processo pode utilizar todo o recurso do servidor e
diminuir a performance ou at mesmo trav-lo, tornando necessrio o reinicio do
sistema.
Exemplo 1:
dbSeek(xFilial(SE1)+DTOS(dDtIni))
Do While SE1->(!Eof())
@ lin, col SAY teste
Enddo
Nesse exemplo est faltando o comando para passar para o prximo registro
dbkip(), ou seja, ele nunca ser final de arquivo conforme a condio para
sair do While.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

22

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo 2:
aCampos := {}
Do while .T.
Aadd(aCampos, Teste)
Enddo
Nesse exemplo o sistema ficar rodando at alcanar o limite da varivel
tipo Array, at que isso acontea o programa estar utilizando a memria do
servidor e com isso diminuindo o desempenho de toda a empresa.
Exemplo 3:
dbSeek(xFilial(SE1)+DTOS(dDtIni))
Do While SE1->(!Eof())
Reclock(SE5, .T.)
Enddo
Nesse exemplo o sistema ficar rodando at acabar o espao em disco no
servidor, diminuindo o desempenho de toda a empresa e impedindo o uso
por todos os usurios, at que o arquivo seja ajustado, apagando os
registros incorretos.
Exerccios
1. Fazer Algoritmo que leia um vetor de 3 linhas e 5 colunas e imprima o seu
contedo na tela, utilizando o que foi visto em vetores e estruturas de repetio.
2. Com base no Array informado mostrar na tela a media de cada aluno:
Local aArray := { { Maria, 10, 7, 15, 31} ,;
{ Jose , 15, 16, 21, 33} , ;
{ Petruncio, 8, 8, 8, 6} , ;
{ Firmino, 15, 16, 21, 33} , ;
{ Felizberto, 10, 17, 31, 25} }
3. Com base nesse mesmo array imprimir o nome informando mostrar na tela a
media de cada aluno, conforme regra a seguir:
Nome do aluno seguida da palavra
14 Aprovado se a media for maior que 25
15 Exame se a media for entre 10 e 25
16 Reprovado se a media for menor que 10
4. Matheus um homem de negcios e sempre viaja ao exterior e precisa controlar
tudo que traz de l. Sempre que ele traz mercadorias que ultrapassam R$
10.000,00, deve ser pago o imposto de 15%. Faa um algoritmo que leia o valor
da mercadoria e grave na varivel M o valor da mercadoria e se ultrapassar o
valor, calcular o valor do imposto na varivel I, caso no ultrapasse grave 0.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

23

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

5. Calcule o Salrio de um funcionrio recebendo em uma varivel o valor hora e


em outra a quantidade de horas. Caso a qtde de horas ultrapasse a meta (180)
acrescentar 2,00 por hora trabalhada e em seguida mostre na tela o salrio a
receber.
6. Desenvolva um fluxograma que:
Leia 4 (quatro) nmeros;
Calcule o quadrado de cada um;
Se o valor resultante do quadrado do terceiro for >= 1000, imprima-o e
finalize;
Caso contrrio, imprima os valores lidos e seus respectivos quadrados.
7. Elabore um algoritmo que dada a idade de um nadador classifique-o em uma das
seguintes categorias:
8. Infantil A = 5 a 7 anos
Infantil B = 8 a 11 anos
Juvenil A = 12 a 13 anos
Juvenil B = 14 a 17 anos
Adultos = Maiores de 18 anos

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

24

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 09 Development Studio


o ambiente de desenvolvimento integrado do Advanced Protheus. atravs dele
que feito o acesso ao repositrio, incluindo e excluindo funes. O IDE utilizado
tanto pelos clientes quanto pelos programadores da Microsiga, com ele podemos
compilar e depurar os programas. O IDE possui todos os recursos disponveis nas
melhores ferramentas de desenvolvimento do mercado.
Podemos utilizar o IDE sem conexo ao Server, a conexo somente feita durante
atualizao ou consulta de um repositrio ou durante o processo de depurao.
Os passos para o desenvolvimento de programas em AdvPl utilizando o IDE so:
Configurao de Ambiente Podemos configurar o ambiente que ser
atualizado na compilao e depurao de programas;
Criao do Projeto Criamos projetos como forma de organizar os programas
criados de modo que qualquer outro analista possa entender o roteiro das
customizaes;
Criao do programa Atravs de edio podemos criar programas;
Compilao Compilamos os programas ou todo o projeto para enviarmos ao
repositrio o que foi mudado e para que o Protheus saiba o que queremos que
faa;
Depurao Execuo passo a passo das rotinas, permitindo que o analista veja
o andamento do programa e o contedo das variveis, bem como as tabelas
abertas;

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

25

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Configurao de Ambiente
Antes de comearmos, precisamos primeiro configurar o ambiente em que
queremos trabalhar, isso feito da seguinte forma:
Entramos no IDE e escolhemos a opo Arquivo e em seguida Configuraes.
Surgir a seguinte tela, escolha adicionar:

Descrio: Nome
sugestivo para o
ambiente, geralmente
colocamos o mesmo
nome do ambiente no
Server
Ambiente: Nome do
ambiente no server.
Conexo: nome da
conexo utilizada,
geralmente TCP.
Parmetros:
Parmetros utilizados (m, -q, -a, - e) entre
outros.
Diretrios de
Includes: Caminho
onde se encontram os
includes, (*.ch),
separados por ponto e
virgula (;)

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

26

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Criao de Projetos
Aps a configurao precisamos criar o projeto que conter toda a organizao dos
programas envolvidos naquele projeto.

Assim que criamos um novo projeto podemos inserir programas nele, na estrutura
em que acharmos importante.

Para
inserirmos
arquivos
no
projeto,
posicionamos o mouse na pasta em que
queremos inserir e pressionamos o boto direito
do mouse e escolhemos adicionar arquivos, e
escolhemos os fontes.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

27

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Utilizando assistentes de Programas


Editamos o programa no IDE, incluindo novos ou alterando um j existente.
Podemos comear um programa do zero, mas tambm podemos usar o assistente
de cdigo. Clique em ferramentas e Assistente de cdigo, surgira a seguinte tela,
altamente intuitiva:

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

28

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Agora que j temos o ambiente, projeto e os programas precisamos envi-lo para o


Protheus, para isso precisamos compilar o programa, e assim o programa ser
inserido no repositrio e pode ser interpretado pelo Protheus.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

29

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Compilao
Agora que j temos o ambiente, projeto e os programas precisaram envi-lo para o
protheus, para isso precisamos compilar o programa, e assim o programa ser
inserido no repositrio e pode ser interpretado pelo Protheus.
Na hora de compilar, podemos escolher:
Compilar tudo - todo o projeto, somente os que houve mudana desde a ultima
compilao;
Recompilar tudo todo o projeto, sem exceo.
Somente um determinado projeto
Somente os programas dentro de uma pasta.
Apenas um programa.
Para compilarmos basta clicar com o boto direito do mouse no projeto, surgir a
tela:

Depurao
O IDE, como tantos outros ambientes de desenvolvimento do mercado tm a opo
de depurar os fontes para encontrar um possvel erro de lgica, ou identificar a
visibilidade de determinadas variveis, campos de tabelas. Chamamos tambm de
debugar, passar linha a linha, passo a passo, todo o programa, podemos marcar
pontos de parada no programa para sabermos o andamento do mesmo. Para isso
pressionamos o boto verde

O Protheus ser iniciado e no momento em que o programa selecionado estiver no


ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

30

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
local que foi marcado para parar, o processo parado e so mostradas as variveis
e campos podero ser visualizados.

Nessa tela, o programa pararia na linha 160, quando chegasse no programa


novo3.prw.
Podemos visualizar o contedo das variveis e campos nesse exato momento de
algumas formas:
Watchs Adicionamos as variveis ou campos que queremos visualizar, e em
momento de execuo aparecer o seu contedo, que so alteradas de acordo com
o processamento.

Podemos ver tambm diretamente os tipos de variveis, ou tabelas, escolhendo as


opes:
- Variveis Locais, Privadas, Publicas, estticas ou tabelas e campos.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

31

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 10 Customizao
Chamamos de customizao tudo aquilo que fazemos no Protheus que foge do
padro, quando o padro do Sistema no atende. Podemos customizar diversas
situaes:
Parmetros,
Tabelas,
Perguntas,
Frmulas - Expresses em AdvPL / User Function,
Lanamentos Padres via Expresses em AdvPL / User Function,
Validaes,
Gatilhos,
Campos de Arquivos,
User Function via menu,
Pontos de Entrada,
Dicionrio de Dados Ativo,
SigaRPM,
Crystal,
Integrao Office (Word , Excel)

Parmetros
Podemos criar parmetros especficos para utilizar durante o processamento no
sistema. Os parmetros podem ser criados pelo configurador.

importante estabelecermos um padro na criao de novos parmetros, para no


serem confundidos com parmetros padres, apesar do sistema gravar o campo
X6_PROPRI com U, pode ocorrer uma coincidncia na criao de parmetros com
nome igual a um parmetro criado numa verso seguinte. Uma sugesto colocar
as iniciais da empresa seguida de nmeros.
Existem funes que nos permite manipular os parmetros.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

32

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
GETMV - Retorna o contedo de um parmetro cadastrado no SX6.
Sintaxe: GETMV( cNomPar, [ lRetPar ], [ uRet ] )
Argumento
cNomPar

Obrig
Sim

Tipo
C

lRetPar

No

uRet

No

Descrio
Nome do parmetro a ser pesquisado
Define retorno do parmetro. Default .F.
.F. Retorna o contedo do parmetro. (retorno de acordo com
o tipo do parmetro). .T. - Retorna se o parmetro existe.
(retorno lgico)
Valor que deve ser retornado se o parmetro solicitado no
existir. O valor desse parmetro pode ser caracter, numrico,
lgico ou data.

Exemplo:
MV_AD_0001 Cdigos de usurios autorizados e enxergar determinada rotina.
cADEmail := GETMV( "MV_AD_0001" ) // Retorna o contedo do
armetro
GETMV( MV_AD_0001, .T. )
// Retorna .T. se o parmetro existir e
.F. se no existir. // Retorna o contedo do parmetro, caso no exista, retorna o
email@empresa.com.br
cADEmail:=GETMV(MV_AD_0001,, email@empresa.com.br )
PUTMV Grava informao no parmetro no SX6.
Sintaxe: PUTMV( cNomPar, cConteudo )
Argumento
cNomPar

Obrig
Sim

Tipo
C

cConteudo

Sim

Descrio
Nome do parmetro a ser pesquisado
Contedo a ser gravado no parmetro, deve ter o tipo esperado
no parmetro.

Exemplo:
MV_AD_0001 Cdigos de usurios autorizados e enxergar determinada rotina.
PUTMV( "MV_AD_0001" , email1@advpl.com.br )
PUTMVFIL Grava informao no parmetro no SX6 de acordo com a filial.
Sintaxe: PUTMVFIL( cNomPar, cConteudo,cFil )
Argumento
cNomPar

Obrig
Sim

Tipo
C

cConteudo

Sim

cFil

No

Descrio
Nome do parmetro a ser pesquisado
Contedo a ser gravado no parmetro, deve ter o tipo esperado
no parmetro.
Filial do parmetro.

Exemplo:
MV_AD_0001 Cdigos de usurios autorizados e enxergar determinada rotina.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

33

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
PUTMVFIL( "MV_AD_0001" , email1@advpl.com.br ,01 )
SUPERGETMV - Retorna o contedo de um parmetro cadastrado no SX6.
Sintaxe: SUPERGETMV( cNomPar, [lHelp], [ uRet ] , [cFil])
Argumento
cNomPar

Obrig
Sim

Tipo
C

lHelp

No

uRet

No

cFil

No

Descrio
Nome do parmetro a ser pesquisado
Define retorno do parmetro. Default .F.
.F. Retorna o contedo do parmetro. (retorno de acordo com
o tipo do parmetro). .T. - Retorna se o parmetro existe.
(retorno lgico)
Valor que deve ser retornado se o parmetro solicitado no
existir. O valor desse parmetro pode ser caracter, numrico,
lgico ou data.
Retorna parmetro de acordo com a Filial, Default Filial atual. Se
houver parmetro para a filial, ela ser priorizada.

Exemplo: MV_AD_0001 Cdigos de usurios autorizados e enxergar determinada


rotina.
cADEmail := SUPERGETMV( "MV_AD_0001" )
// Retorna o contedo do
parametro SUPERGETMV ( "MV_AD_0001", .T. ) // Retorna .T. se o parmetro
existir e .F. se no existir. // Retorna o contedo do parmetro da filial 01, caso
no exista, retorna o "email@empresa.com.br"
cADEmail:=SUPERGETMV (" MV_AD_0001", , email@empresa.com.br, 01 )

Tabelas
Podemos criar tabelas especficas para utilizar durante o processamento, fazer
pesquisas e amarraes no sistema. As tabelas podem ser criadas pelo
configurador.

A criao de tabelas deve ser feita quando temos alguma informao padronizada
que contenha cdigo e descrio, a microsiga reserva as tabelas iniciadas em Z
para uso de clientes.
Existem funes que nos permite manipular as tabelas.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

34

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
TABELA - Retorna o contedo de uma tabela cadastrada no SX5.
Sintaxe: TABELA( cCodTab, cChave, [lHelp] )
Argumento
cCodTab
cChave

Obrig
Sim
Sim

Tipo
C
C

lHelp

No

Descrio
Codigo da Tabela a pesquisar
Chave para pesquisa da tabela
Define se mostra o help. Default .T.
.T. Mostra o help. .F. No mostra o help

Exemplo: Tabela Z1 Tipos de Mveis


cADDescr := TABELA( "00,07, .F. ) // Retorna a descrio da tabela 00
chave 07 que na figura ser TIPOS DE TITULOS
X5DESCRI - Retorna a descrio no idioma atual da tabela posicionada no SX5.
Sintaxe: X5DESCRI( )

Perguntas
Utilizado para criao de perguntas nos relatrios especficos, utilizando-se de
recursos padres do sistema, aproveitando funes prontas, com telas padres.
PERGUNTE Carrega e Monta a tela de perguntas cadastradas no SX1.
Sintaxe: PERGUNTE( cGrupo, lMostra )
Argumento
cGrupo

Obrig
Sim

T Tipo
C

lMostra

Sim

Descrio
Grupo de perguntas
.T. Carrega e mostra tela com perguntas, .F. apenas carrega
respostas das perguntas

Expresses ADVPL
Podemos colocar qualquer expresso em ADVPL ou uma User Function em vrios
lugares no Protheus, dentre eles:

Frmulas (SM4)
Lanamentos padres (CT5)
Validaes (SX3 X3_VLDUSER)
Inicializador Padro (SX3- X3_RELACAO)

Para executar essas instrues utilizado o recurso de macrosubstituio.


Exemplo: Utilizando Cadastro de Formulas (M4_FORMULA)
U_FCRIAMENS() // Utilizando uma User Function
IF(SM4->M4_CODIGO < A01, NO ENVIAR, ENVIAR) //Utilizando uma
expresso NO RECEBER APS AS 18 HRS // Utilizando uma expresso sem
condio.
Para executar essa expresso utilizado & M4_FORMULA.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

35

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Pontos de Entrada
So aberturas nas rotinas padres do sistema que deixa o sistema flexvel
permitindo o desenvolvimento de processos especficos a partir de uma rotina
padro do sistema, de acordo com a necessidade do cliente e dos analistas de
campo, permitindo maior abrangncia nos diversos segmentos.
EXISTBLOCK() - verifica a existncia de uma funo de usurio compilada no
repositrio de objetos da aplicao Protheus. Esta funo normalmente utilizada
nas rotinas padres da apliao Protheus para determinar a existncia de um ponto
de entrada e permitir sua posterior execuo.
Sintaxe: EXISTBLOCK(cFun)
Argumento

Obrigat.

Tipo

Descrio

cFun
uparam

Sim
No

B
U

cFuno Nome da funo que ser avaliada


Paarametros a enviar para a funo

Retorno:- Lgico
.T. Existe a Funo no repositrio e .F. No existe a funo no repositrio
EXECBLOCK() - Executa uma funo de usurio que esteja compilada no
repositrio. Esta funo normalmente utilizada pelas rotinas padres da aplicao
Protheus para executar pontos de entrada durante seu processamento.
A funo de usurio executada atravs da EXECBLOCK() no recebe parmetros
diretamente, sendo que estes estaro disponveis em uma varivel private
denominada PARAMIXB.
A varivel PARAMIXB o reflexo do parmetro xParam, definido na execuo da
funo EXECBLOCK(). Caso seja necessria a passagem de vrias informaes, as
mesmas devero ser definidas na forma de um array, tornando PARAMIXB um
array tambm, a ser tratado na funo de usurio que ser executada.

Sintaxe: MSExecAuto(cblock, , , uparam)


Argumento

Obrigat.

Tipo

Descrio

cblock
uparam

Sim

Nome da Funo Padro

Exemplo
#include "protheus.ch"
User Function VerFun()
IF EXISTBLOCK(MT100GRV)
EXECBLOCK(MT100GRV,.F.,.F.,aParam)
ENDIF
Return .t.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

36

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Dicionrio de Dados Ativos


O Protheus tem um dicionrio ativo, que permite alteraes de informaes que
no necessitam que o sistema seja compilado para que entre em produo,
bastando apenas alterar a partir do dicionrio, que so tabelas com campos e
registros que so lidos em tempo de execuo e que utiliza o recurso de
macrosubstituio.

Gatilhos
Rotina que define os campos que devem preencher outros campos no momento em
que o campo for preenchido.
Exemplo: Ao digitar o cdigo do fornecedor dever preencher automaticamente o
campo com o nome do fornecedor:

Campo: Nome do campo que dispara o gatilho


Seqncia: Seqncia de execuo do gatilho
Cnt Domnio: Campo que receber o preenchimento automtico
Regra: Contedo que contra domnio recebera
Posiciona: Determina se devera fazer um posicionamento antes de executar a
regra
Alias: se Posiciona for igual a sim , ento dever ser informado qual o alias a
Posicionar
Ordem: Determina a ordem de pesquisa do Alias informado
Chave: chave a ser pesquisada no alias informado.
Condio: Se necessrio, colocar a condio para execuo do gatilho.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

37

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 11 Conceitos de Filiais


O Protheus permite a criao de empresas e filiais, permitindo tratamento de
compartilhamento de informaes entre as filiais em determinados cadastros.
O sistema permite controlar at 99 Empresas. Cada Empresa pode ter at 99
Filiais:
Exemplo:
Empresa 01 Filial 01..99
..
Empresa 99 Filial 01..99
Para cada empresa existe um jogo de Arquivos de dicionrios e de tabelas tambm.
Sxxnn0 -> xx Prefixo do arquivo e nn Cdigo da empresa
Exemplo:
Dicionrio-> SX1010, SX2010, SX3010, etc
Tabelas -> SA1010, SA2010, SB1010, DA1010, etc
As filiais ficam dentro do arquivo, todo arquivo deve ter um campo filial.
xx_FILIAL -> xx Prefixo do arquivo, quando a tabela comea com S
xxx_FILIAL -> xxx Prefixo do Arquivo, quando a tabela no comea com S
Exemplo: A1_FILIAL, A2_FILIAL, B1_FILIAL, DA1_FILIAL.

Arquivos Compartilhados
Quando o arquivo est definido como compartilhado, no campo filial ser gravado
espao em branco, essa definio e feita no dicionrio de tabelas SX2 no campo
X2_MODO = C. Assim todas as filiais enxergaro todos os registros.
Exemplo:
A1_FILIAL

A1_COD
000001
000002
000003
000004

A1_NOME
CLIENTE A
CLIENTE B
CLIENTE C
CLIENTE D

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

38

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Arquivos Exclusivos
Quando o arquivo est definido como exclusivo, no campo filial ser gravada a
filial, essa definio e feita no dicionario de tabelas SX2 no campo X2_MODO = E,
Assim somente a filial enxergar o registro.
Exemplo:
A1_FILIAL
01
01
02
01

A1_COD
000001
000002
000003
000004

A1_NOME
CLIENTE A
CLIENTE B
CLIENTE C
CLIENTE D

XFILIAL Retorna a filial de um Alias especfico.


Sintaxe: XFILIAL( cAlias )
Argumento

Obrig

TTipo

Descrio

cAlias

Sim

Alias do arquivo que deseja retornar a filial

Exemplo:
xFilial(SA1)
Jamais use um campo filial de uma tabela para executar um dbSeek() em outra
tabela. Pois uma tabela poder ser compartilhada (campo filial em branco),
enquanto que a outra poder ser compartilhada (campo filial preenchido).
A varivel cFilAnt contm a filial que o usurio est no momento , e a varivel
cEmpant contm a empresa e a filial.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

39

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 12 Programando
Agora podemos
adquirido.

criar novos

programas

para exercitarmos

o conhecimento

Criando um Programa Simples


Utilizando o IDE, vamos criar um relatrio de produtos:
#INCLUDE "protheus.ch"
/*
=============================================
Programa RELA01 Autor AP6 IDE
Data 23/03/07

=============================================
Descricao Codigo gerado pelo AP6 IDE

=============================================
Uso
AP6 IDE

=============================================
*/
User Function Rela01
//
// Declaracao de Variaveis
//
Local cDesc1
:= "Este programa tem como objetivo imprimir relatorio "
Local cDesc2
:= "de acordo com os parametros informados pelo usuario."
Local cDesc3
:= "Relatorio 1"
Local cPict
:= ""
Local titulo
:= "Relatorio 1"
Local nLin
:= 80
Local Cabec1
:= "Codigo
Descricao
Tipo"
Local Cabec2
:= ""
Local imprime
:= .T.
Local aOrd
:= {}
Private lEnd
:= .F.
Private lAbortPrint:= .F.
Private CbTxt
:= ""
Private limite
:= 80
Private tamanho := "P"
Private nomeprog := "Rela01" // Coloque aqui o nome do programa para impressao
no cabecalho
Private nTipo
:= 18
Private aReturn := { "Zebrado", 1, "Administracao", 2, 2, 1, "", 1}
Private nLastKey := 0
Private cbtxt
:= Space(10)
Private cbcont
:= 00
Private CONTFL := 01
Private m_pag
:= 01
Private wnrel
:= "Rela01" //Coloque aqui o nome do arquivo usado para
impressao em disco
Private cString := "SB1"
dbSelectArea("SB1")
dbSetOrder(1)
ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

40

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
//
// Monta a interface padrao com o usuario...

//
Wnrel:=SetPrint(cString,
NomeProg,"RELA01",@titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,.T.,Tamanho,,.F.)
If nLastKey == 27
Return
Endif
SetDefault(aReturn,cString)
If nLastKey == 27
Return
Endif
nTipo := If(aReturn[4]==1,15,18)
RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo)
Return
/*
===============================================
Fun"o RUNREPORT Autor AP6 IDE
Data 23/03/07
==============================================="
Descrio Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS

monta a janela com a regua de processamento.

==============================================="
Uso
Programa principal

==============================================="
*/
Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)
Local nOrdem
(cString)->(dbSetOrder(1))
// SETREGUA -> Indica quantos registros serao processados para a regua
SetRegua(RecCount())
SB1->(dbGoTop())
While SB1->(!EOF())
// Verifica o cancelamento pelo usuario...
If lAbortPrint
@nLin,00 PSAY "*** CANCELADO PELO OPERADOR ***"
Exit
Endif

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

41

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

// Impressao do cabecalho do relatorio. . .


If nLin > 55 // Salto de Pgina. Neste caso o formulario tem 55 linhas...
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
nLin := 8
Endif
@nLin,00 PSAY SB1->B1_COD
@nLin,17 PSAY SB1->B1_DESC
@nLin,49 PSAY SB1->B1_TIPO
nLin := nLin + 1 // Avanca a linha de impressao
dbSkip() // Avanca o ponteiro do registro no arquivo
EndDo
//Finaliza a execucao do relatorio...
SET DEVICE TO SCREEN
//Se impressao em disco, chama o gerenciador de impressao...
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
MS_FLUSH()
Return
Na criao de um relatrio algumas variveis e seus tipos so convencionados para
a utilizao da biblioteca de funes de relatrio.
Argumento

Ident

Tipo

Descrio

wnRel
cbCont
Cabec1
Cabec2
Cabec3

Local
Local
Local
Local
Local

C
N
C
C
C

Tamanho

Local

cDesc1
cDesc2
cDesc3
Limite
Titulo

Local
Local
Local
Local
Local

C
C
C
N
C

aReturn

Private

Nomeprog
cString

Private
Private

C
C

Li

Private

m_pag

Private

aOrd

Private

nLastKey

Private

cPerg

Private

aLinha

Private

Nome default do relatrio em disco


Contador
1 linha do cabealho do relatrio
2 linha do cabealho do relatrio
3 linha do cabealho do relatrio
Tamanho do Relatrio (P = 80 colunas, M = 132 colunas,
G = 220 colunas)
1 linha da descrio do relatrio
2 linha da descrio do relatrio
3 linha da descrio do relatrio
Quantidade de colunas no relatrio (80,132,220)
Ttulo do Relatrio
Matriz com as informaes para a tela de configurao de
impresso
Nome do programa do relatrio
Alias do arquivo principal do relatrio para o uso de filtro
Controle das linhas de impresso. Seu valor inicial a
qtde de linhas por pgina.
Controle do nmero de pginas do relatrio
Matriz contendo as ordens para a impresso. Ex.:
aOrd:={"Cdigo","Descrio"}
Utilizado para controlar o cancelamento da impresso do
relatrio
Nome da pergunta a ser exibida para o usurio
Matriz que contem informaes para impresso de
relatrios cadastrais

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

42

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
SETPRINT Funo de impresso padro do Protheus
Sintaxe: SetPrint( cAlias, cPrograma, [ cPerg ], [ cTitulo ], [ cDesc1 ], [ cDesc2 ], [
cDesc3 ], [ lDic ], [ aOrd ], [ lCompres ], [ cTam ], [ uPar1 ], lFiltro, [ lCrystal ], [
cNomeDrv ], [ uPar2 ], [ lServidor ], [ cPortaImpr ] ) -> caracter
Argumento

Ident

Tipo

Descrio

cAlias
cPrograma
cPerg
cTitulo
cDesc1
cDesc2
cDesc3
lDic
aOrd
lCompres
cTam
uPar1
lFiltro
lCrystal
cNomeDrv
uPar2
lServidor
cPortaImpr

Sim
Sim
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No
No

C
C
C
C
C
C
C
L
A
L
C
U
L
L
C
U
L
C

Alias do arquivo a ser impresso.


Nome do arquivo a ser gerado em disco
Grupo de perguntas cadastrado no dicionrio SX1.
Ttulo do relatrio
Descrio do relatrio.
Continuao da descrio do relatrio.
Continuao da descrio do relatrio.
Permite a escolha dos campos a serem impressos.
Ordem(s) de impresso.
Se verdadeiro (.T.) habilita escolha o formato da impresso.
Tamanho do relatrio "P","M" ou "G".
Parmetro reservado
Se verdadeiro (.T.) permite a utilizao do assistente de filtro.
Se verdadeiro (.T.) permite integrao com Crystal Report.
Nome de um driver de impresso.
Parmetro reservado.
Se verdadeiro (.T.) fora impresso no servidor.
Define uma porta de impresso padro.

Incluindo Item no Menu


Entre no configurador, selecione Ambiente Cadastros Menus, surgira a seguinte
tela:

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

43

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Escolha o mdulo que pretende alterar o menu e clique em ok

Clique em adicionar antes de fazer qualquer alterao para no sobrepor


indevidamente o menu de produo, em seguida posicione no local em que deseja
incluir o item no menu e selecione a opo novo Item

Descrio em Portugus: Descrio que voc quer que aparea no menu;


Programa: Nome da User Function de seu programa;
Mdulo: escolha o mdulo desejado;
Tipo: Escolha a opo adequada ao item no menu;
Rotina do Browse: Escolha os itens do browse que o usurio desse menu ter
acesso;
Tabelas: Selecione as tabelas que esse programa precisar abrir.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

44

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Aps ter preenchido todos os dados clique em OK e em seguida em gerar, surgira a
seguinte tela:

Coloque o nome do menu sem a extenso e clique em gerar, se o menu j existir


aparecer a seguinte tela:

Clique em sim e em seguida clique em fechar.


Entre no mdulo em que criou o item no menu e rode o programa para ver se tudo
esta ok.
Exerccios
1. Com base no exemplo de cadastro de produtos:
a. Faa um relatrio que agrupe por tipo e demonstre quantos produtos de cada
tipo existem.
b. Totalizar ao final do relatrio
c. Criar pergunta para o relatrio com o mesmo nome do programa: RELA01
Produto Inicial
Produto Final
d. Preparar o programa para entender tal filtro.
Veja a seguir como dever ficar o relatrio:

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

45

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

46

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 13 Funes Pr-Existentes


Por ser uma linguagem derivada do Clipper, podemos utilizar as diversas funes
nativas da linguagem:

Manipulao de Stings
VAL - Converte valor em texto.
Sintaxe : VAL( cValor )
Argumento

Obrigat.

Tipo

Descrio

cValor

Sim

Contedo que se quer converter.

Exemplo:
cCodigo := 000015
nNum := Val(cCodigo)+1
msginfo(nNum) // nNum ter o valor de 16
SUBSTR - Retorna um pedao de um texto.
Sintaxe: SUBSTR( cConteudo, nValIni, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nValIni
nCount

Sim
Sim
Sim

C
N
N

Contedo que se quer extrair uma parte


Posio Inicial para extrao
Qtde de caracteres a extrair a partir da Posio Inicial

Exemplo:
cCodigo
cPedaco1
cPedaco2
cPedaco3

:= Paralelepipedo
:= Substr(cCodigo,5,4) // cPedaco1 ter o contedo lele
:= Substr(cCodigo,1,6) // cPedaco2 ter o contedo parale
:= Substr(cCodigo,9,5) // cPedaco3 ter o contedo piped

LEFT Retorna o contedo de uma qtde de caracteres a esquerda


Sintaxe: LEFT( cConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nCount

Sim
Sim

C
N

Contedo que se quer extrair uma parte


Qtde de caracteres a extrair

Exemplo:
cCodigo
:= Paralelepipedo
cPedaco1 := Left(cCodigo,5) // cPedaco1 ter o contedo paral

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

47

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
RIGHT Retorna o contedo de uma qtde de caracteres a direita
Sintaxe: RIGHT( cConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nCount

Sim
Sim

C
N

Contedo que se quer extrair uma parte


Qtde de caracteres a extrair

Exemplo:
cCodigo := Paralelepipedo
cPedaco1 := Right(cCodigo,5) // cPedaco1 ter o contedo ipedo
PADC Centraliza um texto conforme a qtde de caracteres especificados.
Sintaxe: PADC( cConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nCount

Sim
Sim

C
N

Contedo que se quer centralizar


Qtde de caracteres a para centralizar

Exemplo:
cCodigo := Parede
cCodigo := Padc(cCodigo,14) // cCodigo ter o contedo

Parede

PADR preenche com espaos em branco a direita conforme a qtde de caracteres


especificados.
Sintaxe: PADR( cConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nCount

Sim
Sim

C
N

Contedo que se quer alinhar


Qtde de caracteres a alinhar

Exemplo:
cCodigo := Parede
cCodigo := Padr(cCodigo,14) // cCodigo ter o contedo

Parede

PADL preenche com espaos em branco a esquerda conforme a qtde de


caracteres especificados.
Sintaxe: PADL( cConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

cConteudo
nCount

Sim
Sim

C
N

Contedo que se quer alinhar


Qtde de caracteres a alinhar

Exemplo:
cCodigo := Parede
cCodigo := Padl(cCodigo,14) // cCodigo ter o contedo Parede

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

48

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
ALLTRIM Limpa espaos em branco iniciais e finais
Sintaxe: Alltrim( cConteudo )
Argumento

Obrigat.

Tipo

Descrio

cConteudo

Sim

Contedo que se quer limpar

Exemplo:
cCodigo := Parede
cCodigo := Alltrim(cCodigo) // cCodigo ter o contedo Parede
LTRIM Limpa espaos em branco a esquerda.
Sintaxe: Ltrim( cConteudo )
Argumento

Obrigat.

Tipo

Descrio

cConteudo

Sim

Contedo que se quer alinhar

Exemplo:
cCodigo := Parede
cCodigo := Ltrim(cCodigo) // cCodigo ter o contedo Parede

RTRIM Limpa espaos em branco a esquerda.


Sintaxe: Ltrim( cConteudo )
Argumento

Obrigat.

Tipo

Descrio

cConteudo

Sim

Contedo que se quer alinhar

Exemplo:
cCodigo := Parede
cCodigo := Rtrim(cCodigo) // cCodigo ter o contedo

Parede

Manipulao de Dados
DATE Retorna a data do sistema operacional
Sintaxe: DATE()
Exemplo:
dDataAtual := date() // dDataAtual

ter o contedo da data de hoje

DTOS Converte data em String


Sintaxe: DTOS( dData )
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data a converter

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

49

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo:
cData := dtos(date()) // cData ter o contedo 200612
DTOC Converte data em Caracter
Sintaxe: DTOC( dData )
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data a converter

Exemplo:
cData := dtoc(date()) // cData ter o contedo 31/12/2006
STOD Converte String em data
Sintaxe: STOD( cData )
Argumento

Obrigat.

Tipo

Descrio

cData

Sim

Data a converter

Exemplo:
cData := 20061231
cData := stod(date()) // cCodigo ter o contedo 31/12/06
STOC Converte String em data
Sintaxe: STOC( cData )
Argumento

Obrigat.

Tipo

Descrio

cData

Sim

Data a converter

Exemplo:
cData := 31/12/06
cData := stoc(date()) // cCodigo ter o contedo 31/12/06
MONTH Retorna o Mes
Sintaxe: Month( dData )
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data

Exemplo:
nMes := Month(date()) // nMes ter o contedo 12 para a data 31/12/06
DAY Retorna o dia
Sintaxe: Day( dData )
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

50

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo:
nDia := Day(date()) // nDia ter o contedo 31 para a data 31/12/06
YEAR Retorna o Mes
Sintaxe: Year( dData )
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data

Exemplo:
nAno := Year(date()) // nAno ter o contedo 2006 para a data 31/12/06
MESEXTENSO Retorna o Ms por extenso em portugus
Sintaxe:
Argumento

Obrigat.

Tipo

Descrio

dData

Sim

Data

Exemplo:
MesExtenso( dData )
cMes := MesExtenso(date()) // cMes ter o contedo Dezembro para a data
31/12/06

Manipulao de Nmeros
STR Converte numero em caracter
Sintaxe: Str( nConteudo )
Argumento

Obrigat.

Tipo

Descrio

nConteudo

Sim

Valor a converte

Exemplo:
nCodigo := 1
cCodigo := Str(nCodigo) // cCodigo ter o contedo

STRZERO Converte numero em caracter,preenchendo com Zeros a esquerda.


Sintaxe: Strzero( nConteudo, nCount )
Argumento

Obrigat.

Tipo

Descrio

nConteudo
nCount

Sim
Sim

N
N

Valor a converte
Qtde de caracteres

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

51

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo:
nCodigo := 1
cCodigo := Strzero(nCodigo, 6) // cCodigo ter o contedo 000001
nCodigo := 158
cCodigo := Strzero(nCodigo, 6) // cCodigo ter o contedo 000158
TRANSFORM Converte numero em caracter utilizando mscara.
Sintaxe: Transform( nConteudo, cMask )
Argumento

Obrigat.

Tipo

Descrio

nConteudo
CMask

Sim
Sim

N
N

Valor a converte
Formato do caracter

Exemplo:
nCodigo := 1500
cCodigo := Valor: + Transform(nCodigo, @E 99,999.99) // cCodigo ter o
contedo (Valor: 1.500,00)

Manipulao de Vetores
AADD - Adiciona um novo elemento ao final do array.
Sintaxe: AADD( aAlvo, expValor )
Argumento

Obrigat.

Tipo

Descrio

AAlvo
expValor

Sim
Sim

A
Todos

o array ao qual o novo elemento ser adicionado.


uma expresso vlida que ser o valor do novo elemento.

Exemplos
aArray := {}
AADD(aArray, 5)
AADD(aArray, 10)
AADD(aArray, { 12, 10 })

//
//
//
//

Resultado:
Resultado:
Resultado:
Resultado:

aArray vazio
{5}
{ 5, 10 }
{ 5, 10, { 12, 10 } }

ARRAY - Cria um array com dados no inicializados.


Sintaxe: ARRAY( nQtdElem1 , [ nQtdElemn ]...)
Argumento

Obrigat.

Tipo

Descrio

NQtdElem1

Sim

[nQtdElemN]

No

Quantidade de Elementos da 1 dimenso do array.


Quantidade de Elementos das demais dimenses do
array.

Exemplos
aArray := ARRAY(5) ou aArray := { NIL, NIL, NIL, NIL, NIL }
aArray := ARRAY(3, 2) ou aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} }

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

52

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
ASCAN - Busca em um array at que o bloco retorne verdadeiro .T.
Sintaxe: ASCAN( aOrigem, expSearch, [ nStart ], [ nCount ]) --> nStoppedAt
Argumento

Obrigat.

Tipo

Descrio

AOrigem

Sim

<expSearch>

Sim

Todos

o array onde ser executada a expresso.


a posio a partir da 1, do qual ser inserido um
elemento

Exemplo:
aArray := { "Tony", "Maria", "Sueli" }
nPos := ASCAN(aArray, "Maria") // Result: 2
nPos1 := ASCAN(aArray, "maria") // Result: 0
aArray5 := {}
AADD(aArray5,{"um","dois"})
AADD(aArray5,{"tres","quatro"})
AADD(aArray5,{"cinco","seis"})
nPos3 := ASCAN(aArray5, {|x| x[2] == "quatro"}) // Result: 2
ASORT - Ordena um array.
Sintaxe: ASORT( aOrigem, [ nInicio ], [ nQtde ], [ bOrdem ])
Argumento

Obrigat.

Tipo

Descrio

aOrigem

Sim

NInicio

No

NQtde

No

BOrder

No

Bloco de cdigo

o array que ser classificado.


Onde ser o inicio da ordenao. Caso
seja omitido, ser considerado o 1
elemento do array.
Quantidade de elementos que sero
ordenados a partir do nInicio. Caso seja
omitido, sero considerados todos
elementos at o final do Array.
um bloco de cdigo ( code block )
opcional que indicar a ordem correta
dos elementos. Caso ele no seja
informado, o array ser classificado em
ordem crescente desde que no seja
multidimensional.

Exemplo
aArray := { 3, 5, 1, 2, 4 }
ASORT(aArray)
// Resultado: { 1, 2, 3, 4, 5 }
aArray := { {"Maria", 14}, {"Joao", 23}, {"Arlete", 16} }
aArraycr := ASORT(aArray ,,, { |x, y| x[2]+x[1] < y[2] })
aArraydc := ASORT(aArray ,,, { |x, y| x[2] > y[2] })
aArraynom := ASORT(aArray ,,, { |x, y| x[1] < y[1] })

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

53

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 14 Tratamento de Base de Dados


O Tratamento de base de dados em ADVPL idntico ao Clipper, utiliza-se as
mesma funes nativas para isso. No Protheus temos algumas funes que
podemos utilizar para criao de arquivos e tambem criamos a partir do mdulo
configurador.

Criando Arquivos
CRIATRAB - Cria arquivo de trabalho, com nome temporrio.
Sintaxe: CriaTrab( [aCampos], lExclus )
Argumento

Obrigat.

Tipo

aCampos

No

lExclus

Sim

Descrio
o array com os campos da tabela a criar.
Quando nulo apenas retorna um nome
temporrio e no cria a tabela.
.T. cria tabela exclusiva
.F. cria tabela compartilhada

Exemplo:
Local aCampos := {{'T_COD' ,C,6, 0},;
{'T_NOME' ,C,30, 0},;
{'T_ENDERECO' ,C,30,0},;
{'T_DATA' ,D,8,0},;
{'T_NUMERO' ,N,17, 2}}
cArqTra := CriaTrab( aCampos, .T. ) //Cria o arquivo fisicamente em DBF no
RothPath
dbUseArea(.t.,,cArqTra,"TMP",.f.,.f.)
cArqTemp := CriaTrab( Nil, .F. ) //Somente gera um nome temporario

Criando Indices Temporrios


INDREGUA - Cria ndice temporrio.
Sintaxe: INDREGUA( cAlias, cArqNtx, cIndCond,[cTipo], [cFiltro], cMensagem,
[lMostra] )
Argumento

Obrigat.

Tipo

Descrio

CAlias
cArqNtx
cIndCond

Sim
Sim
Sim

C
C
C

CTipo

No

cFiltro
cMensagem

No
Sim

C
C

lMostra

No

Alias do arquivo que quer criar ndice


Nome fsico do ndice
Chave do ndice
Tipo de ndice C Crescente ou D
Decrescente, se no informado o
Default C crescente.
Filtro desejado
Mensagem a aparecer na tela
.T. Mostra Rgua de progresso
(default)
.F. No mostra a rgua

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

54

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo:
cArqTemp := CriaTrab( Nil, .F. ) //Somente gera um nome temporario
IndRegua( "SB1", cArqTemp, B1_FILIAL+B1_GRUPO, , B1_COD>
Selec.registros...", .T.)
//Deleta ndice criado no final do programa
DbSelectArea( SB1 ) //Selecionando a area
DbSetOrder( 1 ) //Posicionando na ordem de origem
fErase( cArqtemp + OrdBagExt() ) //Deletando arquivo de trabalho

D,

Posicionamento de Registros
O posicionamento correto de registros fundamental para a funcionalidade
completa dos programas, um grande causador de erros de lgica.
Algumas dicas para posicionamento de registros so :
sempre bom utilizar o Alias antes de comando de Base de Dados.
Exemplos:
SB1->(DBGOTOP()) Posiciona no primeiro registro do arquivo SB1 de acordo com
a ordem que esta selecionada no momento.
SB1->(DBGOBOTTOM()) Posiciona no ultimo registro do arquivo SB1 de acordo
com a ordem que esta selecionada no momento.
SB1->(DBSEEK(XFILIAL() + 000100)) - Busca em SB1 o registro que obedea a
chave estipulada de acordo com a ordem selecionada no momento.
Ao executar um DBSEEK(), verificar se localizou o registro, exemplo:
If ! SB1->(dbSeek(xFilial("SB1")))
// No achei o registro
Endif
Sempre verifique a existncia do registro, pois o programa deve prever que a base
de dados pode no estar consistente, e um alerta ajuda a identificar estes casos.
Em casos de relatrios, atentar-se para imprimir a mensagem de forma correta.
Se for executada a funo RECLOCK(cAlias, .F.), para alterao do registro atual,
em um arquivo no estado de EOF() (caso falhe um DBSEEK() ) ser abortado o
programa e gravado um arquivo texto de nome MSRLOCK.EOF que poder ser
usado para averiguaes.
Quanto ao comando DO WHILE no esquecer de incluir a condio referente
filial, quando esta leitura for de registros de uma filial).

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

55

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo :
dbSelectArea("SB1")
SB1->(dbSeek(xFilial("SB1")))
Do While SB1->(! Eof() .And. B1_FILIAL == xFilial("SB1"))
// Processamento
SB1->(dbSkip())
Enddo
Ao criar uma funo que ir desposicionar registros, use a funo GETAREA() e
RESTAREA(), para voltar tudo posio original. Exemplo:
Dbselectarea("SD1")
aAreasd1 := Getarea() // Armazena o ambiente do arquivo SD1
SD1->(dbsetorder(3))
SD1->(dbseek(xfilial("SD1") + DTOS("01/03/01"), .T.))
Do While ! Eof() .And. D1_FILIAL == xfilial("SD1") .And. DTOS(D1_EMISSAO) <=
DTOS(mv_par02)
// Processamento
Dbskip()
Enddo
Restarea(aAreasd1) // Restaura o ambiente do arquivo SD1
Funo Posicione
Podemos tambm buscar uma informao em determinado campo usando
apenas uma funo.
Sintaxe:
Posicione(cAlias, nOrdem, cChave, cCampo)
Exemplo:
Posicione("SB1", 1, xFilial("SB1") + cCodigo, "B1_DESC")
Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave da busca
xFilial("SB1") + cCodigo e ser retornado o contedo do campo "B1_DESC".
Note que esta funo, no restaura a posio original do arquivo alvo (no caso
SB1).
necessrio colocar a FILIAL do arquivo na chave passada como parmetro,
caso ela exista na chave do indice.
Funo Existcpo
Retorna se determinada chave existe ou no no arquivo.
Sintaxe :
ExistCpo(cAlias,cChave,nOrdem)
Exemplo :
ExistCpo("SB1", 1, cCodigo, "B1_DESC")
Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave cChave. E ser
retornado se a chave foi encontrada ou no (.T. ou ,F,). Neste caso no
necessrio passar a filial. Ela ser inserida automaticamente na chave de pesquisa
pela funo.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

56

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Funes de Base de Dados


DBAPPEND Inserir um registro em branco na tabela da rea corrente.
Sintaxe:DBAPPEND()
DBSELECTAREA Seleciona uma rea de Trabalho.
Sintaxe: DBSELECTAREA(cAlias)
Argumento

Obrigat.

Tipo

Descrio

CAlias

Sim

C ou N

Se numrico, seleciona rea pelo nmero, se


Caracter, seleciona a rea pelo Apelido.

DBSETORDER Seleciona um ndice pela ordem.


Sintaxe: DBSETORDER(nOrd)
Argumento

Obrigat.

Tipo

Descrio

NOrd

Sim

Nmero do ndice

DBGOTOP Posiciona o ponteiro no primeiro registro de acordo com a ordem


corrente.
Sintaxe: DBGOTOP()
DBGOBOTTOM Posiciona o ponteiro no ultimo registro de acordo com a ordem
corrente.
Sintaxe: DBGOBOTTOM()
DBSEEK Pesquisa na tabela corrente utilizando a chave da ordem corrente.
Sintaxe: DBSEEK(cChave, lEncontra)
Argumento

Obrigat.

Tipo

Descrio

CChave

Sim

lEncontra

No

Chave a ser procurada


.T. Posiciona no registro da chave, se no
encontrar posiciona no registro mais prximo
a chave.
.F. (Default) Posiciona no registro da chave,
se no encontrar posiciona no fim do arquivo
(EOF)

DBSKIP Salta registro da tabela corrente.


Sintaxe: DBSKIP(nStep)
Argumento

Obrigat.

Tipo

Descrio

NStep

Nao

Default 1. Qtde de registros que ser saltado.


Se positivo avana registros, Se negativo
retrocede registros.

DBFILTER Retorna a expresso do filtro da tabela corrente.


Sintaxe: DBFILTER()

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

57

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
DBSETFILTER Retorna a expresso do filtro da tabela corrente.
Sintaxe: DBSETFILTER(bFiltro, cFiltro)
Argumento

Obrigat.

Tipo

Descrio

BFiltro
CFiltro

Sim
Sim

B
C

Bloco com a expresso de filtro


Expresso do Filtro

DBCLEARFIL Limpa o filtro da tabela corrente.


Sintaxe: DBCLEARFIL()
DBGOTO Posiciona no registro especificado da tabela corrente.
Sintaxe: DBGOTO(nReg)
Argumento

Obrigat.

Tipo

Descrio

NReg

Sim

Numero do Registro

DBUSEAREA Abre uma tabela e a deixa corrente.


Sintaxe: DBUSEAREA( lNew, cDriver, cNomArq, cAlias, lShared, lReadOnly)
Argumento

Obrigat.

Tipo

LNew

No

CDriver
cNomArq
CAlias

No
Sim
Sim

C
C
C

LShared

No

lReadOnly

No

Descrio
.T. Abre em uma nova Area
.F. (Default)
Abre na rea corrente,
fechando a rea anteriormente utilizada.
Driver da tabela a abrir. Default DBFCDX
Nome da tabela a abrir
Apelido
.T. Abre a tabela compartilhada
.F. (Default) Abre a tabela exclusiva
.T. Abre a tabela somente leitura
.F. (Default) Permite gravao na tabela

Exemplo:
dbUseArea(.T., TOPCONN, SX5020, SX5A, .T., .T.)
dbSelectArea(SB1)
dbSetorder(1)
dbGotop()
cFiltro := B1_TIPO > MP
cADFilAnt := SB1->(dbFilter())
SB1->(dbSetFilter({||&cFiltro},cFiltro))
While SB1->(!EOF())
If !dbSeek(xFilial(SB1) + SB1->B1_COD)
SB5->(dbAppend())
Endif
SB5->B5_FILIAL := xFilial(SB1)
SB5->B5_COD := SB1->B1_COD
SB1->(MsUnlock())
SB1->(dbSkip())
Enddo
If Empty(cADFilAnt)
SB1->(dbClearFil())
Else
SB1->(dbSetFilter({||&cADFilant},cADFilant))
Endif

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

58

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 15 Blocos de Cdigos


Definio
O tipo de dado chamado bloco de cdigo permite que o cdigo compilado seja
tratado como um dado. Pode-se considerar um bloco de cdigo como uma funo
sem nome atribuda a uma varivel. E como o AdvPL trata os blocos de cdigo
como valores, eles podem ser passados como parmetros e armazenados em
variveis.
As operaes que podem atuar em um bloco de cdigo so as de atribuio e
avaliao. A atribuio de um bloco de cdigo feita geralmente a uma varivel,
mas eles tambm podem ser um elemento de um vetor ou passados como
parmetros. A avaliao de um bloco de cdigo pode ser realizada sobre um valor,
para cada elemento de um vetor, ou um bloco de cdigo para avaliar cada registro
de uma base de dados.
Sintaxe: uRet := { |<argumentos>| <expresses>}
Argumento

Obrigat.

Tipo

argumentos

No

Diversos

expresses

Sim

Diversos

URet

Descrio
Lista de argumentos que o bloco receber, cada
argumento deve ser separado por virgula.
Lista de expresses que o bloco executar, cada
instruo dever ser separada por virgula
Retorno ser o resultado da ultima expresso da
lista de expresses.

Exemplo:
bBloco:= {| nVar1, cVar1| fTeste(nVar1, cVar1)}
Como um bloco de cdigo como uma funo sem nome, veja o bloco e sua
representao equivalent abaixo:
Bloco
bTest := {|nVar| nVar * 5}

Equivalente
Function SemNome( nVar )
Return(nVar * 5)

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

59

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Funes de Bloco
EVAL - Executa um bloco de cdigo qualquer, com passagem de parmetros.
Sintaxe: uRet := Eval(bVar,Par1,Par2...Parx)
Argumento

Obrigat.

Tipo

Descrio

BVar

Sim

Bloco

Par1,Par2..Parx

No

Diversos

Bloco a ser executado


Lista de argumentos que o bloco informado
necessita receber.
Retorno ser o resultado da ultima expresso da
lista de expresses.

URet

Exemplo:
bBloco := {|nvar| nVar * 10}
nRet := Eval(bBloco,9) // resulta 90
ou
bVar := {|| N1 := 6, N2 := 20, N3 := N1 * N2}
nVar := Eval(bVar) // Resulta 120
Equivalente a
N1:= 6
N2:=20
N3:= N1 * N2
DBEVAL - Executa um bloco de cdigo enquanto obedecer a condio.
Sintaxe: dbEval(bVar,bFor,bWhile)
Argumento

Obrigat.

Tipo

Descrio

BVar

Sim

BFor

No

Bloco
Bloco

BWhile

No

Bloco a ser executado


Lista de argumentos que o bloco informado
necessita receber.
Retorno ser o resultado da ultima expresso
da lista de expresses.

Bloco

Exemplo:
bBloco := {|| aAdd(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})}
bWhile := {|| X5_TABELA==cTabela})
dbEval(bBloco,,bWhile)
Equivalente a
While !Eof() .And. X5_TABELA==cTabela
aAdd(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})
dbSkip()
End

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

60

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
AEVAL - Executa um bloco de cdigo, passando um array como parmetro, a
funo percorre o array de acordo com os argumentos de inicio e quantidade de
vezes do array.
Sintaxe: aEval(aArray,bBloco,nInicio,nCount)
Argumento

Obrigat.

Tipo

Descrio

AArray
BBloco

Sim
sim

NInicio

No

Array
Bloco
Numerico

NCount

No

Array eu dever ser percorrido


Bloco com instrues a executar
Elemento que o bloco comear a percorrer,
se no informado o default ser 1
Numero de elementos que o bloco deve
percorrer, se no informado, o default ir
at o final do array.

Numerico

Exemplo:
aEstrutura := (cAlias)->(dbStruct()) //{cCampo,cTipo",nTam,nDec}
bAcao := {|x| Msginfo(aEstrutura[x][1]) }
aEval(aEstrutura, bAcao)
Equivalente a
aEstrutura := (cAlias)->(dbStruct()) //{cCampo,cTipo",nTam,nDec}
For I:=1 to len(aEstrutura)
Msginfo(aEstrutura[I][1])
Next
A varivel x foi criada para guardar o elemento da matriz que est sendo lido no
momento, tornando possvel o dinamismo na apresentao da mensagem.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

61

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 16 Funes Diversas


Funes de Ambientes
GetRemoteIniName() - Retorna o nome do arquivo de cofiguracao remote.
GetEnvServer() - Retorna o ambiente atual
GetTheme() Retorna o tema escolhido.
GetDBExtension() Retorna a extenso da Base (DBF, DTC, etc)
Conout(cMens) Imprime cMens no console do Server
OrdBagExt() Retorna a extenso do Indice(CDX, IDX, NTX, etc)
Funname(n)- Retorna a funo da pilha, onde n a posio na pilha.
Exemplo:
#include "protheus.ch"
User Function FuncServ()
cTemProc
cTemProc
cTemProc
cTemProc
cTemProc
cTemProc
cTemProc
cTemProc

:= "Menu: " + CARQMNU + CRLF //Nome do menu


+= "Modulo: " + cModulo+ CRLF // Modulo atual
+= "Ambiente: " + Getenvserver() + CRLF //Ambiente atual
+= "Usuario: " + cUserName + CRLF //Nome Usuario
+= "Programa: " + funname() + CRLF //Funcao chamada Menu
+= "Tema: " + GetTheme() + CRLF //Tema do usuario
+= "Extensao Base Local: " + GetDBExtension() + CRLF //Extenso LocalFiles
+= "Tipo Indice: " + OrdBagExt() + CRLF //Extensao de ndices

conout(cTemProc)
Return Nil

Funes de Servidor
GetsrvProfString() - Retorna o conteudo do parametro da seo
Sintaxe: GetSrvprofString( cParam, cDefault)
Argumento

Obrigat.

Tipo

Descrio

cParam

Sim

Sim

Parametro da seo no arquivo INI


Contedo Padro, caso no seja encontrado o
parmetro cParam na seo do INI.

cDefault

GetFuncArr() Retorna um array com as funes do repositrio do ambiente


corrente.
Sintaxe: aVar := GetFuncArr( cNomFun)
Argumento

Obrigat.

Tipo

Descrio

cNomFun

Sim

Nome da funo do repositrio, se informado


A, retorna todas as funes do repositrio.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

62

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
GetFuncPrm(cFun) Retorna parmetros da funo especificada.
Sintaxe: : aVar := GetFuncPrm( cFun)
Argumento

Obrigat.

Tipo

Descrio

cFun

Sim

Nome da funo do repositrio.

Exemplo:
#include "protheus.ch"
User Function FuncServ()
Local aGetA := {}
Local aGetF := {}
Local cFun := ""
aGetA := GetFuncArr("A")
For I:=1 to Len(aGetA)
cFun+= aGetA[I] + "() "
aGetF := GetFuncPrm(aGetA[I])
For X:=1 to Len(aGetF)
cFun += If(X>1, ", "," ")+ aGetA[X]
Next
Next
cLocalArq := GetsrvProfString("STARTPATH", "C:\")
Memowrite(cLocalArq,cFun)
Return Nil

GetApoInfo() Retorna um array com dados do programa informado dentro do


repositrio.
Sintaxe: aVar := GetApoInfo( cNomProg)
Argumento

Obrigat.

Tipo

Descrio

cNomProg

Sim

Nome do programa

Exemplo:
#include "protheus.ch"
User Function fDadosFun()
Local aApoInfo := GetApoInfo( "MATA410.PRX" )
Conout(aApoInfo[1])
Conout(aApoInfo[2])
Conout(aApoInfo[3])
Conout(aApoInfo[4])

//MATA410.PRX -> Nome do arquivo


//ADVPL
-> Codificada Em
//BUILD_FULL -> Quem Compilou, TOTVS ou Cliente
//23/01/2007 -> Data da ltima Modificao.

Return

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

63

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Funes de Comunicao Server x Client


CpyS2T() - Copia arquivos do servidor para a mquina do cliente.
Sintaxe: CPYS2T(cArqOri, cArqDes, lComp)
Argumento

Obrigat.

Tipo

cArqOri

Sim

Sim

No

cArqDest
lComp

Descrio
Arquivo de Origem, visivel a partir do rootpath do
ambiente corrente
Arquivo de Destino, visivel na mquina do cliente
Define se compacta antes de enviar o arquivo.
Default .T.

Exemplo:
#include "protheus.ch"
User Function CopiaArq()
Local cArqOri := "\SYSTEM\SIGAFIN.XNU"
Local cArqDes := "C:\TEMP"
If CPYS2T(cArqOri, cArqDes, .T.)
MSGINFO("Arquivo " + cArqOri + " copiado com sucesso para "+ cArqDes, "COPIAARQ")
Else
MSGINFO("Arquivo " + cArqOri + " no foi copiado! ", "COPIAARQ")
EndIf
Return Nil

CpyT2S() - Copia arquivos da mquina do cliente para o servidor.


Sintaxe: CPYT2S(cArqOri, cArqDes, lComp)
Argumento

Obrigat.

Tipo

Descrio

cArqOri

Sim

Sim

No

Arquivo de Origem, visivel na mquina do cliente


Arquivo de Destino, visivel a partir do rootpath do
ambiente corrente
Define se compacta antes de enviar o arquivo.
Default .T.

cArqDest
lComp

Exemplo:
#include "protheus.ch"
User Function CopiaArq()
Local cArqOri := "C:\TEMP\SIGAFIN.XNU"
Local cArqDes := "\SYSTEM "
If CPYT2S(cArqOri, cArqDes, .T.)
MSGINFO("Arquivo " + cArqOri + " copiado com sucesso para "+ cArqDes, "COPIAARQ")
Else
MSGINFO("Arquivo " + cArqOri + " no foi copiado! ", "COPIAARQ")
EndIf
Return Nil

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

64

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Funes de Servidor
RpcClearEnv() Limpa o ambiente
RpcSetType() Seleciona o Tipo o RPC
RpcSetEnv() Prepara o Ambiente para a empresa definida
Sintaxe: RpcSetEnv(cADEmp,cADFil,cUser,cSenha,cADMod,,aTables)
Argumento

Obrigat.

Tipo

Descrio

cADEmp
cADFil
cUser
cSenha
cADMod
aTables

Sim
Sim
No
No
No
No

C
C
C
C
C
A

Cdigo da Empresa
Cdigo da Filial
Usurio do Protheus
Senha do Protheus
Sigla do mdulo
Array com os alias necessrios

Exemplo:
#include "protheus.ch"
User Function PrepEnv()
Local cUser:= "Administrador"
Local cSenha:="123456"
Local aEmps := {{"01","01"};{"02","01"};{"03","01"};{"99","01"}}
For I:=1 to Len(aemps)
RpcClearEnv()
RpcSetType(3)
RpcSetEnv(aEmps[I,1], aEmps[I,2],cUser,cSenha,"FAT",,{"SA1", "SA2","SA3"})
Msginfo(SM0->M0_NOME, "PREPENV")
Next
Return Nil

Pode ser feito de outra forma:


Exemplo:
#include "protheus.ch"
User Function PrepEnv()
Local cUser:= "Administrador"
Local cSenha:="123456"
Local aEmps := {{"01","01"};{"02","01"};{"03","01"};{"99","01"}}
For I:=1 to Len(aemps)
RpcClearEnv()
RpcSetType(3)
PREPARE ENVIRONMENT EMPRESA aEmps[I,1] FILIAL aEmps[I,2] USER cUser;
PASSWORD cSenha MODULO 'FAT' TABLES "SA1", "SA2", "SA3"
Msginfo(SM0->M0_NOME, "PREPENV")
Next
Return Nil

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

65

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Captulo 17 Tela de Padro Microsiga


AxCadastro()
Tela de cadastro simples, com poucas opes de customizao, a qual composta
de:
Browse padro para visualizao das informaes da base de dados, de acordo
com o Dicionrio de Dados.(X3_BROWSE = S)
Funes padres para visualizao de registros simples, sem a opo de
cabealho e itens.

axPesqui() Tela de pesquisa de acordo com dicionario (SIX)


AxVisual() Tela de visualizao de acordo com o dicionario (SX3)
AxInclui() Tela de incluso de acordo com o dicionario (SX3)
AxAltera() Tela de alterao de acordo com o dicionario (SX3)
AxDeleta() Tela de excluso de acordo com o dicionario (SX3)

Sintaxe: AxCadastro(cAlias, cTitulo, [cVldExc], [cVldAlt], [arotadic], [bpre], [bok],


[aauto], [nopcauto],; [btts], [bnotts], [abuttons]
Argumento

Obrigat.

Tipo

Descrio

cAlias
cTitulo
cVldExc
cVldAlt
Arotadic
Bpre
Bok

Sim
Sim
No
No
No
No
No

C
C
C
C
A
B
B

No

No
No
No

N
B
B

No

Alias do arquivo
Titulo da Janela
Nome de funcao para validacao da exclusao
Nome de funcao para validacao da tela
Array de botes adicionais no arotina
CodeBlock Executado antes da Interface
CodeBlock Executado na validacao da Interface
Array com dados para execuo de rotina
automtica
Opo para execuo de rotina automtica
CodeBlock Executado dentro da transao
CodeBlock Executado fora da transao
CodeBlock
com
botes
adicionais
na
enchoicebar

Aauto
Nopcauto
Btts
Bnotts
Abuttons

Retorno:- Lgico
.T. Clique no boto OK da tela
.F. Clique o boto Cancela da tela
Exemplo:
#include "protheus.ch"
User Function CadSZ9()
Local
Local
Local
Local

cAlias := "SZ9"
cTitulo := "Cadastro de Ordem "
cVldExc := ".T."
cVldAlt := ".T."

(cAlias)->(dbSetOrder(1))
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return Nil

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

66

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Pergunte()
Tela de parmetros para interao com usurio. A funo inicializa as variveis de
pergunta (mv_par01,...) baseada na orderm da pergunta inserida na tabela SX1
Sintaxe: Pergunte( cPergunta , [lMostra] , [cTitle] )
Argumento

Obrigat.

Tipo

Descrio

cPergunta

Sim

lMostra

No

cTitle

No

Alias do arquivo
.T. exibir a tela para edio e carregar as
perguntas
.F. apenas carregar as perguntas nas variveis
MV_PAR99
Ttulo da janela de perguntas

Retorno:- Lgico
.T. Clique no boto OK da tela
.F. Clique o boto Cancela da tela
Exemplo:
#include "protheus.ch"
User Function ADV0001()
Local cPerg := PADR("AULAXX",10)
If Pergunte(cPerg, .T.)
Chamafun()
Else
MsgInfo("Usuario clicou em cancelar", "ADV0001 Funcao modelo")
Endif
Return Nil

PutSx1()
Permite a incluso de um nico item de pergunta em um grupo de definido no
Dicionrio de Dados (SX1)via cdigo de programao. Todos os vetores contendo
os textos explicativos da pergunta devem conter at 40 caracteres por linha.
Sintaxe: PutSx1(cGrupo, cOrdem, cPergunt, cPerSpa, cPerEng, cVar, cTipo,
nTamanho, nDecimal, nPresel,; cGSC, cValid, cF3, cGrpSxg ,cPyme,cVar01,cDef01,
cDefSpa1 , cDefEng1, cCnt01, cDef02,; cDefSpa2,cDefEng2, cDef03, cDefSpa3,
cDefEng3, cDef04, cDefSpa4, cDefEng4,cDef05,; cDefSpa5, cDefEng5, aHelpPor,
aHelpEng, aHelpSpa, cHelp)

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

67

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Argumento

Obrigat.

Tipo

Descrio

cGrupo

Grupo de perguntas do SX1 (X1_GRUPO)

Ordem do parmetro no grupo (X1_ORDEM)

Descrio da pergunta em portugus

Descrio da pergunta em espanhol

cPerEng

Sim
Sim
Sim
No
No

cVar

Sim

cTipo

Sim
Sim

Descrio da pergunta em ingls


Nome
da
varivel
de
controle
(X1_VARIAVL)
Tipo do parmetro

Tamanho do contedo do parmetro

No

Nmero de decimais para contedos numricos

nPresel

No

cGSC

Sim

cValid
cF3
cGrpSxg

No
No

C
C

No

cPyme
cVar01
cDef01
cDefSpa1
cDefEng1

No
No
No
No
No

C
C
C
C
C

cCnt01

No

cDef0x
cDefSpax
cDefEngx

No
No
No

C
C
C

aHelpPor

No

aHelpEng

No

aHelpSpa

No

cHelp

No

cOrdem
cPergunt
cPerSpa

nTamanho
nDecimal

auxiliar

Define qual opo do combo a padro para o


parmetro.
Define se a pergunta ser do tipo G Get ou C
Choice (combo)
Expresso de validao do parmetro
Cdigo da consulta F3 vinculada ao parmetro
Cdigo do grupo de campos SXG para atualizao
automtica, quando o grupo for alterado.
Se a pergunta estar disponvel no ambiente Pyme
Nome da varivel MV_PAR+Ordem do parmetro.
Descrio da opo 1 do combo em portugus
Descrio da opo 1 do combo em espanhol
Descrio da opo 1 do combo em ingls
Contedo padro ou ultimo contedo definido como
respostas para este item
Descrio da opo X do combo em portugus
Descrio da opo X do combo em espanhol
Descrio da opo X do combo em ingls
Vetor simples contendo as linhas de help em
portugus para o parmetro.
Vetor simples contendo as linhas de help em ingls
para o parmetro.
Vetor simples contendo as linhas de help em
espanhol para o parmetro.
Contedo do campo X1_HELP

Exemplo:
#include "protheus.ch"
User Function CriaSx1(cPerg)
Local aHelp := {}
//
Texto do help em portugus
, ingls, espanhol
AAdd(aHelp, {{"Informe o nome da conta inicial"}, {""}, {""}})
AAdd(aHelp, {{"Informe o nome da conta final" }, {""}, {""}})
PutSx1(cPerg,"01","Conta de?","","","mv_ch1",;
"C",20,00,00,"G","","SZ1", "","","mv_Par01",;
"","","","","","","","","","","","","","",;
"","",aHelp[1,1],aHelp[1,2],aHelp[1,3],"")
PutSx1(cPerg,"01","Conta Ate?","","","mv_ch2",;
"C",20,00,00,"G","","SZ1", "","","mv_Par01",;
"","","","","","","","","","","","","","",;
"","",aHelp[2,1],aHelp[2,2],aHelp[2,3],"")
Return

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

68

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

mBrowse()
Monta um browse padro do sistema, conforme os parmetros, de aacordo com
dicionario.
Sintaxe: MBrowse(nt, nl, nb, nr, calias, afixe, ccpo, nposi, cfun, ndefault, acolors, ;
ctopfun, cbotfun, nfreeze, bparbloco, lnotopfilter, lseeall, lchgall, cexprfiltop)

Argumento

Obrigat.

Tipo

Descrio

NT
Nl
Nb
Nr

No
No
No
No

N
N
N
N

Calias

Sim

Afixe

No

Ccpo

No

Linha Inicial
Coluna Inicial
Linha Final
Coluna Final
Alias do arquivo que ser visualizado no browse.
Para utilizao de arquivos de trabalho, o nome do
alias deve ser obrigatoriamente 'TRB' e o parmetro
aFixe torna-se obrigatrio.
Array bi-dimensional contendo os nomes dos
campos fixos pr-definidos.
A estrutura do array diferente para arquivos que
fazem parte do dicionrio de dados e para arquivos
de trabalho.
Arquivos que fazem parte do dicionrios de dados
[n][1]=>Descrio do campo
[n][2]=>Nome do campo
Arquivos de trabalho
[n][1]=>Descrio do campo
[n][2]=>Nome do campo
[n][3]=>Tipo
[n][4]=>Tamanho
[n][5]=>Decimal
[n][6]=>Picture
Campo a ser validado se est vazio ou no para
exibio do bitmap de status.
Quando esse parmetro utilizado, a primeira
coluna do browse ser um bitmap indicando o
status do registro, conforme as condies
configuradas nos parmetros cCpo, cFun e aColors.

Nposi

No

Cfun

No

Ndefault

No

Acolors

No

Ctopfun

No

Cbotfun

No

Funo que retornar um valor lgico para exibio


do bitmap de status.
Quando esse parmetro utilizado, o parmetro
cCpo
automaticamente desconsiderado.
Nmero da opo do aRotina que ser executada
quando for efetuado um duplo clique em um
registro do browse. O default executar a rotina de
visualizao.
Array bi-dimensional para possibilitar o uso de
diferentes bitmaps de status.
[n][1]=>Funo que retornar um valor lgico para
a exibio do bitmap
[n][2]=>Nome do bitmap que ser exibido quando
a funo retornar .T. (True).
O nome do bitmap deve ser um resource do
repositrio e quando esse parmetro utilizado os
parmetros cCpo e cFun soautomaticamente
desconsiderados.
Funo que retorna o limite superior do filtro
baseado na chave de ndice selecionada.
Esse parmetro deve ser utilizado em conjunto com
o parmetro cBotFun.
Funo que retorna o limite inferior do filtro
baseado na chave de ndice selecionada.
Esse parmetro deve ser utilizado em conjunto com
o parmetro cTopFun.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

69

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Nfreeze

No

Bparbloco

No

Lnotopfilter

No

Lseeall

No

Lchgall

No

No

Cexprfiltop

Qtde de colunas que ficaro congeladas


Bloco de cdigo que ser executado no ON INIT da
janela do browse. O bloco de cdigo receber como
parmetro o objeto da janela do browse.
Valor lgico que define se a opo de filtro ser
exibida no menu da MBrowse.
.T. => No exibe a opo no menu
.F. => (default) Exibe a opo no menu.
A opo de filtro na MBrowse est disponvel
apenas para TopConnect.
Identifica se o Browse dever mostrar todas as
filiais.
O valor default .F. ( False ), no mostra todas as
filiais. Caso os parmetros cTopFun ou cBotFun
sejam informados esse parmetro ser configurado
automaticamente para .F. ( False )
Parmetro vlido partir da verso 8.11.
A funo SetBrwSeeAll muda o valor default desse
parmetro.
Identifica se o registro de outra filial est
autorizado para alteraes.
O valor default .F. ( False ), no permite alterar
registros de outras filiais. Quando esse parmetro
est configurado para .T. ( True ), o parmetro
lSeeAll configurado automaticamente para .T. (
True ).
Caso os parmetros cTopFun ou cBotFun sejam
informados esse parmetro ser configurado
automaticamente para .F. ( False ).
Parmetro vlido partir da verso 8.11.
A funo SetBrwChgAll muda o valor default desse
parmetro.
Expressao para efetuar o filtro no browse com
sintaxe em TopConnect.

cCadastro- Ttulo que ser exibido do browse.


aRotina - Array contendo as funes que sero executadas pela Mbrowse, nele
ser definido o tipo de operao a ser executada (incluso, alterao, excluso,
visualizao, pesquisa, etc. ), e sua estrutura composta de
5 (cinco) dimenses:
[n][1] - Ttulo;
[n][2] Rotina;
[n][3] Reservado;
[n][4] Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 -alterao; 5 excluso);
Exemplo:
#include "protheus.ch"
User Function brw00001()
Private cCadastro := "Cadastro de Exemplo"
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})
Private cString := "SA1"
SA1->(dbSetOrder(1))
mBrowse( ,,,,cString)
Return

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

70

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Modelo 2
Tela de Manuteno Utilizando uma Tabela (Cabecalho/Itens).
Sintaxe:
Modelo2(cTitulo,aCab,aRod,aGetdados,[nOpc],[cLinOk],[cTudOk],aCols,[bF4],[cInit
Pos],[nMax],[aCoord],[lDelGet],[lMaximized],[aButtons])

Argumento

Obrigat.

Tipo

Descrio

cTitulo
aCab

Sim
Sim

C
A

aRod

Sim

aGetdados

Sim

nOpc

Nao

cLinOk

No

cTudOk

Nao

aCols

Sim

bF4

No

cInitPos

No

nMax
aCoord
lDelGet

No
No
No

N
A
L

lMaximized
aButtons

No
No

L
A

Ttulo da Janela
Array com dados do cabealho
Ex:{cVariavel,{nLin,nCol},cTitulo_Campo,cPictu
re,Funcao_valid,F3,lEditavel}
Array com dados do rodap
Ex;{cVariavel,{nLin,nCol},cTitulo_Campo,cPictu
re,Funcao_valid,F3,lEditavel}
Array com posies da getdados
Ex:{nLinIni,nColIni,nLinFim,nColFim}
Modo de operao (3/4 Inclui ou altera, 6
altera, outros visualiza)
Ex: nOpc := 3
Funo para validar linha
Ex: allwaystrue()
Funo que valida tudo
Ex: allwaystrue()
Array com os campos que podem ser alterados
Ex:{A1_COD,A1_NREDUZ}
Bloco de Cdigo Chamado pelo F4
Ex: {||MsgAlert(Teste)}
String com nome dos campos que devem ser
inicializados ao teclar seta para baixo.
Nmero mximo de linhas
Array com as coordenadas das janelas
Determina se a linha da getdados pode ser
apagada ou no
Maximiza a tela
Array com botes a serem acrescentados no
toolbar

Retorno:- Lgico
.T. Clique no boto OK da tela
.F. Clique o boto Cancela da tela

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

71

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Modelo 3
Tela de Manuteno Utilizando duas Tabelas (Cabecalho/Itens).

Argumento

Obrigat.

Tipo

Descrio

cTitulo
cAlias1
cAlias2
aEnchoice
cLinOk
cTudOK
nOpc1
nOpc2
cFieldOk
lVirtual
nLinhas
aAltEnchoice
nFreeze
aButtons

Sim
Sim
Sim
Sim
No
No
No
No
No
No
No
No
No
No

C
C
C
A
C
C
N
N
C
L
N
A
N
A

aCoord
nSize

No
No

A
N

Ttulo da Janela
Alias da tabela do Cabealho
Alias da Tabela dos Itens
Array com os campos da enchoice(Cabecalho)
Funo de Validao de Itens
Funo de Validao tudo
Opo de edio da Enchoice
Opo de edio da Getdados
Funo de validao dos campos da Getdados
Permite visualizar campos virtuais na Enchoice
Numero Maximo de Linhas da Getdados
Array com os campos alterveis da enchoice
Qtde de colunas que ficaro congeladas
Array com botes a serem acrescentados ao
toolbar
Array com as coordenadas da tela
Numero de linhas da enchoice

Retorno:- Lgico
.T. Clique no boto OK da tela
.F. Clique o boto Cancela da tela
Exemplo:
#include "protheus.ch"
User Function CadM3()
Private cAlias1
:= "SC5"
Private cAlias2
:= "SC6"
Private aHeader
:= {}
Private aCols
:= {}
Private cCadastro
:= "Modelo 3"
Private aRotina
:= {}
AAdd(aRotina, {"Pesquisar" , "axPesqui" , 0, 1})
AAdd(aRotina, {"Visualizar", "U_Incmod3" , 0, 2})
AAdd(aRotina, {"Incluir" , "u_Incmod3" , 0, 3})
AAdd(aRotina, {"Altera" , "u_Incmod3" , 0, 4})
AAdd(aRotina, {"Excluir" , "u_Incmod3" , 0, 5})
mBrowse(,,,,cAlias1)
Return
//===============================================
User Function Incmod3(cAlias, nReg, nOpc)
Local nAdi
:= 0
Local i := 0
Private j:=1
//Criar as variaveis de memoria
RegToMemory(cAlias1, (nOpc==3))
RegToMemory(cAlias2, (nOpc==3))
aHeader
:= {}
aCols
:= {}
//Monta aheader
dbSelectArea("SX3")
dbSetorder(1)
dbSeek(cAlias2)
While SX3->(!EOF()) .AND. SX3->X3_ARQUIVO == cAlias2
If X3USO(SX3->X3_USADO) .AND. cNIVEL >= SX3->X3_NIVEL //.AND. ALLTRIM(SX3>X3_CAMPO) $ "C6_ITEM/C6_PRODUTO/C6_UM/C6_QTDVEN/C6_PRCVEN/C6_VALOR"
AAdd (aHeader, {Trim(SX3->X3_TITULO),;//01 - titulo

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

72

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

SX3->X3_CAMPO
,; //02- nome do campo
SX3->X3_PICTURE
,; //03 - mascara do campo
SX3->X3_TAMANHO
,; //04 - tamanho
SX3->X3_DECIMAL
,; //05 - decimais
SX3->X3_VALID
,; //06 - validacao
SX3->X3_USADO
,; //07 - USADO
SX3->X3_TIPO
,; //08 - TIPO DO CAMPO
SX3->X3_ARQUIVO
,; //09 - ALIAS
SX3->X3_CONTEXT})
//10 - Virtual ou Real
ENDIF
SX3->(DBSKIP())
ENDDO
//Monta acols
If nOpc == 3 //Incluso
AAdd(aCols, Array(Len(aHeader) + 1))
For nAdi:= 1 to Len(aHeader)
aCols[1][nADI] := Criavar(aHeader[nADI][2])
Next
ACols[1][len(aHeader)+1] := .F.
Else //Visual/Altera/Exclui
(cAlias2)->(dbSetOrder(1))
(cAlias2)->(dbSeek(xFilial(cAlias2) + (cAlias1)->C5_NUM))
While (cAlias2)->(!EOF()).And.(cAlias2)->C6_FILIAL == xFilial(cAlias2) .And.;
(cAlias2)->C6_NUM == (cAlias1)->C5_NUM
AAdd(aCols, Array(len(aHeader)+1))
For i := 1 To Len(aHeader)
If aHeader[i][10] <> "V"
aCols[len(aCols)][i] := (cAlias2)->&(aHeader[i][2])
Else
aCols[len(aCols)][i] := CriaVar(aHeader[i][2])
EndIf
Next
ACols[j][len(aHeader)+1] := .F.
(cAlias2)->(dbSkip())
j++
Enddo
Endif
lRet := Modelo3(cCadastro, cAlias1, cAlias2, ,"Allwaystrue","Allwaystrue" , nOpc, nOpc)
Return

Exerccio
Fazer um programa que trate a Amarracao Cliente x Produto
Tabelas Envolvidas
Cadastro de Clientes (SA1) , sempre visual (no permite alteracao)
Amarracao Produtos x Clientes (SA7) Obedece a escolha do usuario no browse
Browse (Cadastro de Clientes)
Itens do aRotina
Incluir, Alterar ,visualizar , excluir os dados

Pesquisa Padro (AXPESQUI)


No permitir incluir o mesmo produto para o mesmo cliente.
No permitir alterao caso no exista nenhum item amarrado para o cliente
selecionado.
Na excluso, excluir apenas os itens ( SA7), No deixar excluir caso no exista
nenhum item amarrado para o cliente selecionado.
Trazer o acols j preenchido conforme registro posicionado pelo usuario.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

73

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Capitulo 18 MSEXECAUTO
Fazer manuteno automtica (incluso, alterao e excluso) das rotinas de
manipulao de dados do sistema, automatizando o processo de entrada de dados
sem a necessidade de desenvolver rotinas especificas.

Vantagens
1) Interface : Os dados de entrada so enviados a rotina em forma de campos e
contedos (array) e desta forma no necessrio a apresentao de nenhuma
interface ao usurio.
2) Segurana : A utilizao de rotinas automticas aumenta consideravelmente a
segurana do sistema, uma vez que utiliza as validaes padres e diminui os
problemas causados por atualizao de verso ou incluso de customizaes nas
rotinas padres do sistema.
3) Agilidade no processo : Aumenta consideravelmente o tempo de
desenvolvimento das customizaes que necessitam de entrada de dados.
Exemplo: Importao de pedido de venda.
Procedimentos
Sintaxe: MSExecAuto({|x,y|fpgmpad(x,y)},aCampos,nOpc)
Argumento

Obrigat.

Tipo

Descrio

fPgmPad
aCampos
nOpc

Sim
Sim
No

B
A
N

Nome da Funo Padro


Array com os campos a gravar
Opo do Browse que ser utilizada.

Existem duas maneiras de utilizar a rotina automtica, sendo elas:


Sem Interface
Para a utilizao da rotina automtica sem interface deve-se, configurar o ambiente
utilizando-se o comando PREPARE ENVIRONMENT e chamar diretamente o nome da
funo.
Exemplo:
#include "protheus.ch"
User Function IncProd()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t. // se .t. direciona as mensagens de help para o arq. de log
Private lMsErroAuto := .f. //necessario a criacao, pois sera atualizado quando houver
//alguma incosistencia nos parametros
PREPARE ENVIRONMENT EMPRESA '99' FILIAL '01' MODULO 'FAT'
aRotAuto:= {{'B1_COD' ,GETSXENUM('SB1', 'B1_COD') ,Nil},;
{'B1_DESC' ,'Produto teste',Nil},;
{'B1_TIPO' ,'PA' ,Nil},;
{'B1_UM' ,'UN' ,Nil},;
{'B1_LOCPAD' ,'01' ,Nil},;
{'B1_PICM' ,0 ,Nil},;
{'B1_IPI' ,0 ,Nil},;
{'B1_PRV1' ,100 ,Nil},;
{'B1_LOCALIZ' ,'N' ,Nil},;
{'B1_CODBAR' ,'789888800001' ,Nil}}
MSExecAuto({|x,y| mata010(x,y)},aProduto,nOpc)
If lMsErroAuto
//mostrar na tela o log informando qual a inconsistncia ocorreu durante a rotina
Mostraerro()
Return .f.
EndIf
Return .t.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

74

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Com Interface
Para a utilizao da rotina automtica com interface deve-se apenas colocar no
menu.
Exemplo:
#include "protheus.ch"
User Function IncProd()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t. // se .t. direciona as mensagens de help para o arq. de log
Private lMsErroAuto := .f. //necessario a criacao, pois sera atualizado quando houver
//alguma incosistencia nos parametros
aRotAuto:= {{'B1_COD' ,GETSXENUM('SB1', 'B1_COD') ,Nil},;
{'B1_DESC' ,'Produto teste',Nil},;
{'B1_TIPO' ,'PA' ,Nil},;
{'B1_UM' ,'UN' ,Nil},;
{'B1_LOCPAD' ,'01' ,Nil},;
{'B1_PICM' ,0 ,Nil},;
{'B1_IPI' ,0 ,Nil},;
{'B1_PRV1' ,100 ,Nil},;
{'B1_LOCALIZ' ,'N' ,Nil},;
{'B1_CODBAR' ,'789888800001' ,Nil}}
MSExecAuto({|x,y| mata010(x,y)},aProduto,nOpc)
If lMsErroAuto
//mostrar na tela o log informando qual a inconsistncia ocorreu durante a rotina
Mostraerro()
Return .f.
EndIf
Return .t.

Onde usar: Existem varias situaes em que podemos usar:


Customizaes de rotinas que automatizam processos entre empresas e facilitam
o trabalho do usurio.
Importao de dados para o sistema.
Arquivo texto,
XML,
Sites da Web,
ADVPL ASP,
Web Services.
Workflow
Replicao de Dados, como cpia de pedidos, produtos, clientes, fornecedores,
liberao de pedidos, etc

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

75

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Exemplo de Automao de Rotinas


Tipo de Entrada e Saida:
#include "protheus.ch"
User Function IncTes()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t.
Private lMsErroAuto := .f.
//Entrada
aTes:={{"F4_CODIGO" ,"011",Nil},;
{"F4_TIPO"
,"E",Nil},;
{"F4_ICM"
,"S",Nil},;
{"F4_IPI"
,"S",Nil},;
{"F4_CREDICM" ,"S",Nil},;
{"F4_CREDIPI" ,"S",Nil},;
{"F4_DUPLIC" ,"S",Nil},;
{"F4_ESTOQUE" ,"S",Nil},;
{"F4_CF"
,"1102",Nil},;
{"F4_TEXTO" ,"COMPRA",Nil},;
{"F4_PODER3" ,"N",Nil},;
{"F4_LFICM" ,"T",Nil},;
{"F4_LFIPI"
,"T",Nil},;
{"F4_DESTACA","N",Nil},;
{"F4_INCIDE" ,"N",Nil},;
{"F4_COMPL" ,"N",Nil}}
MSExecAuto({|x,y| mata080(x,y)},aTes,nOpc)
//Sada
aTes:={{"F4_CODIGO" ,"511",Nil},;
{"F4_TIPO"
,"S",Nil},;
{"F4_ICM"
,"S",Nil},;
{"F4_IPI"
,"S",Nil},;
{"F4_CREDICM" ,"S",Nil},;
{"F4_CREDIPI" ,"S",Nil},;
{"F4_DUPLIC" ,"S",Nil},;
{"F4_ESTOQUE" ,"S",Nil},;
{"F4_CF"
,"5102",Nil},;
{"F4_TEXTO" ,"COMPRA",Nil},;
{"F4_PODER3" ,"N",Nil},;
{"F4_LFICM" ,"T",Nil},;
{"F4_LFIPI"
,"T",Nil},;
{"F4_DESTACA"
,"N",Nil},;
{"F4_INCIDE" ,"N",Nil},;
{"F4_COMPL" ,"N",Nil}}
MSExecAuto({|x,y| mata080(x,y)},aTes,nOpc)
If lMsErroAuto
Mostraerro()
Return .f.
EndIf
Return .t.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

76

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Documento de Entrada
#include "protheus.ch"
User Function Incnfe()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t.
Private lMsErroAuto := .f.
aCab := {{"F1_TIPO" , 'N'
{"F1_FORMUL" , "N"
{"F1_DOC"
, "000001"
{"F1_SERIE"
, "UNI"
{"F1_EMISSAO" , dDataBase
{"F1_FORNECE" ,"000001"
{"F1_LOJA"
, "01"
{"F1_COND"
, "001"
{"F1_ESPECIE" ,"NF"

,NIL},;
,NIL},;
,NIL},;
,NIL},;
,NIL},;
,NIL},;
,NIL},;
,NIL},;
,NIL}}

For nx:=1 to 3
aLinha:={}
AADD(aLinha,{"D1_COD"
,"EX"+Str(nx,1,0),NIL})
AADD(aLinha,{"D1_UM"
,"PC"
,NIL})
AADD(aLinha,{"D1_QUANT",10000
,NIL})
AADD(aLinha,{"D1_VUNIT",1
,NIL})
AADD(aLinha,{"D1_TOTAL",10000
,NIL})
AADD(aLinha,{"D1_TES"
,"001"
,NIL})
AADD(aLinha,{"D1_LOCAL","01"
,NIL})
AADD(aItens,aLinha)
Next nx
MSExecAuto({|x,y,z| MATA103(x,y,z)},aCab,aItens,nOpc)
If lMsErroAuto
Mostraerro()
Return .f.
EndIf
Return .t.

Fornecedores
#include "protheus.ch"
User Function IncFor()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t.
Private lMsErroAuto := .f.
aFornecedor:={

{"A2_COD"
,GETSXENUM('SA2', 'A2_COD'),Nil},;
{"A2_LOJA"
,"01",Nil},;
{"A2_NOME" ,"FORNECEDOR VENDE BARATO S.A.",Nil},;
{"A2_NREDUZ","VENDE TUDO",Nil},;
{"A2_TIPO" ,"F",Nil},;
{"A2_END" ,"AV LEONARDO DA VINCE, 608",Nil},;
{"A2_MUN" ,"SAO PAULO",Nil},;
{"A2_EST" ,"SP",Nil},;
{"A2_COND" ,"001",Nil}}

MSExecAuto({|x,y| mata020(x,y)},aFornecedor,nOpc)
If lMsErroAuto
Mostraerro()
Return .f.
EndIf
Return .t.

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

77

Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010

Clientes
#include "protheus.ch"
User Function IncCli()
Local aRotAuto := {}
Local nOpc := 3 // inclusao
Private lMsHelpAuto := .t.
Private lMsErroAuto := .f.
aCliente:={

{"A1_COD" ,GETSXENUM('SA1', 'A1_COD'),Nil},;


{"A1_LOJA" ,"01",Nil},;
{"A1_NOME" ,"CLIENTE COMPRA TUDO S.A.",Nil},;
{"A1_NREDUZ","COMPRA TUDO",Nil},;
{"A1_TIPO" ,"F",Nil},;
{"A1_END" ,"RUA DO ROCIO 123",Nil},;
{"A1_MUN" ,"SAO PAULO",Nil},;
{"A1_EST" ,"SP",Nil},;
{"A1_COND" ,"001",Nil}}

MSExecAuto({|x,y| mata030(x,y)},aCliente,nOpc)
If lMsErroAuto
Mostraerro()
Return .f.
EndIf
Return .t.

Exerccios
1. Criar uma rotina que inclua automaticamente pelo MSEXECAUTO um pedido de
vendas com 2 itens quaisquer.
Apoio: ROT_AUTO.PRW
Funcao de inclusao:mata410()
Tabelas: SC5 e SC6
2. Criar uma rotina automtica para o cadastro de Clientes, para isso crie um grupo
de perguntas com as seguintes perguntas:
Nome, Endereco, CNPJ, telefone, tipo

Use o MSExecauto com esses campos.


Coloque no aRotina do Browse do exerccio anterior.
Lembre-se de gravar o cdigo usando a funo GETSXENUM()
Mostre na tela o cdigo gerado

ADVPL Consultoria e Treinamento|Programao e Tecnologia - ADVPL I -

Todos os Direitos Reservados 2010

78

Você também pode gostar