Escolar Documentos
Profissional Documentos
Cultura Documentos
Protheus Advpl 2010 PDF
Protheus Advpl 2010 PDF
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 -
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 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:
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 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:
&&
//
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 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
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 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 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).
Aprovaes
Nome
Assinatura
Data
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
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
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
LiniPad
12
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Adio
Subtrao
Multiplicao
Diviso
** ou ^
Exponenciao
String
Os operadores utilizados para tratamento de caracteres so:
+
Concatenao de strings com eliminao dos brancos finais das strings intermedirias
Relacionais
Os operadores utilizados para operaes e avaliaes relacionais so:
<
Menor que
>
Maior que
Igual
==
<=
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
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
+=
-=
*=
/=
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
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.
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
b. (
c. (
d. (
e. (
f. (
g. (
h. (
16
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Col1
Col2
Col3
Lin1
Lin2
Lin3
A
D
G
B
E
H
C
F
I
Col1
Col2
Col3
Lin1
Lin2
Lin3
Y
D
G
B
E
Z
C
X
I
17
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
18
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
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
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
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
21
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Parmetros
CASE
Comandos...
Exemplo
Local nMes
:= Month(Date())
Local cPeriodo := ""
DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
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.
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.
23
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
24
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos 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 (;)
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.
27
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
28
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos 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
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.
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.
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.
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.
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.
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
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)
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
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.
Obrigat.
Tipo
Descrio
cblock
uparam
Sim
Exemplo
#include "protheus.ch"
User Function VerFun()
IF EXISTBLOCK(MT100GRV)
EXECBLOCK(MT100GRV,.F.,.F.,aParam)
ENDIF
Return .t.
36
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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:
37
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
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
Obrig
TTipo
Descrio
cAlias
Sim
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.
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
=============================================
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 -
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
==============================================="
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
41
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
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
43
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos 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:
45
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
46
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Manipulao de Stings
VAL - Converte valor em texto.
Sintaxe : VAL( cValor )
Argumento
Obrigat.
Tipo
Descrio
cValor
Sim
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
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
Obrigat.
Tipo
Descrio
cConteudo
nCount
Sim
Sim
C
N
Exemplo:
cCodigo
:= Paralelepipedo
cPedaco1 := Left(cCodigo,5) // cPedaco1 ter o contedo paral
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
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
Exemplo:
cCodigo := Parede
cCodigo := Padc(cCodigo,14) // cCodigo ter o contedo
Parede
Obrigat.
Tipo
Descrio
cConteudo
nCount
Sim
Sim
C
N
Exemplo:
cCodigo := Parede
cCodigo := Padr(cCodigo,14) // cCodigo ter o contedo
Parede
Obrigat.
Tipo
Descrio
cConteudo
nCount
Sim
Sim
C
N
Exemplo:
cCodigo := Parede
cCodigo := Padl(cCodigo,14) // cCodigo ter o contedo Parede
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
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
Exemplo:
cCodigo := Parede
cCodigo := Ltrim(cCodigo) // cCodigo ter o contedo Parede
Obrigat.
Tipo
Descrio
cConteudo
Sim
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
Obrigat.
Tipo
Descrio
dData
Sim
Data a converter
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
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
Obrigat.
Tipo
Descrio
nConteudo
nCount
Sim
Sim
N
N
Valor a converte
Qtde de caracteres
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
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 } }
Obrigat.
Tipo
Descrio
NQtdElem1
Sim
[nQtdElemN]
No
Exemplos
aArray := ARRAY(5) ou aArray := { NIL, NIL, NIL, NIL, NIL }
aArray := ARRAY(3, 2) ou aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} }
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
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
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] })
53
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
Obrigat.
Tipo
Descrio
CAlias
cArqNtx
cIndCond
Sim
Sim
Sim
C
C
C
CTipo
No
cFiltro
cMensagem
No
Sim
C
C
lMostra
No
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).
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.
56
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Obrigat.
Tipo
Descrio
CAlias
Sim
C ou N
Obrigat.
Tipo
Descrio
NOrd
Sim
Nmero do ndice
Obrigat.
Tipo
Descrio
CChave
Sim
lEncontra
No
Obrigat.
Tipo
Descrio
NStep
Nao
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
Obrigat.
Tipo
Descrio
NReg
Sim
Numero do Registro
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
58
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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)
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
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
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
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
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.
61
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
cDefault
Obrigat.
Tipo
Descrio
cNomFun
Sim
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
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
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])
Return
63
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
Obrigat.
Tipo
Descrio
cArqOri
Sim
Sim
No
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
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
65
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
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
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)
67
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos Direitos Reservados 2010
Argumento
Obrigat.
Tipo
Descrio
cGrupo
cPerEng
Sim
Sim
Sim
No
No
cVar
Sim
cTipo
Sim
Sim
No
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
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
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
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
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
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
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
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
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.
75
Advpl I - Plus
Programao e Tecnologia - Verso 5.0 07/2010 Todos 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.
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:={
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
78