You are on page 1of 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 Data

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

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 CCampo LiniPad

uRet := CriaVar(cCampo,lIniPad)
tipo de retorno de acordo com o dicionrio de dados, considerando inicializador padro. Nome do campo 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:
+ * / ** ou ^ % Adio Subtrao Multiplicao Diviso 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 ! E 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. ( b. ( c. ( d. ( e. ( f. ( g. ( h. ( ) _lTudo na linha 25ser nula. ) nTempo do tipo caracter. ) lcont tem o contedo Verdadeiro. ) lVar no esta visvel na linha 29 ) lTudo na linha 25 tem seu identificador Local ) cNom na linha 18 nula ) lVar no pode ser acessada na linha 25 ) 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 Lin1 Lin2 Lin3 Col1 A D G Col2 B E H Col3 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 Lin1 Lin2 Lin3 Col1 Y D G Col2 B E Z Col3 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 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.

Comandos EXIT LOOP

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 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.

Comandos EXIT

LOOP

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 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.

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

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 lRetPar Obrig Sim No Tipo C L 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.

uRet

No

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 cConteudo Obrig Sim Sim Tipo C U 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 cConteudo cFil Obrig Sim Sim No Tipo C U C 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 lHelp Obrig Sim No Tipo C L 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.

uRet cFil

No No

U C

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 lHelp Obrig Sim Sim No Tipo C C L 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 lMostra Obrig Sim Sim T Tipo C C 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 cFun uparam Obrigat. Sim No Tipo B U Descrio 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 cblock uparam Exemplo #include "protheus.ch" User Function VerFun() IF EXISTBLOCK(MT100GRV) EXECBLOCK(MT100GRV,.F.,.F.,aParam) ENDIF Return .t. Obrigat. Sim Tipo B Descrio Nome da Funo Padro

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 cAlias Obrig Sim TTipo C Descrio 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 wnRel cbCont Cabec1 Cabec2 Cabec3 Tamanho cDesc1 cDesc2 cDesc3 Limite Titulo aReturn Nomeprog cString Li m_pag aOrd nLastKey cPerg aLinha Ident Local Local Local Local Local Local Local Local Local Local Local Private Private Private Private Private Private Private Private Private Tipo C N C C C C C C C N C A C C N N A N C A Descrio 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 cAlias cPrograma cPerg cTitulo cDesc1 cDesc2 cDesc3 lDic aOrd lCompres cTam uPar1 lFiltro lCrystal cNomeDrv uPar2 lServidor cPortaImpr Ident Sim Sim No No No No No No No No No No No No No No No No Tipo C C C C C C C L A L C U L L C U L C Descrio 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 cValor Obrigat. Sim Tipo C Descrio 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 cConteudo nValIni nCount Obrigat. Sim Sim Sim Tipo C N N Descrio 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 cConteudo nCount Obrigat. Sim Sim Tipo C N Descrio 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 cConteudo nCount Obrigat. Sim Sim Tipo C N Descrio 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 cConteudo nCount Obrigat. Sim Sim Tipo C N Descrio 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 cConteudo nCount Obrigat. Sim Sim Tipo C N Descrio 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 cConteudo nCount Obrigat. Sim Sim Tipo C N Descrio 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 cConteudo Obrigat. Sim Tipo C Descrio 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 cConteudo Obrigat. Sim Tipo C Descrio 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 cConteudo Obrigat. Sim Tipo C Descrio 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 DTOS Converte data em String Sintaxe: DTOS( dData )
Argumento dData Obrigat. Sim Tipo D Descrio Data a converter

ter o contedo da data de hoje

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 dData Obrigat. Sim Tipo D Descrio Data a converter

Exemplo: cData := dtoc(date()) // cData ter o contedo 31/12/2006 STOD Converte String em data Sintaxe: STOD( cData )
Argumento cData Obrigat. Sim Tipo C Descrio 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 cData Obrigat. Sim Tipo C Descrio 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 dData Obrigat. Sim Tipo D Descrio Data

Exemplo: nMes := Month(date()) // nMes ter o contedo 12 para a data 31/12/06 DAY Retorna o dia Sintaxe: Day( dData )
Argumento dData Obrigat. Sim Tipo D Descrio 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 dData Obrigat. Sim Tipo D Descrio 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 dData Obrigat. Sim Tipo D Descrio 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 nConteudo Obrigat. Sim Tipo N Descrio Valor a converte

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

STRZERO Converte numero em caracter,preenchendo com Zeros a esquerda. Sintaxe: Strzero( nConteudo, nCount )
Argumento nConteudo nCount Obrigat. Sim Sim Tipo N N Descrio 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 nConteudo CMask Obrigat. Sim Sim Tipo N N Descrio 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 AAlvo expValor Obrigat. Sim Sim Tipo A Todos Descrio 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 NQtdElem1 [nQtdElemN] Obrigat. Sim No Tipo N N Descrio 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 AOrigem <expSearch> Obrigat. Sim Sim Tipo A Todos Descrio 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 aOrigem NInicio Obrigat. Sim No Tipo A N Descrio 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.

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] })

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 aCampos lExclus Obrigat. No Sim Tipo A L 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 CAlias cArqNtx cIndCond CTipo cFiltro cMensagem lMostra Obrigat. Sim Sim Sim No No Sim No Tipo C C C C C C L Descrio 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 CAlias Obrigat. Sim Tipo C ou N Descrio Se numrico, seleciona rea pelo nmero, se Caracter, seleciona a rea pelo Apelido.

DBSETORDER Seleciona um ndice pela ordem. Sintaxe: DBSETORDER(nOrd)


Argumento NOrd Obrigat. Sim Tipo N Descrio 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 CChave Obrigat. Sim Tipo C Descrio 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)

lEncontra

No

DBSKIP Salta registro da tabela corrente. Sintaxe: DBSKIP(nStep)


Argumento NStep Obrigat. Nao Tipo N Descrio 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 BFiltro CFiltro Obrigat. Sim Sim Tipo B C Descrio 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 NReg Obrigat. Sim Tipo N Descrio Numero do Registro

DBUSEAREA Abre uma tabela e a deixa corrente. Sintaxe: DBUSEAREA( lNew, cDriver, cNomArq, cAlias, lShared, lReadOnly)
Argumento LNew CDriver cNomArq CAlias LShared lReadOnly Obrigat. No No Sim Sim No No Tipo L C C C L L 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 argumentos expresses URet Obrigat. No Sim Tipo Diversos Diversos 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 BVar Par1,Par2..Parx URet Obrigat. Sim No Tipo Bloco Diversos Descrio Bloco a ser executado Lista de argumentos que o bloco informado necessita receber. Retorno ser o resultado da ultima expresso da lista de expresses.

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 BVar BFor BWhile Obrigat. Sim No No Tipo Bloco Bloco Bloco Descrio Bloco a ser executado Lista de argumentos que o bloco informado necessita receber. Retorno ser o resultado da ultima expresso da lista de expresses.

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 AArray BBloco NInicio NCount Obrigat. Sim sim No No Tipo Array Bloco Numerico Numerico Descrio 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.

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 cParam cDefault Obrigat. Sim Sim Tipo C C Descrio Parametro da seo no arquivo INI Contedo Padro, caso no seja encontrado o parmetro cParam na seo do INI.

GetFuncArr() Retorna um array com as funes do repositrio do ambiente corrente. Sintaxe: aVar := GetFuncArr( cNomFun)
Argumento cNomFun Obrigat. Sim Tipo C Descrio 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 cFun Obrigat. Sim Tipo C Descrio 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 cNomProg Obrigat. Sim Tipo C Descrio 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 //MATA410.PRX -> Nome do arquivo //ADVPL -> Codificada Em //BUILD_FULL -> Quem Compilou, TOTVS ou Cliente //23/01/2007 -> Data da ltima Modificao.

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 cArqOri cArqDest lComp Obrigat. Sim Sim No Tipo C C L 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 cArqOri cArqDest lComp Obrigat. Sim Sim No Tipo C C L Descrio 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.

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 cADEmp cADFil cUser cSenha cADMod aTables 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 Obrigat. Sim Sim No No No No Tipo C C C C C A Descrio Cdigo da Empresa Cdigo da Filial Usurio do Protheus Senha do Protheus Sigla do mdulo Array com os alias necessrios

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 cAlias cTitulo cVldExc cVldAlt Arotadic Bpre Bok Aauto Nopcauto Btts Bnotts Abuttons Obrigat. Sim Sim No No No No No No No No No No Tipo C C C C A B B A N B B A Descrio 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

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 cPergunta lMostra cTitle Obrigat. Sim No No Tipo C L C Descrio 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 cGrupo cOrdem cPergunt cPerSpa cPerEng cVar cTipo nTamanho nDecimal nPresel cGSC cValid cF3 cGrpSxg cPyme cVar01 cDef01 cDefSpa1 cDefEng1 cCnt01 cDef0x cDefSpax cDefEngx aHelpPor aHelpEng aHelpSpa cHelp Obrigat. Tipo C C C C C C C N N N C C C C C C C C C C C C C A A A C Descrio Grupo de perguntas do SX1 (X1_GRUPO) Ordem do parmetro no grupo (X1_ORDEM) Descrio da pergunta em portugus Descrio da pergunta em espanhol Descrio da pergunta em ingls Nome da varivel de controle (X1_VARIAVL) Tipo do parmetro Tamanho do contedo do parmetro Nmero de decimais para contedos numricos 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 auxiliar

Sim Sim Sim No No Sim Sim Sim No No Sim


No No No No No No No No No No No No No No No No

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 NT Nl Nb Nr Calias

Obrigat. No No No No Sim

Tipo N N N N C

Descrio 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. 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.

Afixe

No

Ccpo

No

Nposi

No

Cfun

No

Ndefault

No

Acolors

No

Ctopfun

No

Cbotfun

No

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 Bparbloco No No N B 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.

Lnotopfilter

No

Lseeall

No

Lchgall

No

Cexprfiltop

No

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 cTitulo aCab

Obrigat. Sim Sim

Tipo C A

Descrio 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

aRod

Sim

aGetdados nOpc

Sim Nao

A N

cLinOk cTudOk aCols bF4 cInitPos nMax aCoord lDelGet lMaximized aButtons

No Nao Sim No No No No No No No

C C A B C N A L L A

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 cTitulo cAlias1 cAlias2 aEnchoice cLinOk cTudOK nOpc1 nOpc2 cFieldOk lVirtual nLinhas aAltEnchoice nFreeze aButtons aCoord nSize

Obrigat. Sim Sim Sim Sim No No No No No No No No No No No No

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

Descrio 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.
Todos os Direitos Reservados 2010

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

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 fPgmPad aCampos nOpc Obrigat. Sim Sim No Tipo B A N Descrio 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

You might also like