Você está na página 1de 174

1

PROGRAMAO ADVPL

PROGRAMAO ADVPL 7.10

Objetivos do Curso ..................................................... 6 Metodologia do Curso ................................................... 6 Linguagem de Programao ADVPL ......................................... 6 Programao com Interface Prpria com o Usurio ........................ 7 Criando Variveis ...................................................... 8 Padronizao de variveis .............................................. 8 Operadores ............................................................. 9 Estrutura de controles ................................................ 11 For ... Next .......................................................... 11 While ... End ......................................................... 12 If ... Elseif ... Else ... Endif ...................................... 13 Do Case ... Case ... Otherwise ... End Case ........................... 13 Macro ................................................................. 14 Bloco de cdigo ....................................................... 14 Tcnicas de programao e anlise ..................................... 15 Regras de nomeao do arquivo de cdigo-fonte ......................... 16 Construo de funes ................................................. 16 Criao e Atribuio de Variveis ..................................... 17 Matrizes .............................................................. 21 Matrizes como Estruturas .............................................. 21 Cuidados com Matrizes ................................................. 22 Inicializando Matrizes ................................................ 23 Blocos de Cdigo ...................................................... 24 Lista de Expresses ................................................... 25 Convertendo para uma Lista de Expresses .............................. 26 Onde Pode-se Utilizar uma Lista de Expresses? ........................ 26 Executando um Bloco de Cdigo ......................................... 27 Passando Parmetros ................................................... 28 Utilizando Blocos de Cdigo ........................................... 28 Validao de campo .................................................... 29 Cuidados com Posicionamentos de Registros ............................. 32 Funo Posicione ...................................................... 33 Funo ExistCpo ....................................................... 33 Funo SetPrint ....................................................... 34 Problemas com Looping de Programas .................................... 34 Manipulao de Arquivos Externos ao Protheus .......................... 35

PROGRAMAO ADVPL 7.10

3 Desenvolvendo Telas ................................................... 36 Salvando Arrays padres .............................................. 37 Para Entendimento do Conceito de Integridade Referencial .............. 37 Atualizando SX (ATUSX) ................................................ 37 Comandos definidos pelo usurio (UDCs) ................................ 38 Uso de Strings ........................................................ 39 ndices ............................................................... 40 Para deletar este ndice de trabalho no final do processamento: ....... 40 Conceito de Filial e Compartilhamento de Arquivos ..................... 40 Arquivos Compartilhados ............................................... 40 Arquivos Exclusivos ................................................... 41 Tcnicas para Filtragem ............................................... 41 Chaves Primrias ...................................................... 42 Chaves Estrangeiras ................................................... 42 Integridade Referencial ............................................... 42 Controle de Semforo .................................................. 42 Funes aplicadas em gatilhos ......................................... 43 Funes para Cadastros ................................................ 49 AxCadastro() Cadastro Padro ........................................ 49 MBrowse() ............................................................. 50 Modelo2() ............................................................. 55 Modelo3() ............................................................. 64 Relatrios ............................................................ 76 Variveis de Relatrios ............................................... 77 SetPrint() ............................................................ 77 SetDefault() .......................................................... 78 Pergunte() ............................................................ 78 SetRegua() ............................................................ 79 RptStatus() ........................................................... 79 IncRegua() ............................................................ 79 Desenvolvendo Relatrios .............................................. 79 Perguntas e Respostas ................................................. 84 Exerccios ........................................................... 117 Pontos de Entradas ................................................... 120 Objetivo dos Pontos de Entrada ....................................... 120 Quando criar um Ponto de Entrada ..................................... 120 Procedimentos para sua criao ....................................... 121 Processamento ........................................................ 124

PROGRAMAO ADVPL 7.10

4 Processa() ........................................................... 124 GUIA DE REFERNCIA RPIDA AdvPL ...................................... 126 FUNES PARA O INTERPRETADOR XBASE ................................... 126

PROGRAMAO ADVPL 7.10

PROGRAMAO ADVPL 7.10

INTRODUO-VISO GERAL DO CURSO


Este curso foi elaborado com o objetivo de capacitar os analistas e programadores do Protheus a utilizarem os recursos da Linguagem de Programao ADVPL para que seja possvel a aplicao s rotinas de sua empresa, proporcionando a automao no controle das necessidades referentes as customizaes futuras no Protheus.

Objetivos do Curso
O objetivo deste curso programao Protheus, apresentadas. Alm de desenvolver consultas em arquivos, entradas e criao de prpria ferramenta. ensinar como utilizar as principais funes de utilizando exemplos prticos das funes programas utilizados em gatilhos, cadastros, relatrios, rotinas de processamento, pontos de telas de dilogo, por meio de utilitrios da

Metodologia do Curso
O curso de Linguagem de Programao ADVPL ministrado com um kit de treinamento composto por: Apostila: Aborda as rotinas do Protheus, conduzindo o aluno em sua utilizao por meio de uma srie de exerccios para prtica e reviso da matria. Para que o grau de aprendizado proposto seja obtido, os exerccios devem ser executados junto ao Sistema, exatamente da forma como esto apresentados; A cada captulo, o aluno posicionado sobre o contedo fornecido e os assuntos complementares que sero expostos. Manual Eletrnico: Para verificar o manual eletrnico da Linguagem de Programao ADVPL, posicione no menu principal da ferramenta e pressione a tecla <F1>. Materiais de Apoio: Pasta e caneta. O aluno deve acompanhar este curso nas instalaes da MICROSIGA ou em uma de suas franquias, com o direcionamento de um instrutor que conduzir as sesses de treinamento de modo que os objetivos propostos sejam atingidos.

Linguagem de Programao ADVPL


A Linguagem de Programao ADVPL tem como objetivo permitir ao usurio Protheus a construo de seus prprios programas, agregando-os aos menus dos ambientes e executando-os de uma forma transparente ao operador. De forma anloga, as rotinas escritas pelo usurio tambm podem ser executadas por meio de funes ExecBlock() ou U_<Funo>, que contm um conjunto de expresses executadas em tempo real. O usurio tem a possibilidade de utilizar os recursos de programao adotados pelo Protheus, por meio de um grande nmero de funes desenvolvidas pela prpria MICROSIGA e de funes da Linguagem de Programao de origem, o que agiliza a criao de novas opes sem que o prprio usurio perceba que esteja utilizando algo que no original.

PROGRAMAO ADVPL 7.10

7 A linguagem ADVPL teve seu incio em 1994, sendo na verdade uma evoluo na utilizao de linguagens no padro xBase pela Microsiga Software S. A. (Clipper, Visual Objects e depois FiveWin). Com a criao da tecnologia Protheus, foi necessrio criar uma linguagem que suportasse o padro xBase para a manuteno de todo o cdigo existente do Sistema ERP SIGA MP8. Foi ento criada a linguagem chamada MP8 Protheus Language. O ADVPL uma extenso do padro xBase de comandos e funes, operadores, estruturas de controle de fluxo e palavras reservadas, contando tambm com funes e comandos disponibilizados pela MICROSIGA que a torna uma linguagem completa para a criao de aplicaes ERP prontas para a Internet. Tambm uma linguagem orientada a objetos e eventos, permitindo ao programador desenvolver aplicaes visuais e criar suas prprias classes de objetos. Quando compilados, todos os arquivos de cdigo tornam-se unidades de inteligncia bsicas, chamados APOs (MP8 Protheus Objects). Tais APOs so mantidos em um repositrio e carregados dinamicamente pelo MP8 Protheus Server para a execuo. Como no existe a linkedio ou unio fsica do cdigo compilado a um determinado ambiente ou aplicao, funes criadas em ADVPL podem ser executadas em qualquer ponto do ambiente Protheus. O compilador e o interpretador da linguagem ADVPL o prprio servidor Protheus (MP8 Protheus Server) e existe um ambiente visual para desenvolvimento integrado (MP8 Protheus IDE) no qual o cdigo pode ser criado, compilado e depurado. Os programas em ADVPL podem conter comandos ou funes de interface com o usurio. De acordo com tal caracterstica, tais programas so subdivididos nas seguintes categorias:

Programao com Interface Prpria com o Usurio


Nesta categoria, entram os programas desenvolvidos para serem executados por meio do terminal remoto do Protheus, o MP8 Protheus7 Remote. O MP8 Protheus Remote a aplicao encarregada da interface e da interao com o usurio, sendo que todo o processamento do cdigo em ADVPL, o acesso ao banco de dados e o gerenciamento de conexes efetuado no MP8 Protheus7 Server. O MP8 Protheus Remote o principal meio de acesso a execuo de rotinas escritas em ADVPL no MP8 Protheus Server, e por isso permite executar qualquer tipo de cdigo, tenha ele interface com o usurio ou no. Porm, nesta categoria so considerados apenas os programas que realizem algum tipo de interface remota utilizando o protocolo de comunicao do MP8 Protheus. Pode-se criar rotinas para a customizao do sistema ERP MP8 Protheus, desde processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o ambiente montado pelos ambientes do ERP MP8 Protheus. Porm, com o ADVPL possvel at mesmo criar toda uma aplicao, ou ambiente, do comeo. Todo o cdigo do sistema ERP MP8 Protheus escrito em ADVPL.

PROGRAMAO ADVPL 7.10

O que voc aprendeu neste captulo


Neste captulo, aprendemos a definir as preferncias e as configuraes necessrias para iniciarmos a utilizao do ambiente de desenvolvimento do Protheus.

Prximo Passo
No prximo captulo, iremos aprender como utilizar gatilhos aplicando funes nas regras.

Criando Variveis O que voc ir aprender neste captulo


Neste captulo, aprenderemos como criar funes em ADVPL e utiliz-las por meio de gatilhos, ou seja, como disparar um programa customizado atravs do preenchimento de um determinado campo em uma tela de digitao de dados como, por exemplo, um cadastro.

Rotinas Abordadas
Variveis. Na criao de fundamentais: uma varivel deve-se ter em mente alguns pontos

a declarao; o tipo de varivel; a funo CRIAVAR(); a inicializao.

Padronizao de variveis
Deve ser feita sempre no incio da rotina, como no exemplo: User Function a910VerCod() Local cCod910 := 001 Return O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da rotina. Toda varivel deve estar tipada durante sua criao. Quando programamos nativamente em C, isto torna-se obrigatrio. Devemos fazer o mesmo no MP8, pois demonstra que a varivel foi conscientemente declarada.

Variveis e tipos de dados


Caractere quando os dados armazenados possuem, em sua composio, caracteres numricos (0-9), caracteres alfabticos (a-z ou A-Z) ou

PROGRAMAO ADVPL 7.10

9 especiais (+*#%<>^~, etc). Os valores ou constantes a serem armazenados devem ser sempre delimitados por aspas () ou apstrofos (). Se houver necessidade de declarar uma varivel do tipo caractere, mas a princpio no existir nenhum caractere para atribu-lo, ento poder declarar da seguinte maneira: cVar := ou cVar := Numrica quando os dados ou constantes nela armazenados possuem, em sua composio somente caracteres numricos, os sinais + ou e o ponto decimal (o ponto decimal e no vrgula, pois o Protheus utiliza o sistema americano). Essas variveis destinam-se, portanto, realizao de clculos matemticos. Um dado ou uma constante numricos no devem ser delimitados por nenhum smbolo, caso contrrio sero considerados como caractere ou ocorrer algum erro. O valor nulo para variveis ou constantes numricos o zero. Lgica quando o dado armazenado representar apenas dois estados possveis: falso ou verdadeiro, seu contedo poder ser .T. (true verdadeiro) ou .F. (false falso). Os valores armazenados devem ser sempre delimitados por pontos, por exemplo: .T. ou .F.. Data quando os dados nela armazenados possurem em sua composio 8 (oito) posies constitudas por nmeros e / no formato 99/99/99. Est varivel representa datas e permite a realizao de uma srie de operaes com ela, como a obteno da diferena entre duas datas em nmero de dias. Para a definio de variveis tipos data necessrio utilizar a funo Ctod(), que transforma dados tipo caractere em dados tipos data. Por exemplo: dEmisso := Ctod(25/01/04) Vetor ou Array ou Matriz vetor apenas uma coletnea de dados agrupados por uma tabela de endereos. Isso permite que cada elemento do vetor possa ter tamanho, tipo e formato diferentes. A sua declarao pode ser: Local aVetor := {} para este caso no foi definido nenhuma dimenso para o vetor. ou Local aVetor := Array(3) para este caso o vetor ter somente trs colunas em sua dimenso. Por exemplo: aVetor := { Nil, Nil, Nil } ou Local aVetor := Array(3,2) para este caso o vetor ter sua dimenso em linhas (elementos) e colunas. Por exemplo: aVetor := { { Nil, Nil }, { Nil, Nil }, { Nil, Nil } } A funo Array() inicia um tamanho especfico para o vetor.

Operadores
Matemticos ** ou ^ * Exponenciao Multiplicao

PROGRAMAO ADVPL 7.10

10 / % + Relacionais < > == <= >= <> ou # ou != Lgicos .Not. ou ! .And. .Or. Atribuio := += -= *= /= ^= ou **= %= Diviso Mdulo (resto da diviso) Adio ou sinal positivo Subtrao ou sinal negativo

Menor que Maior que Igual a Menor que ou igual a Maior que ou igual a Diferente

No lgico E lgico Ou lgico

Permite atribuir um valor a uma varivel Adiciona antes de atribuir Subtrai antes de atribuir Multiplica antes de atribuir Divide antes de atribuir Eleva antes de atribuir Calcula o mdulo antes de atribuir

Incremento/Decremento ++x X++ --x x Strings x+y Soma um ao valor de x e ento retorna o valor de x j atualizado Retorna o valor de x e ento soma um ao valor de x Subtrai um do valor de x e ento retorna o valor de x j atualizado Retorna o valor de x e ento subtrai um do valor de x

x-y

x $ y

Concatenao dos strings x e y Concatenao dos strings, mas os espaos em branco direita do primeiro operando (x) sero transferidos para o fim do string resultante da concatenao Retorna verdadeiro se o contedo da varivel x estiver contido no contedo da varivel y

Especiais

PROGRAMAO ADVPL 7.10

11 &cVariavel || () [] {} -> @ ; : Operador macro Indica uma lista de argumento em um bloco de cdigo Funo ou agrupamento em frmula numrica ou macro operador Referncia a um elemento de uma matriz Delimitador do bloco de cdigo ou atribuio de valores literais para uma matriz Referncia a um alias, sendo um indicador Passagem de parmetros por referncia Separa instrues numa mesma linha Usando como operador send quando acessa nova classe de objeto, atribuio a objeto

Estrutura de controles For ... Next


Permite definir um lao de comandos For nVar := nExpr1 To Expr2 [Step nExpr3] <comandos> [Exit] <comandos> [Loop] Next nVar varivel de comando do lao nExpr1 valor inicial da varivel de controle nExpr2 valor final da varivel de controle nExpr3 incremento (n) ou decremanto (-n) da varivel de controle (default 1)

Exerccio 01 User Function testefor() Local nCnt Local aX[10] Local aY := Array(10)

PROGRAMAO ADVPL 7.10

12 Local aZ := {0,0,0,0,0,0,0,0,0,0} For nCnt := 1 To 10 aX[nCnt] := nCnt * nCnt Next nCnt Return()

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina.

While ... End


O While um comando de programao estruturada que permite que as instrues contidas entre while e o associado end sejam repetidas enquanto uma determinada condio permanecer verdadeira. While <expresso lgica> <comandos...> [Exit] <comandos...> [Loop] End

Exerccio 02 User Function TesteWhile() Local nCnt:=1 Local aX While nCnt<=10 nCnt:=nCnt * nCnt nCnt++ Enddo Return

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. Exit Transfere o controle para fora do lao definido pelos comandos While e For. Loop Transfere o controle para o mais recente While ou For executado.

PROGRAMAO ADVPL 7.10

13

If ... Elseif ... Else ... Endif


O comando if um comando de programao que permite executar condicionalmente um bloco de instrues, tambm conhecido como desvio condicional. Cada if deve obrigatoriamente terminar com um endif. If <condio> <comandos...> Elseif <condio> <comandos...> Else <comandos...> Endif Exerccio 03 User Function testeif() Local nCnt Local aX Local bX if nCnt == 10 aX := nCnt++ bX := aX endif Return() Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina.

Do Case ... Case ... Otherwise ... End Case


O comando Do Case ... EndCase estruturado e seleciona apenas um caminho entre um conjunto de caminhos alternativos para o curso do fluxo de execuo. Do Case Case <condio> <comandos...> Case <condio> <comandos...> Otherwise <comandos...> EndCase

Exerccio 04 User Function tesCase() nOpcao := 1 Do Case Case cOpcao == 1

PROGRAMAO ADVPL 7.10

14 MsgAlert(Opo Case cOpcao == 2 MsgAlert(Opo Case cOpcao == 3 MsgAlert(Opo Otherwise MsgAlert(Opo EndCase Return Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. 1 selecionada!) 2 selecionada!) 3 selecionada!) selecionada invlida!)

Macro
Embora a macro no seja uma funo propriamente dita, ela assim considerada por convenincia. Seu propsito substituir o nome de uma varivel tipo caractere, diretamente pelo seu contedo em qualquer lugar que aparea. &<nome da varivel caractere> Exerccio 05 Exemplo: cVar := A1_NOME Alert(cVar) => resultado: A1_NOME Alert(&cVar) => resultado: CLIENTE COMPRA BEM LTDA.

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. A utilizao da funo & (macro) um dos mais interessantes recursos de programao. Ela realiza a substituio do nome de uma varivel caractere pelo seu contedo, permitindo grande flexibilidade de programao, principalmente, na substituio de parmetros. A funo macro somente pode ser utilizada com variveis tipo caractere. Uma macro pode ser utilizada para substituir constantes, nome de variveis, expresses completas, incluindo funes e operadores, ttulos, condies e processos recursivos.

Bloco de cdigo
Bloco de cdigos so pores pr-compiladas de cdigos que a semelhana do operador Macro, podem ser chamadas em tempo de execuo.

PROGRAMAO ADVPL 7.10

15 So representados internamente como string de cdigo, da mesma forma que funes e procedures. Quando um bloco de cdigo atribudo a uma varivel em tempo de execuo, um ponteiro gerado para esta varivel que est na tabela de alocao. Exemplo: bBloco := {|x,y| if( x > y, Maior, Menor)} Eval( bBloco, cVar1, cVar2 ) O exemplo acima pode ser comparado a uma funo. Exerccio 06 Function bBloco(x,y) Local cRet If x > y cRet := Maior Else cRet := Menor Endif Return( cRet )

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina.

Tcnicas de programao e anlise


Padres estruturais adotados para o Protheus Variveis e memria Metasmbolos Descrevem a natureza geral dos elementos bsicos da sintaxe. constitudo com um prefixo que define o tipo de dado, seguido do descritor lgico do nome do campo. Abaixo est uma sugesto de regra de formatao de variveis: <xNomeVar> <x> o prefixo do nome da varivel a letra minscula do tipo de dado obtido como o exemplo abaixo: a para Array ex.: aBotao c para Caractere ex.: cNome b para Bloco de Cdigo ex.: bBloco n para Numrica ex.: nTotal d para Data ex.: dEmissao l para Lgica ex.: lVazio m para Memo ex.: mTexto n para Polimrfica ex.: xBuffer <NomeVar> o nome lgico do campo que deve ser escrito de forma capital, isto , a primeira letra do nome que compe o campo deve ser maiscula. O nome deve ser absolutamente significativo. Exemplo: um campo para armazenar o custo mdio deve ter uma nomenclatura similar a esta: nCustoMedio Embora o Protheus possua a limitao de dez posies para o nome da varivel, esta pode ser desprezada nos programas, desde que no gerem duplicidade de smbolos.

PROGRAMAO ADVPL 7.10

16 Exemplo: nCustoMedio1 e nCustoMedio2 ambas sero truncadas em dez posies e sero entendidas como nCustoMedio. Campos de banco de dados Estes campos recebem a designao mais significativa possvel dentro da limitao de tamanho imposta pelo Protheus. A regra da formatao obedece seguinte ordem: <Xn_NOMECPO> <Xn> o prefixo convencionado para um nome de campo, deve ser formatado da letra indicativa da famlia do arquivo mais o nmero da ordem deste dentro da famlia, seguido de um underline. <NOMECPO> o nome do campo de banco de dados. Deve sempre ser referenciado em letra maiscula. Sua formatao deve ser a mais significativa possvel em at sete posies. Exemplo: CUSTMED Exemplos da formatao de campos: A1_NOME Para o nome do cliente no cadastro de clientes (SA1) B1_LOCPAD Para o local padro de armazenagem do produto no cadastro de produto (SB1)

Regras de nomeao do arquivo de cdigo-fonte


Processos EST Estoque FAT ATF FIN GPE COM CTB Faturamento Ativo Fixo Financeiro Gesto Pessoal Compras Contabilidade Prefixo R Programa Especfico G Gatilho W Web function C Crystal Report Sufixo A Atualizao C R M W Consulta Relatrio Miscelnea Workflow

O nome do programa ser formado da seguinte maneira: Prefixo + Processo + Seqencial em base dez Exemplo: RFATR010.PRW programa especfico para o faturamento seqncia 01 RFATR011.PRW programa especfico para o faturamento, porm um derivado do anterior RFATR020.PRW outro programa especfico para o faturamento seqncia 02

Construo de funes
Regra de formatao de nomes de funo e formato de escrita. Para funes monolticas (PRW) XXXA990 <0> a derivao do programa 0 (zero) para o programa principal <99> a seqncia do programa dentro do ambiente

PROGRAMAO ADVPL 7.10

17 <A> o tipo de programa, podendo ser: A para atualizaes C para consultas R para relatrios M para miscelnea <XXX> o prefixo de designao do ambiente Exemplo: MATA460 um programa de gerao do faturamento Para funes internas de programa. A999XXXX <XXXX> o nome significativo da funo (deve seguir a mesma regra de formatao de nomes livres) <A999> so as quatro ltimas posies do nome do programa a qual est vinculada. Exemplo: A460Gera uma funo vinculada a um programa de atualizao do ambiente que estiver rodando.

Criao e Atribuio de Variveis


Variveis de memria so um dos recursos mais importantes de uma linguagem. So reas de memria criadas para armazenar informaes utilizadas por um programa para a execuo de tarefas. Por exemplo, quando o usurio digita uma informao qualquer, como o nome de um produto em uma tela de um programa, esta informao armazenada em uma varivel de memria para posteriormente ser gravada ou impressa. A partir do momento que uma varivel criada, no necessrio mais referenciar ao seu contedo, e sim ao seu nome. O nome de uma varivel um identificador nico que segue duas regras: Mximo de 10 caracteres. O AdvPl no impede a criao de uma varivel de memria cujo nome contenha mais de 10 caracteres, porm apenas os 10 primeiros sero considerados para a localizao do contedo armazenado. Portanto, se forem criadas duas variveis cujos dez primeiros caracteres forem iguais, como nTotalGeralAnual e nTotalGeralMensal, as referncias a qualquer uma delas no programa resultaro o mesmo. Ou seja, sero a mesma varivel:

Exerccio 07 nTotalGeralMensal := 100 nTotalGeralAnual := 300 Alert(Valor mensal: + cValToChar(nTotalGeralMensal))

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300. Isso acontece porque no momento que esse valor foi atribudo varivel nTotalGeralAnual, o AdvPl considerou apenas os 10 primeiros caracteres (assim como o faz quando deve exibir o valor da varivel nTotalGeralMensal), ou seja, considerou-as como a mesma varivel. Assim o valor original de 100 foi substitudo pelo de 300.

PROGRAMAO ADVPL 7.10

18 Limitao de caracteres no nome. Os nomes das variveis devem sempre comear por uma letra ou o caracter de sublinhado ( _ ). No restante, pode conter letras, nmeros e o caracter de sublinhado. Qualquer outro caracter, incluindo espaos em branco, no so permitidos. O AdvPl permite a criao ilimitada de variveis, dependendo apenas da memria disponvel. A seguir esto alguns nomes vlidos para variveis:
TOT01 cNumero VAR_QUALQUER M_CARGO A11

E alguns invlidos:
1CODIGO (Inicia por um nmero) M CARGO (contm um espao em branco) LOCAL (palavra reservada do AdvPl)

O AdvPl no uma linguagem de tipos rgidos para variveis, ou seja, no necessrio informar o tipo de dados que determinada varivel ir conter no momento de sua declarao, e o seu valor pode mudar durante a execuo do programa. Tambm no h necessidade de declarar variveis em uma seo especfica do seu cdigo fonte, embora seja aconselhvel declarar todas as variveis necessrias no comeo, tornando a manuteno mais fcil e evitando a declarao de variveis desnecessrias. Para declarar uma varivel, deve-se utilizar um identificador de escopo, seguido de uma lista de variveis separadas por vrgula (,). Um identificador de escopo uma palavra-chave que indica a que contexto do programa a varivel declarada pertence. O contexto de variveis pode ser local (visualizadas apenas dentro do programa atual), pblico (visualizadas por qualquer outro programa), entre outros. Os diferentes tipos de contexto de variveis so explicados na documentao sobre escopo de variveis. Considere as linhas de cdigo de exemplo:
nResultado := 250 * (1 + (nPercentual / 100))

Se esta linha for executada em um programa AdvPl, ocorrer um erro de execuo com a mensagem variable does not exist: nPercentual, pois esta varivel est sendo utilizada em uma expresso de clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar a varivel previamente:
Local nPercentual, nResultado nResultado := 250 * (1 + (nPercentual / 100))

Neste exemplo, as variveis so declaradas previamente utilizando o identificador de escopo local. Quando a linha de clculo for executada, o erro de varivel no existente no mais ocorrer. Porm, variveis no inicializadas tm sempre o valor default nulo (Nil) e este valor no pode ser utilizado em um clculo, pois tambm gerar erros de execuo (nulo no pode ser dividido por 100). A resoluo deste problema efetuada inicializando-se a varivel por meio de uma das formas:

PROGRAMAO ADVPL 7.10

19

Exerccio 08 Local nPercentual,nResultado Store 10 To nPercentual nResultado := 250 * (1 + (nPercentual / 100)) ou Local nPercentual, nResultado nPercentual := 10 nResultado := 250 * (1 + (nPercentual / 100)) ou Local nPercentual := 10, nResultado nResultado := 250 * (1 + (nPercentual / 100))

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. A diferena entre o ltimo exemplo e os dois anteriores que a varivel inicializada no momento da declarao. Nos dois primeiros exemplos, a varivel primeiro declarada e ento inicializada em uma outra linha de cdigo. O comando store existe apenas por compatibilidade com verses anteriores e outras linguagens xBase, mas obsoleto. Deve-se utilizar o operador de atribuio (:= ou somente =). aconselhvel optar pelo operador de atribuio composto de dois pontos e sinal de igual, pois o operador de atribuio utilizando somente o sinal de igual pode ser facilmente confundido com o operador relacional (para comparao) durante a criao do programa. Uma vez que um valor lhe seja atribudo, o tipo de dado de uma varivel igual ao tipo de dado do valor atribudo. Ou seja, uma varivel passa a ser numrica se um nmero lhe atribudo, passa a ser caracter se uma string de texto lhe for atribuda, etc. Porm, mesmo que uma varivel seja de determinado tipo de dado, pode-se mudar o tipo da varivel atribuindo outro tipo a ela:

Exerccio 09 01 Local xVariavel // Declara a varivel inicialmente com valor nulo 02 03 xVariavel := Agora a varivel caracter... 04 Alert(Valor do Texto: + xVariavel) 05 06 xVariavel := 22 // Agora a varivel numrica 07 Alert(cValToChar(xVariavel))

PROGRAMAO ADVPL 7.10

20 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

xVariavel := .T. // Agora a varivel lgica If xVariavel Alert(A varivel tem valor verdadeiro...) Else Alert(A varivel tem valor falso...) Endif xVariavel := Date() // Agora a varivel data Alert(Hoje : + DtoC(xVariavel)) xVariavel := nil // Nulo novamente Alert(Valor nulo: + xVariavel) Return

Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar diversos tipos de dados. A letra x em minsculo no comeo do nome utilizada para indicar uma varivel que pode conter diversos tipos de dados, segundo a Notao Hngara (consulte documentao especfica para detalhes). Este programa troca os valores da varivel e exibe seu contedo para o usurio por meio da funo alert. Essa funo recebe um parmetro que deve ser do tipo string de caracter, por isso dependendo do tipo de dado da varivel xVariavel necessrio fazer uma converso antes. Apesar dessa flexibilidade de utilizao de variveis, deve-se tomar cuidados na passagem de parmetros para funes ou comandos e na concatenao (ou soma) de valores. Note a linha 20 do programa de exemplo. Quando esta linha executada, a varivel xVariavel contm o valor nulo. A tentativa de soma de tipos de dados diferentes gera erro de execuo do programa. Nesta linha do exemplo, ocorrer um erro com a mensagem type mismatch on +. Excetuando-se o caso do valor nulo, para os demais deve-se sempre utilizar funes de converso quando necessita-se concatenar tipos de dados diferentes (por exemplo, nas linhas 07 e 17). Note tambm que quando uma varivel do tipo de dado lgico, ela pode ser utilizada diretamente para checagem (linha 10):
If xVariavel

o mesmo que
If xVariavel = .T.

A declarao de variveis para os demais tipos de dados, matrizes e blocos de cdigo, exatamente igual ao descrito at agora. Apenas existem algumas diferenas quanto a inicializao que podem ser

PROGRAMAO ADVPL 7.10

21 consultadas na documentao de inicializao de matrizes e blocos de cdigo.

Matrizes
Matrizes ou arrays so colees de valores ou, de uma maneira mais fcil de entender, uma lista. Uma matriz pode ser criada por meio de diferentes maneiras. Consulte a documentao sobre Inicializao de Matrizes para maiores detalhes. Cada item em uma matriz referenciado pela indicao de sua posio numrica na lista, iniciando pelo nmero 1. O exemplo a seguir declara uma varivel e atribui uma matriz de trs elementos a ela, exibindo um dos elementos e o tamanho da matriz: Exerccio 10 Local aLetras // Declarao da varivel aLetras := {A, B, C} // Atribuio da matriz varivel Alert(aLetras[2]) // Exibe o segundo elemento da matriz Alert(cValToChar(Len(aLetras))) // Exibe o tamanho da matriz Dica Compile este exemplo e verifique pelo DEBUG o resultado desta rotina. O AdvPl permite a manipulao de matrizes facilmente. Enquanto que em outras linguagens como C ou Pascal necessrio alocar memria para cada elemento de uma matriz (o que tornaria a utilizao de pointeiros necessria), o AdvPl encarrega-se de gerenciar a memria e torna simples a adicio de elementos a uma matriz, utilizando a funo aAdd:
aAdd(aLetras,D) Alert(aLetras[4]) Alert(aLetras[5]) // Adiciona o quarto elemento ao final da matriz // Exibe o quarto elemento // Erro! No h um quinto elemento na matriz

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, em contraste com outras linguagens como C e Pascal.
aFunct1 := {Pedro,32,.T.}

Esta matriz contem uma string, um nmero e um valor lgico. Em outras linguagens como C ou Pascal, este pacote de informaes pode ser chamado como um struct (estrutura em C, por exemplo) ou um record (registro em Pascal, por exemplo). Como se fosse na verdade um registro de um banco de dados, um pacote de informaes construdo com diversos campos, cada campo tendo um pedao diferente de dado.

PROGRAMAO ADVPL 7.10

22 Suponha-se que, no exemplo anterior, o array aFunct1 contenha informaes sobre o nome de uma pessoa, sua idade e sua situao matrimonial. Os seguintes #defines podem ser criados para indicar cada posio dos valores dentro da matriz:
#define FUNCT_NOME 1 #define FUNCT_IDADE 2 #define FUNCT_CASADO 3

E considere mais algumas matrizes para representar mais pessoas:


aFunct2 := {Maria , 22, .T.} aFunct3 := {Antnio, 42, .F.}

Os nomes podem ser impressos assim:


Alert(aFunct1[FUNCT_NOME]) Alert(aFunct2[FUNCT_NOME]) Alert(aFunct3[FUNCT_NOME])

Agora, ao invs de trabalhar com variveis individuais, pode-se agruplas em uma outra matriz, do mesmo modo que muitos registros so agrupados em uma tabela de banco de dados:
aFuncts := {aFunct1, aFunct2, aFunct3}

Que equivalente a isso:


aFuncts := { {Pedro , 32, .T.}, ; {Maria , 22, .T.}, ; {Antnio, 42, .F.} }

aFuncts uma matriz com trs linhas por trs colunas. Uma vez que as variveis separadas foram combinadas em uma matriz, os nomes podem ser exibidos assim:
Local nCount For nCount := 1 To Len(aFuncts) Alert(aFuncts[nCount,FUNCT_NOME]) // O acesso a elementos de uma matriz multidimensional // pode ser realizado tambm desta forma: // aFuncts[nCount][FUNCT_NOME] Next nCount

A varivel nCount seleciona interesse. Ento a constante daquela linha.

que funcionrio (ou que linha) de FUNCT_NOME seleciona a primeira coluna

Cuidados com Matrizes


Matrizes so listas de elementos, portanto necessrio memria para armazenar estas informaes.

PROGRAMAO ADVPL 7.10

23 Como as matrizes podem ser multidimensionais, a memria necessria ser a multiplicao do nmero de itens em cada dimenso da matriz, considerando-se o tamanho do contedo de cada elemento contido nesta. Portanto, o tamanho de uma matriz pode variar muito. A facilidade da utilizao de matrizes, mesmo que para armazenar informaes em pacotes como descrito anteriormente, no compensada pela utilizao em memria quando o nmero de itens em um array for muito grande. Quando o nmero de elementos for muito grande, deve-se procurar outras solues como a utilizao de um arquivo de banco de dados temporrio. No h limitao para o nmero de dimenses que uma matriz pode ter, mas o nmero de elementos mximo, independente das dimenses onde se encontram, de 100000.

Inicializando Matrizes
Algumas vezes, o tamanho da matriz conhecido previamente. Outras vezes, o tamanho da matriz s ser conhecido em tempo de execuo.

Se o tamanho da matriz conhecido


Se o tamanho da matriz conhecido no momento que o programa escrito, h diversas maneiras de implementar o cdigo. Exerccio 11 Com base no exerccio anterior, faa com que ele somente funcione no ambiente Estoque/Custos. Local nCnt Local aX[10] Local aY := Array(10) Local aZ := {0,0,0,0,0,0,0,0,0,0} For nCnt := 1 To 10 aX[nCnt] := nCnt * nCnt Next nCnt Este cdigo preenche a matriz com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ... 81, 100. Note que a linha 07 refere-se varivel aX, mas poderia tambm trabalhar com aY ou aZ. O objetivo deste exemplo demonstrar trs modos de criar uma matriz de tamanho conhecido no momento da criao do cdigo. Na linha 02 a matriz criada usando aX[10]. Isto indica ao AdvPl para alocar espao para 10 elementos na matriz. Os colchetes [ e ] so utilizados para indicar o tamanho necessrio. Na linha 03 utilizada a funo array com o parmetro 10 para criar a matriz e o retorno desta funo atribudo varivel aY. Na linha 03 efetuado o que se chama desenhar a imagen da matriz. Como pode-se notar, existem dez 0s (zeros) na lista encerrada entre chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de 1000 elementos. O terceiro mtodo difere dos anteriores porque inicializa a matriz com os valores definitivos. Nos dois primeiros mtodos, cada posio da matriz contm um valor nulo (Nil) e deve ser inicializado posteriormente.

PROGRAMAO ADVPL 7.10

24 A linha 07 demonstra como um valor pode ser atribudo para uma posio existente em uma matriz especificando o ndice entre colchetes.

Se o tamanho da matriz no conhecido


Se o tamanho da matriz no conhecido at o momento da execuo do programa, h algumas maneiras de criar uma matriz e adicionar elementos a ela. O exemplo a seguir ilustra a idia de criao de uma matriz vazia (sem nenhum elemento) e a adio de elementos dinamicamente. Exerccio 12 Local Local Local Local nCnt aX[0] aY := Array(0) aZ := {}

For nCnt := 1 To nSize aAdd(aX,nCnt*nCnt) Next nCnt A linha 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum elemento, seu tipo de dado matriz. Na linha 03, a chamada da funo array cria uma matriz sem nenhum elemento. Na linha 04, est declarada a representao de uma matriz vazia em AdvPl. Mais uma vez, esto sendo utilizadas as chaves para indicar que o tipo de dados da varivel matriz. Note que {} uma matriz vazia (tem o tamanho 0), enquanto {Nil} uma matriz com um nico elemento nulo (tem tamanho 1). Porque cada uma destas matrizes no contm elementos, a linha 07 utiliza a funo aadd para adicionar elementos sucessivamente at o tamanho necessrio (especificado, por exemplo, na varivel nSize).

Blocos de Cdigo
Blocos de cdigo so um conceito existente h muito tempo em linguagens xBase. No como algo que apareceu da noite para o dia, e sim uma evoluo progressiva utilizando a combinao de muitos conceitos da linguagem para a sua implementao.

Um Primeiro Lembrete
O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim como o operador de atribuio :=. Assim, ao invs de escrever: x := 10 // Atribui o valor 10 varivel chamada X Alert(Valor de x: + cValToChar(x))

PROGRAMAO ADVPL 7.10

25

Posde-se escrever: // Atribui e ento exibe o valor da varivel X Alert(Valor de x: + cValtoChar(X := 10)) A expresso x:=10 avaliada primeiro e ento seu resultado (o valor de X, que agora 10) passada para a funo cvaltochar para a converso para caracter e em seguida para a funo alert para a exibio. Por causa desta regra de precedncia possvel atribuir um valor a mais de uma varavel ao mesmo tempo: Z := Y := X := 0 Por causa dessa regra, essa expresso avaliada como se fosse escrita assim: Z := ( Y := (X := 0) ) Apesar do AdvPl avaliar expresses da esquerda para a direita, no caso de atribuies isso acontece ao contrrio, da direita para a esquerda. valor atribudo varivel X, que retorna o valor para ser atribudo varivel Y e assim sucessivamente. Pode-se dizer que o zero foi propagado atravs da expresso.

Outro Lembrete
Em AdvPl pode-se juntar diversas linhas de cdigo em uma nica linha fsica do arquivo. Por exemplo, o cdigo: If lAchou Alert(Cliente encontrado!) Endif pode ser escrito assim: If lAchou ; Alert(Cliente encontrado!) ; Endif O ponto-e-vrgula indica ao AdvPl que a nova linha de cdigo est para comear. Pode-se ento colocar diversas linhas lgicas de cdigo na mesma linha fsica atravs do editor de texto utilizado. Apesar da possibilidade de se escrever todo o programa assim, em uma nica linha fsica, isto no recomendado pois dificulta a legibilidade do programa e, conseqentemente, a manuteno.

Lista de Expresses
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a seguir, o smbolo ==> indicar o retorno da expresso aps sua avaliao (seja para atribuir em uma varivel, exibir para o usurio ou imprimir em um relatrio), que ser impresso em um relatrio por exemplo. Duas Linhas de Cdigo @00,00 PSAY x := 10 ==> 10 @00,00 PSAY y := 20 ==> 20 Cada uma das linhas ter a expresso avaliada e o valor da varivel ser ento impresso.

PROGRAMAO ADVPL 7.10

26 Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha: Alert( cValToChar( x := 10 ; y := 20 ) ) ==> 10 Apesar desse cdigo se encontrar em uma nica linha fsica, existem duas linhas lgicas separadas pelo ponto e vrgula. Ou seja, esse cdigo equivalente a: Alert( cValToChar( x := 10 ) ) y := 20 Portanto, apenas o valor 10 da varivel x ser passado para as funes cvaltochar e alert para ser exibido. E o valor 20 apenas ser atribudo varivel y.

Convertendo para uma Lista de Expresses


Quando parnteses so colocados ao redor do cdigo e o sinal de ponto-evrgula substitudo por uma vrgula apenas, o cdigo torna-se uma lista de expresses: Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) ==> 20 O valor de retorno resultante de uma lista de expresses o valor resultante da ltima expresso ou elemento da lista. Funciona como se fosse um pequeno programa ou funo, que retorna o resultado de sua ltima avaliao (efetuadas da esquerda para a direita). Neste exemplo, a expresso x := 10 avaliada e ento a expresso y := 20, cujo valor resultante passado para a funo alert e cvaltochar e ento exibido. Depois que essa linha de cdigo executada, o valor de X igual a 10 e o de y igual a 20, e 20 ser exibido. Teoricamente, no h limitao para o nmero de expresses que podem ser combinadas em uma lista de expresses. Na prtica, o nmero mximo por volta de 500 smbolos. Debugar listas de expresses difcil porque as expresses no esto divididas em linhas de cdigo fonte, o que torna todas as expresses associadas a uma mesma linha de cdigo. Isto pode tornar muito difcil determinar onde um erro ocorreu.

Onde Pode-se Utilizar uma Lista de Expresses?


O propsito principal de uma lista de expresses agrup-las em uma nica unidade. Em qualquer lugar do cdigo AdvPl que uma expresso simples pode ser utilizada, pode-se utilizar uma lista de expresses. E ainda, pode-se fazer com que vrias coisas aconteam onde normalmente apenas uma aconteceria. X := 10 ; Y := 20 If X > Y Alert(X) Z := 1 Else Alert(Y) Z := -1 Endif Aqui temos o mesmo conceito, escrito utilizando listas de expresses na funo iif: X := 10 ; Y := 20

PROGRAMAO ADVPL 7.10

27 iif( X > Y , ; ( Alert(X), Z := 1 ) , ; ( Alert(Y), Z := -1 ) ) De Listas de Expresses para Blocos de Cdigo Considere a seguinte lista de expresses: Alert( cValToChar( ( x := 10, y := 20 ) ) ) ==> 20 O AdvPl permite criar funes, que so pequenos pedaos de cdigo, como se fosse um pequeno programa, utilizados para diminuir partes de tarefas mais complexas e reaproveitar cdigo em mais de um lugar num programa. Para maiores detalhes consulte a documentao sobre a criao de funes em AdvPl. Porm, a idia neste momento que a lista de expresses utilizada na linha anterior pode ser criada como uma funo:

Function Lista() X := 10 Y := 20 Return Y E a linha de exemplo com a lista de expresses pode ser substituda, tendo o mesmo resultado, por: Alert( cValToChar( Lista() ) ) ==> 20 Como mencionado anteriormente, uma lista de expresses como um pequeno programa ou funo. Com poucas mudanas, uma lista de expresses pode se tornar um bloco de cdigo: ( X := 10 , Y := 20 ) // Lista de Expresses {|| X := 10 , Y := 20 } // Bloco de Cdigo Note as chaves {} utilizadas no bloco de cdigo. Ou seja, um bloco de cdigo uma matriz. , na verdade, no uma lista de dados, e sim uma lista de comandos, uma lista de cdigo. // Isto uma matriz de dados A := {10, 20, 30} // Isto um bloco de cdigo, porm funciona como // se fosse uma matriz de comandos B := {|| x := 10, y := 20}

Executando um Bloco de Cdigo


Diferentemente de uma matriz, no se pode acessar elementos de um bloco de cdigo por meio de um ndice numrico. Porm, blocos de cdigo so semelhantes a uma lista de expresses e a uma pequena funo. Ou seja, podem ser executados. Para a execuo, ou avaliao de um bloco de cdigo, deve-se utilizar a funo eval: nRes := Eval(B) ==> 20

PROGRAMAO ADVPL 7.10

28 Essa funo recebe como parmero um bloco de cdigo e avalia todas as expresses contidas neste bloco de cdigo, retornando o resultado da ltima expresso avaliada.

Passando Parmetros
J que blocos de cdigo so como pequenas funes, tambm possvel a passagem de parmetros para um bloco de cdigo. Os parmetros devem ser informados entre as barras verticais (||) separados por vrgulas, assim como em uma funo. B := {| N | X := 10, Y := 20 + N} Porm, deve-se notar que j que o bloco de cdigo recebe um parmetro, um valor deve ser passado quando o bloco de cdigo for avaliado. C := Eval(B, 1) ==> 21

Utilizando Blocos de Cdigo


Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente, so utilizados para executar tarefas quando eventos de objetos so acionados ou para modificar o comportamento padro de algumas funes. Por exemplo, considere a matriz abaixo: A := {GARY HALL, FRED SMITH, TIM JONES} Esta matriz pode ser ordenada pelo primeiro nome, utilizando-se a chamada funo asort(A), resultado na matriz com os elementos ordenados dessa forma: {FRED SMITH, GARY HALL, TIM JONES} A ordem padro para a funo asort ascendente. Este comportamento pode ser modificado por meio da informao de um bloco de cdigo que ordena a matriz de forma descendente: B := { |X, Y| X > Y } aSort(A, B) O bloco de cdigo (de acordo com a documentao da funo asort) deve ser escrito para aceitar dois parmetros que so os dois elementos da matriz para comparao. Note que o bloco de cdigo no conhece que elementos est comparando - a funo asort seleciona os elementos (talvez utilizando o algortmo QuickSort) e passa-os para o bloco de cdigo. O bloco de cdigo compara-os e retorna verdadeiro (.T.) se encontram-se na ordem correta, ou falso (.F.), se no. Se o valor de retorno for falso, a funo asort ir ento trocar os valores de lugar e seguir comparando o prximo par de valores. Ento, no bloco de cdigo anterior, a comparao X > Y verdadeira se os elementos esto em ordem descendente, o que significa que o primeiro valor maior do que o segundo. Para ordenar a mesma matriz pelo ltimo nome, tambm em orden descendente, pode-se utilizar o seguinte bloco de cdigo: B := { |X, Y| Substr(X,At( ,X)+1) > Substr(Y,At( ,Y)+1) } Note que este bloco de cdigo procura e compara as partes dos caracteres imediatamente seguintes a um espao em branco. Depois de utilizar esse bloco de cdigo para a funo asort, a matriz conter:

PROGRAMAO ADVPL 7.10

29 {GARY HALL, TIM JONES, FRED SMITH} Finalmente, para ordenar um sub-elemento (coluna) de exemplo, pode-se utilizar o seguinte bloco de cdigo: B := { |X, Y| X[1] > Y[1] }

uma

matriz

por

Validao de campo
No ambiente Configurador, menu Base de dados/Dicionrio/Bases de dados, possvel ter acesso s configuraes dos campos das tabelas, dentre todas as configuraes vivel criar mecanismos para crticas de campos no momento da digitao. Esta funcionalidade ajuda a impedir a incluso de informaes incorretas no banco de dados, bloqueando o seguimento do preenchimento do cadastro, se a funo for padro Microsiga, ser enviado um aviso de alerta e a no permisso da informao digitada. E importante salientar que este mecanismo semelhante aos mecanismos do gatilho, porm aqui necessrio devolver um valor, sendo verdadeiro (.T.) ou falso (.F.), porque isso que a validao espera. Na configurao de validao para campos, tambm possvel utilizar-se deste recurso no X1_VALID, no qual o objetivo validar a digitao feita na tela de parmetros.

Exerccio 13 clientes.

Criar

validao

nos

campos

do

cadastro

de

PROGRAMAO ADVPL 7.10

30 Premissa: Faa uma validao no campo A1_NOME, utilizando a funo Texto(). Acesse o ambiente configurador Selecione a opo: Base de dados/Dicionrio/Bases de dados Clique na opo Dicionrio Pesquise a tabela SA1 Clique em Editar Selecione a opo Campos Escolha o campo A1_NOME Clique em Editar Selecione a pasta Validao No campo Validao do Usurio, digite: Texto() Esta funo no permite que o usurio deixe um espao em branco antes da primeira palavra, ou seja, nenhum nome dever comear com espao em branco. Aps a digitao da funo, confirme todas as operaes, com o objetivo de sair do ambiente configurador. Acesse o ambiente faturamento e selecione a opo Clientes localizado no menu Atualizao/Cadastro, clique na opo incluir e tente informar um nome que comece com espao em branco, quando terminar tecle <Entre>, perceba que o Sistema criticar a digitao e no permitir que saia do campo antes de corrigir.

Exerccio 14 Criar validao no campo Armazm padro no cadastro de produtos. Premissa: Faa uma validao para o campo Armazm padro no cadastro de produtos para que aceite somente armazm 01 (zero um) e 10 (dez). Acesse o ambiente configurador Selecione a opo: Base de dados/Dicionrio/Bases de dados Clique na opo Dicionrio Pesquise a tabela SB1 Clique em Editar Selecione a opo Campos Escolha o campo B1_LOCPAD Clique em Editar Selecione a pasta Validao No campo Validao do Usurio, digite: Pertence(01/10) Esta funo permite somente que seja digitada a informao configurada. Aps a digitao da funo, confirme todas as operaes, com o objetivo de sair do ambiente configurador. Acesse o ambiente faturamento e selecione a opo Produtos localizado no menu Atualizao/Cadastro, clique na opo incluir e tente informar um armazm padro que no est configurado na funo, perceba que o sistema criticar a digitao e no permitir que saia do campo antes de corrigir.

PROGRAMAO ADVPL 7.10

31

Exerccio 15 Criar validao nos campos Tipo de entrada e Tipo de sada padro para o cadastro de produto. Premissa: os campos B1_TE (tipo de entrada padro) e B1_TS (tipo de sada padro), j possuem validao, sendo o campo B1_TE < 500 e no campo B1_TS >= 501, esta definio padro do Sistema, ento vamos melhorar, nestes campos alm desta validao, configure para que est validao permanea porm envie uma mensagem de alerta ao usurio sobre a ocorrncia em cada campo. Acesse o ambiente configurador Selecione a opo: Base de dados/Dicionrio/Bases de dados Clique na opo Dicionrio Pesquise a tabela SB1 Clique em Editar Selecione a opo Campos Escolha o campo B1_TE Clique em Editar Selecione a pasta Validao No campo Validao do Usurio, digite: Iif(M->B1_TE<500,.T.,Eval({|| Help(,1,F4_TIPO),.F.}) Aps a digitao da funo, confirme todas as operaes com o objetivo de sair do ambiente configurador. Acesse o ambiente faturamento e selecione a opo Produtos localizado no menu Atualizao/Cadastro, clique na opo incluir e tente informar um TE padro que no seja de entrada, perceba que o Sistema criticar a digitao e no permitir que saia do campo antes de corrigir. Faa o mesmo procedimento para o campo B1_TS, porm na frmula digite: Iif(M->B1_TE >= 501,.T.,Eval({|| Help(,1,F4_TIPO),.F.})

Exerccio 16 Crie uma validao no campo emisso de ttulo a receber. Premissa: Crie uma validao onde o usurio somente poder incluir um ttulo no contas a receber quando a emisso for posterior a data de limite para realizaes financeira, ou seja, a data definida no parmetro MV_DATAFIN Exemplo: MV_DATAFIN igual a 31/01/2004, ento se ao incluir um ttulo com data inferior a data definida no parmetro, o Sistema deve critic-lo com uma mensagem para o usurio. Acesse o ambiente configurador Selecione a opo: Base de dados/Dicionrio/Bases de dados Clique na opo Dicionrio Pesquise a tabela SE1 Clique em Editar Selecione a opo Campos Escolha o campo E1_EMISSAO

PROGRAMAO ADVPL 7.10

32 Clique em Editar Selecione a pasta Validao No campo Validao do Usurio, digite: Iif(M>E1_EMISSAO>=GetMv(MV_DATAFIN),.T.,Eval({||MsgInfo(Emisso Invlida,Fim),.F.})) Aps a digitao da funo, confirme todas as operaes com o objetivo de sair do ambiente configurador. Acesse o ambiente financeiro e selecione a opo Contas a Receber localizado no menu Atualizao/Contas a Receber, clique na opo incluir e tente informar uma emisso anterior a data definida no parmetro MV_DATAFIN, perceba que o Sistema criticar a digitao e no permitir que saia do campo antes de corrigir. Note que se mudar a data base do Sistema para uma data anterior a definida no parmetro MV_DATAFIN, em seguida for incluir um ttulo a receber, o Sistema no far a mesma crtita, isto porque o campo emisso j inicia com um preenchimento automtico, ento para se resolver est inconformidade, volte ao ambiente configurador e no campo em questo coloque no seu inicializador padro a seguinte instruo: Iif(dDataBase<GetMv(MV_DATAFIN),Ctod( / / ),dDataBase), ou seja, se a data base do Sistema for inferior a data definida no parmetro, este campo inicializar sem preenchimento, obrigando o usurio preench-lo.

Cuidados com Posicionamentos de Registros


O posicionamento correto de registros fundamental para a funcionalidade completa dos programas. Algumas dicas para posicionamento de registros so: Evitar DBGOTOP(), usar DBSEEK(XFILIAL()) para os arquivos de dados do Sistema. O comando DBGOTOP() somente ser utilizado quando da real necessidade de efetuar uma leitura desde o incio do arquivo independente do tratamento de filial. Como no mesmo arquivo de dados poderemos ter registros de vrias filiais, desta forma ficar garantido o posicionamento no primeiro registro da filial corrente. Ao executar um DBSEEK(), verificar se localizou o registro, exemplo: If ! SB1->(dbSeek(xFilial(SB1))) // No achei o registro Endif Mesmo que seja bvia a existncia do registro, faa o teste pois o programa deve prever que a base de dados no to confivel como deveria e um alerta ajuda a identificar estes casos. Em casos de relatrios, atentar-se para imprimir a mensagem de forma consciente. 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.

PROGRAMAO ADVPL 7.10

33 O comando SOFTSEEK determina se ser usada uma busca relativa durante uma procura em um banco de dados. Se este comando estiver em ON, for utilizada uma funo DBSEEK() e nenhuma correspondncia for encontrada, o ponteiro de registro ficar no prximo registro do ndice que possua um valor mais alto que a expresso utilizada nesta funo. Este comando dever ser utilizado com a mxima ateno pois, caso esteja ligado, poder localizar um registro errado. Quanto ao comando DO WHILE, no esquea de incluir a condio referente filial, quando esta leitura for de registros de uma filial). Exemplo : dbSelectArea(SB1) dbSeek(xFilial(SB1)) Do While ! Eof() .And. B1_FILIAL == xFilial(SB1) // Processamento 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 ndice.

Funo ExistCpo
Funo Existcpo Retorna se determinada chave existe ou no no arquivo. Sintaxe : ExistCpo(cAlias,cChave,nOrdem) Exemplo : ExistCpo(SB1, 1, cCodigo, B1_DESC)

PROGRAMAO ADVPL 7.10

34 Desta forma, ser ser retornado se no necessrio chave de pesquisa efetuada uma busca no SB1, na ordem 1, chave cChave. E a chave foi encontrada ou no (.T. ou ,F,). Neste caso, passar a filial. Ela ser inserida automaticamente na pela funo. Restaurando ndice e limpando filtros

Funo SetPrint
Nos relatrios devemos analisar que a funo SetPrint possibilita efetuar filtros, escolha da ordem e gerao em disco ou impressora. No final dos programas de relatrio, devemos restaurar a ordem original dos arquivos, limpar o filtro e desativar a impressora. //Trmino do relatrio dbSelectArea(SRA) Set Filter to dbSetOrder(1) Set Device To Screen If aReturn[5] = 1 Set Printer To Commit ourspool(wnrel) Endif MS_FLUSH()

Problemas com Looping de Programas


O Protheus utiliza a tecnologia Cliente/Servidor. Isto significa que o aplicativo no mais executado individualmente em cada mquina. Ele ser executado no servidor do aplicativo. At a verso, 4.07 um programa travado significava que apenas a estao estava comprometida (o executvel estava na memria da estao). Com o Protheus, todo o processamento est no Server e quando o programa est em looping estaremos gradativamente usando toda a CPU do Server e conseqentemente parando todo o processamento. Se ao desenvolvermos uma rotina, a mesma entrar em looping (tiver apenas uma entrada e no tiver uma sada do processamento), este processamento utilizar todos os recursos do servidor comprometendo (reduzindo drasticamente a performance do aplicativo), ou at impedindo o uso do aplicativo por todos os demais usurios. Se isso acontecer em uma empresa na qual existam apenas 5 usurios, o administrador da rede poder reiniciar o servidor, porm onde existe um nmero considervel de usurios poder haver um prejuzo para a empresa que utiliza nosso Sistema. Exemplo: dbSeek(xFilial(SE1)+DTOS(dDtIni)) Do While SE1->(!Eof()) // Falta um DbSkip() Enddo No exemplo acima, a rotina ficar em looping (pois falta um comando de sada da rotina, um DbSkip() seria o mais apropriado), utilizando todos os recursos de processamento do servidor, fazendo com que ele pare de funcionar. Outro exemplo:

PROGRAMAO ADVPL 7.10

35 aCampos := {} Do while .T. Aadd(aCampos, Teste) Enddo No exemplo acima, o caso ainda mais crtico, pois alm de utilizar todo o recurso de processamento do servidor, em dado momento haver uma queda do aplicativo, devido limitao da varivel tipo Array, criada acima. E quando este limite for ultrapassado, o Sistema ser interrompido abruptamente e todos os demais usurios ficaro impossibilitados de utilizarem o Sistema.

Manipulao de Arquivos Externos ao Protheus


A manipulao de arquivos considerados externos ao Protheus dever ter um tratamento diferenciado. Os arquivos a serem manipulados (alterados/consultados) devero ser copiados do Client para o Server e vice-versa utilizando uma conexo (TPC-IP, IPX etc). Para copiar os arquivos, foram criadas duas funes que sero executadas via conexo, a CPYS2T() encarregada de copiar do Server para o Client/Terminal e a CPYT2S() encarregada de copiar do Client/Terminal para o Server. O editor de texto Word da Microsoft, os arquivos de imagens (BMP, JPEG etc) exigem um lugar fsico para abertura dos documentos/imagens, navegando pela Internet por exemplo so copiados via conexo para um diretrio temporrio no computador para serem visualizados. O AP5 trabalha da mesma forma por meio dessas consideraes e, utilizando a arquitetura Client/Server, os arquivos sero copiados via conexo. Em alguns ambientes do Protheus so encontradas rotinas de Importao/Exportao de lanamentos, exigindo serem utilizadas as funes CPYT2S() e CPYS2T() para manipulao dos arquivos. Por exemplo, uma importao de lanamentos da Folha de Pagamento poder ser feita diretamente do Client sem precisar copiar para o Server, mas se outro usurio precisar visualizar os lanamentos de origem da importao no ter acesso, no entanto, se for realizada a cpia do Client para o Server todos podero visualizar (aconselhvel). Isso acontece no ambiente Controle de Documentos, quando todos os arquivos (documentos) so copiados entre o Client e o Server para que todos visualizem e manipulem. Um exemplo que no h necessidade de cpia so os arquivos gerados para contabilizao (CPROVA), pois estes so gerados no prprio Server no havendo necessidade de cpia. Os arquivos que podero ser copiados devero estar necessariamente embaixo do RootPath na configurao do Server, isto , o diretrio DOCS do exemplo abaixo dever ser sub-diretrio do RootPath. Exemplo de cpia do Server para o Client: CPYS2T(\DOCS\EXEMPLO.DOC,C:\WINDOWS\TEMP,.T.) Onde os parmetros so: 1 o <Nome do Arquivo> a ser copiado para o Client 2 o <Nome do Diretrio> do Client e/ou local fsico onde ser copiado o arquivo 3 se deseja compactar o arquivo (recomendvel) Exemplo de cpia do Client para o Server: CPYT2S(C:\WINDOWS\TEMP\EXEMPLO.DOC,\DOCS,.T.)

PROGRAMAO ADVPL 7.10

36 Onde os parmetros so: 1 o <Nome do Arquivo> a ser copiado para o Server 2 o <Nome do Diretrio> do Server 3 se deseja compactar o arquivo (recomendvel) As funes possuem um retorno True(.T.) ou False(.F.) indicando se a cpia foi realizada com sucesso ou no.

Desenvolvendo Telas
A aparncia e a objetividade das telas num sistema base fundamental para a interface Sistema x Usurio. O MP8 j cria, automaticamente, a grande parte das telas de um ambiente, tais como a Browse, a GetDados e Enchoice. Algumas outras telas necessitam de construo manual, ou seja, com a utilizao de comandos, tais como SAY , GET e LABEL na Dialog. Procure sempre colocar em tela as informaes que mais se objetivam com o assunto abordado. Sempre que possvel, d preferncia aos campos obrigatrios. Isso facilita a digitao do usurio, que no precisar passar de campo em campo (no caso de estar utilizando a tecla <TAB>) at chegar ao campo desejado. A ordem dos campos tambm importante para a fcil localizao das informaes. Quando o volume de informaes muito grande, divida os campos em folders, ou seja, pastas, agrupando os campos em assuntos. Isso ir deixar a tela menos poluda e evitar que o usurio navegue por uma tela s. Para fazer essa facilidade, preencha o campo X3_FOLDER no SX3, com um nmero, agrupando-os de acordo com o tipo de informao e no SXA, com o ALIAS do arquivo em pauta, a ordem, que equivale ao nmero informado no X3_FOLDER e a descrio nos trs idiomas. Essa descrio que ser a informao contida na pasta do folder. Exemplo: Os campos SZ1_ENDER, SZ1_NUM e SZ1_BAIRRO devem estar com o campo X3_FOLDER preenchido com o contedo 1. No SXA, o XA_ALIAS dever ser SZ1, o XA_ORDEM = 1 (mesmo valor preenchido no X3_FOLDER), no XA_DESCRIC, Endereo Residencial e, nos demais, o mesmo texto em outros idiomas. O Folder, alm de agrupar e facilitar a procura pelos campos, evita a rolagem vertical da tela, facilitando a visualizao das informaes. Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Utilize telas seqenciais, conhecidas como Wizard (semelhante aos de instalao de um software). Dessa forma, o usurio ficar mais atento aos fatos, dificultando o erro. Mas, cuidado: no faa disso uma incansvel seqncia de telas, pois isso acabar desmotivando o usurio a utilizar o Sistema. Enfim, as telas devem ser limpas e objetivas, de tal forma que impea o usurio de sair de seu objetivo final. Todo curioso ir apertar todos os botes da tela ou preencher todos os campos com qualquer tipo de informao. Portanto, esteja atento a tamanho dos labels, para que os mesmos no excedam o tamanho da caixa de dilogo definida. Isso, alm de no ser esttico, prejudica o entendimento da informao. Exerccio 15.1 Utilizando os objetos para criar telas.

PROGRAMAO ADVPL 7.10

37 User Function TELA1() Local oDlg Local aButtons aButtons := {{"BMPPERG",{|| MsgInfo("Pergunte")},"Pergunte..."},; {"BMPCALEN", {|| MsgInfo("Calendario")}, "Calendario..." }} DEFINE MSDIALOG oDlg TITLE "" FROM 000,000 TO 400,600 PIXEL ACTIVATE MSDIALOG oDlg CENTERED oDlg:End()},; {|| oDlg:End()},, aButtons) Return ON INIT EnchoiceBar(oDlg, {||

Salvando Arrays padres


Quando temos Janelas que necessitem apresentar mais de uma getdados, devemos salvar os elementos, acols, aheader e n, da tela anterior para apresentar uma nova janela. As principais variveis so: Acols = Array contendo as linhas usadas que sero apresentadas na Getdados AHeader = Array contendo o cabeo das colunas da Getdados N = Varivel publica que indica a posio do atual no acols (a linha que est sendo editada na Getdados) Para salv-las podemos: aColsAnt := aClone(Acols) aHeaderAnt := aClone(aHeader) nElemAnt := n E para restaur-las: aCols := aClone(aColsAnt) aHeader := aClone(aHeaderAnt) n := nElemAnt

Para Entendimento do Referencial Atualizando SX (ATUSX)

Conceito

de

Integridade

O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos customizadores internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as informaes padres necessrias para a criao de bases das empresas e efetuar possveis customizaes.

PROGRAMAO ADVPL 7.10

38 Em uma atualizao de verso, o sistema ir fazer uma compatibilizao de dados com os arquivos j existentes e os atualizar com base nos SXs. Ao desenvolver uma rotina que exige um novo campo, por exemplo, este dever ser criado no ATUSX, caso contrrio gerar uma no conformidade comprometendo todo o trabalho da atualizao e o bom andamento do trabalho. Todos os campos, perguntas, ndices e parmetros novos devero estar no ATUSX , pois estes so os padres do Protheus. aqui tambm que cadastramos os HELPs de campo e de programas, criamos os menus do Sistema e onde disponibilizamos informaes para serem traduzidas para outros pases. Exemplo de atualizao no SX: Criao de ndice no Cadastro de Funcionrios: Suponhamos que seja necessrio um ndice por data de admisso. Neste caso, utilizaremos o SINDEX , onde devero ser alimentados, basicamente, o Alias (SRA), a ordem , a chave de indexao (RA_ADMISSA) e sua descrio em portugus. As descries referentes s outras lnguas devero ficar a cargo do departamento de tradues. Numa atualizao de verso, o sistema enxergar a existncia deste ndice pelo SINDEX e o disponibilizar para utilizao. Ao final da manuteno dos arquivos SXs, abre-se uma janela na qual devem ser documentadas todas as alteraes efetuadas da forma mais clara e precisa possvel. Esta documentao de extrema importncia para que se tenha um controle dos arquivos customizadores padres e garantem um perfeito funcionamento do Protheus.

Comandos definidos pelo usurio (UDCs)


Este recurso cria novas e infinitas possibilidades para modificar a maneira pela qual escrevemos o cdigo de uma funo e a maneira pela qual podemos resolver problemas complexos. Ele ajuda a facilitar a manuteno do cdigo e a implementao de normas. Estes comandos so traduzidos, analisados e modificados antes que o compilador comece a trabalhar para gerar um arquivo objeto. O responsvel por esta traduo o pr-processador que um tradutor inteligente que atua antes da gerao do cdigo objeto. Em sua maioria, isto se resume a encontrar os comandos no cdigo fonte e traduzi-los para instrues e funes equivalentes que se acham no corpo da funo ou no contedo de arquivos .CH (arquivos de cabealho). Este tipo de arquivo (.CH) contm diversos comandos que sero utilizados por todas as funes que contenham a instruo include em seu cdigo. Estes mesmos comandos poderiam estar embutidos na funo, mas para facilitar a manuteno, um nico arquivo .CH pode ser includo (comando include) em vrias funes ao mesmo tempo. No h a necessidade de colocar o comando include em cada funo. Uma nica meno ao .CH no arquivo .PR? servir ao propsito de todas as funes nele embutidas. Estes comandos so diretivas do pr-processador e comeam sempre com o caracter # diretamente a sua frente e devem estar escritos em caracteres tipo caixa alta. Os mais utilizados no Protheus so: #DEFINE #IFDEF, ou #IFNDEF

PROGRAMAO ADVPL 7.10

39 #ELSE #ENDIF #INCLUDE Cada um destes comandos pode ser colocado em qualquer parte do arquivo fonte que ser lido pelo pr-processador. No entanto, para facilitar a visualizao da existncia destes comandos e a manuteno da funo, estes comandos devem ser colocados no incio do fonte. O pr-processador substituir, cada ocorrncia da constante no fonte, ser substituda pela expresso ou valor, que estiver contida diretamente frente da mesma. A exemplo de sintaxe e cdigo fonte para este comando : #DEFINE _TESC 27 #DEFINE _LESC lastkey() if _nLastkey == _TESC RETURN Endif if _LESC == _TESC RETURN Endif Esta diretiva muito til quando temos um valor constante vrias vezes repetido dentro do cdigo fonte que poder ser alterado com freqncia no decorrer da vida til da funo. #IFDEF ou #IFNDEF <CONSTANTE> <instrues> #ELSE <outras instrues> #ENDIF Esta diretiva do pr-processador permite que voc prepare aplicaes para compilao condicional ou, em outras palavras, se a <constante> definida anteriormente via diretiva DEFINE ou pelo Protheus foi definida (IFDEF), as <instrues> sero incorporadas ao cdigo objeto e as <outras instrues> sero desprezadas. Mas, se a <constante> no foi definida <IFNDEF> as <instrues> sero incorporadas e as <outras instrues> sero desprezadas. #INCLUDE <ARQUIVO> Uma instruo INCLUDE diz ao pr-processador para inserir o contedo de outro arquivo em um local determinado dentro da funo. Este arquivo especificado deve focalizar outras instrues do prprocessador que possam ser comuns a diversos ambientes da rotina.

Uso de Strings
Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de inserirmos diretamente os textos no fonte do relatrio, utilizamos o recurso de strings, no qual por meio de um include acessaremos o texto em trs lnguas diferentes (Portugus, Espanhol e Ingls) dependendo da forma da compilao. convencionado que o nome do include seja o mesmo nome do fonte do relatrio para que a manuteno deste relatrio seja o mais simples possvel.

PROGRAMAO ADVPL 7.10

40 Exemplo: Relatrio FABR001.PRW Include FABR001.CH

ndices
A utilizao de ndices para a pesquisa deve ser bem analisada a fim de evitar lentido ou processamentos redundantes nos relatrios. Os ndices ajudam a otimizar as pesquisas e laos de processamentos, por isto no devem ser subtilizados ou utilizados de forma errnea. Caso a necessidade do relatrio exija uma otimizao que no possvel obter com os ndices padres do sistema, possvel criar ndices temporrios por meio da funo Indregua tornando assim os relatrios mais geis e bem estruturados. Criando e Deletando Arquivos de trabalho (Temporrios.) Quando criamos um arquivo de trabalho ou um ndice de trabalho (utilizando a funo Indregua) no final do programa devemos apag-los. Para criao de um ndice de Trabalho (Temporrio) com Indregua: cArqNtx := CriaTrab( NIL, .F. ) //Criando Arquivo IndRegua( SRA, cArqNtx, cIndCond, , cFor, STR0039 ) //Selec.registros...

Para deletar este ndice de trabalho no final do processamento:


DbSelectArea( SRA ) //Selecionando a area DbSetOrder( 1 ) //Posicionando na ordem de origem fErase( cArqNtx + OrdBagExt() ) //Deletando arquivo de trabalho Caso o programa crie um arquivo de trabalho e no o apague no final de seu processamento, este ficar ocupando espao em disco no ambiente de trabalho. Isto poder gerar problemas futuros para o cliente. Por isto, fundamental que aps sua utilizao ele seja descartado.

Conceito de Filial e Compartilhamento de Arquivos


O Sistema permite a criao de vrias filiais para uma mesma empresa cadastrada, de modo que filiais da mesma empresa compartilhem ou no as mesmas informaes como cadastro de produtos, clientes etc. Este tratamento feito internamente por meio dos campos XX_FILIAL, obedecendo a seguinte regra:

Arquivos Compartilhados
Quando o arquivo esta configurado para trabalhar no modo compartilhado (X2_MODO = C), este campo ser gravado com ( espaos ).

PROGRAMAO ADVPL 7.10

41 Deste modo, o registro ficar disponvel para todas as filiais.

Arquivos Exclusivos
Quando o arquivo est configurado para trabalhar no modo exclusivo ( X2_MODO= E ), este campo ser gravado com o cdigo da filial atual. Deste modo, o registro focar disponvel apenas para a filial que o gravou. Para que o registro realmente fique disponvel ou no para suas respectivas filiais, TODAS as rotinas que manipulam registros diretamente na base de dados dever verificar a filial por meio da Funo xFilial(), alm disso a maioria dos ndices possuem o campo FILIAL na chave : Sintaxe : XFILIAL(EXPC1) onde, ExpC1 = Alias do arquivo A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ir retornar se o arquivo for compartilhado e o cdigo da filial se o arquivo for exclusivo. Por exemplo: Para executar um dbSeek no arquivo de clientes: DbSelectArea(SA1) DbSeek(xFilial(SA1)+cCodCli+cLoja) ndice do SA1: A1_FILIAL+A1_COD+A1_LOJA Ou um processamento no arquivo: Do while !EOF() .AND. XX_FILIAL==xFilial(01) Sendo o campo FILIAL parte da chave de todos os ndices do sistema, este procedimento garante que a utilizao dos registros ser exclusiva da filial que criou os mesmos no caso do arquivo ser exclusivo ou disponvel para todas as filiais quando ele estiver configurado como compartilhado. Jamais use um campo filial de uma tabela para executar um dbSeek() em outra tabela. Pois uma tabela poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser compartilhada (campo filial preenchido). A varivel cFilAnt contm a filial que o usurio est operando e a varivel cEmpant contm a empresa e a filial.

Tcnicas para Filtragem


Nos sistemas Microsiga, a filtragem dos dados em ambiente Code Base os DBFs feita de maneira geral pela Funo INDREGUA(Params,) , o que de forma geral no impede o uso de instrues como SET FILTER TO, DBSETFILTER(), DBFILTER() ou qualquer outro comando de sintaxe xBase. A INDREGUA() uma funo interna que rene vrios atrativos e facilidades para o seu uso, entre elas a possibilidade de se indexar e filtrar os registros por meio dos parmetros fornecidos, ela tambm preferencialmente usada para que o cdigo fique mais limpo e de fcil interpretao, pois dentro de sua estrutura rene uma srie de comandos de indexao e filtragem que agiliza o processo de criao de ndices e filtros em arquivos de trabalho com menos linhas de cdigo, vejamos o exemplo :

PROGRAMAO ADVPL 7.10

42

Chaves Primrias
Sua funo garantir unicidade. Em toda relao, por definio, tem-se uma ou mais chaves candidatas. Dessas chaves, uma ser primria e se houver mais de uma na relao, essas outras sero definidas como chaves alternadas.

Chaves Estrangeiras
um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave externa ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos so necessrios.

Integridade Referencial
Todos os valores da chave estrangeira tm, obrigatoriamente, que ter valor correspondente na chave primria que se relaciona, mas nem todos os valores encontrados na chave primria, precisam ter seus correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabela de clientes, o campo A1_COD (cdigo do cliente) vai estar relacionado com outra tabela que indica quais so os pedidos de venda colocados. Desta forma, nem todos os clientes precisam ter pedidos de venda colocados, mas, necessariamente, todos os pedidos de venda precisam de um cliente. Como o PROTHEUS foi projetado para o ambiente SQL, no qual a integridade referencial das tabelas definida no prprio banco de dados por meio de regras internas, devemos tomar algumas precaues com esse tpico: Verificar a integridade da coluna em todas as tabelas relacionadas: no se pode alterar o tamanho do cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se verificar as tabelas de cabealho e itens das notas fiscais, de ttulos a pagar e receber etc. O Sistema conta com o recurso de grupos de tabelas relacionadas, que permite alterar o tamanho de diversas colunas de uma vez s , garantindo a integridade das colunas. Verificar a integridade dos cadastros com todas as tabelas relacionadas: no se pode excluir o cdigo do cliente se existe um pedido de vendas em aberto para esse cliente, deve-se verificar todas as tabelas relacionadas antes de atualizar a base de dados. Alm disso, na incluso de cadastros devemos utilizar as funes existchav e existcpo para garantir que as informaes de chave no sejam repetidas e que o acesso a tabelas externas seja validado de maneira consistente. Verificar a atualizao da informao em todas as tabelas relacionadas: a integridade no se resume a validaes de cadastros e tamanho de colunas, deve-se garantir no ato do desenvolvimento que TODOS os pontos relacionados ao tpico envolvido sejam analisados e, se necessrio, atualizados. Por exemplo, ser atualizado o saldo em estoque de determinado produto NO SE DEVE atualizar somente o arquivo de saldos em estoque, deve-se avaliar se o produto utiliza rastreabilidade para, nesse caso, atualizar o arquivo de saldos por lote, deve-se avaliar se o produto utiliza controle de localizao fsica para atualizar o arquivo de saldos por localizao etc. Deve-se fazer um estudo antes de qualquer alterao em atualizao de base de dados.

Controle de Semforo
O controle de semforo permite que o Sistema controle a numerao automtica de documentos on line. Temos basicamente trs funes que gerenciam o seu controle. So elas:

PROGRAMAO ADVPL 7.10

43 GETSXENUM( EXPC1) Obtm o nmero seqencial do alias especificado no parmetro. ROLLBACKSXE Descarta o nmero pendente do semforo. usado quando o usurio cancela a operao (o nmero no aproveitado). CONFIRMSXE Confirma o nmero sugerido. Esta funo deve ser chamada no momento da confirmao da gravao do registro. MAYIUSE Checa fisicamente se um determinado arquivo existe. O arquivo poder conter o nmero seqencial.

O que voc aprendeu neste captulo


Neste captulo, aprendemos a definir as preferncias e as configuraes necessrias para iniciarmos a utilizao do ambiente de desenvolvimento do Protheus.

Prximo Passo
No prximo captulo, iremos aprender como utilizar gatilhos aplicando funes nas regras.

Funes aplicadas em gatilhos O que voc ir aprender neste captulo


Neste captulo, aprenderemos como criar funes em ADVPL e utiliz-las por meio de gatilhos, ou seja, como disparar um programa customizado atravs do preeenchimento de um determinado campo em uma tela de digitao de dados como, por exemplo, um cadastro.

Rotinas Abordadas
Funes em gatilhos.

Funes em Gatilhos
A utilizao de gatilhos em cadastros muito grande, pois por meio deles poderemos automatizar o preenchimento de muitos campos durante a digitao de apenas um nico campo de origem, considerado o campo de disparo. Um gatilho deve ser utilizado sempre que se fizer necessria a atualizao automtica de campos dependentes na tela de digitao (cadastros ou movimentaes), por meio do preenchimento de um campo de origem. Exerccio 17 Criar validao no campo emisso de ttulo a receber. Como criar Projetos de Trabalho:

PROGRAMAO ADVPL 7.10

44 1. 2. Acesse as opes: Projetos + Novo; Ser apresentado uma tela (Projeto), na qual deveremos definir o nome do mesmo no quadro Novo Grupo de Projetos, que dever ser um nome sugestivo Customizao que ser iniciada, neste caso, Curso ADVPL; Selecione as opes: Projetos + Salvar. Salve o Novo Projeto com o nome de Curso ADVPL e confirme; Logo abaixo, existe outro quadro, no qual poderemos detalhar ainda mais o nosso projeto, daremos o nome de ADVPL, clicando com o boto direito do mouse e selecionando a opo Renomear. Depois confirme.

3. 4.

Dica Nunca se esquea que para Compilar um Programa, ser necessrio a utilizao de um Projeto de Trabalho; Para facilitar a Visualizao durante a elaborao de programas, no se esquea de fixar a Caixa de Projetos ao rodap do MP8 Protheus IDE; Para isto, basta clicar sobre o Cabealho da Caixa e arrast-lo at o rodap, juntamente com as pastas de Mensagens e Comandos.

O gatilho permite ao usurio estabelecer uma atualizao dinmica dos dados por meio da definio de critrios, isto , a partir da digitao de um dado possvel atualizar automaticamente outros campos. Para definir um gatilho: 1. Acesse o ambiente Configurador e selecione a opo gatilho no menu Base de dados/Dicionrio, sero apresentados alguns gatilhos j cadastrados utilizados pelo prprio sistema.

PROGRAMAO ADVPL 7.10

45

2. Clique na opo incluir para um novo gatilho e informe os dados:

Significado dos campos da tela de cadastro de gatilhos Campo nome do campo que ao ser alterado inicia o processo de atualizao. Seqncia nmero seqencial gerado pelo sistema para cada gatilho. Cnt. Domnio nome contra-domnio, ou seja, campo que dever ser atualizado automaticamente. Tipo tipo do gatilho (P/E/X); P primrio: para atualizaes de dados do mesmo arquivo; E estrangeiro: para atualizaes de dados em outros arquivos; X Posicionamento: para posicionar o arquivo mencionado no alias sem efetuar nenhuma atualizao. Utilizado para casos em que o usurio deseja estabelecer um relacionamento entre arquivos.

PROGRAMAO ADVPL 7.10

46 Regra expresso em sintaxe AdvPL a ser transportada para o contradomnio, ou apenas o nome de campo. Lembre-se sempre que a regra deve retornar um contedo vlido conforme o tipo do campo definido como contra domnio. Posiciona Sim/No movimenta o ponteiro em outro arquivo com base na expresso definida no campo chave. Alias Alias do arquivo. As trs letras iniciais da tabela cujo o ponteiro deve ser movimentado. Ordem nmero da chave do ndice a ser atualizada para movimentao do ponteiro. Chave expresso em sintaxe AdvPl que determina o posicionamento do ponteiro. Condio informe a condio, user function, etc., que iro determinar quando o gatilho deve ser executado. Exerccio 18 Como criar gatilho para atualizao em mesmo campo e tabela. Premissa: no cadastro de cliente, existe campo para preenchimento do endereo completo, alm de campos para o endereo de cobrana. Digite o endereo, bairro, cep, municpio e estado. Faa gatilhos para que cada campo informado alimente os campos correspondentes para cobrana. Campo Seqncia Contra Domnio Tipo Regra Campo Seqncia Contra Domnio Tipo Regra Campo Seqncia Contra Domnio Tipo Regra Campo Seqncia Contra Domnio Tipo Regra Campo Seqncia A1_END 001 A1_ENDCOB 1=Primrio M->A1_END A1_BAIRRO 002 A1_BAIRROC 1=Primrio M->A1_BAIRRO A1_CEP 003 A1_CEPC 1=Primrio M->A1_CEP A1_MUN 004 A1_MUNC 1=Primrio M->A1_MUN A1_ESTADO 005

PROGRAMAO ADVPL 7.10

47 Contra Domnio Tipo Regra A1_ESTC 1=Primrio M->A1_ESTADO

Aps a criao de todos os gatilhos, acesse o ambiente faturamento e v ao menu clientes localizado em Atualizaes/Cadastro. Escolha a opo incluir e faa os testes dos gatilhos. Exerccio 19 Como criar gatilho para atualizar campo que depende da informao de outra tabela. Premissa: no cadastro de complemento de produtos, necessrio digitar o cdigo do produto. Faa um gatilho que aps est digitao o campo nome cientifico seja preenchido automaticamente com o nome do produto, conforme o cdigo selecionado. Campo B5_COD Seqncia 001 Contra B5_CEME Domnio Tipo 1=Primrio Regra SB1->B1_DESC Posicione Sim Alias SB1 Ordem 1 Chave xFilial(SB1)+M->B5_COD Aps a incluso do gatilho, teste-o acessando o ambiente Estoque/Custos. No menu, selecione a opo Complemento de Produtos, localizado no menu Atualizaes/Cadastro.

Exerccio 20 Apenas preencha o campo condio no cadastro do gatilho anterior criado. Condio Cmodulo==EST

Para testar este exerccio, acesse o ambiente Faturamento e inclua um complemento de produto. Repare que a ao do gatilho no funcionar, devido a condio colocada ao gatilho configurado. Em contra partida, se for incluir um complemento de produto pelo ambiente Estoque/Custo, ele ter sua ao funcionando normalmente. Exerccio 21 Como criar gatilho utilizando funo criada pelo usurio. Premissa: no cadastro de clientes, existe um campo que armazena o e-mail.

PROGRAMAO ADVPL 7.10

48 Ao informar o correio eletrnico, faa um gatilho que acione uma funo para validar se existe o smbolo @ (arroba) no texto digitado. Crie um programa com o nome exerc04.prw que dever atender a necessidade mencionada na premissa acima. #Include Protheus.ch User Function Exerc04() If .Not. (@ $ M->A1_EMAIL) MsgInfo(Verifique, este e-mail est correto ? , Validao) Endif Return(M->A1_EMAIL) Aps o trmino da digitao da funo, salve o programa, adicione ao projeto e compile. Acesse o ambiente configurador e crie um gatilho como o exemplo abaixo: Campo Seqncia Contra Domnio Tipo Regra A1_EMAIL 001 A1_EMAIL 1=Primrio U_exerc04()

Confirme a incluso, acesse o ambiente faturamento e selecione a opo Clientes localizada no menu Atualizao/Cadastros. Digite um correio eletrnico sem o smbolo arroba. O sistema dever criticar a digitao. Dica Lembre-se de que quando a informao est sendo digitada, ela encontra-se no Buffer. Devemos ento tratar como M-><campo> que identifica que a informao de retorno est na memria. Quando a informao j est gravada, deveremos tratar como <Alias>-><Campo>. Exerccio 22 Como condio de disparo: criar funes utilizando mais de uma

#Include Protheus.ch User Function Exerc04() If !(@ $ M->A1_EMAIL) MsgInfo(Verifique, este e-mail est correto ?,Validao) Endif Return(M->A1_EMAIL)

O que voc aprendeu neste captulo


Neste captulo aprendemos a criar gatilhos com utilizao de funes.

PROGRAMAO ADVPL 7.10

49

Prximo Passo
No prximo captulo, iremos aprender como criar telas de cadastros utilizando as funes da Microsiga e tambm a desenvolver programas de validao e relacionamento entre arquivos.

Funes para Cadastros O que voc ir aprender neste captulo


Neste captulo, aprenderemos como criar telas para cadastros, utilizando para isso as funes definidas pela MICROSIGA. Veremos tambm, funes customizadas para validaes em arquivos e relacionamentos.

Rotinas Abordadas
Funes para Cadastros: AxCadastro(); MBrowse(); Modelo2(); Modelo3().

AxCadastro() Cadastro Padro


Esta funo utilizada para a criao de telas de cadastros padronizados da MICROSIGA, nas quais poderemos ter apenas as opes: Pesquisar, Visualizar, Alterar, Incluir e Excluir, que no podero ser modificadas. Sintaxe: AxCadastro(cAlias,cTitulo,cDel,cOk); Parmetros: cAlias = Alias do Arquivo para o cadastro, deve obrigatoriamente ter a sua Estrutura defini-da no SX3; cTitulo = Ttulo da Janela; cDel = Funo para validar a Excluso; cOK = Nome de Funo para Validao da Tela.

Exerccio 23 Como criar telas de cadastros com utilizao de Arquivo Padro:

PROGRAMAO ADVPL 7.10

50 Crie uma Tela de Cadastro Padro para o arquivo de Cadastro de Produtos e adicione-o ao menu do ambiente Faturamento. Utilize para isso um programa com o nome de Exerc05.

#Include Protheus.ch User Function Exerc05() AxCadastro(SZ1,Cadastro de Software) Return

MBrowse()
Esta funo utilizada para a criao de telas de cadastros padronizados da MICROSIGA, onde poderemos criar at dez botes sem a necessidade de utilizarmos os originais. Tambm possvel a utilizao de legendas durante o cadastro, que podero ser definidas por meio de cores e condies. Sintaxe: MBrowse(nT,nL,nB,nR,cAlias,aFixe,cCpo,nPosI,cFun,nDefault,; aColors,cTopFun,cBotFun) Parmetros: nT = Linha Inicial; nL = Coluna Inicial; nB = Linha Final; nR = Coluna Final; cAlias = Alias do Arquivo; aFixe = Array, contendo os Campos Fixos (A serem mostrados em primeiro lugar no Browse); cCpo = Campo a ser tratado, quando Empty, para informaes de Linhas com Cores; Prioridade 2 nPosI = (Dummy); cFun = Funo para habilitar semforo; Prioridade 3 na execuo; Prioridade (falta alguma coisa?) nDefault = Nmero da opo do menu a ser executada quando o <Enter> for pressionado; aColors = Array com os Objetos e Cores; Prioridade 1 cTopFun = Funo para filtrar o TOP do Browse; cBotFun = Funo para filtrar o BOTTOM do Browse.

Exerccio 24 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

PROGRAMAO ADVPL 7.10

51 Rotina de cadastro para a tabela SZ1. Cadastro de software. User Function Exerc06() Local aFixos := {} Local aCores := {} Private aRotina := {} Private cCadastro := Cadastro de Software aAdd( aAdd( aAdd( aAdd( aAdd( aRotina, aRotina, aRotina, aRotina, aRotina, { { { { { Pesquisar Visualizar Incluir Alterar Excluir , , , , , AxPesqui AxVisual AxInclui AxAltera AxDeleta , , , , , 0 0 0 0 0 , , , , , 1 2 3 4 5 }) }) }) }) })

dbSelectArea(SZ1) dbSetOrder(1) dbGoTop() // Primeiro exemplo sem nehuma atribuio mBrowse(,,,,SZ1) // Segundo exemplo, mostrar somente os campos contidos no vetor. //aAdd(aFixos,{FILIAL,Z1_FILIAL }) //aAdd(aFixos,{FABRICANTE ,Z1_FABRICA}) //mBrowse(,,,,SZ1,aFixos) // Terceiro exemplo: quando a emisso for diferente da aquisio aparecer uma legenda vermelha //mBrowse(,,,,SZ1,,Z1_EMISSAO<>Z1_DTAQUIS) // Quarto exemplo: quando a condio for verdadeira aparecer uma legenda verde. //mBrowse(,,,,SZ1,,,,Z1_COMPATI==1) // Quinto exemplo: quando clicar duas vezes sob o registro ou teclar <ENTER>, ser executada // a funo correspondente ao nmero na funo //mBrowse(,,,,SZ1,,,,,4) // Sexto exemplo: cores para representar o status do registro no browse. //aAdd(aCores,{Z1_COMPATI==1,BR_VERDE}) //aAdd(aCores,{Z1_COMPATI==2,BR_AMARELO}) //aAdd(aCores,{Z1_COMPATI==3,BR_AZUL}) //aAdd(aCores,{Z1_COMPATI==4,BR_BRANCO}) //mBrowse(,,,,SZ1,,,,,,aCores)

PROGRAMAO ADVPL 7.10

52 // Stimo exemplo: apresentar os dados somente dentro da expresso definida, utilizando funes auxiliares. //mBrowse(,,,,SZ1,,,,,,,u_E06ExpIni,u_E06ExpFim) Return //DESCRICAO Funo auxiliar para retornar a expresso inicial de filtro. User Function E06ExpIni() Return(01000002) //DESCRICAO Funo auxiliar para retornar a expresso final de filtro. User Function E06ExpFim() Return(01000004)

Exerccio 25 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. \\Programa EXERC07 Desc. Rotina de cadastro para a tabela SZ1. Cadastro de software. User Function Exerc07() Private aRotina := {} Private cCadastro := Cadastro de Software aAdd( aAdd( aAdd( aAdd( aAdd( aRotina, aRotina, aRotina, aRotina, aRotina, { { { { { Pesquisar Visualizar Incluir Alterar Excluir , , , , , u_E07Mnt u_E07Mnt u_E07Mnt u_E07Mnt u_E07Mnt , , , , , 0 0 0 0 0 , , , , , 1 2 3 4 5 }) }) }) }) })

dbSelectArea(SZ1) dbSetOrder(1) dbGoTop() mBrowse(,,,,SZ1) Return

PROGRAMAO ADVPL 7.10

53

Exerccio 26 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Desc. Funo auxiliar para a execuo conforme a escolha feita por meio do menu. User Function E07Mnt(cAlias,nRecNo,nOpc) Local nEscolha := 0 If nOpc==1 AxPesqui() Elseif nOpc==2 AxVisual(cAlias,nRecNo,nOpc) Elseif nOpc==3 nEscolha := AxInclui(cAlias,nRecNo,nOpc) If nEscolha==1 MsgInfo(Cadastro concludo com sucesso!,cCadastro) Else MsgInfo(Cadastro abandonado,cCadastro) Endif Elseif nOpc==4 nEscolha := AxAltera(cAlias,nRecNo,nOpc) If nEscolha==1 MsgInfo(Alterao efetuada com sucesso!,cCadastro) Else MsgInfo(Alterao abandonada,cCadastro) Endif de cada funo

PROGRAMAO ADVPL 7.10

54 Elseif nOpc==5 nEscolha := AxDeleta(cAlias,nRecNo,nOpc) If nEscolha==2 MsgInfo(Excluso concluda,cCadastro) Else MsgInfo(Desistncia de excluir,cCadastro) Endif Endif Return

Exerccio 27 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. EXERC08 Rotina de cadastro para a tabela SZ4. Solicitao de software #include Protheus.ch User Function Exerc08() //+-----------------------------------------------------------------------------------------------+ //| Declarar as variaveis aRotina e cCadastro como Private, porque a funo mBrowse est esperando | //+-----------------------------------------------------------------------------------------------+ Private aRotina := {} Private cCadastro := Solicitao de Software //+-------------------------------------------------------------------------+ //| Montar o vetor aRotina, obrigatorio para a utilizao da fun mBrowse() | //+-------------------------------------------------------------------------+ aAdd( aRotina, { Pesquisar , AxPesqui , 0 , 1 }) aAdd( aRotina, { Visualizar , u_Mod2Manut , 0 , 2 }) aAdd( aRotina, { Incluir , u_Mod2Manut , 0 , 3 }) aAdd( aRotina, { Alterar , u_Mod2Manut , 0 , 4 }) aAdd( aRotina, { Excluir , u_Mod2Manut , 0 , 5 })

PROGRAMAO ADVPL 7.10

55 //+----------------------------------------------------------------------+ //| Selecionar a tabela ordem e posicionar no primeiro registro da ordem | //+----------------------------------------------------------------------+ dbSelectArea(SZ4) dbSetOrder(1) dbGoTop() //+----------------------------------------------------+ //| Executar a funo mBrowse para a tabela mencionada | //+----------------------------------------------------+ mBrowse(,,,,SZ4) Return

Modelo2()
Exerccio 28 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Mod2ManutAutor Microsiga Funo que d carga nas variveis e faz o controle de manuteno nos dados por meio da funo Modelo2()

User Function Mod2Manut(cAlias,nReg,nOpc) //+-------------------------+ //| Declarao de variveis | //+-------------------------+ Local cChave := Local nCOLS := 0 Local i := 0 Local lRet := .F. //+--------------------------------------------------------------+ //| Variveis que serviro de parmetros para a funo Modelo2() | //+--------------------------------------------------------------+ Private cTitulo := cCadastro Private aC := {}

PROGRAMAO ADVPL 7.10

56 Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private Private aR := {} aCGF := {} cLinOk := cAllOk := u_Md2TudOk() aGetsGD := {} bF4 := {|| } cIniCpos := +Z4_ITEM nMax := 99 aCordW := {} lDelGetD := .T. aHeader := {} aCOLS := {} nCount := 0 bCampo := {|nField| FieldName(nField) } dData := Ctod( / / ) cNumero := Space(6) aAlt := {}

//+----------------------------------+ //| Cria variaveis de memoria M->??? | //+----------------------------------+ dbSelectArea(cAlias) For i := 1 To FCount() M->&(Eval(bCampo,i)) := CriaVar(FieldName(i),.T.) Next nX //+------------------------------------------------------+ //| Criar o vetor aHeader conforme o dicionario de dados | //+------------------------------------------------------+ dbSelectArea(SX3) dbSetOrder(1) dbSeek(cAlias) While !Eof() .And. SX3->X3_ARQUIVO == cAlias If X3Uso(X3_USADO) .And. cNivel >= X3_NIVEL !(Trim(X3_CAMPO)$Z4_NUMERO/Z4_EMISSAO) aAdd(aHeader,{ TRIM(X3_TITULO) ,; X3_CAMPO ,; X3_PICTURE ,; X3_TAMANHO ,; X3_DECIMAL ,; X3_VALID ,; X3_USADO ,; X3_TIPO ,; X3_ARQUIVO ,; X3_CONTEXT }) Endif

.And.

PROGRAMAO ADVPL 7.10

57 dbSkip() End dbSelectArea(cAlias) dbSetOrder(1) //+----------------------------------------------------------------------------+ //| Se a opcao for diferente de incluir, entao atribuir os dados no vetor aCOLS | //| Caso contrario criar o vetor aCOLS com a caracteristica de cada campo | //+----------------------------------------------------------------------------+ If nOpc <> 3 cNumero := (cAlias)->Z4_NUMERO //+------------------------------------------------------------------------------------------------+ //| Deve-se posicionar porque nunca se sabe em qual item esta, e necessario pegar todos os itens | //+------------------------------------------------------------------------------------------------+ dbSeek(xFilial(cAlias)+cNumero) While !Eof() .And. (cAlias)->(Z4_FILIAL+Z4_NUMERO) == Filial(cAlias)+cNumero //+------------------------------------------------------------------------+ //| Criar o vetor com sua devida dimenso em relao ao dicionrio de dados | //+------------------------------------------------------------------------+ aAdd(aCOLS,Array(Len(aHeader)+1)) nCOLS++ //+-------------------------------------------+ //| Atribuir o dado para cada coluna do vetor | //+-------------------------------------------+ For i := 1 To Len(aHeader) If aHeader[i,10]<>V aCOLS[nCOLS,i] := FieldGet(FieldPos(aHeader[i,2])) Else aCOLS[nCOLS,i] := CriaVar(aHeader[i,2],.T.) Endif Next i //+------------------------------------------------------------------------+ //| Criar uma ltima coluna para o controle da Getdados, se deletado ou no | //+------------------------------------------------------------------------+

PROGRAMAO ADVPL 7.10

58 aCOLS[nCOLS,Len(aHeader)+1] := .F. //+----------------------------------------------------------------------+ //| Atribuir o nmero do registro neste vetor para o controle na gravao | //+----------------------------------------------------------------------+ aAdd(aAlt,RecNo()) dbSelectArea(cAlias) dbSkip() End Else //+-----------------------------------------------------+ //| Atribuir varivel o inicializador padro do campo | //+-----------------------------------------------------+ cNumero := GetSxeNum(SZ4,Z4_NUMERO) //+------------------------------------------------------------------------+ //| Criar o vetor com sua devida dimenso em relao ao dicionrio de dados | //+------------------------------------------------------------------------+ aAdd(aCOLS,Array(Len(aHeader)+1)) For i := 1 To Len(aHeader) aCOLS[1,i] := CriaVar(aHeader[i,2]) Next i //+------------------------------------------------------------------------+ //| Criar uma ltima coluna para o controle da Getdados, se deletado ou no | //+------------------------------------------------------------------------+ aCOLS[1,Len(aHeader)+1] := .F. //+-----------------------------------------------+ //| Atribuir 01 para a primeira linha da Getdados | //+-----------------------------------------------+ aCOLS[1,aScan(aHeader,{|x|Trim(x[2])==Z4_ITEM})] := 01 Endif //+-------------------------------------------------------+ //| Caracterstica do vetor | //| aC[n,1] = Nome da Variavel Ex.:cCliente | //| aC[n,2] = Array com coordenadas do Get [x,y] em PIXEL | //| aC[n,3] = Titulo do Campo | //| aC[n,4] = Picture | //| aC[n,5] = Validacao | //| aC[n,6] = F3 |

PROGRAMAO ADVPL 7.10

59 //| aC[n,7] = Se campo e editavel .t. se nao .f. | //+-------------------------------------------------------+ aAdd(aC,{cNumero ,{15,10},Nmero,@!,,,.F.}) aAdd(aC,{dData,{15,80},Data Emissao,99/99/99,,,(nOpc==3)}) //+-------------------------------+ //| Coordenada do objeto Getdados | //+-------------------------------+ aCGD:={34,5,128,315} //+-----------------------------------------------------------+ //| Validacao na mudanca de linha e quando clicar no botao Ok | //+-----------------------------------------------------------+ cLinOk := AllwaysTrue() //+-------------------------------------------+ //| Atribuir a database do sistema a varivel | //+-------------------------------------------+ dData := dDataBase //+-----------------------------+ //| Executar a funo Modelo2() | //+-----------------------------+ lRet := Modelo2(cTitulo,aC,aR,aCGD,nOpc,cLinOk,cAllOk,,,cIniCpos,nMax) //+---------------+ //| Se confirmado | //+---------------+ If lRet //+-----------------------+ //| Se opo for inclusao | //+-----------------------+ If nOpc == 3 If MsgYesNo(Confirma gravao dos dados ?,cTitulo) Processa({|| Md2Inclu(cAlias)},cTitulo,Gravando aguarde...) Endif //+------------------------+ //| Se opo for alterao | //+------------------------+ Elseif nOpc == 4 If MsgYesNo(Confirma alterao dos dados ?,cTitulo) Processa({|| Md2Alter(cAlias)},cTitulo,Alterando aguarde...)

de

os

dados,

os

dados,

PROGRAMAO ADVPL 7.10

60 Endif //+-----------------------+ //| Se opo for excluso | //+-----------------------+ Elseif nOpc == 5 If MsgYesNo(Confirma eliminao dos dados ?,cTitulo) Processa({|| Md2Exclu(cAlias)},cTitulo,Exclundo os dados, aguarde...) Endif Endif Else //+--------------------------------------------------------------------+ //| Se no confirmado, reestabelecer a nmerao automtica do cadastro | //+--------------------------------------------------------------------+ RollBackSX8() Endif Return

Exerccio 29 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Md2Inclu Desc. Funo para incluir os dados Static Function Md2Inclu(cAlias) Local i := 0 Local y := 0 ProcRegua(Len(aCOLS)) dbSelectArea(cAlias)

PROGRAMAO ADVPL 7.10

61 dbSetOrder(1) For i := 1 To Len(aCOLS) IncProc() If !aCOLS[i,Len(aHeader)+1] RecLock(cAlias,.T.) For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y (cAlias)->Z4_FILIAL := xFilial(cAlias) (cAlias)->Z4_NUMERO := cNumero (cAlias)->Z4_EMISSAO := dData MsUnLock() Endif Next i Return

Exerccio 30 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Md2Alter Desc. Funo para alterar os dados Static Function Md2Alter(cAlias) Local i := 0 Local y := 0 ProcRegua(Len(aCOLS)) dbSelectArea(cAlias) dbSetOrder(1) For i:=1 To Len(aCOLS) If i<=Len(aAlt) dbGoTo(aAlt[i]) RecLock(cAlias,.F.) If aCOLS[i,Len(aHeader)+1] dbDelete() Else For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y

PROGRAMAO ADVPL 7.10

62 Endif MsUnLock() Else If !aCOLS[i,Len(aHeader)+1] RecLock(cAlias,.T.) For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y (cAlias)->Z4_FILIAL := xFilial(cAlias) (cAlias)->Z4_NUMERO := cNumero (cAlias)->Z4_EMISSAO := dData MsUnLock() Endif Endif Next i Return

Exerccio 31 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Md2Exclu Desc. Funo para excluir os dados Static Function Md2Exclu(cAlias) ProcRegua(Len(aCOLS)) dbSelectArea(cAlias) dbSetOrder(1) dbSeek(xFilial(cAlias)+cNumero)

PROGRAMAO ADVPL 7.10

63 While !Eof() .And. (cAlias)->Z4_FILIAL == xFilial(cAlias) .And. (cAlias)->Z4_NUMERO == cNumero IncProc() RecLock(cAlias,.F.) dbDelete() MsUnLock() dbSkip() End Return

Exerccio 32 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Md2TudOk Desc. Funo para validar se est tudo pronto para gravar alm das validaes do dicionrio de dados User Function Md2TudOk() Local lRet := .T. Local i := 0 Local nDel := 0 For i:=1 To Len(aCOLS) If aCOLS[i,Len(aHeader)+1] nDel++ Endif

PROGRAMAO ADVPL 7.10

64 Next i If nDel == Len(aCOLS) MsgInfo(Para excluir EXCLUIR,cTitulo) lRet := .F. Endif Return(lRet)

todos

os

itens,

utilize

opo

Modelo3()
Exerccio 33 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Programa EXERC09 Desc. Rotina de cadastro para a tabela SZ2 relacionada com SZ3 Cadastro de oramento de venda. #Include Protheus.Ch User Function Exerc09() //+-----------------------------------------------------------------------------------------------+ //| Declarao de variaveis | //| Declarar as variaveis aRotina e cCadastro como Private, porque a funo mBrowse est esperando | //+-----------------------------------------------------------------------------------------------+ Private cCadastro := Oramento de venda Private cAlias1 := SZ2 Private cAlias2 := SZ3 Private aRotina := {} //+-------------------------------------------------------------------------+ //| Montar o vetor aRotina, obrigatorio para a utilizao da fun mBrowse() |

PROGRAMAO ADVPL 7.10

65 //+-------------------------------------------------------------------------+ aAdd( aRotina, { Pesquisar , AxPesqui , 0 , 1 }) aAdd( aRotina, { Visualizar , u_Mod3Manut , 0 , 2 }) aAdd( aRotina, { Incluir , u_Mod3Manut , 0 , 3 }) aAdd( aRotina, { Alterar , u_Mod3Manut , 0 , 4 }) aAdd( aRotina, { Excluir , u_Mod3Manut , 0 , 5 }) //+--------------------------------------------------------------------------+ //| Selecionar a tabela pai, ordem e posicionar no primeiro registro da ordem | //+--------------------------------------------------------------------------+ dbSelectArea(cAlias1) dbSetOrder(1) dbGoTop() //+----------------------------------------------------+ //| Executar a funo mBrowse para a tabela mencionada | //+----------------------------------------------------+ mBrowse(,,,,cAlias1) Return

Exerccio 34 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Mod3Manut Desc. Funo que d carga na variveis e faz o controle de manuteno nos dados por meio da funo Modelo3() User Function Mod3Manut(cAlias,nRecNo,nOpc) //+-------------------------+ //| Declarao de variaveis | //+-------------------------+ Local i := 0 Local cLinOk := AllWaysTrue Local cTudoOk := u_Md3TudOk Local nOpcE := nOpc Local nOpcG := nOpc Local cFieldOk := AllWaysTrue

PROGRAMAO ADVPL 7.10

66 Local Local Local Local lVirtual := .T. nLinhas := 99 nFreeze := 0 lRet := .T. aCOLS := {} aHeader := {} aCpoEnchoice := {} aAltEnchoice := {} aAlt := {}

Private Private Private Private Private

//+--------------------------------------------+ //| Criar as variaveis M->Z2_??? da tabela PAI | //+--------------------------------------------+ RegToMemory(cAlias1,(nOpc==3)) //+----------------------------------------------+ //| Criar as variaveis M->Z2_??? da tabela FILHO | //+----------------------------------------------+ RegToMemory(cAlias2,(nOpc==3)) //+--------------------------------------------------------------------------------------------+ //| Criar o vetor aHeader, que eh o vetor que tem as caracteristicas para os campos da Getdados | //+--------------------------------------------------------------------------------------------+ CriaHeader() //+---------------------------------------------------------------------------------------------------------------+ //| Criar o vetor aCOLS, que eh o vetor que tem os dados preenchidos pelo usuario, relacionado com o vetor aHeader | //+---------------------------------------------------------------------------------------------------------------+ CriaCOLS(nOpc) //+-----------------------------+ //| Executar a funo Modelo3() | //+-----------------------------+ lRet:=Modelo3(cCadastro,cAlias1,cAlias2,aCpoEnchoice,cLinOk,cTudoO k,nOpcE,; nOpcG,cFieldOk,lVirtual,nLinhas,aAltEnchoice,nFreeze) //+---------------+ //| Se confirmado | //+---------------+

PROGRAMAO ADVPL 7.10

67 If lRet //+-----------------------+ //| Se opo for inclusao | //+-----------------------+ If nOpc == 3 If MsgYesNo(Confirma gravao dos dados ?,cCadastro) Processa({||GrvDados()},cCadastro,Gravando os dados, aguarde...) Endif //+------------------------+ //| Se opo for alterao | //+------------------------+ Elseif nOpc == 4 If MsgYesNo(Confirma alterao dos dados ?,cCadastro) Processa({||AltDados()},cCadastro,Alterando os dados, aguarde...) Endif //+-----------------------+ //| Se opo for excluso | //+-----------------------+ Elseif nOpc == 5 If MsgYesNo(Confirma eliminao dos dados ?,cCadastro) Processa({||ExcluiDados()},cCadastro,Exclundo os dados, aguarde...) Endif Endif Else //+--------------------------------------------------------------------+ //| Se no confirmado, reestabelecer a nmerao automtica do cadastro | //+--------------------------------------------------------------------+ RollBackSX8() Endif Return

Exerccio 35 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo CriaHeader

PROGRAMAO ADVPL 7.10

68 Desc. Funo para criar o vetor aHeader conforme o dicionario de dados da tabela FILHO Static Function CriaHeader() aHeader:={} aCpoEnchoice := {} aAltEnchoice := {} dbSelectArea(SX3) dbSetOrder(1) dbSeek(cAlias2) While !Eof() .And. X3_ARQUIVO == cAlias2 If X3USO(X3_USADO) .And. cNivel >= X3_NIVEL aAdd(aHeader,{TRIM(X3_TITULO),; X3_CAMPO,; X3_PICTURE,; X3_TAMANHO,; X3_DECIMAL,; X3_VALID,; X3_USADO,; X3_TIPO,; X3_ARQUIVO,; X3_CONTEXT}) Endif dbSkip() End dbSeek(cAlias1) While !Eof() .And. X3_ARQUIVO == cAlias1 If X3USO(X3_USADO) .And. cNivel >= X3_NIVEL aAdd(aCpoEnchoice,X3_CAMPO) aAdd(aAltEnchoice,X3_CAMPO) Endif dbSkip() End Return

Exerccio 36 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo

PROGRAMAO ADVPL 7.10

69 Customizada Produtos. para acessar o Cadastro de Complementos de

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo CriaHeader Desc. Funo para criar o vetor aCOLS conforme o dicionario de dados da tabela FILHO Static Function CriaCOLS(nOpc) Local nQtdCpo := 0 Local i := 0 Local nCOLS := 0 nQtdCpo := Len(aHeader) aCOLS := {} aAlt := {} If nOpc == 3 aAdd(aCOLS,Array(nQtdCpo+1)) For i := 1 To nQtdCpo aCOLS[1,i] := CriaVar(aHeader[i,2]) Next i aCOLS[1,nQtdCpo+1] := .F. Else dbSelectArea(cAlias2) dbSetOrder(1) dbSeek(xFilial(cAlias2)+(cAlias1)->Z2_NUMERO) While !Eof() .And. (cAlias2)->Z3_FILIAL == xFilial(cAlias2) .And. (cAlias2)->Z3_NUMERO == (cAlias1)->Z2_NUMERO aAdd(aCOLS,Array(nQtdCpo+1)) nCOLS ++ For i := 1 To nQtdCpo If aHeader[i,10] <> V aCOLS[nCOLS,i] := FieldGet(FieldPos(aHeader[i,2])) Else aCOLS[nCOLS,i] := CriaVar(aHeader[i,2],.T.) Endif Next i aCOLS[nCOLS,nQtdCpo+1] := .F. aAdd(aAlt,RecNo()) dbSelectArea(cAlias2) dbSkip() End

PROGRAMAO ADVPL 7.10

70 Endif Return Exerccio 37 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo GrvDados Desc. Funo para incluir os dados na tabela FILHO conforme o vetor aHeader e aCOLS e tambm incluir os dados na tabelaPAI conforme as variveis M->??? Static Function GrvDados() Local bCampo := { |nField| Field(nField) } Local i := 0 Local y := 0 Local nItem := 0 ProcRegua(Len(aCOLS)+FCount()) dbSelectArea(cAlias1) RecLock(cAlias1,.T.) For i := 1 To FCount() IncProc() If FILIAL $ FieldName(i) FieldPut(i,xFilial(cAlias1)) Else FieldPut(i,M->&(Eval(bCampo,i))) Endif Next i MsUnLock() dbSelectArea(cAlias2) dbSetOrder(1) For i := 1 To Len(aCOLS) IncProc() If !aCOLS[i,Len(aHeader)+1] RecLock(cAlias2,.T.) For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y nItem++

PROGRAMAO ADVPL 7.10

71 (cAlias2)->Z3_FILIAL := xFilial(cAlias2) (cAlias2)->Z3_NUMERO := (cAlias1)->Z2_NUMERO (cAlias2)->Z3_ITEM := StrZero(nItem,2,0) MsUnLock() Endif Next i Return

Exerccio 38 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo AltDados Desc. Funo para incluir/alterar os dados na tabela FILHO conforme o vetor aHeader e aCOLS e tambm incluir os dados na tabela PAI conforme as variveis M->??? Static Function AltDados() Local bCampo := { |nField| Field(nField) } Local i := 0 Local y := 0 Local nItem := 0 ProcRegua(Len(aCOLS)+FCount()) dbSelectArea(cAlias1) RecLock(cAlias1,.F.) For i := 1 To FCount() IncProc() If FILIAL $ FieldName(i) FieldPut(i,xFilial(cAlias1)) Else FieldPut(i,M->&(Eval(bCampo,i))) Endif Next i MsUnLock() dbSelectArea(cAlias2) dbSetOrder(1) nItem := Len(aAlt)+1

PROGRAMAO ADVPL 7.10

72 For i:=1 To Len(aCOLS) If i<=Len(aAlt) dbGoTo(aAlt[i]) RecLock(cAlias2,.F.) If aCOLS[i,Len(aHeader)+1] dbDelete() Else For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y Endif MsUnLock() Else If !aCOLS[i,Len(aHeader)+1] RecLock(cAlias2,.T.) For y := 1 To Len(aHeader) FieldPut(FieldPos(Trim(aHeader[y,2])),aCOLS[i,y]) Next y (cAlias2)->Z3_FILIAL := xFilial(cAlias2) (cAlias2)->Z3_NUMERO := (cAlias1)->Z2_NUMERO (cAlias2)->Z3_ITEM := StrZero(nItem,2,0) MsUnLock() nItem++ Endif Endif Next i Return

Exerccio 39 Como Criar Telas de Cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo AltDados Desc. Funo para excluir os dados da tabela PAI e FILHO Static Function ExcluiDados() ProcRegua(Len(aCOLS)+1) dbSelectArea(cAlias2) dbSetOrder(1)

PROGRAMAO ADVPL 7.10

73 dbSeek(xFilial(cAlias2)+(cAlias1)->Z2_NUMERO) While !Eof() .And. (cAlias2)->Z3_FILIAL == xFilial(cAlias2) .And. (cAlias2)->Z3_NUMERO == (cAlias1)->Z2_NUMERO IncProc() RecLock(cAlias2,.F.) dbDelete() MsUnLock() dbSkip() End dbSelectArea(cAlias1) dbSetOrder(1) IncProc() RecLock(cAlias1,.F.) dbDelete() MsUnLock() Return

Exerccio 40 Como criar telas de cadastros: Crie um programa denominado Exerc08, utilizando o arquivo de Cadastro de Produtos. Ele deve possuir uma Opo Customizada para acessar o Cadastro de Complementos de Produtos.

Rotina de cadastro para a tabela SZ1. Cadastro de software. Funo Md3TudOk Desc. Funo para validar se a getdados est liberada para gravar os dados conforme o preenchimento User Function Md3TudOk() Local lRet := .T. Local i := 0 Local nDel := 0 For i:=1 To Len(aCOLS) If aCOLS[i,Len(aHeader)+1] nDel++ Endif Next i If nDel == Len(aCOLS) MsgInfo(Para excluir todos EXCLUIR,cCadastro) lRet := .F. Endif Return(lRet)

os

itens,

utilize

opo

PROGRAMAO ADVPL 7.10

74

Modelo2()
Esta funo utilizada para a criao de telas de cadastros nas quais pode-se trabalhar com um esquema cabealho desenvolvido apenas com a utilizao de variveis de memria e logo abaixo uma tela com linhas, utilizada para a digitao dos dados, aparentando estarmos trabalhando com dois arquivos em tela, porm na verdade existir apenas um. Como exemplo, pode-se citar o cadastro de Controle de Reservas, existente no ambiente Faturamento. Sintaxe: Modelo2(cT,aC,aR,aGd,nOp,cLOk,cTOk, aGetsD, bF4, cIniCpos) Parmetros: lRet = Retorno da funo (.T. se confirmou); cT = Ttulo da Janela; aC = Array com os Campos do Cabealho; aR = Array com os Campos do Rodap; aGd = Array com as posies para edio dos tens (GETDADOS); nOp = Modo de operao (3 ou 4 altera e inclui tens, 6 altera mas no inclui tens, qualquer outro nmero s visualiza os tens); cLOk = Funo para validao da linha; cTOk = Funo para validao de tudo (na confirmao); aGetsD = Array com Gets editveis; bF4 = Bloco de Cdigos, para tecla <F4>; cIniCpos = String com Nome dos Campos que devem ser inicializados ao pressionar a tecla de Seta para Baixo.

Exerccio 41 Como utilizar a funo modelo 2 para cadastros: 1. 2. Acesse a Ferramenta IDE; Adicione os Programas a seguir (encontram-se na pasta Rdmake) ao Projeto em uso e compile: Exerc15, Md2vlcli, Md2linok, Md2tudok, Md2valid; 3. Adicione o programa Exerc15 ao menu do Modulo Faturamento e teste. Obs.: Verifique que o Tipo de Cadastro criado totalmente diferente dos utilizados at o momento.

PROGRAMAO ADVPL 7.10

75 4. Teste-o, verificando Cadastro. as suas Validaes e saia do

Modelo3()
Esta funo utilizada para a criao de telas de cadastros, nas quais poderemos trabalhar com um esquema de dois arquivos em tela, ou seja, um para a criao do cabealho e outro para a criao do corpo do cadastro, no qual iremos utilizar linhas para a digitao. Como exemplo, podemos citar o cadastro de pedidos de vendas existente no ambiente Faturamento. Sintaxe: Modelo3(cTitulo,cAlias1,cAlias2,aMyEncho,cLinOk,cTudoOk,nOpcE,nOpcG,cFs2, ; aMyEncho,cLinOk,cTudoOk,nOpcE,nOpcG,cFieldOk,lVirtual,nLinhas,aAltEnchoic e) Parmetros: lRet = Retorno .T. Confirma / .F. Abandona; cTitulo = Ttulo da Janela; cAlias1 = Alias da Enchoice; cAlias2 = Alias da GetDados; aMyEncho = Array com campos da Enchoice; cLinOk = LinOk; cTudOk = TudOk; nOpcE = nOpc da Enchoice; nOpcG = nOpc da GetDados; cFieldOk = Validao para todos os campos da GetDados; lVirtual = Permite visualizar campos virtuais na Enchoice; nLinhas = Nmero Mximo de linhas na Getdados; aAltEnchoice = Array com campos da Enchoice Alterveis.

Exerccio 42 Como utilizar a funo modelo 3 para cadastros: 1. Acesse a Ferramenta IDE; 2. Adicione o programa Exerc16 (encontra-se na pasta Rdmake) ao Projeto em uso e compile-o; 3. Adicione-o ao menu do Modulo Faturamento e teste. Obs.: Verifique que o Tipo de Cadastro criado parecido com o da Funo anterior, porm repare que ele utiliza Dois Arquivos para a sua Criao; 3. Teste-o, inserindo algum Registro e saia do Cadastro.

PROGRAMAO ADVPL 7.10

76

Exerccio 43 Como criar programas utilizando as funes Mbrowse e Modelo3 juntas: 1. Acesse a Ferramenta IDE; 2. Adicione o Programa Exerc17 (encontra-se na pasta Rdmake) ao Projeto em uso e compile-o; 3. Adicione-o ao menu do Modulo Faturamento e teste. Obs.: Verifique que o Cadastro agora possui todas as Opes. 4. Teste-o, inserindo algum Registro; 5. Verifique tambm que a linha possui uma Validao que no deixa que a incluso seja confirmada sem o Preenchimento dos Campos ou que seja possvel a repetio de um Centro de Custos que j foi utilizado em alguma linha anterior; 6. Teste todos as Opes e saia do Cadastro.

O que voc aprendeu neste captulo


Neste captulo, aprendemos a utilizar as funes de criao de telas para cadastros, juntamente com rotinas de validaes utilizadas freqentemente durante a elaborao de programas.

Prximo Passo
No prximo captulo, iremos aprender a criar relatrios para os cadastros. Verificaremos tambm, o arquivo de perguntas para a configurao de seus parmetros.

Relatrios O que voc ir aprender neste captulo


Neste captulo, aprenderemos a criar relatrios customizados.

Rotinas abordadas
Funes para relatrios: SetPrint(); SetDefault(); Pergunte(); SetRegua(); RptStatus(); IncRegua().

PROGRAMAO ADVPL 7.10

77 Criao de Relatrios Customizados; Criao de Relatrios com Relacionamento; Configurao do Arquivo de Perguntas e Respostas.

Variveis de Relatrios
Na criao de um relatrio, algumas variveis e seus tipos so convencionados para a utilizao da biblioteca de funes de relatrio.

Vrivela Tipo

Contedo

Wnrel Local Nome default do relatrio em disco CbCont Local Contador Cabec1 Local 1 linha do cabealho do relatrio Cabec2 Local 2 linha do cabealho do relatrio Cabec3 Local 3 linha do cabealho do relatrio Tamanho Local Tamanho do Relatrio (P = Pequeno 80 Colunas, M= Mdio 132 colunas),G = (Grande 220 colunas) Limite Local Quantidade de colunas no relatrio (80, 132, 220). Titulo Local Titulo do Relatrio CDesc1 Local 1 linha da descrio do relatrio CDesc2 Local 2 linha da descrio do relatrio CDesc3 Local 3 linha da descrio do relatrio aReturn Private Array com as informaes para a tela de configurao da impresso Nomeprog Private Nome do programa do relatrio Cstring Private Alias do arquivo principal do relatrio para o uso de filtro Li Private Controle das linhas de impresso. Seu valor inicial a quantidade mxima de linhas por pgina utilizada no relatrio. M_Pag Private Controle do nmero de pginas do relatrio. Aord Private Array contendo as ordens de layout para a impresso. Caso no existam vrias ordens este array deve estar vazio. Ex.: aOrd:= {Cdigo, Descrio, Telefone} -> O layout do relatrio vai depender da ordem selecionada na tela de configurao de impresso. nLastKey Private Utilizado para controlar o cancelamento da impresso do relatrio. Cperg Private Nome da pergunte a ser exibida para o usurio. Alinha Private impresso de relatrios cadastrais Array que contem informaes para a

SetPrint()
Essa funo a responsvel pela criao da tela do dispositivo de impresso dos relatrios, montando a interface com o usurio. Sintaxe:

PROGRAMAO ADVPL 7.10

78 SetPrint(ExpC2, ExpC3, ExpC4, ExpC5, ExpC6, ExpC7, ExpC8, ExpL1, ExpA1, ExpL2,ExpC9). Parmetros: ExpC2 = Alias do Arquivo Principal (Se existir); ExpC3 = Nome Padro do Relatrio; ExpC4 = Nome do Grupo de Perguntas; ExpC5 .. ExpC8 = Descrio do Relatrio; ExpL1 = Habilita o Dicionrio de Dados: .T. => Habilita (S utilizar em conjunto com a Funo ImpCadast); .F. => Desabilita. ExpA1 = Array contendo as Ordens de Indexao do Arquivo Principal; ExpL2 = Habilita a Alterao da Compresso do Relatrio; .T. => Habilita; .F. => Desabilita. ExpC9 = Classificao do Relatrio por Tamanho ( G, M ou P ): P = 80 colunas; M = 132 colunas; G = 220 colunas.

SetDefault()
Esta funo permite habilitar os padres definidos pela funo Print(). Sintaxe: SetDefault(Array,Alias). Parmetros: Array = Array aReturn, preenchido pelo SetPrint; Array1 = Reservado para o Formulrio; Array2 = Reservado para N de Vias; Array3 = Destinatrio; Array4 = Formato (1Comprimido, 2Normal); Array5 = Mdia a ser Descarregada (1Comprimido, 2Normal); Array6 = Porta da Printer ou Arquivo (1LPT1, 4Com1); Array7 = Expresso ou Filtro de Dados; Array8 = Ordem a ser Selecionada; Array9 = 1 Campo a Processar; Array10 = 2 Campo a Processar; Array11 = 3 Campo a Processar; ArrayN = 4 Campo a Processar; Alias = Alias do Arquivo a ser Impresso. Set

Pergunte()
Esta funo permite acessar e editar um grupo de perguntas de programas, baseando-se no arquivo de perguntas e respostas do sistema (Sx1), conhecido tambm como parmetros de relatrios. Mostra uma tela contendo um lote de parmetros a serem respondidos e, em seguida, confirmados pelo usurio.

PROGRAMAO ADVPL 7.10

79 Sintaxe: Pergunte(cPergunta,lAsk). Parmetros: cPergunta = Cdigo da Pergunta no SX1 conforme o Programa/ Nome do Grupo de Perguntas; lAsk = Mostrar a Tela de Perguntas ou simplesmente carrega os Valores Default. .F. = Devolve Contedo da Variveis, no apresentando a Janela de Perguntas; .T. = Permite Alterao das Variveis apresentando a Janela.

SetRegua()
Inicializa a rgua padro para acompanhar a evoluo do processamento dos relatrios. Sintaxe: SetRegua(n1). Parmetros: <n1> = Numrico, Nmero de registros que sero processados.

RptStatus()
Executa a funo de detalhes do relatrio, ou seja, a impresso da pgina propriamente dita. Sintaxe: RptStatus(b1). Parmetros: <b1> = Bloco de cdigo que define a funo a ser executada. Comentrios: Pode ser utilizada com o Parmetro: RptStatus( { | | (Nome da Funo) } )

IncRegua()
Incrementa a rgua padro de processamento em relatrios, ou seja, a responsvel por sincronizar a barra de progresso de acordo com o nmero de registros selecionados para a impresso. Sintaxe: IncRegua(). Parmetros: Nil.

Desenvolvendo Relatrios
A criao de relatrios no MP8 Protheus muito facilitada pelo assistente de cdigo, porm sempre haver a necessidade de complementos adicionais, pois a ferrramenta cria apenas o fonte padro.

PROGRAMAO ADVPL 7.10

80

Exerccio 44 Como criar relatrios para cadastro de softwares por meio do assistente de cdigo da ferramenta IDE: 1. Acesse a Ferramenta IDE; 2. Selecione as seguintes opes: Ferramentas + Assistente de Cdigo + Relatrio; 3. Clique na opo Avanar>>; 4. Selecione a opo Arquivo Padro; 5. No Campo Alias, informe SZ1; 6. Selecione a opo Utiliza ndice Padro; 7. No Campo Ordem, informe 1 e clique na opo Avanar>>; 8. No Campo Chave, informe RSZ1; 9. Clique na opo Avanar>>; 10. No Campo Ttulo, informe Relatrio de Softwares; 11. No Campo Cabec1, informe Cdigo Nome; 12. No Campo Cabec2, informe ------ ---------------; 13. Selecione a opo Normal; 14. No Campo Tamanho, selecione 80 Colunas; 15. Na pasta Ordem, posicione o cursor sobre o Campo Ordem, informe Cdigo e clique na opo adicionar; 16. Na seqncia, informe tambm Nome e clique na opo adicionar; 17. Nas pastas Habilitaes, deixe tudo selecionado e clique na opo Finalizar.

Exerccio 45 Como realizar Alteraes necessrias nos fontes: 1. Realize as Alteraes necessrias, seguindo o exemplo a seguir, de acordo com o Texto em Negrito: #Include rwmake.ch Programa 99/99/99 | RPAD | Autor | Ferramenta IDE | Data |

Descrio | Cdigo gerado pelo MP8 Protheus7 IDE.

User Function Exerc18 Private cString Local aOrd := {} Private CbTxt := Local cDesc1 := imprimir relatrios Local cDesc2 := informados pelo usurio. Local cDesc3 := Local cPict :=

Este de

programa acordo

tem

como os

objetivo

com

parmetros

Cadastro de Software

PROGRAMAO ADVPL 7.10

81 Private lEnd Private lAbortPrint Private limite Private tamanho := Private nomeprog := Programa para cabealho Private nTipo Private aReturn := 1, , 1} Private nLastKey := Private cPerg Perguntas Local titulo Local nLin := Local Cabec1 Local Cabec2 Private cbtxt Private cbcont Private CONTFL := Private m_pag Local imprime Private wnrel Arquivo usado para disco. Private cString dbSelectArea(SZ1) dbSetOrder(1) pergunte(cPerg,.F.) := .F. := .F. := 80 P Exerc18

//

Coloque aqui o impresso

Nome

do no

:= 18 { Zebrado, 1, Administrao, 2, 2, 0 := := 80 := := := := 01 := := :=

RSZ1

//

Nomo

do

Grupo

de

Cadastro de Software Codigo Nome Space(10) 00 01 .T. Exerc18 // Coloque aqui o Nome do impresso em SZ1

:=

Monta a interface padro com o usurio...

wnrel := SetPrint(cString,NomeProg,cPerg,@titulo,cDesc1, cDesc2,cDesc3,.T.,aOrd,.T.,Tamanho,,.T.) If nLastKey == 27 Return Endif SetDefault(aReturn,cString) If nLastKey == 27 Return Endif nTipo := If(aReturn[4]==1,15,18) Processamento. processamento. RPTSTATUS monta janela com a rgua de

PROGRAMAO ADVPL 7.10

82 RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo) RETURN * Funo | RUNREPORT | Autor | MP8 Protheusx IDE Data | 99/99/99 |

Descrio | Funo auxiliar chamada pela RPTSTATUS. A funo RPTSTATUS | monta a janela de processamento

Static Function RunReport(Cabec1,Cabec2,Titulo,nLin) Local nOrdem dbSelectArea(cString) dbSetOrder(1) | * SETREGUA -> Indica quantos registros sero processados para a rgua //*SetRegua(RecCount()) // Posicionamento do primeiro registro e loop principal. // Pode-se criar a lgica da seguinte maneira: // Posiciona-se na filial corrente e processa enquanto a filial do registro for a filial // corrente. // Por exemplo, substitua o dboTop() e o While !EOF() abaixo pela sintaxe: // dbSeek(xFilial(SA1)) // While !EOF() .And. xFilial(SA1) == A1_Filial // O tratamento dos parmetros deve ser realizado dentro da lgica do seu relatrio. // Geralmente a chave principal e a filial (Isto vale principalmente se o arquivo for // um arquivo padro). Posiciona-se o primeiro registro pela filial + pela chave // secundria (cdigo por exemplo), e processa enquanto estes valores estiverem dentro // dos parmetros definidos. Suponha por exemplo o uso de dois parmetros: // mv_par01 -> Indica o cdigo inicial a processar // mv_par02 -> Indica o cdigo final a processar // dbSeek(xFilial(SA1)+mv_par01,.T.) // Posiciona no 1 reg. satisfatrio // While !EOF() .And. xFilial(SA1) == A1_Filial .And. A1_Cod <= mv_par02 // Assim o processamento ocorrer enquanto o cdigo do registro posicionado for // menor ou igual ao parmetro mv_par02, que indica o cdigo Limite

PROGRAMAO ADVPL 7.10

83 // para o processamento. Caso existam outros parmetros a serem checados, isto // deve ser realizado dentro da estrutura de lao (WHILE): // mv_par01 -> Indica o cdigo inicial a processar // mv_par02 -> Indica o cdigo final a processar // mv_par03 -> Considera qual estado? // dbSeek(xFilial(SA1)+mv_par01,.T.) // Posiciona no 1 reg. satisfatrio // While !EOF() .And. xFilial(SA1) == A1_Filial .And. A1_Cod <= mv_par02 // If A1_EST <> mv_par03 // dbSkip() // Loop // Endif dbGoTop() DBSEEK(xFilial(SZ1)+mv_par01,.T.) While !EOF() .and. SZ1->Z1_Codigo <= MV_Par02 // Verifica o cancelamento pelo usurio... If lAbortPrint @nLin,00 PSAY *** Cancelado pelo Operador *** Exit Endif // Impresso do cabealho do relatrio. . . If nLin > 55 // Salto de Pgina. Neste caso o formulrio tem 55 linhas... Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) nLin := 8 Endif // Coloque aqui a lgica da impresso de seu programa. Utilize PSAY para //sada na impressora. Por exemplo:* @nLin,00 PSAY SA1->A1_Cod nLin := nLin + 1 // Avana a linha de impresso @ nLin, 01 Psay SZ1->Z1_Codigo @ nLin, 08 Psay SZ1->Z1_Nome dbSkip() // Avana o ponteiro do registro no arquivo Incregua() EndDo

PROGRAMAO ADVPL 7.10

84 // Finaliza a execucao do relatrio... SET DEVICE TO SCREEN // Retorna para a Tela If aReturn[5]==1 // Se impresso em disco, chama o gerenciador de impresso... dbCommitAll() SET PRINTER TO OurSpool(wnrel) Endif MS_FLUSH() // Limpa o Buffer de Impresso Return 2. 3. 4. Confira os dados, salve o Programa com o nome de Exerc18; Adicione ao Projeto em uso e Compile-o. Adicione-o ao menu do Modulo Faturamento e teste.

Perguntas e Respostas
Todos os relatrios existentes no MP8 Protheus necessitam de perguntas para imprimir corretamente os dados, ou seja, necessrio configurarmos um arquivo para parametrizar o que desejamos imprimir. O arquivo responsvel por essa configurao o (Sx1) e ele servir tanto para as perguntas e respostas de relatrios, quanto para as rotinas de processamentos.

Exerccio 46 Como criar perguntas: 1. Ainda no ambiente Configurador; 2. Selecione as seguintes opes Base de Dados + Dicionrio + Base de Dados; 3. Posicione o cursor sobre a opo Perguntas e clique na opo Incluir; 4. No Campo Grupo, informe RSZ1; 5. Nas Linhas Abaixo, crie as perguntas a seguir: 6. Confira os dados e confirme a Criao das Perguntas; 7. Clique na opo Pesquisar; 8. No Campo Procurar por:, informe RSZ1 e confirme; 9. Verifique se as Perguntas foram includas corretamente no Arquivo; 10. Aps a verificao, saia do cadastro e do ambiente Configurador.

Exerccio 47 Entendendo o que aconteceu: 1. D um duplo clique no Atalho do Remote; 2. No Campo Programa Inicial, informe APSDU e confirme;

PROGRAMAO ADVPL 7.10

85 Ser solicitado um Usurio (Administrador) e Senha (em branco); 4. Selecione as seguintes opes: File + Open; 5. Selecione o Driver DBF (DBFCDXADS/DBFCDXAX); 6. Clique na opo + da opo Servidor ao lado direito da caixa e posicione com o cursor sobre a pasta \Sigaadv\; 7. Posicione com o cursor sobre o Arquivo SX1990.dbf, que se encontra ao lado direito da caixa; 8. Selecione as seguintes opes: Find + Seek; 9. No Campo Expression, informe RSZ1 e confirme; 10. Assim que a Pesquisa for concluda, verifique o Resultado e saia do Aplicativo. 3.

1. 2. 3. 4. 5.

Exerccio 48 Como testar relatrios: Acesse o ambiente Faturamento; Selecione as seguintes opes: Relatrios + Cadastros + Exerc18; Na pasta Impresso, selecione a opo Em Disco; Clique na opo Parmetros ao lado direito da tela e defina a impresso dos registros, informando os dados a seguir: Confira os dados, confirme os Parmetros e a Emisso do Relatrio para Verificao do Resultado.

Dica: Para anular a Impresso dos Parmetros dos Relatrios, acesse o Cadastro de Parmetros, no ambiente Configurador e configure os Parmetros MV_IMPSX1, MV_SALTPAG e MV_CANSALT com o Contedo igual a N. Dessa maneira, as Perguntas no sero mais impressas, no haver Saltos e tampouco emisso de Pginas em Branco.

Exerccio 49 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente: 1. Acesse a Ferramenta IDE; 2. Selecione as seguintes opes: Ferramentas + Assistente de Cdigo + Relatrio; 3. Clique na opo Avanar>>; 4. Selecione a opo Arquivo Padro; 5. No Campo Alias, informe SZ2; 6. Selecione a opo Utiliza ndice Padro; 7. No Campo Ordem, informe 1 e clique na opo Avanar>>; 8. No Campo Chave, informe RSZ2; 9. Clique na opo Avanar>>; 10. No Campo Ttulo, informe Relatrio de Usurios; 11. No Campo Cabec1, informe Cdigo Nome;

PROGRAMAO ADVPL 7.10

86 NoCampo Cabec2, informe ------ ---------------; Selecione a opo Normal; No Campo Tamanho, selecione 80 Colunas; Na pasta Ordem, posicione com o cursor no Campo Ordem, informe Cdigo e clique na opo adicionar; 16. Na sequncia, informe tambm o Nome e clique na opo adicionar; 17. Nas pastas Habilitaes, deixe tudo selecionado e clique na opo Finalizar. 12. 13. 14. 15.

Exerccio 50 Como realizar alteraes necessrias nos fontes e criar funes, para a criao de perguntas automaticamente: Programa NOVO2 Descricao Codigo gerado pelo AP6 IDE. LAY-OUT DO RELATORIO CODIGO NOME EMISSAO AQUISICAO 999999 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 99/99/99 99/99/99 012345678901234567890123456789012345678901234567890123456789012345 67890123456789 0 1 2 3 4 5 6 7

#INCLUDE rwmake.ch User Function Exerc10() // Declaracao Local cDesc1 relatorio Local cDesc2 usuario. Local cDesc3 Local cPict Local titulo Local nLin

de

Variaveis

:= Este programa tem como objetivo imprimir := de acordo com os parametros informados pelo := := := := Cadastro de Software Cadastro de Software 80 := CODIGO NOME

Local Cabec1 EMISSAO AQUISICAO Local Cabec2 := Local imprime := .T. Local aOrd := {}

PROGRAMAO ADVPL 7.10

87 Private lEnd := .F. Private lAbortPrint := .F. Private CbTxt := Private limite := 80 Private tamanho := P Private nomeprog := EXERC10 // 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 := nomeprog // Coloque aqui o nome do arquivo usado para impressao em disco Private cString := SZ1 dbSelectArea(SZ1) dbSetOrder(1)

//

Monta a interface padrao com o usuario... wnrel:=SetPrint(cString,NomeProg,,@titulo,cDesc1,cDesc2,cDesc3,. F.,aOrd,.F.,; Tamanho,,.F.) If nLastKey == 27 Return Endif SetDefault(aReturn,cString) If nLastKey == 27 Return Endif nTipo := If(aReturn[4]==1,15,18) // Processamento. RPTSTATUS monta janela com a regua de processamento. RptStatus({|| RunReport(Cabec1,Cabec2,Titulo,nLin) },Titulo) Return //Funo RUNREPORT //Funcao auxiliar chamada pela RPTSTATUS. A funcao RPTSTATUS //monta a janela com a regua de processamento. Static Function RunReport(Cabec1,Cabec2,Titulo,nLin)

PROGRAMAO ADVPL 7.10

88 Local nOrdem dbSelectArea(cString) dbSetOrder(1) // SETREGUA -> Indica quantos registros serao processados para a regua SetRegua(RecCount()) // Posicionamento do primeiro registro e loop principal. Pode-se criar // a logica da seguinte maneira: Posiciona-se na filial corrente e pro // cessa enquanto a filial do registro for a filial corrente. Por exem // plo, substitua o dbGoTop() e o While !EOF() abaixo pela sintaxe: // // dbSeek(xFilial()) // While !EOF() .And. xFilial() == A1_FILIAL dbGoTop() While !EOF() // Verifica o cancelamento pelo usuario... If lAbortPrint @nLin,00 PSAY *** CANCELADO PELO OPERADOR *** Exit Endif // 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 // Coloque aqui a logica da impressao do seu programa... // Utilize PSAY para saida na impressora. Por exemplo: // @nLin,00 PSAY SA1->A1_COD @ nLin,000 PSay SZ1->Z1_CODIGO @ nLin,008 PSay SZ1->Z1_NOME @ nLin,061 PSay SZ1->Z1_EMISSAO @ nLin,071 PSay SZ1->Z1_DTAQUIS 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()

PROGRAMAO ADVPL 7.10

89 SET PRINTER TO OurSpool(wnrel) Endif MS_FLUSH() Return Exerccio 51 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente: * Codigo Item Descricao do Software Quantidade Vlr.Unitario Vlr.Total Oramento: 999999 Cliente: 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Emissao: 99/99/99 Validade: 99/99/99 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 999,999,999.99 999,999,999.99 999,999,999.99 012345678901234567890123456789012345678901234567890123456789012345 67890123456789012345678901234567890123456789012345678901234567 8901 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ User Function Exerc11() //+------------------------//| Declaracoes de variaveis //+------------------------Local cDesc1 := Este relatorio ira imprimir informacoes oramento de software conforme Local cDesc2 := parmetros informados pelo usurio Local cDesc3 := [Utilizando Posicionamento e Condies Registros] Private Private Private Private Private Private Private Private Private Private Private cString Tamanho aReturn wnrel NomeProg nLastKey Limite Titulo cPerg nTipo cbCont := := := := := := := := := := := SZ2 M { Zebrado,1,Administracao,2,2,1,,1 } EXERC11 wnrel 0 132 Orcamento de software EXEC11 0 0

do

p/

PROGRAMAO ADVPL 7.10

90 Private cbTxt Private Li Private m_pag Private aOrd Private Cabec1 Quantidade Private Cabec2 := := := := registro(s) lido(s) 80 1 {} := Cdigo Item Descricao do Vlr.Unitario Vlr.Total :=

Software

/* +------------------------------------------------------| Parametros do aReturn que preenchido pelo SetPrint() +------------------------------------------------------aReturn[1] - Reservado para formulario aReturn[2] - Reservado para numero de vias aReturn[3] - Destinatario aReturn[4] - Formato 1=Paisagem 2=Retrato aReturn[5] - Midia 1-Disco 2=Impressora aReturn[6] - Prota ou arquivo 1-Lpt1... 4-Com1... aReturn[7] - Expressao do filtro aReturn[8] - Ordem a ser selecionada aReturn[9] [10] [n] - Campos a processar se houver */ //+----------------------------------------//| Parametros de perguntas para o relatorio //+----------------------------------------//| mv_par01 - Oramento de ? //| mv_par02 - Oramento ate ? //| mv_par03 - Cliente de ? //| mv_par04 - Cliente ate ? //| mv_par05 - Emisso de ? ? //| mv_par06 - Emisso ate ? ? //+----------------------------------------CriaSx1() //+------------------------------------------------//| Disponibiliza para usuario digitar os parametros //+------------------------------------------------Pergunte(cPerg,.F.) //+-------------------------------------------------//| Solicita ao usuario a parametrizacao do relatorio //+-------------------------------------------------wnrel:=SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,. F.,aOrd,.F.,; Tamanho,.F.,.F.)

PROGRAMAO ADVPL 7.10

91 //+-----------------------------------------------------------------------//| Parmetros da funo SetPrint //| SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd, lCompres,; //| cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortTo Print) //+-----------------------------------------------------------------------//+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------------------------------------//| Estabelece os padroes para impressao, conforme escolha do usuario //+----------------------------------------------------------------SetDefault(aReturn,cString) //+------------------------------------//| Verificar se sera reduzido ou normal //+------------------------------------nTipo := Iif(aReturn[4] == 1, 15, 18) //+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------//| Chama funcao que processa os dados //+----------------------------------RptStatus({|lEnd| Exerc11Imp(@lEnd) },Aguarde...,Imprimindo os dados..., .T.) Return Static Function Exerc11Imp(lEnd) Local nTPedido := 0

PROGRAMAO ADVPL 7.10

92

//+-------------------------------------------//| Selecionar e posicionar na tabela principal //+-------------------------------------------dbSelectArea(SZ2) dbSetOrder(1) dbSeek(xFilial(SZ2)+mv_par01,.T.) While !Eof() .And. xFilial(SZ2)+mv_par02 If lEnd @ Li,000 PSay cCancel Exit Endif SZ2->(Z2_FILIAL+Z2_NUMERO) <=

//+--------------------------------------------------------------------//| Se o registro estiver fora dos parmetros, ir para o prximo registro //+--------------------------------------------------------------------If SZ2->Z2_CLIENTE < mv_par03 .Or. SZ2->Z2_CLIENTE > mv_par04 dbSkip() Loop Endif //+--------------------------------------------------------------------//| Se o registro estiver fora dos parmetros, ir para o prximo registro //+--------------------------------------------------------------------If SZ2->Z2_EMISSAO < mv_par05 .Or. SZ2->Z2_EMISSAO > mv_par06 dbSkip() Loop Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay No. Orcamento: +SZ2->Z2_NUMERO @ Li,024 PSay Cliente: +SZ2->(Z2_CLIENTE+ +Posicione(SA1,1,xFilial(SA1)+SZ2>(Z2_CLIENTE+Z2_LOJA),A1_NOME) @ Li,093 PSay Emissao: +Dtoc(SZ2->Z2_EMISSAO) @ Li,113 PSay Validade: +Dtoc(SZ2->Z2_DTVALID) Li+=2

+Z2_LOJA)+

PROGRAMAO ADVPL 7.10

93

dbSelectArea(SZ3) dbSetOrder(1) dbSeek(xFilial(SZ3)+SZ2->Z2_NUMERO) While !Eof() .And. SZ3->Z3_FILIAL+SZ3->Z3_NUMERO == xFilial(SZ3)+SZ2->Z2_NUMERO If lEnd @ Li,000 PSay cCancel Exit Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay SZ3->Z3_CODSOFT @ Li,013 PSay SZ3->Z3_ITEM @ Li,021 PSay Posicione(SZ1,1,xFilial(SZ1)+SZ3>Z3_CODSOFT,Z1_NOME) @ Li,077 PSay SZ3->Z3_QUANT PICTURE @E 999,999,999.99 @ Li,097 PSay SZ3->Z3_UNIT PICTURE @E 999,999,999.99 @ Li,117 PSay SZ3->Z3_VLRTOT PICTURE @E 999,999,999.99 nTPedido += SZ3->Z3_VLRTOT Li++ dbSelectArea(SZ3) dbSkip() End @ Li,000 PSay __PrtThinLine() Li++ @ Li,000 PSay Total do Pedido: " @ Li,117 PSay nTPedido PICTURE @E 999,999,999.99 nTPedido := 0 Li++ @ Li,000 PSay __PrtThinLine() Li+=2 dbSelectArea(SZ2) dbSkip() End dbSelectArea(SZ2) dbSetOrder(1) dbGoTop() dbSelectArea(SZ3) dbSetOrder(1) dbGoTop() If aReturn[5] == 1

PROGRAMAO ADVPL 7.10

94 Set Printer TO dbCommitAll() Ourspool(wnrel) EndIf Ms_Flush() Return /****** // * // Parametros que devem ser passados para a funo criar as perguntas no arquivo SX1 // * -------------------------------------------------------------------------------// 1o.Parametro -> Nome do grupo // 2o.Parametro -> Numero da ordem // 3o.Parametro -> Texto da pergunta em portugues // 4o.Parametro -> Texto da pergunta em espanhol // 5o.Parametro -> Texto da pergunta em ingles // 6o.Parametro -> Nome da variavel // 7o.Parametro -> Tipo do dado C=caractere, D=Data, N=Numerico // 8o.Parametro -> Tamanho do dado // 9o.Parametro -> Quantidade de casas decimais para o dado // 10o.Parametro -> Numero da pre-selecao // 11o.Parametro -> O tipo do dado sera G=get, S=scroll, C=choice // 12o.Parametro -> Sintaxe em advpl, ou funcao para validacao // 13o.Parametro -> Consistencia com alguma tabela do sistema via <F3> // 14o.Parametro -> Nome do grupo para SXG // 15o.Parametro -> Pyme // 16o.Parametro -> Nome da variavel que ser utilizada no programa // 17o.Parametro -> Primeira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 18o.Parametro -> Primeira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 19o.Parametro -> Primeira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 20o.Parametro -> Conteudo da ultima resposta informada no parametro se caso o tipo do dados for get // 21o.Parametro -> Segunda definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 22o.Parametro -> Segunda definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 23o.Parametro -> Segunda definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 24o.Parametro -> Terceira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 25o.Parametro -> Terceira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No

PROGRAMAO ADVPL 7.10

95 // 26o.Parametro -> Terceira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 27o.Parametro -> Quarta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 28o.Parametro -> Quarta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 29o.Parametro -> Quarta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 30o.Parametro -> Quinta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 31o.Parametro -> Quinta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 32o.Parametro -> Quinta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 33o.Parametro -> Vetor com o texto do help em portugues // 34o.Parametro -> Vetor com o texto do help em espanhol // 35o.Parametro -> Vetor com o texto do help em ingles // 36o.Parametro -> Nome do grupo do help //* //*/ Static Function CriaSx1() Local aHelp := {} aAdd( aHelp , {{Informe o {}} ) aAdd( aHelp , {{Informe o {}} ) aAdd( aHelp , {{Informe o {}} ) aAdd( aHelp , {{Informe o {}} ) aAdd( aHelp , {{Emitir os {}} ) aAdd( aHelp , {{Emitir os {}} ) //texto do ingls espanhol nmero do orcamento inicial} , {} , nmero do oramento final} cdigo do cliente de incio} cdigo do cliente para fim} oramento a partir da data} oramento at a data} help , {} , , {} , , {} , , {} , , {} , portugus

PutSx1(cPerg,01,Orcamento de?,,,mv_ch1,C,06,00,00,; G,,,,,mv_par01,,,,,,,,,,,,,, ,,,; aHelp[1,1],aHelp[1,2],aHelp[1,3],) PutSx1(cPerg,02,Orcamento ate?,,,mv_ch2,C,06,00,00,; G,,,,,mv_par02,,,,,,,,,,,,,, ,,,; aHelp[2,1],aHelp[2,2],aHelp[2,3],)

PROGRAMAO ADVPL 7.10

96 PutSx1(cPerg,03,Cliente de?,,,mv_ch3,C,06,00,00,G,,SA1,; ,,mv_par03,,,,,,,,,,,,,,,,,; aHelp[3,1],aHelp[3,2],aHelp[3,3],) PutSx1(cPerg,04,Clienteate?,,,mv_ch4,C,06,00,00,G, ,SA1,; ,,mv_par04,,,,,,,,,,,,,,,,,a Help[4,1],; aHelp[4,2],aHelp[4,3],) PutSx1(cPerg,05,Emissao de?,,,mv_ch5,D,08,00,00,G,,,,,; mv_par05,,,,,,,,,,,,,,,,,aHelp[5 ,1],aHelp[5,2],; aHelp[5,3],) PutSx1(cPerg,06,Emissao ate?,,,mv_ch6,D,08,00,00,G,,,,,; mv_par06,,,,,,,,,,,,,,,,,aHelp[6 ,1],aHelp[6,2],; aHelp[6,3],) // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 37 Return

Exerccio 52 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente: Codigo Item Descricao do Software Quantidade Vlr.Unitario Vlr.Total Oramento: 999999 Cliente: 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Emissao: 99/99/99 Validade: 99/99/99 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 999,999,999.99 999,999,999.99 999,999,999.99 012345678901234567890123456789012345678901234567890123456789012345 67890123456789012345678901234567890123456789012345678901234567 8901 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ User Function Exerc12()

PROGRAMAO ADVPL 7.10

97 //+------------------------//| Declaracoes de variaveis //+------------------------Local cDesc1 := Este relatorio ira imprimir informacoes oramento de software conforme Local cDesc2 := parmetros informados pelo usurio Local cDesc3 := [Utilizando Filtro Temporrio] Private cString Private Tamanho Private aReturn Private wnrel Private NomeProg Private nLastKey Private Limite Private Titulo Private cPerg Private nTipo Private cbCont Private cbTxt Private Li Private m_pag Private aOrd Private Cabec1 Quantidade Private Cabec2

do

:= SZ2 := M := { Zebrado,1,Administracao,2,2,1,,1 } := EXERC12 := wnrel := 0 := 132 := Orcamento de software := EXEC12 := 0 := 0 := registro(s) lido(s) := 80 := 1 := {} := Codigo Item Descricao do Software Vlr.Unitario Vlr.Total :=

/* +------------------------------------------------------| Parametros do aReturn que preenchido pelo SetPrint() +------------------------------------------------------aReturn[1] - Reservado para formulario aReturn[2] - Reservado para numero de vias aReturn[3] - Destinatario aReturn[4] - Formato 1=Paisagem 2=Retrato aReturn[5] - Midia 1-Disco 2=Impressora aReturn[6] - Prota ou arquivo 1-Lpt1... 4-Com1... aReturn[7] - Expressao do filtro aReturn[8] - Ordem a ser selecionada aReturn[9] [10] [n] - Campos a processar se houver */ //+----------------------------------------//| Parametros de perguntas para o relatorio //+----------------------------------------//| mv_par01 - Oramento de ?

PROGRAMAO ADVPL 7.10

98 //| mv_par02 - Oramento ate ? //| mv_par03 - Cliente de ? //| mv_par04 - Cliente ate ? //| mv_par05 - Emisso de ? ? //| mv_par06 - Emisso ate ? ? //+----------------------------------------CriaSx1() //+------------------------------------------------//| Disponibiliza para usuario digitar os parametros //+------------------------------------------------Pergunte(cPerg,.F.) //+-------------------------------------------------//| Solicita ao usuario a parametrizacao do relatorio //+-------------------------------------------------wnrel:=SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,. F.,aOrd,.F.,; Tamanho,.F.,.F.) //+-----------------------------------------------------------------------//| Parmetros da funo SetPrint //| SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd, lCompres,; //| cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortTo Print) //+-----------------------------------------------------------------------//+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------------------------------------//| Estabelece os padroes para impressao, conforme escolha do usuario //+----------------------------------------------------------------SetDefault(aReturn,cString) //+-------------------------------------

PROGRAMAO ADVPL 7.10

99 //| Verificar se sera reduzido ou normal //+------------------------------------nTipo := Iif(aReturn[4] == 1, 15, 18) //+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------//| Chama funcao que processa os dados //+----------------------------------RptStatus({|lEnd| Exerc12Imp(@lEnd) },Aguarde...,Imprimindo os dados..., .T.) Return Static Function Exerc12Imp(lEnd) Local nTPedido := 0 Local cFiltZ2 := Local cArqTrbZ2 := Local nIndexZ2 := //+----------------------------------------------//| Adquiri nome de arquivo de trabalho/temporario //+----------------------------------------------cArqTrbZ2 := CriaTrab(Nil,.F.) //+-------------------------------------//| Montar a expressao filtro na variavel //+-------------------------------------cFiltZ2 := Z2_FILIAL == +xFilial(SZ2)+ cFiltZ2 += .And. Z2_NUMERO >= +mv_par01+ cFiltZ2 += .And. Z2_NUMERO <= +mv_par02+ cFiltZ2 += .And. Z2_CLIENTE >= +mv_par03+ cFiltZ2 += .And. Z2_CLIENTE <= +mv_par04+ cFiltZ2 += .And. Dtos(Z2_EMISSAO) >= +Dtos(mv_par05)+ cFiltZ2 += .And. Dtos(Z2_EMISSAO) <= +Dtos(mv_par06)+ //+------------------------------------------------------//| Selecionar a tabela com o indice desejado para filtrar //+------------------------------------------------------dbSelectArea(SZ2) dbSetOrder(1)

PROGRAMAO ADVPL 7.10

100 //+-----------------------------------------------------------------------//| Cria o filtro conforme a expressao e adiciona ao indice conforme selecao //+-----------------------------------------------------------------------IndRegua(SZ2,cArqTrbZ2,IndexKey(),,cFiltZ2) nIndexZ2 := RetIndex(SZ2) nIndexZ2 := nIndexZ2 + 1 #IFNDEF TOP dbSetIndex(cArqTrbZ2+OrdBagExt()) #ENDIF dbSetOrder(nIndexZ2) dbGoTop() While !Eof() If lEnd @ Li,000 PSay cCancel Exit Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay No. Orcamento: +SZ2->Z2_NUMERO @ Li,024 PSay Cliente: +SZ2->(Z2_CLIENTE+ +Posicione(SA1,1,xFilial(SA1)+SZ2>(Z2_CLIENTE+Z2_LOJA),A1_NOME) @ Li,093 PSay Emissao: +Dtoc(SZ2->Z2_EMISSAO) @ Li,113 PSay Validade: +Dtoc(SZ2->Z2_DTVALID) Li+=2 dbSelectArea(SZ3) dbSetOrder(1) dbSeek(xFilial(SZ3)+SZ2->Z2_NUMERO) While !Eof() .And. SZ3->Z3_FILIAL+SZ3->Z3_NUMERO >Z2_FILIAL+SZ2->Z2_NUMERO If lEnd @ Li,000 PSay cCancel Exit Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay SZ3->Z3_CODSOFT @ Li,013 PSay SZ3->Z3_ITEM

+Z2_LOJA)+

==

SZ2-

PROGRAMAO ADVPL 7.10

101 @ Li,021 PSay Posicione(SZ1,1,xFilial(SZ1)+SZ3>Z3_CODSOFT,Z1_NOME) @ Li,077 PSay SZ3->Z3_QUANT PICTURE @E 999,999,999.99 @ Li,097 PSay SZ3->Z3_UNIT PICTURE @E 999,999,999.99 @ Li,117 PSay SZ3->Z3_VLRTOT PICTURE @E 999,999,999.99 nTPedido += SZ3->Z3_VLRTOT Li++ dbSkip() End @ Li,000 PSay __PrtThinLine() Li++ @ Li,000 PSay Total do Pedido: " @ Li,117 PSay nTPedido PICTURE @E 999,999,999.99 nTPedido := 0 Li++ @ Li,000 PSay __PrtThinLine() Li+=2 dbSelectArea(SZ2) dbSkip() End //+------------------------------------------------------//| Elimina os arquivos temporarios e reestabelece a tabela //+------------------------------------------------------dbSelectArea(SZ2) FErase(cArqTrbZ2+GetDBExtension()) FErase(cArqTrbZ2+OrdbagExt()) FErase(cArqTrbZ2+.*) RetIndex(SZ2) Set Filter To dbSetOrder(1) dbGoTop() If aReturn[5] == 1 Set Printer TO dbCommitAll() Ourspool(wnrel) EndIf Ms_Flush() Return /****** * // Parametros que devem ser perguntas no arquivo SX1

passados

para

funo

criar

as

PROGRAMAO ADVPL 7.10

102 * -------------------------------------------------------------------------------// 1o.Parametro -> Nome do grupo // 2o.Parametro -> Numero da ordem // 3o.Parametro -> Texto da pergunta em portugues // 4o.Parametro -> Texto da pergunta em espanhol // 5o.Parametro -> Texto da pergunta em ingles // 6o.Parametro -> Nome da variavel // 7o.Parametro -> Tipo do dado C=caractere, D=Data, N=Numerico // 8o.Parametro -> Tamanho do dado // 9o.Parametro -> Quantidade de casas decimais para o dado // 10o.Parametro -> Numero da pre-selecao // 11o.Parametro -> O tipo do dado sera G=get, S=scroll, C=choice // 12o.Parametro -> Sintaxe em advpl, ou funcao para validacao // 13o.Parametro -> Consistencia com alguma tabela do sistema via <F3> // 14o.Parametro -> Nome do grupo para SXG // 15o.Parametro -> Pyme // 16o.Parametro -> Nome da variavel que ser utilizada no programa // 17o.Parametro -> Primeira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 18o.Parametro -> Primeira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 19o.Parametro -> Primeira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 20o.Parametro -> Conteudo da ultima resposta informada no parametro se caso o tipo do dados for get // 21o.Parametro -> Segunda definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 22o.Parametro -> Segunda definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 23o.Parametro -> Segunda definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 24o.Parametro -> Terceira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 25o.Parametro -> Terceira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 26o.Parametro -> Terceira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 27o.Parametro -> Quarta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 28o.Parametro -> Quarta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 29o.Parametro -> Quarta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 30o.Parametro -> Quinta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao

PROGRAMAO ADVPL 7.10

103 // 31o.Parametro -> Quinta definicao do texto em o tipo do dado for choice, exemplo: Si o No // 32o.Parametro -> Quinta definicao do texto em tipo do dado for choice, exemplo: Yes or No // 33o.Parametro -> Vetor com o texto do help em // 34o.Parametro -> Vetor com o texto do help em // 35o.Parametro -> Vetor com o texto do help em // 36o.Parametro -> Nome do grupo do help * */ Static Function CriaSx1() Local aHelp := {} aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) espanhol se caso ingles se caso o portugues espanhol ingles

, {{Informe o nmero do orcamento inicial} , {} , , {{Informe o nmero do oramento final} , {{Informe o cdigo do cliente de incio} , {{Informe o cdigo do cliente para fim} , {{Emitir os oramento a partir da data} , {{Emitir os oramento at a data} , {} , , {} , , {} , , {} , , {} ,

//texto do help portugus ingls espanhol PutSx1(cPerg,01,Oramento de?,,,mv_ch1,C,06,00,00,G,; ,,,,mv_par01,,,,,,,,,,,,,,, ,,; aHelp[1,1],aHelp[1,2],aHelp[1,3],) PutSx1(cPerg,02,Oramento ate?,,,mv_ch2,C,06,00,00,G,; ,,,,mv_par02,,,,,,,,,,,,,,, ,,; aHelp[2,1],aHelp[2,2],aHelp[2,3],)

PutSx1(cPerg,03,Cliente de?,,,mv_ch3,C,06,00,00,G,,SA1,; ,,mv_par03,,,,,,,,,,,,,,,,,a Help[3,1],; aHelp[3,2],aHelp[3,3],)

PROGRAMAO ADVPL 7.10

104 PutSx1(cPerg,04,Cliente ?,,,mv_ch4,C,06,00,00,G,,SA1,,,; mv_par04,,,,,,,,,,,,,,,,,aHelp[4 ,1],aHelp[4,2],; aHelp[4,3],) PutSx1(cPerg,05,Emissao de?,,,mv_ch5,D,08,00,00,G,,,,,; mv_par05,,,,,,,,,,,,,,,,,aHelp[5 ,1],aHelp[5,2],; aHelp[5,3],) PutSx1(cPerg,06,Emissaoate?,,,mv_ch6,D,08,00,00,G, ,,,,; mv_par06,,,,,,,,,,,,,,,,,aHelp[6 ,1],aHelp[6,2],; aHelp[6,3],) // 1 2 3 11 12 13 14 15 16 29 30 31 32 33 Return 4 5 6 7 8 9 10 17 18 19 20 21 22 23 24 25 26 27 28 34 35 37

Exerccio 53 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente:

/* Codigo Item Descricao do Software Quantidade Vlr.Unitario Vlr.Total Oramento: 999999 Cliente: 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Emissao: 99/99/99 Validade: 99/99/99 999999 99 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 999,999,999.99 999,999,999.99 999,999,999.99 012345678901234567890123456789012345678901234567890123456789012345 67890123456789012345678901234567890123456789012345678901234567 8901 0 1 2 3 4 5 6 7 8 9 10 11 12 13 */ User Function Exerc13()

PROGRAMAO ADVPL 7.10

105

//+------------------------//| Declaracoes de variaveis //+------------------------Local cDesc1 := Este relatorio ira imprimir informacoes oramento de software conforme Local cDesc2 := parmetros informados pelo usurio Local cDesc3 := [Utilizando Arquivo de trabalho] Private cString Private Tamanho Private aReturn Private wnrel Private NomeProg Private nLastKey Private Limite Private Titulo Private cPerg Private nTipo Private cbCont Private cbTxt Private Li Private m_pag Private aOrd Private Cabec1 Quantidade Private Cabec2

do

:= SZ2 := M := { Zebrado,1,Administracao,2,2,1,,1 } := EXERC13 := wnrel := 0 := 132 := Orcamento de software := EXEC13 := 0 := 0 := registro(s) lido(s) := 80 := 1 := {} := Codigo Item Descricao do Software Vlr.Unitario Vlr.Total :=

/* +------------------------------------------------------| Parametros do aReturn que preenchido pelo SetPrint() +------------------------------------------------------aReturn[1] - Reservado para formulario aReturn[2] - Reservado para numero de vias aReturn[3] - Destinatario aReturn[4] - Formato 1=Paisagem 2=Retrato aReturn[5] - Midia 1-Disco 2=Impressora aReturn[6] - Prota ou arquivo 1-Lpt1... 4-Com1... aReturn[7] - Expressao do filtro aReturn[8] - Ordem a ser selecionada aReturn[9] [10] [n] - Campos a processar se houver */ //+----------------------------------------//| Parametros de perguntas para o relatorio //+-----------------------------------------

PROGRAMAO ADVPL 7.10

106 //| mv_par01 - Oramento de ? //| mv_par02 - Oramento ate ? //| mv_par03 - Cliente de ? //| mv_par04 - Cliente ate ? //| mv_par05 - Emisso de ? ? //| mv_par06 - Emisso ate ? ? //+----------------------------------------CriaSx1() //+------------------------------------------------//| Disponibiliza para usuario digitar os parametros //+------------------------------------------------Pergunte(cPerg,.F.) //+-------------------------------------------------//| Solicita ao usuario a parametrizacao do relatorio //+-------------------------------------------------wnrel:=SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,. F.,aOrd,.F.,; Tamanho,.F.,.F.) //+-----------------------------------------------------------------------//| Parmetros da funo SetPrint //| SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd, lCompres,; //| cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortTo Print) //+-----------------------------------------------------------------------//+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------------------------------------//| Estabelece os padroes para impressao, conforme escolha do usuario //+----------------------------------------------------------------SetDefault(aReturn,cString)

PROGRAMAO ADVPL 7.10

107 //+------------------------------------//| Verificar se sera reduzido ou normal //+------------------------------------nTipo := Iif(aReturn[4] == 1, 15, 18) //+-------------------//| Se teclar ESC, sair //+-------------------If nLastKey == 27 Return Endif //+----------------------------------//| Chama funcao que processa os dados //+----------------------------------RptStatus({|lEnd| Exerc13Imp(@lEnd) },Aguarde...,Imprimindo os dados..., .T.) Return Static Function Exerc13Imp(lEnd) Local nTPedido := 0 Local cNomCli := Local cDescr := Local cArqTrb := Local aArqTrb := {} Local cOrc := //+-----------------------------------------------------------//| Atribuir ao vetor as caracteristicas do arquivo de trabalho //+-----------------------------------------------------------//| Matriz Campo Tipo Tamanho Decimal aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aAdd( aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, aArqTrb, {ORC ,C, {CLIENTE,C, {LOJA ,C, {NOMCLI ,C, {DTEMISS,D, {DTVALID,D, {CODIGO ,C, {ITEM ,C, {DESCR ,C, {QTDE ,N, {UNIT ,N, {TOT ,N, 06, 06, 02, 40, 08, 08, 06, 02, 50, 12, 12, 12, 0} 0} 0} 0} 0} 0} 0} 0} 0} 2} 2} 2} ) ) ) ) ) ) ) ) ) ) ) )

//+----------------------------------------------------//| Adquiri nome e cria o arquivo de trabalho/temporario

PROGRAMAO ADVPL 7.10

108 //+----------------------------------------------------cArqTrb := CriaTrab( aArqTrb, .T. ) //+---------------------------------//| Abre a nova tabela para o sistema //+---------------------------------dbUseArea(.T., __LocalDriver, cArqTrb, TRB, .T., .F.) //+---------------------------------------//| Cria um indice para a tabela temporaria //+---------------------------------------IndRegua(TRB,cArqTrb,ORC+ITEM) //+-------------------------------------------//| Selecionar e posicionar na tabela principal //+-------------------------------------------dbSelectArea(SZ2) dbSetOrder(1) dbSeek(xFilial(SZ2)+mv_par01,.T.) While !Eof() .And. xFilial(SZ2)+mv_par02 If lEnd MsgInfo(cCancel,titulo) Exit Endif SZ2->(Z2_FILIAL+Z2_NUMERO) <=

//+--------------------------------------------------------------------//| Se o registro estiver fora dos parmetros, ir para o prximo registro //+--------------------------------------------------------------------If SZ2->Z2_CLIENTE < mv_par03 .Or. SZ2->Z2_CLIENTE > mv_par04 dbSkip() Loop Endif //+--------------------------------------------------------------------//| Se o registro estiver fora dos parmetros, ir para o prximo registro //+--------------------------------------------------------------------If SZ2->Z2_EMISSAO < mv_par05 .Or. SZ2->Z2_EMISSAO > mv_par06 dbSkip()

PROGRAMAO ADVPL 7.10

109 Loop Endif cNomCli:=Posicione(SA1,1,xFilial(SA1)+SZ2>(Z2_CLIENTE+Z2_LOJA),; A1_NOME) dbSelectArea(SZ3) dbSetOrder(1) dbSeek(xFilial(SZ3)+SZ2->Z2_NUMERO) While !Eof() .And. SZ3->Z3_FILIAL+SZ3->Z3_NUMERO == xFilial(SZ3)+SZ2->Z2_NUMERO If lEnd MsgInfo(cCancel,titulo) Exit Endif cDescr := Posicione(SZ1,1,xFilial(SZ1)+SZ3>Z3_CODSOFT,Z1_NOME) dbSelectArea(TRB) RecLock(TRB,.T.) TRB->ORC := SZ2->Z2_NUMERO TRB->CLIENTE := SZ2->Z2_CLIENTE TRB->LOJA := SZ2->Z2_LOJA TRB->NOMCLI := cNomCli TRB->DTEMISS := SZ2->Z2_EMISSAO TRB->DTVALID := SZ2->Z2_DTVALID TRB->CODIGO := SZ3->Z3_CODSOFT TRB->ITEM := SZ3->Z3_ITEM TRB->DESCR := cDescr TRB->QTDE := SZ3->Z3_QUANT TRB->UNIT := SZ3->Z3_UNIT TRB->TOT := SZ3->Z3_VLRTOT MsUnLock() dbSelectArea(SZ3) dbSkip() End dbSelectArea(SZ2) dbSkip() End //+----------------------------------------------------//| Ler a tabela temporaria e descarregar para impressao //+----------------------------------------------------dbSelectArea(TRB) dbGoTop()

PROGRAMAO ADVPL 7.10

110 While !Eof() If lEnd @ Li,000 PSay cCancel Exit Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay No. Orcamento: +TRB->ORC @ Li,024 PSay Cliente: +TRB->CLIENTE+ +TRB->LOJA+ >NOMCLI @ Li,093 PSay Emissao: +Dtoc(TRB->DTEMISS) @ Li,113 PSay Validade: "+Dtoc(TRB->DTVALID) Li+=2 cOrc := TRB->ORC While !Eof() .And. TRB->ORC == cOrc If lEnd @ Li,000 PSay cCancel Exit Endif If Li > 55 Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif @ Li,001 PSay TRB->CODIGO @ Li,013 PSay TRB->ITEM @ Li,021 PSay TRB->DESCR @ Li,077 PSay TRB->QTDE PICTURE @E 999,999,999.99 @ Li,097 PSay TRB->UNIT PICTURE @E 999,999,999.99 @ Li,117 PSay TRB->TOT PICTURE @E 999,999,999.99 nTPedido += TRB->TOT Li++ dbSelectArea(TRB) dbSkip() End @ Li,000 PSay __PrtThinLine() Li++ @ Li,000 PSay Total do Pedido: " @ Li,117 PSay nTPedido PICTURE @E 999,999,999.99 nTPedido := 0 Li++ @ Li,000 PSay __PrtThinLine() Li+=2 End dbSelectArea(TRB)

+TRB-

PROGRAMAO ADVPL 7.10

111 dbCloseArea() If !Empty( cArqTrb ) FErase( cArqTrb+.*) Endif If aReturn[5] == 1 Set Printer TO dbCommitAll() Ourspool(wnrel) EndIf Ms_Flush() Return /****** * // Parametros que devem ser passados para a funo criar as perguntas no arquivo SX1 * -------------------------------------------------------------------------------// 1o.Parametro -> Nome do grupo // 2o.Parametro -> Numero da ordem // 3o.Parametro -> Texto da pergunta em portugues // 4o.Parametro -> Texto da pergunta em espanhol // 5o.Parametro -> Texto da pergunta em ingles // 6o.Parametro -> Nome da variavel // 7o.Parametro -> Tipo do dado C=caractere, D=Data, N=Numerico // 8o.Parametro -> Tamanho do dado // 9o.Parametro -> Quantidade de casas decimais para o dado // 10o.Parametro -> Numero da pre-selecao // 11o.Parametro -> O tipo do dado sera G=get, S=scroll, C=choice // 12o.Parametro -> Sintaxe em advpl, ou funcao para validacao // 13o.Parametro -> Consistencia com alguma tabela do sistema via <F3> // 14o.Parametro -> Nome do grupo para SXG // 15o.Parametro -> Pyme // 16o.Parametro -> Nome da variavel que ser utilizada no programa // 17o.Parametro -> Primeira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 18o.Parametro -> Primeira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 19o.Parametro -> Primeira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 20o.Parametro -> Conteudo da ultima resposta informada no parametro se caso o tipo do dados for get // 21o.Parametro -> Segunda definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao

PROGRAMAO ADVPL 7.10

112 // 22o.Parametro -> Segunda definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 23o.Parametro -> Segunda definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 24o.Parametro -> Terceira definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 25o.Parametro -> Terceira definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 26o.Parametro -> Terceira definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 27o.Parametro -> Quarta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 28o.Parametro -> Quarta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 29o.Parametro -> Quarta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 30o.Parametro -> Quinta definicao do texto em portugues se caso o tipo do dado for choice, exemplo: SIM ou Nao // 31o.Parametro -> Quinta definicao do texto em espanhol se caso o tipo do dado for choice, exemplo: Si o No // 32o.Parametro -> Quinta definicao do texto em ingles se caso o tipo do dado for choice, exemplo: Yes or No // 33o.Parametro -> Vetor com o texto do help em portugues // 34o.Parametro -> Vetor com o texto do help em espanhol // 35o.Parametro -> Vetor com o texto do help em ingles // 36o.Parametro -> Nome do grupo do help * */ Static Function CriaSx1() Local aHelp := {} aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp {}} ) aAdd( aHelp , {{Informe o nmero do orcamento inicial} , {} , , {{Informe o nmero do oramento final} , {{Informe o cdigo do cliente de incio} , {{Informe o cdigo do cliente para fim} , {{Emitir os oramento a partir da data} , {} , , {} , , {} , , {} ,

, {{Emitir os oramento at a data}, {} , {}} ) do help portugus

//texto ingls espanhol

PutSx1(cPerg,01,Oramento de?,,,mv_ch1,C,06,00,00,G,;

PROGRAMAO ADVPL 7.10

113 ,,,,mv_par01,,,,,,,,,,,,,,, ,,aHelp[1,1],; aHelp[1,2],aHelp[1,3],) PutSx1(cPerg,02,Orcamento ate?,,,mv_ch2,C,06,00,00,G,; ,,,,mv_par02,,,,,,,,,,,,,,, ,,aHelp[2,1],; aHelp[2,2],aHelp[2,3],) PutSx1(cPerg,03,Cliente de?,,,mv_ch3,C,06,00,00,G,,SA1,; ,,mv_par03,,,,,,,,,,,,,,,,,a Help[3,1],; aHelp[3,2],aHelp[3,3],) PutSx1(cPerg,04,Cliente ate?,,,mv_ch4,C,06,00,00,G,,SA1,; ,,mv_par04,,,,,,,,,,,,,,,,,a Help[4,1],; aHelp[4,2],aHelp[4,3],) PutSx1(cPerg,05,Emissao de?,,,mv_ch5,D,08,00,00,G,,,,,; mv_par05,,,,,,,,,,,,,,,,,aHelp[5 ,1],aHelp[5,2],; aHelp[5,3],) PutSx1(cPerg,06,Emissao ate?,,,mv_ch6,D,08,00,00,G,,,,,; mv_par06,,,,,,,,,,,,,,,,,aHelp[6 ,1],aHelp[6,2],; aHelp[6,3],) // 1 2 3 11 12 13 14 15 16 29 30 31 32 33 Return 4 5 6 7 8 9 10 17 18 19 20 21 22 23 24 25 26 27 28 34 35 37

O que voc aprendeu neste captulo


Neste captulo, voc aprendeu a criar relatrios personalizados com a utilizao de um ou mais arquivos relacionados, por meio de funes da prpria linguagem.

Prximo Passo

PROGRAMAO ADVPL 7.10

114 No prximo captulo, iremos relembrar tudo que vimos at o momento, por meio de exerccios prticos e rotinas utilizadas no dia-a-dia em customizaes.

Exerccio 54 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente: PROGRAMA | Le_Arq_Txt.prw DESCRICAO | Funcao - u_LeArqTxt() Este programa importa dados de arquivo texto MANUTENCAO DESDE SUA CRIACAO ESTRUTURA DO ARQUIVO TEXTO -> CLIENTE.TXT 0 1 2 3 4 5 6 7 8 9 100 123456789012345678901234567890123456789012345678901234567890123456 7890123456789012345678901234567890 X90001AAMICROSIGA SOFTWARE SA 2802200268293976000133 X90002AABARBER GREEN LTDA - MUNDIAL 3112200253113791000122 X90003AAJUND SONDAS SOFISTICAO BRASIL 2303200257507378000101 MICROSIGA BARBER GREEN JUND-SONDAS SP100000 RJ197422 AM888899

123456 -> CODIGO 12 -> LOJA 123456789012345678901234567890 -> NOME COMPLETO 123456789012345 -> NOME REDUZIDO 12 -> ESTADO 12345678901234567 -> VALOR ULT. COMPRA 12345678 -> DATA ULT. COMPRA 12345678901234 -> CGC */

#INCLUDE PROTHEUS.CH USER FUNCTION LeArqTxt() Local cPerg := IMPORT Private nOpc := 0 Private cCadastro := Importao de dados.

PROGRAMAO ADVPL 7.10

115 Private aSay Private aButton := {} := {}

aAdd( aSay, Esta rotina ir ler um arquivo texto e gravar na tabela do cadastro de clientes. ) aAdd( aButton, { 1,.T.,{|| nOpc := 1,FechaBatch()}}) aAdd( aButton, { 2,.T.,{|| FechaBatch() }} ) FormBatch( cCadastro, aSay, aButton ) If nOpc == 1 Processa( {|| Import() }, Processando... ) Endif Return

Exerccio 56 Como criar relatrios para cadastros de usurios com utilizao de matriz para criao de perguntas automaticamente: Le_Arq_Txt.prw DESCRICAO | Funcao - Import() STATIC FUNCTION Import() Local cBuffer := Local aDados := {} Local lOk := .T. Local aMatA030 := {} Private lMsHelpAuto := .T. Private lMsErroAuto := .F. If !File(CLIENTE.TXT) MsgAlert(Arquivo texto: CLIENTE.TXT no localizado,cCadastro) Return Endif FT_FUSE(CLIENTE.TXT) FT_FGOTOP() ProcRegua(FT_FLASTREC()) While !FT_FEOF() IncProc() // Capturar dados cBuffer := FT_FREADLN() // Verificar se CGC eh valido

PROGRAMAO ADVPL 7.10

116 If ! CGC(Substr(cBuffer,81,14)) //CGC MsgAlert(CGC invlido !,cCadastro) lOk := .F. Else aAdd(aDados,Substr(cBuffer,81,14)) Endif // Verificar se estado (uf) eh valido If ! ExistCpo(SX5,12+Substr(cBuffer,54,02)) //ESTADO MsgAlert(Unidade Federativa invlida !,cCadastro) lOk := .F. Else aAdd(aDados,Substr(cBuffer,54,02)) Endif If !lOk MsgAlert(o registro da linha +StrZero(nBtLidos,6,0)+ no ser importado por invalidade de dados.,cCadastro) lOk := .T. aDados := {} FT_FSKIP() Loop Endif aAdd(aDados,Val(Substr(cBuffer,56,17))/100) //VLR. ULTIMA COMPRA aAdd(aDados,Ctod(Substr(cBuffer,73,8)))//DATA ULTIMO TITULO PROTESTADO aMATA030 := {} aMATA030 := {; {A1_COD ,Substr(cBuffer,01,06),Nil},; {A1_LOJA ,Substr(cBuffer,07,02),Nil},; {A1_NOME ,Substr(cBuffer,09,30),Nil},; {A1_NREDUZ ,Substr(cBuffer,39,15),Nil},; {A1_EST ,aDados[2] ,Nil},; {A1_CGC ,aDados[1] ,Nil},; {A1_MCOMPRA ,aDados[3] ,Nil},; {A1_DTULTIT ,aDados[4] ,Nil}; } MSExecAuto({|x,y| MatA030(x,y)},aMATA030,3) aDados := {} lMsErroAuto := .F. FT_FSKIP() EndDo

PROGRAMAO ADVPL 7.10

117 FT_FUSE() MostraErro() MsgInfo(Processo finalizada) Return

Exerccios O que voc ir aprender neste captulo


Neste captulo, iremos relembrar tudo que vimos at o momento por meio de exerccios de fixao. Estes exerccios abrangem todos os tpicos analisados at o momento e visam a fixao dos exemplos propostos em curso.

Rotinas abordadas
Criao de arquivos customizados; Configurao e validao de campos; Criao de ndices; Funes para cadastros; Configurao de consultas-padro; Criao de relatrios; Configurao do arquivo de perguntas e respostas.

Exerccio 57 Exerccios Complementares (1): Desenvolva uma Customizao que dever ser implementada no menu do ambiente Faturamento, utilizando a Funo AxCadastro() de acordo com as seguintes necessidades: 1. Um Cadastro de Visitantes (SZ5). O nome do programa dever ser Exerc21 que possua as principais informaes sobre os mesmos, sendo que: O Cdigo do Cadastro dever ser gerado automaticamente; Dever existir um Campo para informar a qual Setor ele pertence (Dever ser criada uma Lista de Opes),

PROGRAMAO ADVPL 7.10

118 como por exemplo: 1=Administrao; 2=Comercial; 3=Industrial; A Pesquisa do Cadastro, dever disponibilizar a Consulta por Cdigo e Nome; O Nome do Visitante e da Empresa devero ser de Preenchimento Obrigatrio; Um Relatrio para emitir os dados como por exemplo: Cdigo, Nome e Empresa. O nome do relatrio dever ser Exerc21r.

Exemplo de estrutura: 2. Desenvolva um Cadastro de Controle de Visitantes (SZ6), o nome do programa dever ser Exerc22 para controlar as pessoas que esto tendo acesso a empresa sendo que: O Cdigo do Cadastro dever ser gerado automaticamente; Um Campo para identificar o Status do Visitante dentro da empresa (atravs de uma lista de opes), como por exemplo: E=Entrada; S=Sada; Dever existir um Campo para controlar o Motivo da Visita (atravs de uma lista de opes), como por exemplo: 1=Pessoal; 2=Profissional; A Pesquisa do Cadastro dever disponibilizar a consulta por Cdigo, Nome e Data de Entrada; Dever existir um Campo para gravar o Nome do Operador do sistema. Ele dever ser preenchido automaticamente. Dever existir um Campo relacionado a uma Consulta Padro para acessar o Cadastro de Visitantes. Essa consulta dever possuir no Browse os campos : Cdigo, Nome e Setor, disponveis para Visualizao; Criao de Campos para controlar a Hora, Data de Entrada e Sada, sendo que os Dados de Entrada devero ser preenchidos automaticamente pelo sistema; Um Relatrio para emitir os dados como, por exemplo: Cdigo, Operador, Cdigo do Visitante, Data de Entrada, Data de Sada e Motivo da Visita. O nome do relatrio dever ser Exerc22r. Exemplo da estrutura: 3. Assim que toda a Customizao estiver encerrada, acesse o ambiente Faturamento e realize os respectivos Testes.

Exerccio 58 Exerccios complementares (2): Desenvolva uma Customizao que dever ser implementada no menu do ambiente Faturamento, utilizando a Funo Mbrowse() de acordo com as seguintes necessidades: 1. Um Cadastro de Usurios (SZ7), o Nome do Programa, dever ser Exerc23; Apenas o Administrador dever ter acesso a ele. 2. Um Cadastro de Controle para Chamados Tcnicos (SZ8). O nome do programa dever ser Exerc24;

PROGRAMAO ADVPL 7.10

119 Esse Cadastro dever controlar os Chamados Tcnicos realizados pelos Usurios; Cada Usurio poder visualizar apenas os seus Chamados cadastrados e o Administrador poder Visualizar Todos, a fim de controlar os Chamados Atendidos e Solucionados; O campo destinado Soluo do Problema poder ser preenchido apenas pelo Administrador, porm o campo dever estar disponvel a todos os Usurios para Visualizao; Os Registros devero conter uma Legenda ao lado, informando se o Chamado foi Atendido (Vermelho) ou No (Verde). Dever exisitir tambm um boto para informar o significado de cada cor na legenda; Caso o Chamado j tenha sido atendido e o campo destinado a Descrever a Soluo esteja preenchido, a Excluso do Registro no poder ser Concluda; Criar um Relatrio para o Cadastro de Chamados Tcnicos, sendo que a opo para impresso dever estar disponvel na tela de cadastro, por meio de um boto. O nome do programa dever ser Exerc24r. Devero ser impressos apenas os seguintes campos: Cdigo do Chamado, Nome do Usurio, Setor, Data do Chamado, Data da Soluo, Problema e a Soluo. Assim que toda a Customizao estiver encerrada, acesse o ambiente Configurador e cadastre mais um Usurio, para que seja possvel a execuo de todos os Testes.

3.

Obs.: Os Arquivos, Campos e Programas para a realizao do exerccio acima j se encontram na base de dados, sendo necessrio apenas a sua Compilao e Anlise.

O que voc aprendeu neste captulo


Neste captulo realizamos alguns exerccios complementares, recapitulando tudo o que vimos at o momento e utilizando alguns exemplos prticos.

Prximo Passo
No prximo captulo, aprenderemos como devero ser criados os pontos de entradas e sua implementao junto s rotinas padres do sistema.

PROGRAMAO ADVPL 7.10

120

Pontos de Entradas O que voc ir aprender neste captulo


Neste captulo, aprenderemos a criar e implementar pontos de entradas junto s rotinas padres do sistemas.

Rotinas Abordadas
Ferramentas de auxlio na implementao de pontos de entradas (Quark); Criao de pontos de entradas; Implementao de pontos de entradas junto s rotinas padres.

Pontos de Entrada
O conceito utilizado para a criao de um ponto de entrada o mesmo da herana adotado nas linguagens para banco de dados, ou seja, (Store Procedures). So chamadas de programas colocados em pontos estratgicos nas funes padres do sistema e que originalmente no fazem nada. Assim que o desenvolvedor identificar a necessidade de uma interveno nestes pontos, basta criar a rotina, dar a ela o nome especfico citado na documentao do MP8 Protheus e compil-la. No momento em que a Rotina Padro for disparada e passar pela customizao do ponto dee, o mesmo tambm ser executado. Podemos dizer que esta a maneira mais prtica de interveno aos programas padres do sistema sem a necessidade de alterao, fazendo com que estas implementaes passem despercebidas pelo usurio no momento de sua execuo. Porm, necessrio que saibamos muito bem sobre a lgica do programa em questo e at mesmo qual a situao de memria utilizada naquele momento.

Objetivo dos Pontos de Entrada


Deixar o sistema flexivl, pois isso permite uma grande variedade de desenvolvimento via RDMAKE pelos nossos analistas de suporte de acordo com a necessidade de cada tipo de cliente/implantao Permitir que o sistema seja o mais abrangente possvel de acordo com cada tipo de segmento de negcio.

Quando criar um Ponto de Entrada


O ponto de entrada tem resultado quando permite que um processo possa ser modificado, desde que ele no seja crtico para o sistema. Exemplo: Montagem das parcelas de pagamento de um pedido. Ele til em processos que podem ser diferentes de acordo com o tipo de negcio de cada empresa ou estratgia adotada. Ex: relatrio de pedido, cadastro de clientes Sintaxe para criar um ponto de entrada:

PROGRAMAO ADVPL 7.10

121

Exerccio 59 Criar validao no campo emisso de ttulo a receber. Function TMKA010() Local lRetorno := .F. Local LTMKMCL := Existblock(TMKMCl) // O Existblock detecta se existe uma funo no repositrio do MP8 com esse PE. If lTMKMCL lRetorno := Execblock(TMKMCI,.F.,F.,{aValor}) // aValor um array que seria recebido pelo usuario em PARAMIXB Endif Return( lRetorno )

Procedimentos para sua criao


Avaliar com critrio a criao do ponto de entrada, pois importante localiz-lo num ponto que seja til, no redudante e que realmente d condies de atender ao solicitante. O ponto de entrada no uma ferramenta de correo de eventuais falha do sistema. Ele ajuda no desenvolvimento de negcios especficos. Documentar no QUARK com nome, momento no qual o momento em que ele disparado, parametros que ele envia,retorno esperado (se houver) e o que ele executa com o retorno

1.

2. 3.

4.

Exerccio 60 Como identificar os nomes dos pontos de entradas: Desenvolva um Ponto de Entrada para o Cadastro de Clientes. Ele deve disparar uma Mensagem Padro aps a Confirmao do Cadastro. Utilizando um Editor de Textos, edite o menu do ambiente Faturamento e anote o Nome da Funo utilizada para o Cadastro de Clientes; Na seqncia, execute a Ferramenta Quark.exe, que se encontra na pasta AP7\Rdmake\Quark; Acesse a opo Pontos de Entrada, pressione as teclas <Alt> + P, selecione a opo Pesquisar por Programa e informe o Nome do Programa responsvel pelo Cadastro de Clientes; Assim que o sistema posicionar sobre os Pontos de Entrada, disponveis para essa rotina, anote o Nome do Responsvel, pela execuo aps a Incluso do Cliente e saia da Ferramenta Quark.

Obs.: A Ferramenta Quark, utilizada em curso de uso interno da MICROSIGA e pelo suporte externo, para a utilizao deste

PROGRAMAO ADVPL 7.10

122 recurso ser necessrio acessar o site que contm todas as informaes disponibilizadas para clientes e apoio Consultorias no seguinte endereo: WWW.MICROSIGA.COM.BR, acessando o link Utilidades + Quark; importante lembrar que para acess-lo necessrio o uso do SenhaP.

Exerccio 61 Como criar pontos de entrada: 1. 2. Acesse a Ferramenta IDE; Crie o seguinte Programa:

#Include Rwmake.ch User Function m030inc() MsgBox(O Cliente foi cadastrado com sucesso!) Return 3. Confira os dados e salve o Programa na pasta Rdmake com o mesmo nome dado a Funo para que fique fcil a sua identificao posteriormente; Compile o Programa e saia da Ferramenta IDE.

4.

Exerccio 62 Como testar pontos de entrada: Acesse o ambiente Faturamento; Selecione as seguintes opes: Atualizao + Cadastros + Clientes; 3. Clique na opo Incluir e informe os dados a seguir: 4. Confira os dados, confirme o cadastro de Clientes e verifique que neste momento o Ponto de Entrada ser disparado, trazendo a mensagem definida no programa; 5. Cancele o prximo cadastro e saia do ambiente Faturamento. 1. 2.

Exerccio 63 Como criar outro ponto de entrada: Desenvolva um Ponto de Entrada para o Cadastro de Clientes. Ele deve disparar uma Mensagem Padro aps a Excluso de um registro no Cadastro de Clientes. 1. Execute os procedimentos utilizados no exerccio anterior para identificar o Nome do Ponto de Entrada que se enquadra nesta customizao; 2. Na seqncia, acesse a Ferramenta IDE e crie o seguinte programa: #Include Rwmake.ch

PROGRAMAO ADVPL 7.10

123 User Function m030exc() MsgBox(O Cliente foi excluido com sucesso!) Return 3. Confira os dados, salve o programa na pasta Rdmake com o mesmo nome dado Funo para que fique fcil a sua identificao posteriormente; Compile o Programa e saia da Ferramenta IDE.

4.

1. 2. 3.

4.

Exerccio 64 Como testar pontos de entrada: Acesse o ambiente Faturamento; Selecione as seguintes opes: Atualizao + Cadastros + Clientes; Posicione o cursor sobre o Cliente 000002, clique na opo Excluir e verifique que neste momento o Ponto de Entrada ser disparado trazendo a mensagem definida no programa; Confira os dados e abandone o ambiente Faturamento.

Exerccio 65 Como criar outro ponto de entrada: Desenvolva um Ponto de Entrada para o Cadastro de Produtos. No momento da Confirmao do Cadastro, a rotina deve disparar uma Atualizao dos Dados para o Cadastro de Complementos de Produtos. 1. Execute os procedimentos utilizados no exerccio anterior para identificar o Nome do Ponto de Entrada que se enquadra nesta customizao; 2. Na seqncia, acesse a Ferramenta IDE e crie o programa a seguir: #Include Rwmake.ch User Function mt010inc() Local aArea := GetArea() If MsgBox(Confirma a Gerao do Complemento,Complemento Produtos,; YESNO) DbSelectArea(SB5) If RecLock(SB5,.T.) SB5->B5_FILIAL:= SB1->B1_FILIAL SB5->B5_COD:= SB1->B1_COD SB5->B5_CEME:= SB1->B1_DESC Else MsgAlert(No foi possivel travar o registro!) EndIf MsUnLock(SB5) EndIf RestArea(aArea)

de

PROGRAMAO ADVPL 7.10

124 Return 3. Confira os dados e salve o programa na pasta Rdmake com o mesmo nome dado a Funo, para que fique fcil a sua identificao posteriormente; Compile o Programa e saia da Ferramenta IDE.

4.

1. 2. 3. 4.

5.

6.

Exerccio 66 Como testar o ponto de entrada: Acesse o ambiente Faturamento; Selecione as seguintes opes: Atualizao + Cadastros + Produtos; Clique na opo Incluir e informe os dados a seguir: Confira os dados, confirme o cadastro de Produtos e verifique que neste momento o Ponto de Entrada ser disparado, trazendo a mensagem definida no programa; Na seqncia, saia do Cadastro de Produtos, acesse a opo Complem. Produtos e verifique que os Dados do Produto cadastrados anteriormente foram atualizados tambm neste outro arquivo; Saia do Cadastro de Complemento de Produtos e do ambiente Faturamento.

O que voc aprendeu neste captulo


Neste captulo, aprendemos a consultar, criar e utilizar os pontos de entrada disponveis para customizaes, caso haja necessidade de interveno junto a funes padres do sistema.

Prximo Passo
No prximo captulo, processamento. aprenderemos a criar funes para rotinas de

Processamento O que voc ir aprender neste captulo


Neste captulo, processamentos. aprenderemos a criar rotinas de interface com

Rotinas Abordadas
Funes para processamentos: Processa().

Processa()
Esta funo utilizada para criar uma barra de progresso durante a execuo de rotinas de processamento. Descrio:

PROGRAMAO ADVPL 7.10

125 Executa funo de processamento. Sintaxe: Processa(b1). Parmetros: <b1> = Bloco de Cdigos, que define a Funo a ser executada.

Exerccio 67 Como criar funes para processamento: Crie uma Funo de Processamento que seja executada durante a contagem do Nmero de Registros existentes no Arquivo SX3. 1. Acesse a Ferramenta IDE; 2. Adicione o Programa Exerc25, que j se encontra na Pasta Rdmake, ao Projeto; 3. Confira os dados e compile o Programa. 14. Adicione-o ao menu do ambiente Faturamento e teste.

PROGRAMAO ADVPL 7.10

126

GUIA DE REFERNCIA RPIDA AdvPL FUNES PARA O INTERPRETADOR XBASE


A seguir so apresentadas as funes SIGA MP8 para uso junto ao RD-MAKE / Interpretador xBASE. Na linha seguinte ao nome de cada funo, informado onde normalmente ela utilizada, a saber:
Processamento: funes usadas em clculos, acesso a arquivos e tratamentos em geral; Impresso: funes usadas exclusivamente na gerao de relatrios; Telas: funes usadas na gerao de telas, seja DOS ou Windows;

AbreExcl
Tipo: Processamento Fecha o arquivo e reabre exclusivo. Esta funo fecha o arquivo cujo alias est expresso em <cAlias> e reabre-o em modo exclusivo para proceder operaes em que isto necessrio, como por exemplo, PACK. Entretanto, prefervel utilizar o depurador do sistema para proceder estas operaes. Se outra estao estiver usando o arquivo, o retorno ser .F.. Sintaxe AbreExcl(cAlias) Parmetros cAlias Nome do Alias do Arquivo. Deve ter obrigatriamente sua estrutura definida no SX3. Exemplo // IF AbreExcl(SI2) Pack ENDIF AbreExcl( ) dbGoTop( )

Activate Dialog
Tipo: Tela Windows Ativa uma janela previamente definida na funo Dialog e executa os GETs, botes e outros objetos. Sintaxe ACTIVATE DIALOG cVar <CENTERED> [On Init cFuncInit] [Valid cFuncValid] Parmetros cVar Varivel utilizada na funo Dialog para definio da janela. cFuncInit Funo executada automaticamente na abertura do dilogo na
tela (Opcional).

cFuncValid dilogo.

Funo

executada

para

validar

fechamento

da

janela

de

Deve retornar um valor lgico (.T. ou .F.) (Opcional)

Comentrios

PROGRAMAO ADVPL 7.10

127 A clusula <CENTERED> opcional, se omitida assume as coordenadas definidas na criao da janela. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual. Ver tambm Funo Dialog

Aleatorio
Tipo: Processamento Gera um nmero aleatrio de acordo com a semente passada. Esta funo retorna um nmero aleatrio menor ou igual ao primeiro parmetro informado, usando como semente o segundo parmetro. recomendado que esta semente seja sempre o ltimo nmero aleatrio gerado por esta funo. Sintaxe Aleatorio(nMax,nSeed) Parmetros nMax Nmero mximo para a gerao do nmero aleatrio nSeed Semente para a gerao do nmero aleatrio Retorna nRet Nmero aleatrio retornado Exemplo // Exemplo do uso da funo Aleatorio: nSeed := 0 For i := 1 to 100 nSeed := Aleatorio(100,nSeed) ? Str(i,3)+ numero aleatorio gerado: +Str(nSeed,3) Next i inkey(0) Return

Avalimp
Tipo: Relatrios Configura a impressora por meio dos parmetros. Esta funo usada em relatrios especficos que no se utilizam da funo Cabec. Imprimindo o retorno desta funo na impressora, ela se encarregar de configurar a impressora de acordo com o arquivo de driver escolhido e com as configuraes escolhidas pelo usurio definidas no array aReturn. Sintaxe AvalImp(nLimit) Parmetros nLimit Tamanho do relatrio em colunas. Pode ser 80, 132 ou 220 (respec-tivamente para relatrios de tamanho P,M e G). Retorna cControl String com caracteres de controle, dependente das configuraes escolhidas pelo usurio e do arquivo de driver especificado. Exemplo // Exemplo de uso da funo AvalImp:

PROGRAMAO ADVPL 7.10

128 #IFNDEF WINDOWS #DEFINE PSAY SAY #ENDIF cCbTxt:= cCbCont:= nOrdem:= 0 nAlfa:= 0 nZ:= 0 nM:= 0 cTamanho:= G cLimite:= 220 cTitulo:= PADC(Nota Fiscal,74) cDesc1:= PADC(Este programa ir emitir a Nota Fiscal de Entrada/Sada,74) cDesc2:= cDesc3:= PADC(da Feeder Industrial Ltda.,74) cNatureza:= aReturn:= {Especial, 1,Administrao, 1, 2, 2,,1} cNomeProg:= NFEEDER cPerg:= ENTSAI nLastKey:= 0 lContinua:= .T. nLi:= 0 wnrel:= NFEEDER nTamNf:=72 // Apenas Informativo Pergunte(cPerg,.F.) // Pergunta no SX1 cString:=SF2 wnrel:= SetPrint(cString,wnrel,cPerg,cTitulo,cDesc1,cDesc2,cDesc3,.T.) SetDefault(aReturn,cString) If nLastKey == 27 Return Endif #IFDEF WINDOWS RptStatus({|| Execute(Relato)}) Return #ENDIF Function Relato SetPrc(0,0) // Aqui est a chamada da funo AvalImp. Configura a // impressora de acordo com as definies em aReturn // escolhidas pelo usurio na funo SetPrint @ 00,00 PSAY AvalImp(220) dbSelectArea(SF2) dbSeek(xFilial()+mv_par01+mv_par03,.T.) // O programa segue normalmente... Return

Aviso
Tipo: Tela DOS/Windows Monta uma janela exibindo o texto desejado disponibilizando opes de escolha para o usurio. Sintaxe Aviso(cTitulo,cMensagem,aOpcoes) e, opcionalmente,

PROGRAMAO ADVPL 7.10

129 Parmetros cTitulo Titulo da janela. cMensagem Mensagem para ser exibida no interior da janela. O tamanho mximo de 90 caracteres. aOpcoes Array de caracteres com as opes para a montagem de menu (na verso DOS) ou dos botes (na verso Windows). Retorna nResp Retorno. Retorna o nmero da opo escolhida pelo usurio. Exemplo // Exemplo de uso da funo Aviso: While .T. GravaArq() // Funo qualquer (apenas p/exemplo) If !File(TESTE.TXT) aOp:= {Sim,Nao,Cancela} cTit:= Atencao! cMsg:= O arquivo TESTE.TXT nao foi gravado! cMsg:= cMsg + Tenta novamente? nOp:= Aviso(cTit,cMsg,aOp) If nOp == 1 // Sim Loop ElseIf nOp == 3 // Cancela Return Else // Nao ou <ESC> Exit Endif Endif Exit EndDo // Faz o processamento... Return

@ n1,n2 BmpButton
Tipo: Tela Windows Cria um boto de bitmap padro do SigaAdv Win. Sintaxe @ nLinha,nColuna BMPBUTTON TYPE nBotao ACTION cFuncao OBJECT oBtn Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior nBotao Nmero do boto padronizado cFuncao Funo que ser executada oBtn Objeto associado ao boto Comentrios Para executar funes definidas em um mesmo .PR? utilizar a funo Execute(Nome da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual.

PROGRAMAO ADVPL 7.10

130

@... Bitmap... Size


Tipo: Tela Windows Define a rea em que ser mostrado um BITMAP na janela. Sintaxe @ nLinha,nColuna BITMAP SIZE nAltura,nLargura FILE cArq Parmetros nLinha Nmero da Linha superior nColuna Nmero da Coluna superior nAltura Altura de apresentao do BITMAP nLargura Largura de apresentao do BITMAP cArq Nome do arquivo BITMAP Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual.

@...To...Browse
Tipo: Tela Windows Ativa Browse padro SigaAdv Win. Sintaxe @ nLinha1,nColuna1 TO nLInha2,nColuna2 BROWSE cAlias <ENABLE> cCor Parmetros nLinha1 Nmero da linha superior nColuna1 Nmero da coluna superior nLinha2 Nmero da linha inferior nColuna2 Nmero da coluna inferior cAlias Alias do Arquivo (apenas arquivos com estrutura no SX3) cCor Expresso que identifica a cor da marca do registro (opcional) Exemplo Marca Verde - Titulo em aberto Marca Vermelha - Titulo pago Comentrios A clusula <ENABLE> opcional, se for omitida no ser disponibilizada coluna que identifica situao do registro (Cor verde/vermelha).

@...Button
Tipo: Tela Windows Cria um boto com texto. Sintaxe @ nLinha,nColuna BUTTON cTexto SIZE nAltura,nLargura ACTION cFuno Object oBtn Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior cTexto Texto que ser apresentado no boto. Deve incluir um _ antes da letra que utilizada como Hot Key. Ex.: ( _Salvar,Edi_Tar) nAltura Altura do boto nLargura Largura do boto cFuno Funo que ser executada Object oBtn Objeto associado ao boto.

PROGRAMAO ADVPL 7.10

131 Comentrios Para executar funes definidas em um mesmo .PR? utilizar a funo Execute(Nome da funo) ou ExecBlock(Nome do Arquivo) para chamar outro .PR?. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual.

Cabec
Tipo: Impresso Esta funo imprime, na impressora selecionada, o cabealho padro dos relatrios do SIGA MP8. Devolve o nmero da ltima linha impressa para que seja dada continuidade ao relatrio. Sintaxe Cabec(cTtulo, cTexto1, cTexto2, cProg, cLargura, cControle) Parmetros cTtulo Ttulo do Relatrio cTexto1 Extenso da primeira linha do cabealho cTexto2 Extenso da segunda linha do cabealho cProg Nome do Programa cLargura Largura do relatrio (P/ M/ G) cControle Caractere de controle da impressora (numrico) Retorna nLinha Nmero da ltima linha impressa no cabealho Exemplo cTitulo := Relao dos Adiantamentos cCabec1 := Cdigo Item Conta Contbil CCusto Projeto Data Valor cCabec2 := ----------- ------- ----------------------- ------------ ----------- -------- -------- cPrograma := ATRF090 cTamanho := P nCaracter := 15 : cRel:=SetPrint(cAlias, cPrograma , , @cTitulo, cDesc1, cDesc2, cDesc3 , .T., aOrd ) SetDefault(aReturn, cString) : nLinha:=Cabec(cTitulo, cCabec1, cCabec2, cPrograma, cTamanho, nCaracter) While !EOF() nLinha:=nLinha+1 @nLinha,1 Say SB1->B1_CODIGO

CGC
Tipo: Processamento Consiste o CGC digitado, tomando como base o algoritmo nacional para verificao do dgito de controle. Esta funo procede um clculo do dgito verificador do nmero do Cadastro Geral de Contribuintes do Ministrio da Fazenda. utilizado o dgito padro mdulo 11 para verificar se as duas ltimas posies da string passada, correspondem a dgitos verificadores vlidos. Calculando

PROGRAMAO ADVPL 7.10

132 primeiro o dgito das 12 primeiras posies e agregando o dgito encontrado ao fim da string, calcula o dgito das 13 posies, obtendo o segundo dgito. Retorna uma expresso lgica verdadeira se as duas ltimas posies do CGC digitado coincidem com o calculado. Sintaxe CGC(ExpC1) Parmetros ExpC1 String de caracteres representando o nmero do C.G.C. sem pontos e traos separadores. Caso este argumento no seja passado para a funo, esta considerar o GET corrente. Retorna ExpL1 Expresso lgica .T. se o CGC vlido (dgito verificador confere) ou .F. se o dgito verificador no confere. Exemplos cCGC:= Space(14) : @10,16 GET cCGC Picture @R 99.999.999/9999-99 Valid CGC(cCGC)
A mscara do CGC deve vir com @R, para no inserir os pontos e a barra no CGC, o que impossibilita a validao.

@...CheckBox...Var
Tipo: Tela Windows Cria uma caixa de verificao para definir entre Sim/No ou Falso/Verdadeiro. Sintaxe @ nLinha,nColuna CHECKBOX cDesc VAR lSeleo Object oCbx Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior cDesc Descrio da caixa. Ex. Atualiza Estoque ? lSeleo Varivel Lgica que identifica se a caixa foi ou no selecionada oCbx Objeto associado ao Checkbox Retorno A varivel <lSeleo> recebe .T. se for selecionada ou .F., se vazia. Comentrios Pode ser utilizada uma seqncia de CHECKBOX para determinar um conjunto de configuraes onde vrios itens podem ser marcados/desmarcados. Deve ser definida uma varivel <lSeleo> para cada CHECKBOX definida. Ex.: Atualiza Estoque - .T./.F. = Marcada/Desmarcada Gera Duplicata - .T./.F. = Marcada/Desmarcada Calcula IPI - .T./.F. = Marcada/Desmarcada

ChkFile
Tipo: Processamento Abre um arquivo do sistema, em modo exclusivo ou compartilhado, verificando a sua existncia bem como dos ndices, criando-os caso no existam. Esta funo retorna verdadeiro (.T.) se o arquivo j estiver aberto ou se o Alias no for informado. Sempre que desejar mudar o modo

PROGRAMAO ADVPL 7.10

133 de acesso do arquivo (de compartilhado para exclusivo ou vice-versa), feche-o antes de cham-la. Sintaxe ChkFile(cAlias,lExcl,newAlias) Parmetros cAlias Alias do arquivo a ser aberto. lExcl Se for informado verdadeiro (.T.), o arquivo ser aberto em modo exclusivo, caso contrrio, o arquivo ser aberto em modo compartilhado. Se este parmetro no for informado, ser assumido falso (.F.). newAlis Abre o arquivo com outro apelido. Retorna lRet Retorna verdadeiro (.T.) caso tenha conseguido abrir o arquivo e falso (.F.) caso contrrio. Exemplo // Exemplo de uso da funo ChkFile: // Tenta abrir o arquivo de clientes como exclusivo: dbSelectArea(SA1) dbCloseArea() lOk := .T. While .T. IF !ChkFile(SA1,.T.) nResp := Alert(Outro usuario usando! Tenta de novo?,{Sim,Nao}) If nResp == 2 lOk := .F. Exit Endif : Endif EndDo If lOk // Faz o processamento com o arquivo... Endif // Finaliza If Select(SA1) dbCloseArea() Endif ChkFile(SA1,.F.) Return

Close
Tipo: Tela Windows Desativa uma janela previamente definida e ativa. Sintaxe Close(cVar) Parmetros cVar Varivel criada durante o comando de definio da janela. Exemplo @ 75,158 BmpButton type 02 Action Close(oDlg)

PROGRAMAO ADVPL 7.10

134

CloseOpen
Tipo: Processamento Funo usada para fechar e abrir uma lista de arquivos. Sintaxe CloseOpen(aFecha,aAbre) Parmetros aFecha Array com a lista dos Aliases a serem fechados. aAbre Array com a lista dos Aliases a serem abertos.

Retorna lRet Retorna falso (.F.) se no conseguir abrir algum arquivo (se o arquivo estiver em uso exclusivo, por exemplo). Caso contrrio, retorna verdadeiro (.T.). Exemplo // Exemplo de uso da funcao CloseOpen: aFecha := {SA1,SA2,SA3,SB1} aAbre := {SG1,SH8} If CloseOpen(aFecha,aAbre) .. Processamento Endif Return

ClosesFile
Tipo: Processamento
Esta funo fecha todos os arquivos, exceto os SXs, o SM2 e o SM4. Permite que se indique tambm outros arquivos que no devem ser fechados.

Sintaxe ClosesFile(cAlias) Parmetros cAlias String com os Aliases dos arquivos que no devem ser fechados. Devem ser informados separados por barras (/) Retorna lRet Retorna Verdadeiro (.T.) se fechou os arquivos com sucesso. Retorna Falso (.F.), caso contrrio. Exemplo // Exemplo de uso da funcao CLOSESFILE: // Fecha todos os arquivos menos os cadastros: cEmp := SM0->M0_CODIGO ClosesFile(SA1/SA2/SA3/SA4/SA5/SA6/SA7/SA9/SAA/SAB/SAC) // Processamento. . . // Finalizacao dbCloseAll() OpenFile(cEmp) Return

@...ComboBox...Itens...Size
Tipo: Tela Windows

PROGRAMAO ADVPL 7.10

135
Esta funo semelhante a LISTBOX, mas pode ser utilizada em pequenos espaos, pois os itens s sero mostrados quando a caixa for seleciona.

Sintaxe @ nLinha,nColuna COMBOBOX cCont ITENS aArray SIZE nAltura,nLargura Object oCbx Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior cCont Contedo caracter do item selecionado na Matriz [1] aArray Array, Matriz [1] com os itens para seleo nAltura Altura para definir o tamanho da caixa nLargura Largura para definir o tamanho da caixa oCbx Objeto relacionado ao boto Retorno O item selecionado pode ser obtido por <cCont> Comentrios Os itens da Matriz [1] devem ser tipo C caracter. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual.

ConfirmSX8
Tipo: Processamento
Permite a confirmao do nmero sugerido pelo Arquivo de Semforo, atravs da funo GETSX8NUM. Verifique a funo GETSX8NUM para maiores detalhes.

Sintaxe ConfirmSx8() Exemplo cNumSC5:=GetSX8Num(SC5) Replace C5_NUM with cNumSC5 ConfirmSX8() Verifique os exemplos descritos na funo GETSX8NUM.

Contar
Tipo: Processamento Conta o nmero de registros de acordo com a condio determinada. Sintaxe Contar(cAlias, cCond) Parmetros cALias Alias do arquivo cCond Condio para a contagem Exemplo Contar(SC1,C1_DATPRF < dDataBase)

CriaTrab
Tipo: Processamento Cria arquivo de trabalho. Sintaxe CriaTrab(aArray,lDbf) Parmetros

PROGRAMAO ADVPL 7.10

136
aArray Array multidimensional contendo os campos a criar {Nome, Tipo, Tamanho, Decimal}

lDbf Determina se o arquivo de trabalho deve ser criado ( .T.) ou no (.F. ) Retorna ExpC1 Nome do Arquivo gerado pela funo. Comentrios Esta funo retorna o nome de um arquivo de trabalho que ainda no exista. Caso lDbf = .T., a funo criar um arquivo DBF com este nome e a estrutura definida em aArray. Caso lDbf = .F., a funo no criar arquivo de nenhum tipo, apenas fornecer um nome vlido. Exemplos // Com lDbf = .F. cArq := CriaTrab(NIL, .F.) cIndice := C9_AGREG++IndexKey() Index on &cIndice To &cArq // Com lDbf = .T. aStru := {} AADD(aStru,{ MARK , C, 1, 0}) AADD(aStru,{ AGLUT , C, 10, 0}) AADD(aStru,{ NUMOP , C, 10, 0}) AADD(aStru,{ PRODUTO, C, 15, 0}) AADD(aStru,{ QUANT , N, 16, 4}) AADD(aStru,{ ENTREGA, D, 8, 0}) AADD(aStru,{ ENTRAJU, D, 8, 0}) AADD(aStru,{ ORDEM , N, 4, 0}) AADD(aStru,{ GERADO , C, 1, 0}) cArqTrab := CriaTrab(aStru, .T.) USE &cArqTrab ALIAS TRB NEW

CriaVar
Tipo: Processamento 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 CriaVar(cCampo,lIniPad,cLado) Parametros cCampo Nome do campo lIniPad Indica se considera (.T.) ou no (.F.) o inicializador cLado Se a varivel for caracter, cLado pode ser: C centralizado, L esquerdo ou R - direito Retorna uRet Retorno (tipo de acordo com o dicionrio de dados, considerando inicializador padro) Exemplo // Exemplo do uso da funo CriaVar: cNumNota := CriaVar(F2_DOC) // Retorna o contedo do // inicializador padro, // se existir, ou espaos em branco

PROGRAMAO ADVPL 7.10

137 Alert(cNumNota) Return

DataValida
Tipo: Processamento Retorna uma data vlida que no seja sbado, domingo ou feriado, a partir de uma data qualquer informada. uma funo til para a gerao de vencimentos reais para ttulos, por exemplo. Sintaxe DataValida(dData) Parametros dData Data informada para validao. Retorna dDtVld Retorna a Data validada. Exemplo // Exemplo de uso da funcao DataValida: // Pode-se gravar o campo do vencimento real de um // titulo a partir do vencimento informado. dVencto := cTod() : Get dVencto Read dVencRea := DataValida(dVencto) Grava() // Funcao generica. // Um uso interessante, e a obtencao do numero de dias // uteis de determinado mes utilizando-se dessa funcao. // A logica e simples: nDUtil := 0 nMes := 05 nAno := 98 dDtIni := CTOD(01/+StrZero(nMes,2)+/+StrZero(nAno,2) dDtMov := dDtIni While Month(dDtIni) == Month(dDtMov) .And. Year(dDtIni) == Year(dDtMov) If DataValida(dDtMov) == dDtMov nDUtil := nDUtil + 1 Endif dDtMov := dDtMov + 1 EndDo

@...To...Dialog
Tipo: Tela Windows Define uma nova janela na rea de trabalho. Sintaxe @ nLinha1,nColuna1 TO nLinha2,nColuna2 DIALOG cVar TITLE cTtulo Parmetros nLinha1 Nmero da linha superior nColuna1 Nmero da coluna superior nLinha2 Nmero da linha inferior nColuna2 Nmero da coluna inferior

PROGRAMAO ADVPL 7.10

138 cVar Varivel que recebera as definies da nova janela cTtulo Titulo da Janela Comentrios Deve ser utilizada sem conjunto com o comando ACTIVATE DIALOG. Exemplo Ver exemplo no programa RDDEMO apresentado no final deste Manual.

DrawAdv3D
Tipo: Tela DOS Desenha uma janela DOS em 3 dimenses. Sintaxe
DrawAdv3D(cTitle, nLinha1, cCorFundo, cStyle) nColuna1, nLInha2, nColuna2, cCorFrente,

Parmetros cTitle Ttulo da Janela nLinha1 Nmero da linha superior nColuna1 Nmero da coluna superior nLinha2 Nmero da linha inferior nColuna2 Nmero da coluna inferior cCorFrente Cor da letra cCorFundo Cor do fundo cStyle R (onde R = Raised - define a impresso de baixo relevo. O padro alto relevo) Exemplo // DrawAdv3D(Janela 3D,01,24,20,24,B+,N,R)

DrawAdvWindow
Tipo: Tela DOS
Desenha uma janela padro parmetro. Para verso DOS. de acordo com a posio relativa passada como

Sintaxe DrawAdvWindow(cTitulo,nLinha1,nColuna1,nLInha2, nColuna2) Parmetros cTitulo Ttulo da janela nLinha1 Linha superior da janela nColuna1 Coluna esquerda da janela nLinha2 Linha inferior da janela nColuna2 Coluna direita da janela Comentrios Esta funo desenha uma janela com o ttulo cTitulo, com o canto superior esquerdo na posio nLinha1, nColuna1 e canto inferior direito na posio nLinha2, nColuna2. Exemplos DrawAdvWindow(Ttulos em Aberto,3,4,20,76)

PROGRAMAO ADVPL 7.10

139

Execute
Tipo: Processamento Executa uma funo definida em um mesmo .Pr? nas clusulas <ACTION> ou <VALID>. Sintaxe Execute (cFuno) Parmetro cFuno Funo a ser executada. Exemplo @ 75,098 BmpButton type 01 action Execute(S500IMP)

PROGRAMAO ADVPL 7.10

140

ExistChav
Tipo: Processamento
Verifica se a chave j existe em determinado Alias. Funo para uso validaes de campos-chave, para no permitir a duplicidade de registros. em

Sintaxe ExistChav(cAlias,cChave,nOrdem,cHelp) Parametros cAlias Alias do arquivo no qual a consistncia deve ser avaliada cChave Chave para a pesquisa. Opcional. Se no for informada, o contedo ser automaticamente obtido do GET ativo nOrdem Ordem do ndice para a pesquisa no Alias. Se no for especificado, ser assumida a primeira ordem cHelp Opcional chave de help. Se no for informada, o help ser o padro do sistema (JAGRAVADO) Retorna lRet Retorna Verdadeiro (.T.) se a chave no existir (o que significa que pode ser usada para incluir um novo registro). Caso contrrio, retorna Falso (.F.) e executa um help do sistema. Exemplo // Exemplo de uso da funcao ExistChav: // Pode-se utiliza-la em uma validacao de usuario, // definada atraves do Configurador: // Campo -> B1_COD // Validacao do Usuario -> ExistChav(SB1) // Ou em um AdvPL: While .T. cEsp := Space(15) @ 00,00 Say Cadastro de Especialidades @10,00 Say Espec.: Get cEsp Pict @! Read If LastKey() == 27 Exit Endif If ExistChav(SZ1,cEsp,1,ESPEXIST) Loop Endif Grava() // Rotina generica EndDo Return

ExistCpo
Tipo: Processamento
Verifica se determinada chave existe no Alias especificado. Funo utilizada em processamentos no qual o cdigo informado deve existir em determinado cadastro em sua validao.

Sintaxe ExistCpo(cAlias,cChave,nOrdem) Parmetros cAlias Alias do arquivo para a pesquisa

PROGRAMAO ADVPL 7.10

141 cChave Chave a ser pesquisada (opcional). Se no for informada, o conte-do obtido automaticamente do GET em uso nOrdem Nmero da ordem do ndice para Pesquisa (Opcional). Se no for informado, usa a ordem atual do Alias. Retorna lRet Retorna Verdadeiro (.T.) se a chave existir no Alias especificado, caso contrrio, retorna Falso (.F.) e executa um help padro do sistema (REGNOIS). A ordem utilizada na pesquisa a atualmente selecionada. Se no for informado, usa a ordem atual do lias. Exemplo // Exemplo de uso da funcao ExistCpo: While .T. cProd := Space(15) @10,10 Get cProd Read If LastKey() == 27 Exit Endif If !ExistCpo(SB1,cProd) Loop Endif Grava() // Funcao generica. EndDo Return

ExistIni
Tipo: Processamento Verifica se o campo possui inicializador padro. Sintaxe ExistIni(cCampo) Parmetros cCampo Nome do campo para verificao. Retorna lEx Retorna Verdadeiro (.V.) se o campo possui inicializador padro, caso contrrio, retorna falso (.F.). Exemplo // Exemplo de uso da funo ExistIni: // Se existir inicializador no campo B1_COD: If ExistIni(B1_COD) // Chama o inicializador: cCod := CriaVar(B1_COD) Endif Return

PROGRAMAO ADVPL 7.10

142

Extenso
Tipo: Processamento Gera o extenso de um valor numrico. Esta funo retorna um valor, dinheiro ou quantidade, por extenso. Usada para a impresso de cheques, valor de duplicatas etc. Sintaxe Extenso(nValor,lQtd,nMoeda) Parametros nValor Valor a ser gerado o extenso. lQtd Verdadeiro (.T.) indica que o valor representa uma quantidade. Falso (.F.) indica que o valor representa dinheiro. Se no for especificado, o default falso (.F.). nMoeda - Qual moeda do sistema deve ser o extenso. Retorna cValor Retorna o valor por extenso. Exemplo // Exemplo de uso da funcao Extenso: nValor := SF2->F2_VALFAT // Gera o extenso do valor, formatando a variavel com // 200 caracteres preenchendo os espacos em branco com * cExtenso := PADR(Extenso(nValor),200,*) // Imprime o extenso em duas linhas (100 caracteres em cada): For nLi := 20 To 21 @nLi,10 Say Substr(cExtenso,(nLi-20)*100+1,100) Next nLi Return

Formula
Tipo: Processamento Interpreta uma frmula cadastrada. Esta funo interpreta uma frmula previamente cadastrada no Arquivo SM4 por meio do ambiente Configurador e retorna o resultado com tipo de dado de acordo com a prpria frmula. Sintaxe Formula(cFormula) Parmetros cFormula Cdigo da frmula cadastrada no SM4. Retorna uRet Retorno, com tipo de dado de acordo com a frmula. Exemplo // Exemplo de uso da funcao formula: // Formula cadastrada no SM4: // Codigo: F01 // Regra : Sao Paulo, +StrZero(Day(dDataBase),2)+ // de +MesExtenso(dDataBase)+ de + // StrZero(Year(dDataBase),4)+. // Ao imprimir esta linha em um programa, por exemplo, @ 00,00 Say Formula(F01) // o resultado impresso sera algo como: // Sao Paulo, 17 de dezembro de 1997. // Formula cadastrada no SM4:

PROGRAMAO ADVPL 7.10

143 // Codigo: F02 // Regra : (GETMV(MV_JUROS)/100)+1 // Ao usar esta formula, pode-se dar um acrescimo em um // valor de acordo com a taxa de juros cadastrada MV_JUROS: nValor := nValor * Formula(F02)

no

parametro

@... GET
Tipo: Tela DOS/Windows Executa um Get, diferenciado pela clusula <F3>. Sintaxe @ nLinha,nColuna GET cVar <PICTURE> cMscara <VALID> cFuno <F3> cConsulta Parmetros nLinha Nmero da Linha em que o Get ser posicionado nColuna Nmero da Coluna em que o Get ser posicionado cVar Varivel a ser editada cMscara Define a mscara de edio (opcional) cFuno Funo que retorna valor lgico para validao da edio (opcional) cConsulta Definio (SXB) da consulta <F3> associada ao contedo de cVar Comentrios Os cdigos utilizados na clusula <F3> devem ser obtidos por meio do arquivo (SXB). No necessrio utilizar o comando READ aps a definio dos Gets.

GetAdvFval
Tipo: Processamento Esta funo permite executar uma pesquisa em um arquivo pela chave e ordem especificadas, retornando o contedo de um ou mais campos. Sintaxe GetAdvFVal(cAlias,uCpo,uChave,nOrder,uDef) Parmetros cAlias Alias do arquivo. uCpo Nome de um campo ou array contendo os nomes dos campos desejados. uChave Chave para a pesquisa. nOrder Ordem do indice para a pesquisa. uDef Valor ou array default para ser retornado caso a chave no seja encontrada. Retorna uRet Retorna o contedo de um campo ou array com o contedo de vrios campos. Exemplo // Exemplo de uso da funcao GetAdvFVal: // Obtendo apenas de um campo: cChave := SD2->D2_COD+SD2->D2_LOCAL cDesc := GetAdvFVal(SB1,B1_DESC,cChave,1,SC6->C6_DESCRI) // Obtendo o conteudo de mais de um campo:

PROGRAMAO ADVPL 7.10

144 cChave := SD2->D2_COD+SD2->D2_LOCAL aCpos := {B1_DESC,B1_PRV1,B1_UM} aDados := GetAdvFVal(SB1,aCpos,cChave,1,{SC6->C6_DESCRI,SC6>C6_PRCVEN,SC6->C6_UM}) refere-se aos Itens do Pedido de Venda) e, aps pesquisar no SB1 (Cadastro de Produtos), sugerir a quantidade vendida a partir de um campo especfico: // Colunas... nPosCod := aScan(aHeader,{ |x| Upper(AllTrim(x[2])) == C6_PRODUTO }) nPosQtd := aScan(aHeader,{ |x| Upper(AllTrim(x[2])) == C6_QTDVEN }) // Obtm o cdigo do produto cCodigo := aCols[n,nPosCod] // Pesquisa dbSelectArea(SB1) dbSetOrder(1) dbSeek(xFilial(SB1)+cCod) // Altera a quantidade no grid aCols[n,nPosQtd] := SB1->B1_QTSUGER // Campo especfico com a quantidade padro __Return(SB1->B1_QTSUGER) Para uma melhor compreenso, voc pode analisar os programas RDMOD2.PRX e/ou RDMOD3.PRX que acompanham o SIGA MP8. Eles esto no diretrio principal do sistema (geralmente \SIGAADV\) e demonstram rotinas usadas para cadastros semelhantes ao Pedido de Vendas e que trabalham com os arrays mencionados.

GetMV
Tipo: Processamento Recupera o contedo de parmetros originados em SX6. Sintaxe GetMV(cParam) Parmetros cParam Nome do parmetro a ser pesquisado no SX6 Retorna ExpX1 Contedo do parmetro devolvido pela funo Exemplos cTabVista := GETMV(MV_TABVIST) cColICMS := GETMV(MV_COLICMS)

GetSX8Num
Tipo: Processamento Fornece um nmero seqencial do arquivo de semforo (SX8??0.DBF). Esta funo retorna o prximo nmero, na seqncia e disponvel, para o cadastro no SIGA MP8 e mantm esta numerao para o usurio at o momento em que ele confirme ou abandone a operao. O arquivo de semforo usado para evitar a duplicidade de chaves em ambientes multiusurio. Esta funo trabalha juntamente com outras duas chamadas CONFIRMSX8 e ROLLBACKSX8.

PROGRAMAO ADVPL 7.10

145 Verifique os exemplos para maiores detalhes. Sintaxe GetSx8Num(cAlias,cCpoSx8) Parmetros cAlias Alias do Arquivo cCpoSx8 Nome do campo para aplicao do semforo Exemplo Para que o cadastro de clientes, por exemplo, carregue na incluso o prximo nmero disponvel automaticamente, pode-se utilizar a seguinte sintaxe no inicializador padro do campo A1_COD: GetSx8Num(SA1) Caso seja um arquivo especfico, utilize a sintaxe a seguir: GetSx8Num(SZ1,Z1_COD) Para uso em programas AdvPL, as sintaxes descritas acima tambm so vlidas, no devendo esquecer de que a funo GETSX8NUM trabalha junto com as funes CONFIRMSX8 e ROLLBACKSX8, que devem ser chamadas ao final do processamento (procedimento que feito automaticamente em um inicializador padro conforme a sintaxe explicada acima). Exemplo em AdvPL: cCodNew := GetSx8Num(SZ1,Z1_COD) // Processamento... // Confirmacao ConfirmSx8() // ou Cancelamento RollBackSx8() Return

Help
Tipo: Tela DOS/Windows Esta funo exibe a ajuda especificada para o campo e permite sua edio. Se for um help novo, escreve-se o texto em tempo de execuo. Sintaxe Help(cHelp,nLinha,cTtulo,cNil,cMensagem,nLinMen,nColMen) Parmetros cHelp Nome da Rotina chamadora do help (sempre branco) nLinha Nmero da linha da rotina chamadora (sempre 1) cTtulo Ttulo do help cNil Sempre NIL cMensagem Mensagem adicional ao help nLinMen Nmero de linhas da Mensagem (relativa janela) nColMen Nmero de colunas da Mensagem (relativa janela) Retorna Nada Exemplos : If Empty(cArqs) dbSelectArea(cAlias) RecLock(cAlias,.F.) dbDelete() Else

PROGRAMAO ADVPL 7.10

146 Help( ,1,NaoExclui,,cArqs,4,1) Endif :

ImpCadast
Tipo: Impresso Imprime relatrio de cadastros padres do SIGA MP8. Esta funo monta uma interface padro de relatrio com parametrizaes de/at e permite imprimir qualquer arquivo de cadastro definido no sistema.

Sintaxe ImpCadast(cCab1,cCab2,cCab3,cNomePrg,cTam,nLim,cAlias) Parmetros cCab1 Primeira linha de cabealho cCab2 Segunda linha de cabealho cCab3 Terceira linha de cabealho cNomePrg Nome do programa cTam Tamanho do relatrio (P,M ou G) nLim Limite do relatrio. Mxima coluna a ser impressa cAlias Alias do arquivo de cadastro a ser impresso Exemplo // Exemplo de uso da funcao Impcadast: // Imprime relatorio de cadastro de produtos: ImpCadast(Cabec1,Cabec2,Cabec3,PRG01,P,80,SB1) Return

IncRegua
Tipo: Impresso Incrementa rgua padro de processamento em relatrios. Sintaxe IncRegua() Parmetros Nil Retorno Nil Exemplo DbSelectArea(SA1) SetRegua(LastRec()) While ( ! Eof() ) @ Li, 001 PSAY SA1->A1_NOME DbSkip() IncRegua() End Comentrio Ver tambm SetRegua()

PROGRAMAO ADVPL 7.10

147

IncProc
Tipo: Tela DOS/Windows
Incrementa rgua padro de processamento.

Sintaxe IncProc() Parmetros Nil Retorno Nil Exemplo ProcRegua(1000) For i:= 1 to 1000 IncProc() Next Return

IndRegua
Tipo: Processamento Cria ndice de trabalho, podendo ser condicional. Sintaxe IndRegua(cAlias,cArqtrab,cChave,cPar,cFiltro,cTexto) Parmetros cAlias Alias do arquivo. cArqtrab Nome do arquivo de trabalho retornado pela funo CriaTrab (.F.). cChave Expresso utilizada na chave do novo ndice. cPar Se for igual a D, cria um indice com a chave inversa, do maior valor para o menor. cFiltro Expresso utilizada para filtro. cTexto Texto da rgua de processamento ( Selecionando registros ...). Retorno Nil Exemplo DbSelectArea(SC5) cFiltro := C5_OK<>X cChave := Dtos(C5_EMISSAO)+C5_VEND1 cIndSC51 := CriaTrab(Nil,.F.) IndRegua(SC5, cIndSC51, cChave, , cFiltro, Selecionando Pedidos...)

LetterOrNum
Tipo: Processamento Verifica se determinado caractere uma letra ou um nmero. Sintaxe LetterOrNum(cChar)

PROGRAMAO ADVPL 7.10

148 Parmetros cChar Caracter para verificao. Retorna lAlfa Retorna Verdadeiro (.V.) se o caracter informado for uma letra ou um nmero. Exemplo // Exemplo de uso da funcao LetterOrNum: cCh := Inkey(0) If LetterOrNum(cCh) ... Processamento Endif Return

MarkBrowse
Tipo: Processamento Monta um browse padro do sistema, permitindo marcar e desmacar linhas. Sintaxe MarkBrowse(cAlias,cCampo,cCpo,aCampos,lMarc,cMarca,cCtrlM,lBotoes,cTopFun ,cBotFun,aCoord) Parmetros cAlias Alias do arquivo cCampo Campo que estabelece relao com a culuna de marca cCpo Campo que se estiver vazio muda a cor da linha aCampos Array com os campos para montar o browse lMarc Flag para inicializar marcado ou no cMarca Marca obtida com a funo Getmark cCtrlM Funo para ser executada no Alt_M lBotoes Parmetro obsoleto cTopFun Funo filtro para estabelecer o primeiro registro cTopFun Funo filtro para estabelecer o ltimo registro aCoord Array com as coordenadas da MarkBrowse. Exemplo cMarca := GetMark() cCadastro := Escolher Clientes aRotina := { { Pesquisar,AxPesqui,0,1}, ; {Visualizar,AxVisual,0,2}} MarkBrow(SA1,A1_OK,SA1->A1_OK,,,cMarca)

MBrowse
Tipo: Processamento Monta um browse padro do sistema, conforme os parmetros. Sintaxe mBrowse(nLinha1, nColuna1, nLinha2, nColuna2, cAlias, nPar, cCor, n Opc) Parmetros nLinha1 Nmero da linha inicial nColuna1 Nmero da coluna inicial nLinha2 Nmero da linha final nColuna2 Nmero da coluna final cAlias Alias do arquivo

aFixe,

cCpo,

PROGRAMAO ADVPL 7.10

149 aFixe Array contendo os campos fixos (a serem mostrados em primeiro lugar no browse) cCpo Campo a ser tratado. Quando vazio, muda a cor da linha nPar Parmetro obsoleto cCor Funo que retorna um valor lgico, muda a cor da linha nOpc Define qual opo do aRotina que ser utilizada no double click

PROGRAMAO ADVPL 7.10

150 Exemplo cCadastro := Cadastro de Orcamentos aRotina := {{Pesquisar,AxPesqui,0,1},; {Incluir,ExecBlock(DEMOA,.F.),0,3},; {Altera,ExecBlock(DEMOB),0,4},; {Excluir,ExecBlock(DEMOC,.F.),0,5}} MBrowse(6, 1, 22, 75, SA1)

MesExtenso
Tipo: Processamento Retorna o nome do ms por extenso. Sintaxe MesExtenso(nMes) Parmetros nMes Nmero do ms (1 a 12). Se nMes no for informado, assumido o ms da data base do sistema. Esta varivel tambm pode ser caracter (1 ou 2) ou do tipo data. Retorna cNome Nome do ms retornado por extenso. Exemplo // Exemplo do uso da funcao MesExtenso: ? Sao Paulo, +STRZERO(Day(dDataBase),2)+ de +; MesExtenso(dDataBase)+ de +StrZero(Year(dDataBase),4)

Modelo2
Tipo: Processamento
Exibe formulrio Fiscal). para cadastro segundo o modelo 2 (como a rotina de Nota

Sintaxe M o d e l o 2 (c T t u l o ,a C a b e c ,a R o d a p ,a G d ,n O p ,c L O k ,c T O k , [aGetsGD,bF4,cIniCpos,nMax,aCordw,lDelget]) Parmetros cTtulo Ttulo da janela aCabec Array com os campos do cabealho aRodap Array com os campos do rodap aGd Array com as posies para edio dos itens (GETDADOS) nOp Modo de operao (3 ou 4 altera e inclui itens, 6 altera mas no inclui itens, qualquer outro nmero s visualiza os itens) cLOk Funo para validao da linha cTOk Funo para validao de todos os dados (na confirmao) aGetsGD Array Gets editveis (GetDados) Default = Todos. bF4 Codeblock a ser atribudo a tecla F4. Default = Nenhum. cIniCpos String com o nome dos campos que devem ser inicializados ao teclar seta para baixo (GetDados). nMAx Limita o nmero de linhas (GetDados). Default = 99. aCordw Array com quatro elementos numricos, correspondendo s coordenadas

PROGRAMAO ADVPL 7.10

151 linha superior, coluna esquerda, linha interior e coluna direita, definindo a rea de tela a ser usada. Default = rea de Dados Livre. lDelget Determina se as linhas podem ser deletadas ou no (GetDados) Default = .T. Retorna lRet Retorna .T. se for confirmado Exemplo //************************************************** // 3,4 Permitem alterar getdados e incluir linhas // 6 So permite alterar getdados e nao incluir linhas // Qualquer outro numero so visualiza nOpcx:=3 dbSelectArea(Sx3) dbSetOrder(1) dbSeek(SX5) nUsado:=0 aHeader:={} While !Eof() .And. (x3_arquivo == SX5) IF X3USO(x3_usado) .AND. cNivel >= x3_nivel nUsado:=nUsado+1 AADD(aHeader,{ TRIM(x3_titulo),x3_campo,; x3_picture,x3_tamanho,x3_decimal,; ExecBlock(Md2valid,.f.,.f.),x3_usado,; x3_tipo, x3_arquivo, x3_context } ) Endif dbSkip() End aCols:=Array(1,nUsado+1) dbSelectArea(Sx3) dbSeek(SX5) nUsado:=0 While !Eof() .And. (x3_arquivo == SX5) IF X3USO(x3_usado) .AND. cNivel >= x3_nivel nUsado:=nUsado+1 IF nOpcx == 3 IF x3_tipo == C aCOLS[1][nUsado] := SPACE(x3_tamanho) Elseif x3_tipo == N aCOLS[1][nUsado] := 0 Elseif x3_tipo == D aCOLS[1][nUsado] := dDataBase Elseif x3_tipo == M aCOLS[1][nUsado] := Else aCOLS[1][nUsado] := .F. Endif Endif Endif dbSkip() End aCOLS[1][nUsado+1] := .F. cCliente:=Space(6) cLoja :=Space(2) dData :=Date() nLinGetD:=0

PROGRAMAO ADVPL 7.10

152 cTitulo:=TESTE DE MODELO2 aC:={} // aC[n,1] = Nome da Variavel Ex.:cCliente // aC[n,2] = Array com coordenadas do Get [x,y], em // Windows estao em PIXEL // aC[n,3] = Titulo do Campo // aC[n,4] = Picture // aC[n,5] = Validacao // aC[n,6] = F3 // aC[n,7] = Se campo e editavel .t. se nao .f. #IFDEF WINDOWS AADD(aC,{cCliente ,{15,10} ,Cod. do Cliente,@!,; ExecBlock(MD2VLCLI,.F.,.F.),SA1,}) AADD(aC,{cLoja ,{15,200},Loja,@!,,,}) AADD(aC,{dData ,{27,10} ,Data de Emissao,,,,}) #ELSE AADD(aC,{cCliente ,{6,5} ,Cod. do Cliente,@!,; ExecBlock(MD2VLCLI,.F.,.F.),SA1,}) AADD(aC,{cLoja ,{6,40},Loja,@!,,,}) AADD(aC,{dData ,{7,5} ,Data de Emissao,,,,}) #ENDIF aR:={} // aR[n,1] = Nome da Variavel Ex.:cCliente // aR[n,2] = Array com coordenadas do Get [x,y], em // Windows estao em PIXEL // aR[n,3] = Titulo do Campo // aR[n,4] = Picture // aR[n,5] = Validacao // aR[n,6] = F3 // aR[n,7] = Se campo e editavel .t. se nao .f. #IFDEF WINDOWS AADD(aR,{nLinGetD ,{120,10},Linha na GetDados,; @E 999,,,.F.}) #ELSE AADD(aR,{nLinGetD ,{19,05},Linha na GetDados,; @E 999,,,.F.}) #ENDIF #IFDEF WINDOWS aCGD:={44,5,118,315} #ELSE aCGD:={10,04,15,73} #ENDIF cLinhaOk := ExecBlock(Md2LinOk,.f.,.f.) cTudoOk := ExecBlock(Md2TudOk,.f.,.f.) // lRet = .t. se confirmou // lRet = .f. se cancelou lRet:=Modelo2(cTitulo,aC,aR,aCGD,nOpcx,cLinhaOk,cTudoOk) // No Windows existe a funcao de apoio CallMOd2Obj() que // retorna o objeto Getdados Corrente Return

Modelo3

PROGRAMAO ADVPL 7.10

153 Tipo: Processamento Executa cadastro semelhante ao cadastro de Pedidos de Venda, cabealho varivel com itens. Sintaxe Modelo3(cTitulo,cAliasEnchoice,cAliasGetD,aCpoEnchoice,cLinOk,cTudOk,nOpc E,nOpcG,cFieldOk, [lVirtual,nLinhas,aAltEnchoice]) Parmetros cTitulo Ttulo da janela cAliasEnchoice lias do cabealho cAliasGetd lias dos itens aCpoEnchoice Array com os campos que sero mostrados cLinOk Funo para validar a mudana de linha nos itens. cTudOk Funo para validar todos os itens. nOpce Nmero da opo do menu para o cabealho (Enchoice) nOpcG Nmero da opo do menu para o itens (GetDados) cFieldOk Funo para validar os campos dos itens (GetDados) lVirtual Permite visualizar campos virtuais na enchoice. Default = .F.
nLinhas Limita o nmero mximo de linhas (GetDados)

Default = 99. aAltEnchoice Array com campos alterveis (Enchoice) Default = Todos. Retorna
lRet Retorno da funo modelo3. Se True a operao foi confirmada.

Exemplo aRotina := {{ Pesquisa,AxPesqui, 0 , 1},; { Visual,AxVisual, 0 , 2},; { Inclui,AxInclui, 0 , 3},; { Altera,AxAltera, 0 , 4, 20 },; { Exclui,AxDeleta, 0 , 5, 21 }} // // Opcoes de acesso para a Modelo 3 // cOpcao:=VISUALIZAR Do Case Case cOpcao==INCLUIR; nOpcE:=3 ; nOpcG:=3 Case cOpcao==ALTERAR; nOpcE:=3 ; nOpcG:=3 Case cOpcao==VISUALIZAR; nOpcE:=2 ; nOpcG:=2 EndCase // // Cria variaveis M->????? da Enchoice // RegToMemory(SC5,(cOpcao==INCLUIR)) // // Cria aHeader e aCols da GetDados // nUsado:=0 dbSelectArea(SX3) dbSeek(SC6) aHeader:={} While !Eof().And.(x3_arquivo==SC6) If Alltrim(x3_campo)==C6_ITEM dbSkip() Loop Endif If X3USO(x3_usado).And.cNivel>=x3_nivel

PROGRAMAO ADVPL 7.10

154 nUsado:=nUsado+1 Aadd(aHeader,{ TRIM(x3_titulo), x3_campo, x3_picture,; x3_tamanho, x3_decimal,AllwaysTrue(),; x3_usado, x3_tipo, x3_arquivo, x3_context } ) Endif dbSkip() End If cOpcao==INCLUIR aCols:={Array(nUsado+1)} aCols[1,nUsado+1]:=.F. For _ni:=1 to nUsado aCols[1,_ni]:=CriaVar(aHeader[_ni,2]) Next Else aCols:={} dbSelectArea(SC6) dbSetOrder(1) dbSeek(xFilial()+M->C5_NUM) While !eof().and.C6_NUM==M->C5_NUM AADD(aCols,Array(nUsado+1)) For _ni:=1 to nUsado aCols[Len(aCols),_ni]:=FieldGet(FieldPos(aHeader[_ni,2])) Next aCols[Len(aCols),nUsado+1]:=.F. dbSkip() End Endif If Len(aCols)>0 // // Executa a Modelo 3 // cTitulo:=Teste de Modelo3() cAliasEnchoice:=SC5 cAliasGetD:=SC6 cLinOk:=AllwaysTrue() cTudOk:=AllwaysTrue() cFieldOk:=AllwaysTrue() aCpoEnchoice:={C5_CLIENTE} _lRet:=Modelo3(cTitulo,cAliasEnchoice,cAliasGetD,aCpoEnchoice,cLinOk,c TudOk,nOpcE,nOpcG,cFieldOk) // // Executar processamento // If _lRet Aviso(Modelo3(),Confirmada operacao!,{Ok}) Endif Endif Return

MontaF3
Tipo: Processamento Permite o acesso janela de consultas padronizadas (criadas no SXB) por meio de um GET usando a tecla F3.

PROGRAMAO ADVPL 7.10

155

Sintaxe MontaF3(cAlias) Parmetros cAlias Alias do arquivo ou cdigo de tabela para consulta. Se no informado, desabilita a tecla F3. Exemplo // Exemplo de uso da funcao MontaF3: // Versao DOS cCod := Space(15) @02,50 Say Digite o codigo: Get cCod Picture @! ; When MontaF3(SB1) Valid(MontaF3()) Read Return // *************************** // Versao WINDOWS // Use a propria clausula do comando get: @ 250,250 To 360,450 Dialog oDlg Title Teste @ 02,50 Get cCod Picture @! F3 SB1 Activate Dialog oDlg Centered Return

MsgBox
Tipo: Tela Windows Abre uma caixa de dilogo padronizada para informar ao usurio de um erro, deciso a ser tomada ou apenas uma informao (Registro Gravado com sucesso). Sintaxe MSGBOX(cMensagem,cTtulo,cTpCaixa) Parmetros cMensagem Define a mensagem apresentada no interior da janela cTtulo Titulo da janela cTpCaixa Tipo da caixa padronizada Retorno Retorna Nil ou um valor lgico (.T. ou .F.) conforme o tipo de caixa. Comentrios As caixas assumem o tamanho de <cMensagem>. Tipos de caixas: STOP, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. INFO, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. ALERT, utiliza um bitmap para advertncia e tem um boto Ok. Retorna Nil. YESNO, utiliza um bitmap para advertncia e tem dois botes Sim e No, retorna .T. ou .F. RETRYCANCEL, utiliza um bitmap para advertncia e tem dois botes Repetir e Cancelar, retorna .T. ou .F.

PROGRAMAO ADVPL 7.10

156

@..To...MultiLine
Tipo: Tela Windows Ativa Browse para edio de mltiplos itens padro SigaAdv Win (GetDados Itens SC6). Sintaxe @ nLinha1,nColuna1 TO nLinha2,nColuna2 MULTILINE <<MODIFY>> <<DELETE>> <<VALID>> cFuno <<FREEZE>> nColuna Parmetros nLinha1 Nmero da linha superior nColuna1 Nmero da coluna superior nLinha2 Nmero da linha inferior nColuna2 Nmero da coluna inferior
cFuno Funo a ser executada para validar mudana de linha <opcional>

nColuna Nmero de colunas Congeladas esquerda <opcional> Comentrios As clusulas opcionais permitidas controlam as alteraes, excluses e validaes nas mudanas de linha e congelamento de colunas, respectivamente. Devem ser criadas obrigatoriamente as matrizes aHeader [n][n] e aCols[n][n] antes da definio da MULTILINE, sendo que aHeader [n][n] contm informaes sobre os campos que sero editados (SX3) e aCols [n][n] contm os dados referentes aos campos que sero editados.

NaoVazio
Tipo: Processamento Verifica se o campo no est vazio. Sintaxe NaoVazio(cCpo) Parmetros cCpo Campo a verificar Retorna ExpL1 Valor Lgico de Retorno (.T. ou .F.) Exemplos @ 5,10 Get cCodigo Valid NaoVazio(cCodigo)

Negativo
Tipo: Processamento Verifica se negativo. Sintaxe Negativo(nCpo) Parmetros nCpo Campo a verificar Retorna ExpL1 Se o valor de nCpo for menor que 0, retornado .T., caso contrrio ser retornado .F.. Exemplos

PROGRAMAO ADVPL 7.10

157 If Negativo (nValTitulo) @ 5,10 Say Valor invalido Loop EndIf

Orcado
Tipo: Processamento Retorna o valor orado de uma conta. Sintaxe Orcado(cConta, nPerodo,nMoeda,dData) Parmetros cConta Cdigo da conta De nPerdodo Referente ao perodo nMoeda Moeda desejada para obteno do valor
dData Data para converso (em formato data ou caracter), caso no informada, ser utilizada a DataBase do sistema

Exemplo Orcado(11102001,1,1)

OpenFile
Tipo: Processamento a funo que exibe o diagnstico de arquivos, verificando a existncia dos arquivos de dados e dos ndices do sistema, criando-os caso no existam, etc. Abre os arquivos de acordo com o ambiente onde executada ou de acordo com a parametrizao. Sintaxe OpenFile(cEmp) Parmetros cEmp Cdigo da empresa que deve ser aberta. Exemplo // Exemplo de uso da funcao openfile: cEmp := SM0->M0_CODIGO // Elimina os indices de todos os arquivos abertos no // SX2 para reindexacao dbSelectArea(SX2) dbGoTop() While !EOF() If Select(SX2->X2_CHAVE) > 0 dbSelectArea(SX2->X2_CHAVE) dbCloseArea() cEsp := AllTrim(SX2->X2_PATH) cEsp := cEsp + AllTrim(SX2->X2_ARQUIVO) + * + RetIndExt() fErase(cEsp) Endif dbSelectArea(SX2) dbSkip() EndDo dbCloseAll() // Fecha todos os arquivos

PROGRAMAO ADVPL 7.10

158 OpenFile(cEmp) // Abre os arquivos (reindexa) Return Parmetro cEmp apenas no Windows.

OurSpool
Tipo: Impresso Abre a tela do gerenciador de impresso do sistema. O gerenciador mostra os relatrios impressos em disco gravados no diretrio definido por meio do parmetro MV_RELATO. Sintaxe OurSpool(cArq) Parmetros cArq Nome do arquivo. Este parmetro opcional, se informado, o gerenciador de impresso j aberto neste arquivo. Exemplo // Exemplo de uso da funcao ourspool: // Ativa o gerenciador de impressao: OurSpool() // Para verificar o uso desta funcao em relatorios, // verifique o exemplo da funcao AVALIMP. Return

Pergunte
Tipo: Impresso Esta funo permite acessar e editar um grupo de perguntas do arquivo SX1. Mostra uma tela contendo as perguntas gravadas em SX1 a serem respondidas ou confirmadas pelo usurio. Sintaxe Pergunte(cGrupo, lVar) Parmetros cGrupo Nome do Grupo de perguntas. lVar .F. - devolve o contedo das variveis, no apresentando a janela de perguntas; .T. - permite a alterao das variveis, apresentando a janela. Retorna ExpL1 .T. se o grupo de perguntas existe. Exemplos pergunte(AFR090,.T.) // Variveis utilizadas na pergunta // mv_par01 a partir da data // mv_par02 at a data // mv_par03 da conta // mv_par04 at a conta // mv_par05 do centro de custo // mv_par06 at o centro de custo // mv_par07 do cdigo // mv_par08 at o cdigo // mv_par09 do projeto // mv_par10 at o projeto // mv_par11 moeda

PROGRAMAO ADVPL 7.10

159

Pertence
Tipo: Processamento Verifica se o campo est contido em outro. Sintaxe Pertence(cString,cCampo) Parmetros cString String que deve estar contida no cCampo cCampo Campo a verificar Retorna ExpL1 Valor Lgico de Retorno (.T. ou .F.) Exemplo SetCursor(1) @ 09,19 Get cTipo Picture @! Valid Pertence(CL\VD\PD,cTipo)

PesqPict
Tipo: Processamento Pesquisa, no dicionrio de dados, qual a picture usada em um determinado campo, seja para a edio em tela ou para a impresso de relatrios. Sintaxe PesqPict(cAlias,cCampo,nTam) Parmetros cAlias Alias do arquivo cCampo Nome do campo nTam Opcional, para campos numricos, ser usado como o tamanho do campo para definio da picture. Se no informado, e usado o tamanho padro no dicionrio de dados. Retorna cPic Picture do campo Exemplo // Exemplo de uso da funcao PesqPict // Em um relatorio pode-se usar a sintaxe abaixo para // formatacao automatica de acordo com o dicionario de // dados: @ nLin,20 Say Total: @ nLin,27 Say SF2->F2_VALBRUT Picture PesqPict(SF2,F2_VALBRUT) // ... Return

PesqPictQt
Tipo: Processamento Devolve a picture de um campo de quantidade, de acordo com o dicionrio de dados. Esta funo geralmente utilizada quando h pouco espao

PROGRAMAO ADVPL 7.10

160 disponvel para impresso de valores em relatrios, quando o valor nEdio no informado. Ela tem o comportamento semelhante ao da funo X3Picture, pois busca o tamanho do campo no dicionrio de dados. Sintaxe PesqPictQt(cCampo,nEdio) Parmetros cCampo Nome do campo a verificar a picture nEdio Espao disponvel para edio Retorna ExpC Picture ideal para o espao definido por nEdio, sem a separao dos milhares por vrgula Exemplo @ 8,10 Say SB2->B2_QATU Picture PesqPictQt (B2_QATU,8)

Posicione
Tipo: Processamento Posiciona o arquivo em um determinado registro. Sintaxe Posicione(cAlias, nOrdem, cChave, cCampo) Parmetros cAlias Alias do arquivo nOrdem Ordem utilizada cChave Chave pesquisa cCampo Campo a ser retornado Retorna Retorna o contedo do campo passado com o permetro. Exemplo Posicione(SA1,1,xFilial(SA1)+001,A1_NOME)

Positivo
Tipo: Processamento Verifica se positivo. Sintaxe Positivo(nCampo) Parmetros nCampo Campo a verificar Retorna ExpL1 Valor Lgico de Retorno (.T. ou .F.) Comentrios Se cCampo for maior ou igual ( >= ) a zero a funo retorna .T. Caso contrrio retorna .F. Exemplo @ 09,07 Get nValor Picture 999999 Valid Positivo ( nValor )

ProcRegua
Tipo: Tela DOS/Windows

PROGRAMAO ADVPL 7.10

161 Inicializa rgua padro de processamento. Sintaxe ProcRegua(nRegs,nLinha,nColuna) Parmetros nRegs Nmero de registros que sero processados. nLinha Nmero da Linha da rgua nColuna Nmero da Coluna da rgua Retorna Nil Exemplo ProcRegua(1000) For i:= 1 to 1000 IncProc() Next Return No programa para Windows a ProcRegua s utiliza o primeiro parmetro. No programa para DOS so utilizados os trs parmetros. = Ver tambm IncProc()

ProxReg
Tipo: Processamento Retorna o ltimo registro incrementado. Esta funo retorna um valor, numrico ou caracter, contendo o prximo nmero a partir do ltimo registro encontrado. O campo que levado em considerao aquele que se encontra posicionado no SX3 (dicionrio de dados). Pode ser usada para obter os prximos valores para campos dos tipos: Caracter, Numrico e Data. Sintaxe ProxReg(nInc,nPos,nIndice) Parmetros nInc Valor a incrementar nPos Tamanho nndice Nmero do ndice a ser utilizado Retorna uRet Prximo nmero (ltimo registro incrementado) Exemplo // Exemplo de uso da funo ProxReg: dbSelectArea(SX3) dbSetOrder(2) dbSeek(A1_COD) dbSelectArea(SA1) cProx := ProxReg(1,6,1) // Retorna o possvel prximo // cdigo para o cadastro de // cliente dbSelectArea(SX3) dbSeek(D2_NUMSEQ) dbSelectArea(SD2) nProx := ProxReg(1,,4) // Retorna o proximo nmero // seqencial Return

PROGRAMAO ADVPL 7.10

162

@...Radio
Tipo: Tela Windows Cria uma caixa de seleo semelhante a CHECKBOX. Todos os itens so Apresentados, mas apenas um pode ser selecionado. Sintaxe @ nLinha,nColuna RADIO aArray VAR nPos Object oRdx Parmetros nLinha Nmero da linha superior nColuna Nmero da coluna superior aArray Matriz [1] com os Itens nPos Contm a posio na Matriz[1] do item selecionado oRdx Objeto associado Radiobox() Retorno O item selecionado pode ser obtido por - Matriz [n3] Comentrios Os itens da Matriz [1] devem ser do tipo C caracter. Pode ser utilizada para definir uma caracterstica em um conjunto. Ex.Tipo da Condio de pagamento Tipo 1 Tipo 2 Tipo 3

RecLock
Tipo: Processamento Tenta efetuar um lock no registro do banco de dados informado. Sintaxe RecLock(cAlias,lAdiciona) Parmetros cAlias Alias do Banco de Dados lAdiciona .T. adiciona registro ao Banco de Dados Retorna ExpL1 Valor Lgico de Retorno (.T. ou .F.) Comentrios Esta funo tenta colocar o registro corrente do arquivo cAlias em lock. necessrio colocar um registro em lock sempre que for efetuar uma atualizao, como um comando Replace ou um Delete. Caso lAdiciona = .T., a funo RecLock inclui (com um Append Blank) um registro no arquivo cAlias. Se a operao for bem sucedida, retorna .T. Exemplo // Excluso de Registro // Com lAdiciona = .F. If ! RecLock(SF1,.F.) @ 1,1 Say Registro em uso por outra estao Loop EndIf dbDelete() dbUnLock() Com ExpL2 = .T. // Incluso de Registro RecLock(SF1,.T.)

PROGRAMAO ADVPL 7.10

163 Replace F1_TIPO With cTipo, F1_DOC With cNFiscal,; F1_SERIE With cSerie ,F1_EMISSAO With dDEmissao,; F1_LOJA With cLoja ,F1_FORNECE With Subs(cA100For,1,6) dbUnLock() Aps a atualizao do registro, deve-se executar a funo MsUnlock().

RestArea
Tipo: Processamento Restaura a rea RestArea a partir do array. Sintaxe RestArea(aArray) Parmetros aArray Expresso Array para restaurao Exemplo aArray:=GetArea() RestArea(aArray) Ver tambm Funo GetArea( )

RetASC
Tipo: Processamento Retorna um cdigo de letras quando ultrapassar o nmero mximo de dgitos. Sintaxe RetAsc(cOri,nTam,lAlfa) Parmetros cOri String original a ser convertida. nTam Tamanho mximo para a converso. lAlfa Indica se o retorno deve conter letras (.T.) ou somente nmeros (.F.) Retorna cStr Retorna a String formada com letras ou nmeros. Exemplo // Exemplo de uso da funcao RetAsc: // Suponha a existencia de um campo caracter de tamanho // 2. Usando a funcao RetAsc com o parametro lAlfa ver// dadeiro (.T.) se o numero ultrapassar 99 retornara A0 cCod := StrZero(ProxReg(1,2,1),2) // Se ultrapassar 99 retorna A0 cCod := RetAsc(cCod,2,.T.) __Return(cCod)

RetIndex
Tipo: Processamento Devolve os ndices padres do SIGA. Sintaxe RetIndex(cAlias)

PROGRAMAO ADVPL 7.10

164 Parmetros cAlias Alias do Arquivo Retorna Nmero ndices existentes no SINDEX Comentrios Baseado no SINDEX, abre todos os ndices padres para o arquivo em pauta. Exemplo Select SA1 Index on A1_ACUM to TRAB : SINDEX := RetIndex (SA1)

RollBackSX8
Tipo: Processamento Retorna o nmero obtido pela funo GETSX8NUM no semforo como pendente. Verifique a funo GETSX8NUM para maiores detalhes. Sintaxe RollBackSx8() Exemplo Verifique os exemplos na funo GETSX8NUM.

RptStatus
Tipo: Processamento (Apenas Windows) Executa funo de detalhe do relatrio. Sintaxe RptStatus(bBlock) => RptStatus(bBlock, cTtulo, cMsg) Parmetros bBlock Bloco de cdigo que define a funo a ser executada. cTtulo Ttulo do dilogo de processamento. cMsg Mensagem do dilogo de processamento. Comentrios Pode ser utilizada com os parmetros: RptStatus( { | | Execute(Nome da Funo) } )

SaldoSB2
Tipo: Processamento Esta funo calcula o saldo atual do produto (do arquivo SB2), descontando os valores empenhados, reservados etc. necessrio que o arquivo SB2 esteja posicionado no produto desejado. Sintaxe SaldoSB2() Retorna nSld Retorna o Saldo do produto calculado.

PROGRAMAO ADVPL 7.10

165 Exemplo // Exemplo de uso da funcao SaldoSb2: cProd := Space(15) @ 10,10 Get cProd Picture @! Read dbSelectArea(SB2) dbSeek(cProd) cSld := Transform(SaldoSb2(),@E 9,999,999.99) Alert(Este produto tem um saldo de: +cSld) Return

SetDefault
Tipo: Processamento Habilita os padres definidos pela funo SetPrint. Sintaxe SetDefault (aArray, cAlias) Parmetros aArray Array aReturn, preenchido pelo SetPrint [1] Reservado para Formulrio [2] Reservado para N de Vias [3] Destinatrio [4] Formato => 1-Comprimido 2-Normal [5] Mdia => 1-Disco 2-Impressora [6] Porta ou Arquivo 1-LPT1... 4-COM1... [7] Expresso do Filtro [8] Ordem a ser selecionada [9]..[10]..[n] Campos a Processar (se houver) cAlias Alias do arquivo a ser impresso. Retorna Nil Comentrios Esta funo habilita os padres de relatrio alterados pela funo SetPrint. Exemplo // Define Variveis cString:= SB1 NomeRel:= MATR290 cPerg := MTR290 titulo := RELAO PARA ANLISE DOS ESTOQUES cDesc1 := Este relatrio demonstra a situao de cada item em cDesc2 := relao ao seu saldo , seu empenho , suas entradas previstas cDesc3 := e sua classe ABC. aOrd := { Por Codigo , Por Tipo } Tamanho := G // Envia controle para a funo SETPRINT NomeRel:= SetPrint( cString, NomeRel, cPerg, @titulo, cDesc1, ; cDesc2, cDesc3, .F., aOrd, .F., Tamanho) If LastKey() = 27 .or. nLastKey = 27 RestScreen(3,0,24,79,cSavScr1) Return Endif SetDefault(aReturn,cAlias)

PROGRAMAO ADVPL 7.10

166 If LastKey() = 27 .OR. nLastKey = 27 RestScreen(3,0,24,79,cSavScr1) Return Endif

SetDlg
Tipo: Tela Windows Colocar um ttulo em uma Dialog. Sintaxe SetDlg(oWnd, cText) Parmetros oWnd Objeto da janela cText Novo Texto Exemplo If ( INCLUI ) cCaption := Inclusao de Pedidos ElseIf ( ALTERA ) cCaption := Alteracao de Pedidos EndIf SetDlg( oDlg, cCaption )

SetPrint
Tipo: Impresso Altera os padres de impresso. Sintaxe SetPrint(cAlias, cNomeRel, cPerg, cDesc1, cDesc2, cDesc3, cDesc4, lDic, aOrdem, lComp, cClass)

Parmetros cAlias Alias do Arquivo Principal (se existir) cNomeRel Nome padro do relatrio cPerg Nome do grupo de perguntas cDesc1 ..cDesc4 Descrio do Relatrio lDic Habilita o Dicionrio de Dados
.T. Habilita (s utilizar em conjunto com a funo ImpCadast)

.F. Desabilita aOrdem Array contendo as ordens de indexao do arquivo principal. lComp Habilita a alterao da compresso do relatrio .T. Habilita .F. Desabilita cClass Classificao do Relatrio por Tamanho ( G, M ou P ) P 80 colunas M 132 colunas G 220 colunas Retorna ExpC Nome do arquivo com o relatrio impresso em disco opcionalmente alterado pelo usurio Comentrios

PROGRAMAO ADVPL 7.10

167 Esta funo possibilita a alterao de determinados padres dos relatrios. Ela funciona em conjunto com a funo SetDefault. Exemplo // Define Variveis cString:= SB1 NomeRel:= MATR290 cPerg := MTR290 titulo := RELAO PARA ANLISE DOS ESTOQUES cDesc1 := Este relatrio demonstra a situao de cada item em cDesc2 := relao ao seu saldo , seu empenho , suas entradas previstas cDesc3 := e sua classe ABC. aOrd := { Por Codigo , Por Tipo } Tamanho:= G // Envia controle para a funo SETPRINT NomeRel := SetPrint( cString, NomeRel, cPerg, @titulo, cDesc1,; cDesc2, cDesc3, .F., aOrd, .F., Tamanho ) If LastKey() = 27 .or. nLastKey = 27 RestScreen(3,0,24,79,cSavScr1) Return Endif SetDefault(aReturn,cAlias) If LastKey() = 27 .OR. nLastKey = 27 RestScreen(3,0,24,79,cSavScr1) Return Endif

SetRegua
Tipo: Impresso (DOS/ Windows) Inicializa rgua padro em relatrios. Sintaxe SetRegua(nRegs) Parmetros nRegs Nmero de registros que sero processados. Retorno Nil Exemplo DbSelectArea(SA1) SetRegua(LastRec()) While ( ! Eof() ) @ Li, 001 PSAY SA1->A1_NOME DbSkip() IncRegua() End Do Comentrio Ver tambm incRegra.

SldCliente
Tipo: Processamento Retorna o saldo a receber do cliente em uma determinada data.

PROGRAMAO ADVPL 7.10

168 Sintaxe SldCliente(cCliente,dData,nMoeda,lSaldo) Parmetros cCliente Cdigo do Cliente+Loja dData Data do Movimento a Receber (padro dDataBase) nMoeda Moeda lSaldo Se .T. considera o saldo do SE5 (padro .T.) Exemplo SldCliente(00000101,dDataBase)

SldFornece
Tipo: Processamento Retorna o saldo a pagar do fornecedor em uma data. Sintaxe SldFornece(cFornece,dData,nMoeda,lSaldo) Parmetros cFornece Cdigo do Fornecedor+Loja dData Data do Movimento a Pagar (padro dDataBase) nMoeda Moeda - (padro 1) lSaldo Se .T. considera o saldo do SE5 (padro .T.) Exemplo SldFornece(00000101)

SldPagar
Tipo: Processamento Retorna o saldo a pagar em uma determinada data. Sintaxe SldPagar(dData,nMoeda,lData) Parmetros dData Data do Movimento a Pagar ( padro dDataBase) nMoeda Moeda (padro 1) lData Se .T. At a Data, .F. Somente Data (padro .T.) Exemplo SldPagar(dDataBase,1,.T.)

SldReceber
Tipo: Processamento Retorna o saldo a receber em uma data. Sintaxe SldReceber(dData,nMoeda,lData) Parmetros dData Data do Movimento a Receber. nMoeda Moeda - default 1 lData .T. - at a Data; .F. - somente Data (o padro .T.) Exemplo SldReceber(Data,1,.T.)

PROGRAMAO ADVPL 7.10

169

Somar
Tipo: Processamento Faz o somatrio de um arquivo, retornando o valor acumulado de um campo determinado. Sintaxe
Somar(cAlias, cCond, cCampo)

Parmetros cAlias Alias do arquivo cCond Condio para soma cCampo Campo a ser somado Exemplo Somar(SI1,I1_CLASSE=S ,I1_SALANT)
Caso o usurio no deseje definir nenhuma condio, a ExpC2 deve ser .T..

Tabela
Tipo: Processamento Devolve o contedo da tabela de acordo com a chave. Esta funo usada para a obteno do contedo de uma determinada tabela, na chave especificada. Retorna o contedo, possibilitando inclusive a exibio de um help caso a tabela no exista. Sintaxe Tabela(cTab,cChav,lPrint) Parmetros cTab Nmero da tabela a pesquisar (deve ser informado como caracter). cChav Chave a pesquisar na tabela informada. lPrint Indica se deve (.T.) ou no (.F.) exibir o help ou a chave NOTAB se a tabela no existir. Retorna cRet Contedo da tabela na chave especificada. Retorna nulo caso a tabela no exista ou a chave no seja encontrada. Exemplo // Exemplo de uso da funcao tabela: // Suponha a existencia da tabela 99 (tabela de // vendedor x Comissao): // Chave Conteudo // // V0 10 // V1 2.20 // V3 5 // Pode-se fazer um gatilho que, quando da informacao do // codigo do vendedor no cadastro, sugira o percentual // da tabela acima, de acordo com as duas primeiras po// sicoes do codigo digitado: //Gatilho-Dominio : A3_COD // Cta. Dominio: A3_COMIS

PROGRAMAO ADVPL 7.10

170 // Regra : Val(Tabela(99,Left(M->A3_COD,2)))

TamSX3
Tipo: Processamento Retorna o tamanho de um campo no SX3 (dicionrio de dados). Sintaxe TamSx3(cCampo) Parmetros cCampo Nome do campo. Retorna aTam Array com o tamanho e decimais do campo. Exemplo // Exemplo de uso da funcao TAMSX3 // Array auxiliar: aCampos := { {B1_COD ,C},; {B1_DESC,C},; {B1_QE ,N},; {B1_PRV1,N} } // Cria arquivo de trabalho com o tamanho dos campos // exatamente como na base de dados, evitando erros de ] // Data Width Error: i := 0 aStru := {} For i:=1 To Len(aCampos) cCpo := aCampos[i,1] cTp := aCampos[i,2] aTam := TamSx3(cCpo) aAdd(aStru,{cCpo,cTp,aTam[1],aTam[2]) Next i cArq := CriaTrab(aStru,.T.) // O programa continua. . . Return

Texto
Tipo: Processamento No permite a digitao seguida de mais de um espao em branco, em campo do tipo Caracter. Sintaxe Texto(ExpC) Parmetros ExpC1 Expresso a ser verificada Exemplo Texto()

@ ...TO

PROGRAMAO ADVPL 7.10

171 Tipo: Tela Desenha um box 3d. Sintaxe @ nLInha1,nColuna1 TO nLinha2,nColuna2 <TITLE> cTtulo Parmetros nLinha1 Nmero da linha superior nColuna1 Nmero da coluna superior nLinha2 Nmero da linha inferior nColuna2 Nmero da coluna inferior cTtulo Titulo apresentado na linha superior (opcional) Comentrios A clusula TITLE opcional. Se for omitida, o box no ter ttulo. Exemplo @ 000, 000 TO 430, 500 DIALOG oDlg TITLE Interpretador xBase for Windows @ 060, 005 TO 185, 245 TITLE Exemplos @ 070, 010 BUTTON _Objetos B sicos SIZE 70,20 ACTION Execute(BasicObj) @ 070, 090 BUTTON _Browses SIZE 70,20 ACTION Execute(Browse) @ 130, 170 BUTTON Dlg c/Refresh SIZE 70,20 ACTION Execute(DlgDinam) @ 160, 090 BUTTON SQL SIZE 70,20 ACTION Execute(SqlDemo) @ 192,218 BMPBUTTON TYPE 1 ACTION Close(oDlg) ACTIVATE DIALOG oDlg CENTERED

TM
Tipo: Processamento Devolve a picture de impresso de campos numricos dependendo do espao disponvel. Sintaxe TM(nValor, nEdio, nDec) Parmetros nValor Valor a ser editado nEdio Espao disponvel para edio nDec Nmero de casas decimais Retorna ExpC1 Picture ideal para edio do valor nValor. Comentrios Esta rotina leva em considerao duas variveis: MV_MILHAR Determina se deve haver separao de milhar; MV_CENT Nmero de casas decimais padro da moeda corrente. Para ajustar o valor passado (ExpN1) ao espao disponvel (ExpN2) o programa verifica se pode haver separao de milhar, neste caso, a rotina eliminar tantos pontos decimais quantos sejam necessrios ao ajuste do tamanho. Caso no seja possvel ajustar o valor ao espao dado, ser colocado na picture o caracter de estouro de campo . O programa tambm ajusta um valor ao nmero de decimais (ExpN3), sempre imprimindo a quantidade de decimais passados no parmetro. Exemplo Cabec(Ttulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo) Endif li:=li+1 nSalAnt := nSaldoAtu-nCompras-nRecProd-nRecCons @li,00 Say cTipAnt

PROGRAMAO ADVPL 7.10

172 @li,05 Say nSalAnt Picture TM(nSalAnt, 14) @li,23 Say nCompras Picture TM(nCompras, 17, 3)
Se o contedo do campo nSalAnt for: 3.423.659.234,48 o valor ser impresso como: 3423659.234,48

Vazio
Tipo: Processamento Verifica se o campo est vazio. Sintaxe Vazio(cCampo) Parmetros cCampo Campo a verificar Retorna ExpL1 Valor Lgico de Retorno (.T. ou .F.) Comentrios Retorna .T. se ExpC1 estiver vazio. Exemplo @ 9,10 Get cCodigo Valid !Vazio(cCodigo)

X3Picture
Tipo: Processamento Devolve a picture do campo de acordo com o dicionrio de dados. Sintaxe X3Picture(cCampo) Parmetros cCampo Nome do campo a verificar a picture. Retorna ExpC1 Picture do campo no dicionrio de dados. Comentrios Funo geralmente usada para atribuir aos relatrios a efetiva picture de campos numricos em relatrios. Exemplo : cRel:=SetPrint(cAlias, cPrograma , , @cTitulo, cDesc1, cDesc2, cDesc3 , .T., aOrd ) SetDefault(aReturn, cString) : While !EOF() nLinha:=nLinha+1 @nLinha, 1 Say SB2->B2_QATU Picture X3Picture(B2_QATU) :

XFilial
Tipo: Processamento Retorna a filial utilizada por determinado arquivo. Esta funo utilizada para permitir que pesquisas e consultas em arquivos trabalhem somente com os dados da filial corrente, dependendo de se o arquivo est

PROGRAMAO ADVPL 7.10

173 compartilhado ou no (definio que feita por meio do ambiente Configurador). importante verificar que esta funo no tem por objetivo retornar apenas a filial corrente, mas retorn-la caso o arquivo seja exclusivo. Se o arquivo estiver compartilhado, a funo xFilial retornar dois espaos em branco. Sintaxe xFilial(cAlias) Parmetros cAlias Alias do arquivo desejado. Se no for especificado, o arquivo tratado ser o da rea corrente. Retorna cFilArq Retorna a Filial para o arquivo desejado. Exemplo // Exemplo de uso da funcao xFilial: // Supondo que a filial corrente seja a 01: @ 10,10 Say xFilial(SB1) // A linha acima ira imprimir 01 se o arquivo de // produtos estiver exclusivo. Se estiver compartilhado // imprimira . // Usando em processamentos (Pesquisa e processa // enquanto for a mesma filial): dbSeek(xFilial()+mv_par01) While !EOF() .And. xFilial() == SB1->B1_FILIAL ... Processamento Enddo Return

Prximo Passo
Esperamos que voc tenha conhecido e aprendido melhor sobre os principais recursos da Linguagem de Programao ADVPL. Mantenha esta apostila como roteiro para seu trabalho dirio. Se tiver alguma sugesto para melhoria de nosso material, utilize o nosso e-mail: microsigaeducacao@microsiga.com.br. Teremos satisfao em receb-la e analisaremos a viabilidade de aplic-la ao nosso material. Agora, o prximo passo :

PROGRAMAO ADVPL 7.10

174 Aplicar o contedo apresentado rotina de trabalho de sua empresa! Nmero do Registro: 8111001051700 - APL

PROGRAMAO ADVPL 7.10

Você também pode gostar