Escolar Documentos
Profissional Documentos
Cultura Documentos
ADVPL Completo
ADVPL Completo
Programao em ADVPL
Completo
ESTRUTURA DO TREINAMENTO
MDULO 01: Introduo programao...................................................................................................................... 11
1.
1.1.
1.2.
1.2.1.
1.2.2.
2.
2.1.
2.2.
2.2.1.
2.2.2.
3.1.
4.
4.1.
4.2.
4.3.
4.4.
4.5.
4.5.1.
4.5.2.
4.5.3.
4.5.4.
5.
5.1.1.
5.2.
6.1.
6.1.1.
6.1.2.
6.1.3.
6.2.
6.2.1.
6.2.2.
6.2.3.
6.2.4.
7.
Atribuio de variveis.............................................................................................................................. 38
Operadores da linguagem ADVPL............................................................................................................ 39
Operao de Macro Substituio ............................................................................................................... 44
Funes de manipulao de variveis ....................................................................................................... 45
5.1.
6.
Arrays ............................................................................................................................................ 60
Inicializando arrays ................................................................................................................................... 62
Funes de manipulao de arrays ............................................................................................................ 63
Cpia de arrays .......................................................................................................................................... 65
Funes ................................................................................................................................................................... 73
7.1.
7.2.
8.
Diretivas de compilao.......................................................................................................................................... 83
9.1.
9.2.
9.3.
9.3.1.
9.3.2.
9.3.3.
9.4.
9.4.1.
9.4.2.
9.4.3.
9.4.4.
9.4.5.
9.4.6.
9.4.7.
10.
11.1.
11.2.
11.3.
11.4.
12.
12.1.
12.1.1.
12.1.2.
12.2.
12.3.
12.3.1.
12.3.2.
12.4.
13.
13.1.
13.2.
13.2.1.
13.2.2.
13.2.3.
15.
15.1.
16.
17.
19.
19.1.
20.
20.1.
20.2.
20.3.
20.4.
21.
21.1.
21.2.
22.
22.1.
22.2.
22.2.1.
22.2.2.
22.2.3.
22.3.
22.3.1.
22.3.2.
22.4.
23.
22.4.1.
22.4.2.
22.4.3.
22.4.4.
22.4.5.
22.5.
23.1.
23.2.
23.2.1.
23.2.2.
23.2.3.
24.
25.
25.1.
26.
26.1.
26.2.
26.2.1.
RptStatus() .......................................................................................................................................... 259
SETREGUA() .............................................................................................................................................. 261
INCREGUA() .............................................................................................................................................. 262
Processa() ........................................................................................................................................... 263
26.2.2.
SETPROC() ................................................................................................................................................. 265
INCPROC() ................................................................................................................................................. 265
MsNewProcess(). ............................................................................................................................... 266
26.2.3.
MsAguarde(). ..................................................................................................................................... 268
26.2.4.
MsgRun()............................................................................................................................................ 270
26.2.5.
26.3.
26.3.1.
26.3.2.
26.4.
26.5.
ParamBox().................................................................................................................................. 280
27.1.
27.2.
27.3.
27.3.1.
27.3.2.
27.3.3.
27.3.4.
28.
28.1.
28.2.
28.3.
29.1.
29.1.1.
30.
30.1.
30.1.1.
30.1.2.
30.2.
30.2.1.
MsGetDB() ......................................................................................................................................... 315
MsGetDados() .................................................................................................................................... 319
30.2.2.
MsNewGetDados() ............................................................................................................................. 323
30.2.3.
30.2.3.1. Definindo cores personalizadas para o objeto MsNewGetDados() ............................................... 328
-5ADVPL Completo
30.3.
30.3.1.
30.3.2.
30.3.3.
30.3.4.
32.
33.
33.1.
34.
35.
36.1.
36.1.1.
37.
37.1.
37.1.1.
37.1.2.
37.2.
37.2.1.
MsGetDB() ......................................................................................................................................... 499
MsGetDados() .................................................................................................................................... 503
37.2.2.
MsNewGetDados() ............................................................................................................................. 507
37.2.3.
37.2.3.1. Definindo cores personalizadas para o objeto MsNewGetDados() ............................................... 512
37.3.
37.3.1.
37.3.2.
37.3.3.
37.3.4.
38.
38.1.
38.1.1.
38.2.
38.3.
MsSelect()..................................................................................................................................... 542
39.
39.1.
39.1.1.
Introduo ........................................................................................................................................... 545
Finalidade..................................................................................................................................................... 545
Descrio ..................................................................................................................................................... 546
Pr-Requisitos .............................................................................................................................................. 546
Impresso do relatrio personalizvel ................................................................................................ 547
39.1.2.
39.1.2.1. Parmetros de impresso ............................................................................................................... 547
Impresso ..................................................................................................................................................... 547
Arquivo ........................................................................................................................................................ 547
Spool ............................................................................................................................................................ 548
-7ADVPL Completo
E-mail........................................................................................................................................................... 548
Papel............................................................................................................................................................. 549
Tamanho do papel ........................................................................................................................................ 549
Formato da impresso .................................................................................................................................. 549
Configuraes .............................................................................................................................................. 549
Ttulo ............................................................................................................................................................ 549
Ordem .......................................................................................................................................................... 549
Layout .......................................................................................................................................................... 549
Preview ........................................................................................................................................................ 549
Executar em segundo plano ......................................................................................................................... 550
Personalizao .................................................................................................................................... 550
39.1.3.
39.1.3.1. Editando o layout do relatrio ....................................................................................................... 550
Nova estrutura do relatrio TReport: ........................................................................................................... 551
Definindo a Funo ReportDef() ........................................................................................................ 551
39.1.4.
DEFINE REPORT ....................................................................................................................................... 552
DEFINE SECTION ..................................................................................................................................... 552
DEFINE CELL ............................................................................................................................................ 552
MDULO 08: Aplicaes ADVPL para o ERP ............................................................................................................ 553
40.
40.1.
40.2.
40.3.
40.3.1.
MaWndBrowse com Alias Temporrio gerado por Query ................................................................. 583
Exemplo: MaWndBrowse com Alias Temporrio gerado por Query .......................................................... 584
Banco de dados de interface ............................................................................................................... 595
40.3.2.
Consideraes relevantes sobre as funes TCLink() e TCSetConn()......................................................... 595
Consideraes complementares sobre o conceito de Banco de Dados de Interface..................................... 596
40.4.
41.
41.1.
42.
43.
43.1.
- 10 ADVPL Completo
tcnica
de
encadear
pensamentos
para
atingir
Seqncia Lgica
Estes pensamentos, podem ser descritos como uma seqncia de instrues, que devem ser
seguidas para se cumprir uma determinada tarefa.
- 12 ADVPL Completo
1.2.1.
Estudando algoritmos
Mascar um chiclete
Utilizar um telefone pblico carto
Fritar um ovo
Trocar lmpadas
Descascar batatas
Jogar o jogo da forca
Calcular a mdia de notas
Jogar o jogo da velha contra o algoritmo
Mascar um chiclete
1.
2.
3.
4.
Pegar o chiclete
Retirar o papel
Mastigar
Jogar o papel no lixo
os
quais
foram
Fritar um ovo
1. Pegar frigideira, ovo, leo e sal
2. Colocar leo na frigideira
3. Ascender o fogo
4. Colocar a frigideira no fogo
5. Esperar o leo esquentar
6. Quebrar o ovo na frigideira
7. Jogar a casca no lixo
8. Retirar a frigideira do fogo quando o ovo estiver no ponto
9. Desligar o fogo
10. Colocar sal a gosto
Trocar lmpadas
1.
2.
3.
4.
5.
Descascar batatas
1. Pegar faca, bacia e batatas
2. Colocar gua na bacia
3. Enquanto houver batatas, descascar as batatas
3.1.
Colocar as batatas descascadas na bacia
Jogar o jogo da forca
1. Escolher a palavra
2. Montar o diagrama do jogo
3. Enquanto houver lacunas vazias e o corpo estiver incompleto:
3.1.
Se acertar a letra: escrever na lacuna correspondente
3.2.
Se errar a letra: desenhar uma parte do corpo na forca
Calcular a mdia de notas
1. Enquanto houver notas a serem recebidas:
1.1.
Receber a nota;
2. Some todas as notas recebidas;
3. Divida o total obtido pela quantidade de notas recebidas;
4. Exiba a mdia das notas.
Jogar o jogo da velha contra o algoritmo
1. Enquanto existir um quadrado livre e ningum ganhou ou perdeu o jogo:
1.1.
Espere a jogada do adversrio, continue depois
1.2.
Se centro estiver livre: jogue no centro
1.3.
Seno, se o adversrio possuir 2 quadrados em linha com um quadrado livre,
jogue neste quadrado
1.4.
Seno, se h algum canto livre, jogue neste canto
- 14 ADVPL Completo
1.2.2.
Teste de mesa
Aps desenvolver um algoritmo ele dever sempre ser testado. Este teste chamado de
TESTE DE MESA, que significa seguir as instrues do algoritmo de maneira precisa para
verificar se o procedimento utilizado est correto ou no.
Para avaliar a aplicao do teste de mesa, utilizaremos o algoritmo de calcular a mdia de
notas:
Algoritmo: Calcular a mdia de notas
1. Enquanto houver notas a serem recebidas:
a. Receber a nota;
2. Some todas as notas recebidas;
3. Divida o total obtido pela quantidade de notas recebidas;
4. Exiba a mdia das notas.
Teste de mesa:
1. Para cada nota informada, receber e registrar na tabela abaixo:
ID
Nota
2. Ao trmino das notas, a tabela dever conter todas as notas informadas, como abaixo:
ID
1
2
3
4
5
6
Nota
8.0
7.0
8.0
8.0
7.0
7.0
- 15 ADVPL Completo
2. Estruturas de programao
2.1. Diagrama de bloco
O diagrama de blocos uma forma padronizada e eficaz para representar os passos lgicos de
um determinado processamento.
Com o diagrama podemos definir uma seqncia de smbolos, com significado bem definido,
portanto, sua principal funo a de facilitar a visualizao dos passos de um processamento.
Simbologia
Existem diversos smbolos em um diagrama de bloco. No quadro abaixo esto representados
alguns dos smbolos mais utilizados:
Smbolo
Funo
Indica o incio e o fim de um processamento.
Terminador
Processamento em geral.
Processamento
obtidos
com
um
Exibio
Documento
Indica
um
documento
utilizado
pelo
processamento,
seja
para
entrada
de
informaes ou para exibio dos dados
disponveis aps um processamento.
- 16 ADVPL Completo
- 17 ADVPL Completo
- 18 ADVPL Completo
2.2.1.
Estruturas de deciso
Aes anteriores
...
Verdadeiro
Anlise da
condio
Ao vinculada ao
resultado
verdadeiro
Falso
Ao vinculada ao
resultado falso
Continuao do
fluxo aps a
tomada da
deciso
- 19 ADVPL Completo
Esta estrutura permite ainda que seja executada apenas uma ao, na situao em que a a
anlise da condio resultar em um valor verdadeiro.
Representao 02: IF...ELSE somente com ao para situao verdadeira
Aes anteriores
...
Falso
Anlise da
condio
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Continuao do
fluxo aps a
tomada da
deciso
- 20 ADVPL Completo
DO CASE...CASE
A estrutura DO CASE...ENDCASE (Caso) permite a anlise de diversas condies consecutivas,
para as quais somente a condio a primeira condio verdadeira ser sua ao vinculada
executada.
O recurso de anlise de mltiplas condies necessrio para soluo de problemas mais
complexos, nos quais as possibilidades de soluo superam a mera anlise de um nico
resultado verdadeiro ou falso.
Aes anteriores
...
Falso
Anlise da
condio 1
Verdadeiro
Ao vinculada a
condio 1
Verdadeiro
Ao vinculada a
condio 2
Verdadeiro
Ao vinculada a
condio N
Falso
Anlise da
condio 2
Falso
Anlise da
condio N
Falso
Continuao do
fluxo aps a
tomada da
deciso
- 21 ADVPL Completo
2.2.2.
Estruturas de repetio
Aes anteriores
...
Anlise da
condio
Loop
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Continuao do
fluxo
...
- 22 ADVPL Completo
FOR...TO...NEXT
Nesta estrutura, o conjunto de aes ser executado uma quantidade de vezes definida,
normalmente referenciada como passo.
Para cada passo realizado pela estrutura FOR...TO...NEXT, ser avaliada uma condio que
verificar se foi atingido o nmero de execues previamente definido. Desta forma a
estrutura compreende um controle de nmero de passos executados, o qual incrementado
na anlise da expresso NEXT.
Semelhante a estrutura WHILE...END, a primeira ao somente ser realizada mediante um
resultado verdadeiro na anlise da condio.
Representao: FOR...TO...NEXT
Aes anteriores
...
Anlise da
condio
Falso
Verdadeiro
Ao vinculada ao
resultado
verdadeiro
Incrementa o
contador de
passos
Continuao do
fluxo
...
- 23 ADVPL Completo
(como a criao de uma janela padro) ocasionar uma exceo em tempo de execuo. Estas
rotinas so apenas processos, ou Jobs, executados no Protheus Server. Algumas vezes, a
interface destas rotinas fica a cargo de aplicaes externas, desenvolvidas em outras
linguagens, que so responsveis por iniciar os processos no servidor Protheus atravs dos
meios disponveis de integrao e conectividade no Protheus.
De acordo com a utilizao e com o meio de conectividade utilizado, estas rotinas so
subcategorizadas assim:
Rotinas escritas em ADVPL podem ser iniciadas como processos individuais (sem interface) no
Protheus Server atravs de duas maneiras: Iniciadas por outra rotina ADVPL atravs da
chamada de funes como StartJob() ou CallProc() ou iniciadas automaticamente na
inicializao do Protheus Server (quando propriamente configurado).
Programao de RPC
Programao TelNet
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto
atravs de uma aplicao cliente deste protocolo. O PROTHEUS Server pode emular um
terminal TelNet, atravs da execuo de rotinas escritas em ADVPL. Ou seja, pode-se escrever
rotinas ADVPL cuja interface final ser um terminal TelNet ou um coletor de dados mvel.
- 25 ADVPL Completo
Linhas de Comando
Linhas de comando possuem os comandos ou instrues que sero executadas. Por exemplo:
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Linhas de Comentrio
- 26 ADVPL Completo
Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio. Podese utilizar a palavra NOTE ou dois smbolos da letra "e" comercial (&&) para realizar a funo
do sinal de asterisco. Porm todas estas formas de comentrio de linhas so obsoletas e
existem apenas para compatibilizao com o padro xBase. A melhor maneira de comentar
linhas em ADVPL utilizar duas barras transversais:
// Programa para clculo do total
// Autor: Microsiga Software S.A.
// Data: 2 de outubro de 2001
Outra forma de documentar textos utilizar as barras transversais juntamente com o
asterisco, podendo-se comentar todo um bloco de texto sem precisar comentar linha a linha:
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento
(indicada pelos caracteres */) considerado como comentrio.
Linhas Mistas
O ADVPL tambm permite que existam linhas de comando com comentrio. Isto possvel
adicionando-se as duas barras transversais (//) ao final da linha de comando e adicionando-se
o texto do comentrio:
Local nCnt
Local nSoma := 0 // Inicializa a varivel com zero para a soma
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Tamanho da Linha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no
editor de textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela
considerada para a compilao como uma nica linha de comando.
A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento da tecla
<Enter>. Ou seja, a linha lgica, a linha fsica no arquivo. Porm algumas vezes, por
limitao fsica do editor de texto ou por esttica, pode-se "quebrar" a linha lgica em mais de
uma linha fsica no arquivo texto. Isto efetuado utilizando-se o sinal de ponto-e-vrgula (;).
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
- 27 ADVPL Completo
Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como a
linha torna-se muito grande, pode-se dividi-la em mais de uma linha fsica utilizando o sinal de
ponto-e-vrgula. Se um sinal de ponto-e-vrgula for esquecido nas duas primeiras linhas,
durante a execuo do programa ocorrer um erro, pois a segunda linha fsica ser
considerada como uma segunda linha de comando na compilao. E durante a execuo esta
linha no ter sentido.
rea de Identificao
Esta uma rea que no obrigatria e dedicada a documentao do programa. Quando
existente, contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc.,
e aparece no comeo do programa, antes de qualquer linha de comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao
desejada e escolher a formatao apropriada.
#include protheus.ch
/*
+==========================================+
| Programa: Clculo do Fatorial
|
| Autor : Microsiga Software S.A.
|
| Data : 02 de outubro de 2001
|
+==========================================+
*/
User Function CalcFator()
- 29 ADVPL Completo
// Clculo do fatorial
nFator := GetFator()
// GetFator funo ilustrativa na qual a varivel recebe a informao do usurio.
If nFator <= 0
Alert(Informao invlida)
Return
Endif
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
rea de Encerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e o
resultado da execuo do programa utilizado. Pode-se exibir o resultado armazenado em
uma varivel ou em um arquivo ou simplesmente finalizar, caso a tarefa j tenha sido toda
completada no corpo do programa. nesta rea que se encontra o encerramento do
programa. Todo programa em ADVPL deve sempre terminar com a palavra chave return.
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
- 30 ADVPL Completo
- 31 ADVPL Completo
Array
O Array um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O
ADVPL suporta arrays unidimensionais (vetores) ou multidimensionais (matrizes). Os
elementos de um array so acessados atravs de ndices numricos iniciados em 1,
identificando a linha e coluna para quantas dimenses existirem.
Arrays devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a
memria do servidor.
Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas
em ADVPL que podero ser executadas posteriormente.
- 32 ADVPL Completo
Local
Static
Private
Public
- 33 ADVPL Completo
Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a
funo Filha executada, nVar ainda existe mas no pode ser acessada. Quando a execuo
da funo Pai terminar, a varivel nVar destruda. Qualquer varivel com o mesmo nome no
programa que chamou a funo Pai no afetada.
Variveis de escopo local so criadas automaticamente cada vez que a funo onde forem
declaradas for ativada. Elas continuam a existir e mantm seu valor at o fim da ativao da
funo (ou seja, at que a funo retorne o controle para o cdigo que a executou). Se uma
funo chamada recursivamente (por exemplo, chama a si mesma), cada chamada em
recurso cria um novo conjunto de variveis locais.
A visibilidade de variveis de escopo locais idntica ao escopo de sua declarao, ou seja, a
varivel visvel em qualquer lugar do cdigo fonte em que foi declarada. Se uma funo
chamada recursivamente, apenas as variveis de escopo local criadas na mais recente ativao
so visveis.
Variveis de escopo static
Variveis de escopo static funcionam basicamente como as variveis de escopo local, mas
mantm seu valor atravs da execuo e devem ser declaradas explicitamente no cdigo com
o identificador STATIC.
O escopo das variveis static depende de onde so declaradas. Se forem declaradas dentro do
corpo de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem
declaradas fora do corpo de qualquer rotina, seu escopo afeta a todas as funes declaradas
no fonte.
- 34 ADVPL Completo
Neste exemplo, a varivel nVar declarada como static e inicializada com o valor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente
de variveis declaradas como LOCAL ou PRIVATE, nVar continua a existir e mantm seu valor
atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por
execues subseqentes da funo Pai.
Variveis de escopo private
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com
o identificador PRIVATE.
Adicionalmente, a atribuio de valor a uma varivel no criada anteriormente
automaticamente cria a varivel como privada. Uma vez criada, uma varivel privada continua
a existir e mantm seu valor at que o programa ou funo onde foi criada termine (ou seja,
at que a funo onde foi criada retorne para o cdigo que a executou). Neste momento,
automaticamente destruda.
possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente.
Entretanto, a nova (duplicada) varivel pode apenas ser criada em um nvel de ativao
inferior ao nvel onde a varivel foi declarada pela primeira vez (ou seja, apenas em uma
funo chamada pela funo onde a varivel j havia sido criada). A nova varivel privada ir
esconder qualquer outra varivel privada ou pblica (veja a documentao sobre variveis
pblicas) com o mesmo nome enquanto existir.
Uma vez criada, uma varivel privada visvel em todo o programa enquanto no for
destruda automaticamente quando a rotina que a criou terminar ou uma outra varivel
privada com o mesmo nome for criada em uma subfuno chamada (neste caso, a varivel
existente torna-se inacessvel at que a nova varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as
funes chamadas por esta, a menos que uma funo chamada crie sua prpria varivel
privada com o mesmo nome.
- 35 ADVPL Completo
Por exemplo:
Function Pai()
Private nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar criada com escopo private e inicializada com o valor 10.
Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel de escopo
local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda
e qualquer declarao de nVar anterior se tornar acessvel novamente.
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
Exemplo: Private _dData
Variveis de escopo public
Podem-se criar variveis de escopo public dinamicamente no cdigo com o identificador
PUBLIC. As variveis deste escopo continuam a existir e mantm seu valor at o fim da
execuo da thread (conexo).
possvel criar uma varivel de escopo private com o mesmo nome de uma varivel de escopo
public existente, entretanto, no permitido criar uma varivel de escopo public com o mesmo
nome de uma varivel de escopo private existente.
Uma vez criada, uma varivel de escopo public visvel em todo o programa onde foi
declarada at que seja escondida por uma varivel de escopo private criada com o mesmo
nome. A nova varivel de escopo private criada esconde a varivel de escopo public existente,
e esta se tornar inacessvel at que a nova varivel private seja destruda. Por exemplo:
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
- 36 ADVPL Completo
Neste exemplo, nVar criada como public e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privates,
nVar ainda existe aps o trmino da a execuo da funo Pai.
Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como
pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
Exemplo: Public _cRotina
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:
- 37 ADVPL Completo
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.
Atribuio de variveis
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 caractere 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:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
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.
4.5.2.
Operadores comuns
Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a uma
varivel da forma mais simples. O ADVPL amplia significativamente a utilizao de variveis
atravs do uso de expresses e funes.
Uma expresso um conjunto de operadores e operandos cujo resultado pode ser atribudo a
uma varivel ou ento analisado para a tomada de decises. Por exemplo:
Local nSalario := 1000, nDesconto := 0.10
Local nAumento, nSalLiquido
nAumento := nSalario * 1.20
nSalLiquido := nAumento * (1-nDesconto)
Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps um
aumento. Os operandos de uma expresso podem ser uma varivel, uma constante, um
campo de arquivo ou uma funo.
Operadores Matemticos
Os operadores utilizados em ADVPL para clculos matemticos so:
+
*
/
** ou ^
%
Adio
Subtrao
Multiplicao
Diviso
Exponenciao
Mdulo (Resto da Diviso)
Operadores de String
Os operadores utilizados em ADVPL para tratamento de caracteres so:
+
$
- 39 ADVPL Completo
Operadores Relacionais
Os operadores utilizados em ADVPL para operaes e avaliaes relacionais so:
<
>
=
==
<=
>=
<> ou #
ou !=
Comparao
Comparao
Comparao
Comparao
Comparao
Comparao
Comparao
Menor
Maior
Igual
Exatamente Igual (para caracteres)
Menor ou Igual
Maior ou Igual
Diferente
Operadores Lgicos
Os operadores utilizados em ADVPL para operaes e avaliaes lgicas so:
.And.
.Or.
.Not. ou !
E lgico
OU lgico
NO lgico
Operadores de Atribuio
Os operadores utilizados em ADVPL para atribuio de valores a variveis de memria so:
:=
+=
-=
*=
/=
**=
^=
%=
ou
Atribuio Simples
Adio e Atribuio em Linha
Subtrao e Atribuio em Linha
Multiplicao e Atribuio em Linha
Diviso e Atribuio em Linha
Exponenciao e Atribuio em Linha
Mdulo (resto da diviso) e Atribuio em Linha
Atribuio Simples
Atribuio em Linha
O operador de atribuio em linha caracterizado por dois pontos e o sinal de igualdade. Tem
a mesma funo do sinal de igualdade sozinho, porm aplica a atribuio s variveis. Com ele
pode-se atribuir mais de uma varivel ao mesmo tempo.
nVar1 := nVar2 := nVar3 := 0
- 40 ADVPL Completo
Atribuio Composta
Exemplo
X += Y
X -= Y
X *= Y
X /= Y
X **= Y
X %= Y
Equivalente a
X=X+Y
X=X-Y
X=X*Y
X=X/Y
X = X ** Y
X=X%Y
Operadores de Incremento/Decremento
A linguagem ADVPL possui operadores para realizar incremento ou decremento de variveis.
Entende-se por incremento aumentar o valor de uma varivel numrica em 1 e entende-se por
decremento diminuir o valor da varivel em 1. Os operadores so:
++
--
Incremento Ps ou Pr-fixado
Decremento Ps ou Pr-fixado
- 41 ADVPL Completo
Resulta em 22, pois o operador incremental aumentou o valor da primeira nA antes que seu
valor fosse considerado.
Operadores Especiais
Alm dos operadores comuns, o ADVPL possui alguns outros operadores ou identificadores.
Estas so suas finalidades:
()
[]
{}
->
&
@
||
Agrupamento ou Funo
Elemento de Matriz
Definio de Matriz, Constante ou Bloco de Cdigo
Identificador de Apelido
Macro substituio
Passagem de parmetro por referncia
Passagem de parmetro por valor
O smbolo @ utilizado para indicar que durante a passagem de uma varivel para uma
funo ou procedimento ela seja tomada como uma referncia e no como valor.
O smbolo || utilizado para indicar que durante a passagem de uma varivel para
uma funo ou procedimento ela seja tomada como um e valor no como referncia.
- 42 ADVPL Completo
Operadores
Operadores
Operadores
Operadores
Operadores
Operadores
Operadores
de Incremento/Decremento pr-fixado
de String
Matemticos
Relacionais
Lgicos
de Atribuio
de Incremento/Decremento ps-fixado
Exponenciao
Multiplicao e Diviso
Adio e Subtrao
Considere o exemplo:
Local nResultado := 2+10/2+5*3+2^3
O resultado desta expresso 30, pois primeiramente calculada a exponenciao 2^3(=8),
ento so calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e finalmente as
adies resultando em 2+5+15+8(=30).
Alterao da Precedncia
- 43 ADVPL Completo
4.5.3.
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado para a
avaliao de expresses em tempo de execuo. Funciona como se uma expresso
armazenada fosse compilada em tempo de execuo, antes de ser de fato executada.
Considere o exemplo:
01 X := 10
02 Y := "X + 1"
03 B := &Y // O contedo de B ser 11
A varivel X atribuda com o valor 10, enquanto a varivel Y atribuda com a string de
caracteres contendo "X + 1".
A terceira linha utiliza o operador de macro. Esta linha faz com que o nmero 11 seja atribudo
varivel B. Pode-se perceber que esse o valor resultante da expresso em formato de
caractere contida na varivel Y.
Utilizando-se uma tcnica matemtica elementar, a substituio, temos que na segunda linha,
Y definido como "X + 1", ento pode-se substituir Y na terceira linha:
03 B := &"X + 1"
O operador de macro cancela as aspas:
03 B := X + 1
Pode-se perceber que o operador de macro remove as aspas, o que deixa um pedao de
cdigo para ser executado. Deve-se ter em mente que tudo isso acontece em tempo de
execuo, o que torna tudo muito dinmico. Uma utilizao interessante criar um tipo de
calculadora, ou avaliador de frmulas, que determina o resultado de algo que o usurio digita.
O operador de macro tem uma limitao: variveis referenciadas dentro da string de
caracteres (X nos exemplos anteriores) no podem ser locais.
- 44 ADVPL Completo
4.5.4.
Alm de atribuir, controlar o escopo e macro executar o contedo das variveis necessrio
manipular seu contedo atravs de funes especficas da linguagem para cada situao.
As operaes de manipulao de contedo mais comuns em programao so:
CTOD()
CVALTOCHAR()
DTOC()
DTOS()
STOD()
STR()
STRZERO()
VAL()
CTOD()
Sintaxe
CTOD(cData)
Descrio
CVALTOCHAR()
Sintaxe
CVALTOCHAR(nValor)
Descrio
- 45 ADVPL Completo
DTOC()
Sintaxe
DTOC(dData)
Descrio
DTOS()
Sintaxe
DTOS(dData)
Descrio
STOD()
Sintaxe
STOD(sData)
Descrio
STR()
Sintaxe
STR(nValor)
Descrio
STRZERO()
Sintaxe
STRZERO(nValor, nTamanho)
Descrio
VAL()
Sintaxe
VAL(cValor)
Descrio
Manipulao de strings
As funes mais utilizadas nas operaes de manipulao do contedo de strings so:
ALLTRIM()
ASC()
AT()
CHR()
CSTUFF()
LEN()
RAT()
SUBSTR()
ALLTRIM()
Sintaxe
ALLTRIM(cString)
Retorna uma string sem os espaos direita e esquerda, referente ao
contedo informado como parmetro.
Descrio
ASC()
Sintaxe
ASC(cCaractere)
Descrio
AT()
Sintaxe
AT(cCaractere, cString )
Descrio
- 47 ADVPL Completo
CHR()
Sintaxe
CHR(nASCII)
Descrio
LEN()
Sintaxe
LEN(cString)
Descrio
LOWER()
Sintaxe
LOWER(cString)
Descrio
Retorna uma string com todos os caracteres minsculos, tendo como base a
string passada como parmetro.
RAT()
Sintaxe
RAT(cCaractere, cString)
Descrio
STUFF()
Sintaxe
Descrio
SUBSTR()
Sintaxe
Descrio
- 48 ADVPL Completo
UPPER()
Sintaxe
UPPER(cString)
Descrio
Retorna uma string com todos os caracteres maisculos, tendo como base a
string passada como parmetro.
ABS()
INT()
NOROUND()
ROUND()
ABS()
Sintaxe
ABS(nValor)
Descrio
INT()
Sintaxe
INT(nValor)
Descrio
NOROUND()
Sintaxe
NOROUND(nValor, nCasas)
Descrio
ROUND()
Sintaxe
Descrio
ROUND(nValor, nCasas)
Retorna um valor, arredondando a parte decimal do valor especificado no
parmetro de acordo com a quantidades de casas decimais solicitadas,
utilizando o critrio matemtico.
- 49 ADVPL Completo
TYPE()
VALTYPE()
TYPE()
Sintaxe
TYPE(cVariavel)
Descrio
VALTYPE()
Sintaxe
VALTYPE(cVarivel)
Descrio
- 50 ADVPL Completo
Estruturas de repetio
Estruturas de deciso
Sintaxe
- 51 ADVPL Completo
Parmetros
Varivel
nValorInicial
TO nValorFinal
STEP
nIncremento
Comandos
EXIT
LOOP
Exemplo:
Local nCnt
Local nSomaPar := 0
For nCnt := 0 To 100 Step 2
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
Este exemplo imprime a soma dos 100 primeiros nmeros pares. A soma obtida atravs da
repetio do clculo utilizando a prpria varivel de contador. Como a clusula STEP est
sendo utilizada, a varivel nCnt ser sempre incrementada em 2. E como o contador comea
com 0, seu valor sempre ser um nmero par.
O Comando WHILE...ENDDO
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma seo de
cdigo enquanto uma determinada expresso resultar em verdadeiro (.T.).
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpressao
Comandos
EXIT
LOOP
- 53 ADVPL Completo
Exemplo :
Local nNumber := nAux := 350
nAux := Int(nAux / 2)
While nAux > 0
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
5.1.1.
- 54 ADVPL Completo
EXIT
A instruo EXIT utilizada para forar o trmino de uma estrutura de repetio. Desta forma,
todas as operaes que seriam realizadas dentro da estrutura de repetio aps o EXIT sero
desconsideradas, e o programa ir continuar a execuo a partir da prxima instruo
posterior ao trmino da estrutura (END ou NEXT).
Exemplo:
While .T.
End
MSGINFO(Final de Jogo)
// Enquanto no for respondido No para a pergunta: Deseja jogar o jogo da
// forca, ser executada a funo do jogo da forca.
// Caso seja selecionada a opo No, ser executada a instruo EXIT que
provocar o trmino do LOOP, permitindo a execuo da mensagem de Final de
Jogo.
- 55 ADVPL Completo
Sintaxe
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Parmetros
LExpressao
Comandos
Exemplo:
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
- 56 ADVPL Completo
O Comando IF...ELSEIF...ELSE...ENDIF
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro
(.T.).
Sintaxe
IF lExpressao1
Comandos
[ELSEIF lExpressaoX
Comandos]
[ELSE
Comandos...]
ENDIF
Parmetros
lExpressao1
lExpressaoX
Comandos
- 57 ADVPL Completo
Exemplo:
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
ElseIf Date() == dVencto
Alert("Vencimento na data!")
Else
Alert("Vencimento dentro do prazo!")
Endif
Return
O Comando DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro
(.T.).
Sintaxe
DO CASE
CASE lExpressao1
Comandos
[CASE lExpressao2
Comandos
...
CASE lExpressaoN
Comandos]
[OTHERWISE
Comandos]
ENDCASE
Parmetros
CASE
lExpressao1
Comandos...
OTHERWISE
Comandos
- 58 ADVPL Completo
Exemplo:
Local nMes
:= Month(Date())
Local cPeriodo := ""
DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
- 59 ADVPL Completo
- 60 ADVPL Completo
- 61 ADVPL Completo
6.1.1.
Inicializando arrays
Local
Local
Local
Local
nCnt
aX[10]
aY := Array(10)
aZ := {0,0,0,0,0,0,0,0,0,0}
For nCnt := 1 To 10
aX[nCnt] := nCnt * nCnt
Next nCnt
Este cdigo preenche o array com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ...
81, 100. Note que a linha 07 se refere varivel aX, mas poderia tambm trabalhar com aY ou
aZ.
O objetivo deste exemplo demonstrar trs modos de criar um array de tamanho conhecido
no momento da criao do cdigo.
1.
Na linha 02 o array criada usando aX[10]. Isto indica ao ADVPL para alocar espao
para 10 elementos no array. Os colchetes [ e ] so utilizados para indicar o tamanho
necessrio.
2.
Na linha 03 utilizada a funo array com o parmetro 10 para criar o array, e o
retorno desta funo atribudo varivel aY. Na linha 03 efetuado o que se chama
"desenhar a imagen do array". Como se pode notar, existem dez 0s na lista encerrada entre
chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz de 1000
elementos.
3.
O terceiro mtodo difere dos anteriores porque inicializa a matriz com os valores
definitivos. Nos dois primeiros mtodos, cada posio da matriz contm um valor nulo (Nil) e
deve ser inicializado posteriormente.
4.
A linha 07 demonstra como um valor pode ser atribudo para uma posio existente em
uma matriz especificando o ndice entre colchetes.
- 62 ADVPL Completo
Local
Local
Local
Local
nCnt
aX[0]
aY := Array(0)
aZ := {}
1.
A linha 02 utiliza os colchetes para criar um array vazio. Apesar de no ter nenhum
elemento, seu tipo de dado array.
2.
Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento.
3.
Na linha 04 est declarada a representao de um array vazio em ADVPL. Mais uma
vez, esto sendo utilizadas as chaves para indicar que o tipo de dados da varivel array.
Note que {} um array vazio (tem o tamanho 0), enquanto {Nil} um array com um nico
elemento nulo (tem tamanho 1).
Porque cada uma destes arrays no contm elementos, a linha 07 utiliza a funo AADD() para
adicionar elementos sucessivamente at o tamanho necessrio (especificado por exemplo na
varivel nSize).
6.1.2.
A linguagem ADVPL possui diversas funes que auxiliam na manipulao de arrays, dentre as
quais podemos citar as mais utilizadas:
ARRAY()
AADD()
ACLONE()
ADEL()
ASIZE()
AINS()
ASORT()
ASCAN()
- 63 ADVPL Completo
ARRAY()
Sintaxe
ARRAY(nLinhas, nColunas)
Descrio
AADD()
Sintaxe
AADD(aArray, xItem)
Descrio
ACLONE()
Sintaxe
AADD(aArray)
Descrio
ADEL()
Sintaxe
ADEL(aArray, nPosio)
Descrio
ASIZE()
Sintaxe
ASIZE(aArray, nTamanho)
Descrio
A funo ASIZE permite a redefinio da estrutura de um array prexistente, adicionando ou removendo itens do mesmo.
ASORT()
Sintaxe
Descrio
- 64 ADVPL Completo
ASCAN()
Sintaxe
ASCAN(aArray, bSeek)
Descrio
AINS()
Sintaxe
AINS(aArray, nPosicao)
Descrio
6.1.3.
Cpia de arrays
Conforme comentado anteriormente, um array uma rea na memria, o qual possui uma
estrutura permite que as informaes sejam armazenadas e organizadas das mais diversas
formas.
Com base nesse conceito, o array pode ser considerado apenas como um mapa ou um guia
de como as informaes esto organizadas e de como elas podem ser armazenadas ou
consultadas. Para se copiar um array deve-se levar este conceito em considerao, pois caso
contrrio o resultado esperado no ser o obtido na execuo da cpia.
Para copiar o contedo de uma varivel, utiliza-se o operador de atribuio :=, conforme
abaixo:
nPessoas := 10
nAlunos := nPessoas
- 65 ADVPL Completo
A varivel aPessoas represente uma rea de memria que contm a estrutura de um array
(mapa), no as informaes do array, pois cada informao est em sua prpria rea de
memria.
Desta forma ao atribuir o contedo representado pela varivel aPessoas a varivel aAlunos no
est se copiando as informaes e sim o mapa das reas de memria onde as informaes
esto realmente armazenadas.
- 66 ADVPL Completo
6.2.1.
Primeira premissa
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))
Pode-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 caractere, e em seguida para a
funo alert para a exibio. Por causa desta regra de precedncia possvel atribuir um valor
a mais de uma varivel ao mesmo tempo:
Z := Y := X := 0
Por causa dessa regra, essa expresso avaliada como se fosse escrita assim:
Z := ( Y := (X := 0) )
Apesar de o ADVPL avaliar expresses da esquerda para a direita, no caso de atribuies isso
acontece ao contrrio, da direita para a esquerda. O valor atribudo varivel X, que retorna
- 67 ADVPL Completo
o valor para ser atribudo varivel Y e assim sucessivamente. Pode-se dizer que o zero foi
"propagado atravs da expresso".
Segunda premissa
Em ADVPL pode-se juntar diversas linhas de cdigo em uma nica linha fsica de comando. 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.
6.2.2.
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
@00,00 PSAY y := 20
==>
==>
10
20
Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.
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.
- 68 ADVPL Completo
==>
20
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.
Porm 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}
6.2.3.
Blocos de Cdigo
- 70 ADVPL Completo
- 71 ADVPL Completo
6.2.4.
A linguagem ADVPL possui diversas funes que auxiliam na manipulao de blocos de cdigo,
dentre as quais podemos citar as mais utilizadas:
EVAL()
DBEVAL()
AEVAL()
EVAL()
Sintaxe
Descrio
DBEVAL()
Sintaxe
Descrio
AEVAL()
Sintaxe
Descrio
- 72 ADVPL Completo
7. Funes
A maior parte das rotinas que queremos escrever em programas so compostas de um
conjunto
de
comandos, rotinas
estas
que
se
repetem
ao
longo
de todo o
desenvolvimento. Uma funo nada mais do que um conjunto de comandos que para ser
utilizada basta cham-la pelo seu nome.
Para tornar uma funo mais flexvel, ao cham-la pode-se passar parmetros, o quais contm
os dados e informaes que definem o processamento da funo.
Os parmetros das funes descritas utilizando a linguagem ADVPL so posicionais, ou seja, na
sua passagem no importa o nome da varivel e sim a sua posio dentro da lista de
parmetros, o que permite executar uma funo escrevendo:
Calcula(parA, parB, parC) // Chamada da funo em uma rotina
E a funo estar escrita:
User Function Calcula(x, y, z)
... Comandos da Funo
Return ...
possam desenvolver suas prprias funes sem que as mesmas conflitem com as j
disponveis no ambiente ERP, foi implementada pela Tecnologia Microsiga um tipo especial de
funo denominado User Function.
Nos tpicos a seguir sero detalhados os tipos de funes disponveis na linguagem ADVPL,
suas formas de utilizao e respectivas diferenas.
Function()
User Function()
Static Function()
Main Function()
Function()
Funes ADVPL convencionais, restritas ao desenvolvimento da rea de Inteligncia Protheus
da Microsiga.
O interpretador ADVPL distingue nomes de funes do tipo Function() com at dez caracteres.
A partir do dcimo caracter, apesar do compilador no indicar quaisquer tipos de erros, o
interpretador ignorar os demais caracteres.
Exemplo:
// Fonte MATA100INCL.PRW
#INCLUDE "protheus.ch"
Function MATA100INCL01()
ALERT("01")
Return
Function MATA100INCL02()
ALERT("02")
Return
Ao executar a funo MATA100INCL01() ser exibida a mensagem 01, mas ao executar a
funo MATA100INCL02() tambm ser exibida a mensagem 01, pois o interpretador
considera o nome da funo como MATA100INC.
1. Funes do tipo Function() somente podem ser executadas atravs
dos mdulos do ERP.
2. Somente podero ser compiladas funes do tipo Function() se o MPIDE possuir uma autorizao especial fornecida pela Microsiga.
3. Funes do tipo Function() so acessveis por quaisquer outras
funes em uso pela aplicao.
- 74 ADVPL Completo
User Function()
As User Defined Functions ou funes definidas pelos usurios, so tipos especiais de funes
implementados pelo ADVPL para garantir que desenvolvimentos especficos no realizados pela
Inteligncia Protheus da Microsiga sobreponham as funes padres desenvolvidas para o ERP.
O interpretador ADVPL considera que o nome de uma User Function composto pelo nome
definido para a funo precedido dos caracteres U_. Desta forma a User Function XMAT100I
ser tratada pelo interpretador como U_XMAT100I.
1. Como ocorre o acrscimo dos caracteres U_ no nome da funo e o
interpretador considera apenas os dez primeiros caracteres da funo
para sua diferenciao, recomendado que os nomes das User
Functions tenham apenas oito caracteres para evitar resultados
indesejados durante a execuo da aplicao.
2. Funes do tipo User Function so acessveis por quaisquer outras
funes em uso pela aplicao, desde que em sua chamada sejam
utilizados os caracteres U_ em conjunto com o nome da funo.
As User Functions podem ser executadas a partir da tela inicial do client do
ERP (Microsiga Protheus Remote), mas as aplicaes que pretendem
disponibilizar esta opo devem possuir um preparo adicional de ambiente.
Para maiores informaes consulte no DEM o tpico sobre preparao de
ambiente e a documentao sobre a funo RpcSetEnv().
Static Function()
Funes ADVPL tradicionais, cuja visibilidade est restrita as funes descritas no mesmo
arquivo de cdigo fonte no qual esto definidas.
Exemplo:
//Fonte FINA010.PRW
Function FINA010()
CriaSx1(FIN010)
Return
Static Function CRIASX1()
//Fonte FINA020.PRW
Function FINA020()
CriaSx1(FIN020)
Return
Static Function CRIASX1()
- 75 ADVPL Completo
- 76 ADVPL Completo
Avaliando a funo CalcFator() descrita anteriormente podemos verificar que a mesma recebe
como parmetro para sua execuo a varivel nFator.
Com base nesta funo podemos descrever duas forma de passagem de parmetros por
contedo:
Passagem de contedos diretos
Passagem de variveis como contedos
Exemplo 01 Passagem de contedos diretos
User Function DirFator()
Local nResultado := 0
nResultado := CalcFator(5)
- 77 ADVPL Completo
Function CalcFator(nFator)
...
- 79 ADVPL Completo
Passagem de parmetros por referncia Duas variveis x uma nica rea de memria
- 80 ADVPL Completo
Desta forma a funo chamada tem acesso no apenas ao contedo, mas a varivel em si,
pois a rea de memria a varivel, e qualquer alterao nesta ser visvel a funo
chamadora quando tiver o retorno da funo chamadora.
- 81 ADVPL Completo
Se este tratamento no fosse realizado e com isso o parmetro nFator no fosse informado,
ocorreria o seguinte evento de erro:
Exemplo:
User Function CalcFator(nFator)
Local nCnt
Local nResultado := 0
For nCnt := nFator To 1 Step -1 // nFator est como Nulo, portando nCnt nulo
nResultado *= nCnt
Next nCnt // Ao efetuar o Next, o interpretador realiza a ao nCnt += 1.
Return nResultado
- 82 ADVPL Completo
8. Diretivas de compilao
O compilador ADVPL possui uma funcionalidade denominada pr-processador, o qual nada
mais do que um programa que examina o programa fonte escrito em ADVPL e executa certas
modificaes nele, baseadas nas Diretivas de Compilao.
As diretivas de compilao so comandos que no so compilados, sendo dirigidos ao prprocessador, o qual executado pelo compilador antes da execuo do processo de
compilao propriamente dito.
Portanto, o pr-processador modifica o programa fonte, entregando para o compilador um
programa modificado de acordo com as diretivas de compilao, as so iniciadas pelo caractere
#.
As diretivas podem ser colocadas em qualquer parte do programa, sendo que as
implementadas pela linguagem ADVPL so:
#INCLUDE
#DEFINE
#IFDEF
#IFNDEF
#ELSE
#ENDIF
#COMMAND
Lembre-se
Diretiva: #INCLUDE
A diretiva #INCLUDE indica em que arquivo de extenso CH (padro ADVPL) esto os UDCs
a serem utilizados pelo pr-processador.
A aplicao ERP possui diversos includes, os quais devem ser utilizados segundo a aplicao
que ser desenvolvida, o que permitir a utilizao de recursos adicionais definidos para a
linguagem, implementados pela rea de Tecnologia da Microsiga.
Os includes mais utilizados nas aplicaes ADVPL desenvolvidas para o ERP so:
PROTHEUS.CH: diretivas de compilao padres para a linguagem. Contm a
especificao da maioria das sintaxes utilizadas nos fontes, inclusive permitindo a
compatibilidade da sintaxe tradicional do Clipper para os novos recursos implementados
no ADVPL.
- 83 ADVPL Completo
DIALOG.CH
FONT.CH
INI.CH
PTMENU.CH
PRINT.CH
Fique atento
TCQUERY
CREATE RPCCONN
CLOSE RPCCONN
PREPARE ENVIRONMENT
RESET ENVIRONMENT
OPEN REMOTE TRANSACTION
CLOSE REMOTE TRANSACTION
CALLPROC IN
OPEN REMOTE TABLES
CREATE XMLSTRING
CREATE XMLFILE
SAVE XMLSTRING
SAVE XMLFILE
- 84 ADVPL Completo
o
o
o
ADDITEM TAG
ADDNODE NODE
DELETENODE
Os recursos de tratamentos de e-mails, integrao com a ferramenta
TOPCONNECT (DbAcess), preparao de ambientes e manipulao de
arquivos e strings do padro XML sero abordados no curso de ADVPL
Avanado.
- 85 ADVPL Completo
#IFDEF SPANISH
#DEFINE STR0001 Hola !!!
#ELSE
#IFDEF ENGLISH
#DEFINE STR0001 Hello !!!
#ELSE
#DEFINE STR0001 Ol !!!
#ENDIF
#ENDIF
A aplicao ERP disponibiliza a varivel de escopo PUBLIC __LANGUAGE, a qual contm uma string que identifica o idioma em
uso pelo sistema, cujo os contedos possveis so:
PORTUGUESE
SPANISH
ENGLISH
- 86 ADVPL Completo
Banco de Dados: verifica as variveis AXS e TOP para determinar se o banco de dados
em uso pela aplicao est no formado ISAM (DBF, ADS, CTREE, etc.) ou se est
utilizando a ferramenta TOPCONNECT (DbAcess).
#IFDEF TOP
cQuery := SELECT * FROM +RETSQLNAME(SA1)
dbUseArea(.T., "TOPCONN", TcGenQry(,,cQuery), SA1QRY,.T.,.T.)
#ELSE
DbSelectArea(SA1)
#ENDIF
sintaxe; permite o debug (execuo passo a passo do programa, verificando o contedo das
variveis) e fornece assistentes (modelos) de programas.
- 89 ADVPL Completo
- 90 ADVPL Completo
Ela demonstra tambm que os dados a serem processados podem estar armazenados em
bases ISAM ou em Bancos de Dados padro SQL. No primeiro caso o server comunica- se
diretamente com os dados. Em Bancos SQL a interface TOPCONNECT / DBACCESS que
converte os comandos de entrada e sada, adequando-os ao SQL utilizado (SQl Server
Microsoft, Oracle, DB2, etc.).
Uma vez terminado o processamento do objeto chamado, o ele descartado da memria, ou
seja, o Protheus um sistema que pode crescer de forma ilimitada pois os objetos,
armazenados em um repositrio praticamente no ocupam espao no HD (Hard Disk).
O Protheus uma plataforma multicamada. Entre as diversas camadas, temos a interface de
apresentao ao usurio (Remote), o tratamento dado para as regras de negcio
implementadas (Server), o acesso aos objetos do repositrio (Server), o acesso aos
dados disponveis no Banco de Dados (Server ou TOPCONNECT / DBACCESS ) e ao
gerenciamento de servios WEB (Server). Neste processo, o Protheus possui, basicamente,
quatro aplicativos utilizados com diferentes finalidades:
Protheus Server / TOTVS AppServer: Responsvel pela comunicao entre o cliente,
o banco de dados e o RPO. O nome do executvel depende da verso do sistema
(TOTVSAPPSERVER.EXE) sendo que as plataformas ISAM suportadas pelo Protheus
Server so DBF e CTREE.
Protheus Remote / TOTVS SmartClient: Instalado no Server ou na estao.
nome tambm depende da verso do sistema (TOTVSSMARTCLIENT.EXE).
- 91 ADVPL Completo
- 92 ADVPL Completo
- 93 ADVPL Completo
Para isso, necessrio configurar, ou seja, informar ao Protheus onde est cada uma delas.
Esse tipo de informao consta nos arquivos de parmetros de configurao do sistema
(TOTVSAPPSERVER.INI e TOTVSSMARTCLIENT.INI) existentes nas respectivas pastas
APPSERVER e SMARTCLIENT.
Os parmetros do TOTVSAPPSERVER.INI so lidos pelo programa TOTVSAPPSERVER.EXE logo
no incio de sua execuo. O mesmo procedimento ocorre em relao aos parmetros do
TOTVSSMARTCLIENT.INI pelo programa TOTVSSMARTCLIENT.EXE. A execuo desses dois
programas feita por meio de ao do usurio, facilitada pelos atalhos TOTVS APPSERVER e
TOTVS SMARTCLIENT.
- 94 ADVPL Completo
Destino:
c:\protheus\bin\appserver\totvsappserver.exe
- console
Iniciar em:
c:\protheus\bin\appserver
-Console ou -Debug
Executado como uma JanelaConsole, as informaes recebidas das conexes com o TOTVS
Application Server conectados so exibidas diretamente na tela do console do TOTVS
Application Server, bem como informaes de No Conformidades.
-Install
Se o TOTVS Application Server, no for instalado como um Servio do NT, durante a
Instalao, isto pode ser realizado, executando-o com a opo de Linha de Comando.
-Remove
Para remov-lo da Lista de Servios do NT, pode-se execut-lo com a opo de Linha de
Comando.
Destino:
c:\protheus\bin\smartclient\totvssmartcliente.exe
M
Iniciar em:
c:\protheus\bin\smartclient
-Q (Quiet)
Indica que o TOTVS Smart Client, no dever mostrar o Splash (Imagem de Apresentao) e a
tela de identificao de Parmetros Iniciais, necessita ser acompanhada da (Clusula P).
-P (Main Program)
Identifica o Programa (APO) Inicial.
-E (Environment)
Nome da Seo de Environment, no (Ini do Server), que ser utilizada, para definies gerais.
-C (Connection)
Nome da Seo de Conexo, que ser utilizada, para a conexo ao TOTVS Application Server.
-M (AllowMultiSession)
Permite mltiplas instncias (Cpias) do TOTVS Smart Client, na mesma mquina, o que por
Default no permitido.
- 95 ADVPL Completo
Os parmetros que configuram o local do RPO, o Banco de Dados (ISAM ou SQL), os arquivos
de menus, configuraes e customizaes do sistema no arquivo INI so:
SourcePath: Indica o local de origem dos objetos. o endereo do Repositrio
Objetos (Exemplo: SourcePath=C:\PROTHEUS\APO)
de
RootPath: Aponta para a pasta raiz (inicial), a partir da qual sero localizados os dados
(no caso de ISAM), bem como o prprio Dicionrio de Dados
(Exemplo:
RootPath=C:\PROTHEUS\PROTHEUS_DATA)
StartPath: Indica qual a pasta dentro da pasta raiz (informada no parmetro
RootPath) que contm os arquivos de menus, os arquivos de configuraes e os
arquivos de customizaes
(SXs)
do
sistema
Protheus
(Exemplo:
StartPath=\SYSTEM\).
No h necessidade de que os parmetros estejam em ordem nos arquivos de configurao
(.ini). Alm dos parmetros j detalhados, existem outros que podem indicar a verso do
sistema, o tipo de banco de dados, linguagem do pas em que est sendo utilizado e as
mscaras de edio e formatao.
[ENVIRONMENT]
SOURCEPATHC:\PROTHEUS\APO
ROOTPATH= C:\MP811\PROTHEUS_DATA
STARTPATH=\ PROTHEUS\
RPODB=TOP
RPOLANGUAGE=PORTUGUESE
RPOVERSION=101
LOCALFILES=ADS
TRACE=0
LOCALDBEXTENSION=.DBF
PICTFORMAT=DEFAULT
DATEFORMAT=DEFAULT
[DRIVERS]
ACTIVE=TCP
[TCP]
TYPE=TCPIP
PORT=1234
Figura: Exemplo de um ambiente em um arquivo de parmetros
No exemplo da figura anterior, o rtulo [environment] descreve um conjunto de parmetros
que sero inicializados no sistema. Os rtulos [Drivers] e [TCP] identificam a comunicao que
pode ser estabelecida entre o Protheus Server e o Protheus Remote. Outros ambientes podem
ser configurados no mesmo arquivo (TOTVSAPPSERVER.INI).
J o arquivo de parmetros do Protheus Remote (TOTVSSMARTCLIENT.INI) contm apenas as
configuraes locais, basicamente as informaes necessrias para a inicializao e a
comunicao com o Protheus Server, conforme o exemplo da figura a seguir.
- 96 ADVPL Completo
[CONFIG]
LASTMAINPROG=SIGACFG
LANGUAGE=1
[DRIVERS]
ACTIVE=TCP
[TCP]
SERVER=172.16.72.41
PORT=1234
- 97 ADVPL Completo
Funcionalidades Abordadas
9.3.2.
Descrio
Cadastro de empresas e filiais do sistema
Arquivo de usurios, grupos e senhas do sistema
ndices dos arquivos
Perguntas e respostas
Mapeamento de tabelas
Dicionrio de Dados
Agenda do Schedule de processos
Tabelas
Parmetros
Gatilhos de Interface
Fora de uso
Relacionamentos entre tabelas
Pastas cadastrais apontadas no SX3
Consulta por meio da tecla F3 (Consulta Padro)
Controle do Schedule de processos
Seqncia de documentos (+1)
Seqncia de documentos (Prximo)
Tamanho padro para campos apontado pelo SX3
Resposta de Perguntas (SX1) por usurios
Controle de LOGs por tabela
Histrico de Logs cadastrados no SXO
Cadastro de filtros inteligentes da mbrowse (contm as
informaes necessrias para a criao do filtro).
Cadastro de relacionamento entre programa x filtro
(utilizada internamente pelo Protheus para verificar em
quais programas os filtros podero ser utilizados).
- 98 ADVPL Completo
SXS
SXT
Identificao
ATIVO FIXO
COMPRAS
CONTABILIDADE
ESTOQUE E CUSTOS
FATURAMENTO
FINANCEIRO
LIVROS FISCAIS
PLANEJAMENTO E CONTROLE DA PRODUO
GESTO DE PESSOAL
FATURAMENTO DE SERVIOS
VECULOS
CONTROLE DE LOJAS/AUTOMAO COMERCIAL
CALL CENTER
OFICINAS
PONTO ELETRNICO
EASY IMPORT CONTROL
TERMINAL
MANUTENO DE ATIVOS
RECRUTAMENTO E SELEO DE PESSOAL
INSPEO DE ENTRADA QUALIDADE
METODOLOGIA QUALIDADE
O nome de cada tabela no Protheus constitudo de seis dgitos, os quais so utilizados para
formar a seguinte representao:
F
- 99 ADVPL Completo
Onde:
F
SF
A tabela a seguir demonstra algumas das principais famlias de tabelas utilizadas pela
aplicao ERP Protheus:
Famlia
S
S
S
S
S
S
S
S
S
A
C
C
C
C
D
E
G
J
N
P
Q
R
T
W
Z
G
H
I
N
R
X
Z
T
V
W
-
Descrio
Tabelas pertencentes ao sistema bsico, tambm chamado Classic
Cadastros de entidades compartilhadas entre os ambientes
(Clientes, Fornecedores, Bancos entre outros).
Cadastros dos ambientes de Materiais (Produtos, Saldos entre
outros).
Arquivos de movimentaes diversas utilizados pelos ambientes de
Materiais (Solicitao ao Almoxarifado, Solicitao de Compras,
Pedido de Compras, Pedido de Vendas, Ordens de Produo entre
outros).
Arquivos de movimentaes de estoque (Itens de notas fiscais de
entrada e sada, movimentos internos de estoque entre outros).
Cadastros e movimentaes do ambiente Financeiro.
Cadastros e movimentaes Fiscais (Cabealhos das notas fiscais
de entrada e sada, cadastro de tipos de entrada e sada, livros
fiscais, entre outros).
Cadastros do ambiente de Planejamento e Controle de Produo
Movimentos do ambiente de Planejamento e Controle de Produo
Cadastros e movimentos do ambiente Contbil (descontinuado)
Cadastros e movimentos do ambiente Ativo Fixo
Cadastros e movimentos do ambiente Gesto de Pessoal
Tabelas de configurao do sistema
Tabelas livres para utilizao e projetos especficos em clientes.
Gesto de Projetos
Contabilidade Gerencial
Contabilidade Gerencial
Contabilidade Gerencial
Contabilidade Gerencial
Transportadoras e derivados
Comrcio exterior e derivados
Gesto Hospitalar
Gesto Educacional
Servios Pblicos
Reservado para projetos da fbrica de software
Qualidade e derivados
Recursos Humanos e derivados
Plano de Sade
Workflow
Tabelas livres para utilizao e projetos especficos em clientes em
adio a famlia SZ.
- 100 ADVPL Completo
ndices
Cada tabela do sistema possui seus ndices definidos no arquivo de configurao SIX, o qual
pode ser atualizado atravs do mdulo Configurador.
Os arquivos de ndices das tabelas de sistema sero criados de acordo com o banco de dados
utilizado (ISAM ou conexo via TOPCONNECT).
Para bancos de dados ISAM, ser gerados arquivos com a mesma nomenclatura da tabela de
dados, mas com uma extenso diferenciada (atualmente .CDX). No caso da utilizao de um
banco de dados, cada ndice ser uma numerao seqencial em funo do nome da tabela
original.
As especificaes das chaves de ndices de cada um das tabelas est disponvel no arquivo de
sistema SIX, e a chave nica da tabela utilizada para banco de dados est descrita na tabela
SX2.
Menus
Cada mdulo da aplicao ERP possui um menu padro com todas as funcionalidades
disponveis para o ambiente, menu este definido atravs de sintaxe XML (arquivos .XNU).
Os menus possuem uma estrutura padro que permite ao usurio localizar e identificar
facilmente cada uma das funcionalidades oferecidas pelo ambiente.
9.3.3.
Para executar o mdulo Configurador necessrio que a aplicao Protheus Server esteja em
execuo e atravs da aplicao Protheus Remote dever ser informada como programa inicial
a opo SIGACFG.
Logo aps a sua confirmao do usurio e senha com direito de administrador, ser
apresentada a tela inicial do configurador, conforme mostra a figura a seguir:
9.4.1.
A idia do Dicionrio de Dados permitir que o usurio possa incluir ou inibir campos, ou
mesmo alterar as propriedades dos campos existentes. Pode, ainda, criar novas tabelas. Ou
seja, os programas ao invs de terem os campos definidos em seu cdigo original, lem o
Dicionrio em tempo de execuo, montando arrays com as propriedades de cada um. A partir
da, sua utilizao normal, atravs do uso de funes do ADVPL que tornam o trabalho do
desenvolvedor transparente a esta arquitetura.
O objetivo do Dicionrio de Dados permitir que o prprio usurio crie novas tabelas ou altere
os campos nas tabelas existentes quanto ao seu uso, sua ordem de apresentao, legenda
(nos trs idiomas), validao, help, obrigatoriedade de preenchimento, inicializao etc.
9.4.2.
Procedimento
1. Para adicionar uma tabela ao dicionrio de dados de uma empresa, selecione a opo
Dicionrio de Dados abaixo da empresa que ser atualizada. (rvore de opes da parte
esquerda da interface visual do Gerenciador de Bases de Dados).
2. Aps a seleo da opo Dicionrio de Dados sero exibidas as tabelas j cadastradas
no arquivo de sistema SX2.
). Ao utilizar esta opo ser exibida a tela para definio dos dados
boto Incluir (
referentes nova tabela que ser criada:
).
funcionalidade do mdulo.
9.4.3.
Procedimento
1. Para adicionar um campo a uma tabela do dicionrio de dados de uma empresa,
selecione a opo Dicionrio de Dados abaixo da empresa que ser atualizada. (rvore
de opes da parte esquerda da interface visual do Gerenciador de Bases de Dados).
2. Aps a seleo da opo Dicionrio de Dados sero exibidas as tabelas j cadastradas
no arquivo de sistema SX2.
). Ao utilizar esta
e selecione a tabela que ser atualizada, e utilize o boto Editar (
opo ser exibida a tela de manuteno de campos da tabela selecionada:
). Ao utilizar esta opo ser exibida a tela para definio dos dados
opo Incluir (
referentes ao novo campo que ser criado:
boto Confirmar (
).
).
).
Guia: Campo
O campo Decimal ser solicitado somente para os campos de tipo numrico.
O formato ! indica que o caractere ser sempre maisculo, independente da ao
do usurio. O formato @! indica que essa caracterstica estende-se por todo 20
o
campo.
O contexto real indica que o campo existir efetivamente no banco de dados e o
contexto virtual significa que o campo existir apenas no dicionrio de dados e no
fisicamente.
A propriedade alterar indica que o campo pode ser alterado.
Nesta janela, os dados esto classificados em seis pastas com objetivos de
preenchimento bem especficos:
Guia: Informaes
Contm as informaes a respeito dos ttulos.
Ttulo: a legenda que aparece nas telas/relatrios. H inclusive trs campos para
esta finalidade: em portugus, espanhol e ingls. Esta propriedade pode ser alterada
vontade, pois no interfere em nenhum processamento.
Descrio e Help: So propriedades que objetivam documentar o campo.
Guia: Opes
Contm os dados que facilitam a digitao.
Guia: Validaes
Representam as regras de validao do campo.
Validaes: Nesta propriedade, escreve-se uma funo de validao do campo que
est sendo digitado. Existe um conjunto de funes disponveis no ADVPL apropriadas
para esse caso.
Todas as validaes informadas sero executadas no momento do preenchimento do
prprio campo. Uma validao pode ser uma expresso lgica ou uma funo de
usurio que retorna um valor lgico Verdadeiro ou Falso. O sistema s permitir o
avano para o prximo campo quando o respectivo preenchimento resultar Verdadeiro
seja na expresso ou no retorno da funo.
Guia: Uso
Descreve a forma de utilizao do campo.
Guia: Mdulos
Relaciona todos os mdulos em que o campo ser utilizado.
9.4.4.
Conforme mencionado anteriormente, no ambiente Protheus uma tabela pode ter vrios
ndices, os quais sero gerados de acordo com o banco de dados configurado para o sistema.
Os ndices do sistema auxiliam na seleo e obteno de informaes da base de dados alm
de determinar a ordem de apresentao dos registros de uma tabela em consultas e relatrios.
Procedimento
1. Para adicionar um ndice a uma tabela do dicionrio de dados de uma empresa,
selecione a opo Dicionrio de Dados abaixo da empresa que ser atualizada. (rvore
de opes da parte esquerda da interface visual do Gerenciador de Bases de Dados).
2. Aps a seleo da opo Dicionrio de Dados sero exibidas as tabelas j cadastradas
no arquivo de sistema SX2.
). Ao utilizar esta
e selecione a tabela que ser atualizada, e utilize o boto Editar (
opo ser exibida a tela de manuteno de campos da tabela selecionada:
- 113 ADVPL Completo
Confirmar (
).
).
).
O campo relativo filial sempre faz parte dos ndices, com exceo do SM2, para que
os registros nas tabelas estejam agrupados por filiais, independente desta tabela ser
compartilhada entre as filiais.
Uma tabela poder ter vrios ndices cadastrados no Dicionrio de Dados. Em
determinado momento, porm, apenas um deles oferecer acesso ao registro. Essa
ordem pode ser alterada em tempo de execuo pelos programas da aplicao, atravs
do comando DBSetOrder(), ou atravs da definio de uma ordem especfica na
utilizao de queries para acesso as dados diretamente em bancos de dados de
ambientes TOPCONNECT (DbAcess).
9.4.5.
Procedimento
1. Para adicionar um gatilho a um campo de uma tabela do dicionrio de dados de uma
empresa, selecione a opo Gatilho abaixo da empresa que ser atualizada. (rvore de
opes da parte esquerda da interface visual do Gerenciador de Bases de Dados).
2. Aps a seleo da opo Gatilhos sero exibidos os itens j cadastradas no arquivo de
sistema SX7.
o boto Incluir (
Confirmar (
).
Pode haver vrios gatilhos para o mesmo campo. A ordem de execuo determinada
pelo campo Seqncia.
Os tipos do Gatilho Primrio, Estrangeiro e de Posicionamento definem se o Contra
Domnio um campo da mesma tabela, de outra tabela ou se o gatilho deve realizar
um posicionamento, respectivamente.
A regra pode ser uma expresso que resulta em um valor a ser preenchido no Contra
Domnio.
O posicionamento igual a Sim indica que ser executado um comando de busca do
registro de acordo com a chave indicada.
O Alias, a Ordem e a Chave descrevem a tabela envolvida no gatilho, seu ndice e a
chave para que a funcionalidade se posicione no registro adequado.
9.4.6.
Procedimento
1. Para adicionar uma tabela genrica, selecione os menus Ambiente, Cadastros, Tabelas.
2. Aps a seleo da opo Tabelas sero exibidos os itens j cadastradas no arquivo de
sistema SX5.
boto Incluir (
Confirmar (
9.4.7.
).
Criao de Parmetros
Procedimento
1. Para adicionar um Parmetro, selecione os menus Ambiente, Cadastros, Parmetros.
2. Aps a seleo da opo Tabelas sero exibidos os itens j cadastradas no arquivo de
sistema SX6.
boto Confirmar (
).
10.
A ferramenta TOTVS Development Studio um programa que faz parte do Protheus e permite
o trabalho de edio, compilao e depurao de programas escritos em ADVPL.
Projeto
Um programa para ser compilado deve ser vinculado a um projeto. Normalmente, programas
que fazem parte de um determinado mdulo ou ambiente esto em um mesmo projeto.
A vinculao dos programas a um projeto feita por meio dos arquivos do tipo PRW. Na
verdade, um projeto pode ser constitudo de um ou mais arquivos deste tipo, que por sua vez,
podem ter uma ou mais funes, conforme ilustra o diagrama a seguir:
Compilao
Uma vez adicionado a um projeto e compilado sem incidncias de erros de cdigo, o objeto
resultante ser cadastrado no RPO (Repositrio de Objetos) e poder ser utilizado pela
aplicao ERP.
A compilao dos itens de um projeto pode ser realizada individualmente, por grupo de fontes
(pastas) ou ainda selecionando-o inteiramente. Cada uma dos fontes ser processado e
compilado separadamente, permitindo a visualizao do progresso da operao e das
mensagens de aviso (warnings) ou erros (critical errors) na guia Mensagens.
Execuo
Para que os objetos compilados e disponveis n RPO sejam utilizados, devem ser observadas as
seguintes regras:
Se o programa no manipula arquivos, pode-se cham-lo diretamente do DEV-Studio
(nome no lado direito da barra de ferramentas);
Se o programa manipula tabelas existem duas opes:
Adicionar o programa no menu de um dos ambientes e executa-lo atravs do
Remote.
Realizar a preparao do ambiente na prpria rotina, permitindo sua execuo
diretamente pelo DEV-Studio.
No se pode compilar um programa com o Remote e o Monitor abertos, tenha este
finalizado ou no por erro.
Anlise e depurao de erros
Para identificar as causas de erros, a ferramenta DEV-Studio possui diversos recursos que
auxiliam o DEBUG.
A ao de DEBUG necessita que o programa seja executado a partir do DEV-Studio, sendo
necessrio observar as seguintes regras:
Definir e marcar os pontos de parada mais adequados a anlise do fonte;
Executar a rotina atravs do DEV-Studio, selecionando seu nome diretamente, ou o
mdulo que contm a opo ou a ao que ir execut-la;
A partir do momento em que o DEV-Studio pausar o processamento em um dos pontos
de parada especificados previamente podem ser utilizadas as janelas de visualizao
disponveis no DEV-Studio, que so:
Variveis Locais
Variveis Privates
Variveis Publics
Variveis Statics
Janela da Watchs
Janela de Tabelas e Campos
Pilha de Chamadas
Atravs da Janela de Watchs possvel determinar quais variveis devem ser exibidas;
- 122 ADVPL Completo
11.1.
Como a aplicao ERP pode ser configurada para utilizar diferentes tipos de bases de dados
importante mencionar as principais diferenas entre estes recursos, o que pode determinar a
forma como o desenvolvedor ir optar por escrever sua aplicao.
Acesso a dados e ndices
No acesso a informaes em bases de dados do padro ISAM so sempre lidos os registros
inteiros, enquanto no SQL pode-se ler apenas os campos necessrios naquele processamento.
O acesso direto feito atravs de ndices que so tabelas paralelas s tabelas de dados e que
contm a chave e o endereo do registro, de forma anloga ao ndice de um livro. Para cada
chave, criado um ndice prprio.
Nas bases de dados padro ISAM os ndices so armazenados em um nico arquivo do tipo
CDX, j nos bancos de dados padro SQL cada ndice criado com uma numerao seqencial
tendo como base o nome da tabela ao qual ele est relacionado.
A cada incluso ou alterao de um registro todos os ndices so atualizados, tornando
necessrio planejar adequadamente quais e quantos ndices sero definidos para uma tabela,
pois uma quantidade excessiva pode comprometer o desempenho destas operaes.
Deve ser considerada a possibilidade de utilizao de ndices temporrios para processos
especficos, os quais sero criados em tempo de execuo da rotina. Este fator deve levar em
considerao o esforo do ambiente a cada execuo da rotina e a periodicidade com a qual
executada.
Estrutura dos registros (informaes)
Nas bases de dados padro ISAM, cada registro possui um identificador nativo ou ID
seqencial e ascendente que funciona como o endereo base daquela informao.
Este ID, mas conhecido como RECNO ou RECNUMBER gerado no momento de incluso do
registro na tabela e somente ser alterado caso a estrutura dos dados desta tabela sofra
alguma manuteno. Dentre as manutenes que uma tabela de dados ISAM pode sofrer
pode-se citar a utilizao do comando PACK, o qual ir apagar fisicamente os registros
deletados da tabela forando uma renumerao dos identificadores de todos os registros. Esta
situao tambm torna necessria a recriao de todos os ndices vinculados quela tabela.
Isto ocorre nas bases de dados ISAM devido ao conceito de excluso lgica de registros que as
mesmas possuem. J os bancos de dados padro SQL nativamente utilizam apenas o conceito
de excluso fsica de registros, o que para outras aplicaes seria transparente, mas no o
caso do ERP Protheus.
Para manter a compatibilidade das aplicaes desenvolvidas para bases de dados padro
ISAM, a rea de Tecnologia e Banco de Dados da Microsiga implementou nos bancos de dados
padro SQL o conceito de excluso lgica de registros existente nas bases de dados ISAM
atravs da criao de campos de controle especficos: R_E_C_N_O_, D_E_L_E_T_ e
R_E_C_D_E_L.
Estes campos permitem que a aplicao ERP gerencie as informaes do banco de dados da
mesma forma que as informaes em bases de dados ISAM.
Com isso o campo R_E_C_N_O_ ser um identificador nico do registro dentro da tabela,
funcionando como o ID ou RECNUMBER de uma tabela ISAM, mas utilizando um recurso
adicional disponvel nos bancos de dados relacionais conhecido com Chave Primria.
Para a aplicao ERP Protheus o campo de controle R_E_C_N_O_ definido em todas as
tabelas como sendo sua chave primria, o que transfere o controle de sua numerao
seqencial ao banco de dados.
O campo D_E_L_E_T_ tratado internamente pela aplicao ERP como um flag ou marca de
excluso. Desta forma os registros que estiverem com este campo marcado sero
considerados como excludos logicamente. A execuo do comando PACK em uma tabela de
um banco de dados padro SQL visa excluir fisicamente os registros com o campo D_E_L_E_T_
marcado, mas no causar o efeito de renumerao de RECNO (no caso R_E_C_N_O_) que
ocorre nas tabela de bases de dados ISAM.
11.2.
SELECT()
DBSELECTAREA()
DBSETORDER()
DBSEEK() E MSSEEK()
DBSKIP()
DBGOTO()
DBGOTOP()
DBGOBOTTON()
DBSETFILTER()
RECLOCK()
SOFTLOCK()
MSUNLOCK()
DBDELETE()
DBUSEAREA()
DBCLOSEAREA()
- 126 ADVPL Completo
DBRLOCK()
Sintaxe
Descrio
DBRLOCK(xIdentificador)
Funo de base de dados, que efetua o lock (travamento) do registro
identificado pelo parmetro xIdentificador. Este parmetro pode ser o
Recno() para tabelas em formado ISAM, ou a chave primria para bancos de
dados relacionais.
Se o parmetro xIdentificador no for especificado, todos os locks da rea de
trabalho sero liberados, e o registro posicionado ser travado e adicionado
em uma lista de registros bloqueados.
DBCLOSEAREA()
Sintaxe
DbCloseArea()
Descrio
Permite que um alias presente na conexo seja fechado, o que viabiliza seu
reuso em outro operao. Este comando tem efeito apenas no alias ativo na
conexo, sendo necessria sua utilizao em conjunto com o comando
DbSelectArea().
DBCOMMIT()
Sintaxe
DBCOMMIT()
Descrio
DBCOMMITALL()
Sintaxe
DBCOMMITALL()
Descrio
DBDELETE()
Sintaxe
DbDelete()
Descrio
DBGOTO()
Sintaxe
DbGoto(nRecno)
Descrio
DBGOTOP()
Sintaxe
DbGoTop()
Descrio
DBGOBOTTON()
Sintaxe
DbGoBotton()
Descrio
DBRLOCKLIST()
Sintaxe
DBRLOCKLIST()
Descrio
DBSEEK() E MSSEEK()
Sintaxe
Descrio
DBSKIP()
Sintaxe
DbSkip(nRegistros)
Descrio
DBSELECTAREA()
Sintaxe
DbSelectArea(nArea | cArea)
Descrio
DBSETFILTER()
Sintaxe
DbSetFilter(bCondicao, cCondicao)
Descrio
Define um filtro para a rea de trabalho ativa, o qual pode ser descrito na
forma de um bloco de cdigo ou atravs de uma expresso simples.
DBSETORDER()
Sintaxe
DbSetOrder(nOrdem)
Descrio
Define qual ndice ser utilizada pela rea de trabalho ativa, ou seja, pela
rea previamente selecionada atravs do comando DbSelectArea(). As
ordens disponveis no ambiente Protheus so aquelas definidas no SINDEX
/SIX, ou as ordens disponibilizadas por meio de ndices temporrios.
DBORDERNICKNAME()
Sintaxe
DbOrderNickName(NickName)
Descrio
Define qual ndice criado pelo usurio seja utilizado. O usurio pode incluir os
seus prprios ndices e no momento da incluso deve criar o NICKNAME para
o mesmo.
DBUNLOCK()
Sintaxe
Descrio
DBUNLOCK()
Mesma funcionalidade da funo UNLOCK(), s que recomendada para
ambientes de rede nos quais os arquivos so compartilhados.
Libera o travamento do registro posicionado na rea de trabalho ativa e
confirma as atualizaes efetuadas naquele registro.
DBUNLOCKALL()
Sintaxe
DBUNLOCKALL()
Descrio
DBUSEAREA()
Sintaxe
Descrio
DbUseArea(lNovo,
cDriver,
cArquivo,
cAlias,
lComparilhado,;
lSoLeitura)
Define um arquivo de base de dados como uma rea de trabalho disponvel
na aplicao.
MSUNLOCK()
Sintaxe
MsUnLock()
Descrio
posicionado
confirmando
as
RECLOCK()
Sintaxe
RecLock(cAlias,lInclui)
Descrio
RLOCK()
Sintaxe
RLOCK() lSucesso
Descrio
SELECT()
Sintaxe
Descrio
Select(cArea)
Determina o nmero de referncia de um determinado alias em um
ambiente de trabalho. Caso o alias especificado no esteja em uso no
ambiente, ser retornado o valor 0 (zero).
SOFTLOCK()
Sintaxe
SoftLock(cAlias)
Permite a reserva do registro posicionado na rea de trabalho ativa de forma
que outras operaes, com exceo da atual, no possam atualizar este
registro. Difere da funo RecLock() pois no gera uma obrigao de
atualizao, e pode ser sucedido por ele.
Descrio
UNLOCK()
Sintaxe
UNLOCK()
Descrio
11.3.
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou de uma
tabela aberta no momento. Neste caso, o ADVPL privilegiar o campo, de forma que uma
referncia a um nome que identifique tanto uma varivel como um campo, resultar no
contedo do campo.
Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de
identificao de apelido (->) e um dos dois identificadores de referncia, MEMVAR ou FIELD.
cRes := MEMVAR->NOME
Esta linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da
varivel de memria chamada NOME.
cRes := FIELD->NOME
Neste caso, o valor atribudo varivel cRes ser o valor do campo NOME existente no arquivo
ou tabela aberto na rea atual.
O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela aberto, para
evitar a necessidade de selecionar a rea antes de acessar o contedo de terminado campo.
cRes := CLIENTES->NOME
As tabelas de dados utilizadas pela aplicao ERP recebem automaticamente do sistema o
apelido ou ALIAS especificado para as mesmas no arquivo de sistema SX2. Assim se o campo
NOME pertence a uma tabela da aplicao PROTHEUS, o mesmo poder ser referenciado com a
indicao do ALIAS pr-definido desta tabela.
cRes := SA1->NOME // SA1 Cadastro de Clientes
11.4.
GETSXENUM()
CONFIRMSXE()
ROLLBACKSXE()
GETSXENUM()
Sintaxe
Descrio
CONFIRMSXE()
Sintaxe
CONFIRMSXE(lVerifica)
Descrio
ROLLBACKSXE()
Sintaxe
ROLLBACKSXE()
Descrio
12.
Neste tpico sero abordas as formas pelas quais a aplicao ERP Protheus pode ser
customizada com a utilizao da linguagem ADVPL.
Pelos recursos de configurao da aplicao ERP disponveis no mdulo Configurador possvel
implementar as seguintes customizaes:
12.1.
12.1.1.
VAZIO()
NAOVAZIO()
EXISTCPO()
EXISTCHAV()
PERTENCE()
POSITIVO()
NEGATIVO()
TEXTO()
EXISTCHAV()
Sintaxe
Descrio
EXISTCPO()
Sintaxe
Descrio
NAOVAZIO()
Sintaxe
NaoVazio()
Descrio
NEGATIVO()
Sintaxe
Negativo()
Descrio
PERTENCE()
Sintaxe
Pertence(cString)
Descrio
POSITIVO()
Sintaxe
Positivo()
Descrio
TEXTO()
Sintaxe
Texto()
Descrio
VAZIO()
Sintaxe
Vazio()
Descrio
12.1.2.
Funcionalidade
Permite apenas caracteres alfabticos.
Exibe CR depois de nmeros positivos.
Exibe numrico com o ponto e vrgula invertidos (formato Europeu).
Insere caracteres diferentes dos caracteres de template na exibio, mas no os
insere na varivel do GET.
Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro
que identifica o tamanho da regio.
Exibe DB depois de nmeros negativos.
Exibe zeros como brancos.
Exibe nmeros negativos entre parnteses com os espaos em branco iniciais.
Exibe nmeros negativos entre parnteses sem os espaos em branco iniciais.
Converte caracteres alfabticos para maisculo.
Templates
Contedo Funcionalidade
X
Permite qualquer caractere.
9
Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para
numricos.
#
Permite dgitos, sinais e espaos em branco para qualquer tipo de dado.
!
Converte caracteres alfabticos para maisculo.
*
Exibe um asterisco no lugar dos espaos em branco iniciais em nmeros.
.
Exibe o ponto decimal.
,
Exibe a posio do milhar.
Exemplo 01 Picture campo numrico
CT2_VALOR Numrico 17,2
Picture: @E 99,999,999,999,999.99
SAY e PSAY
Funes
Contedo
C
E
R
X
Z
(
!
Funcionalidade
Exibe CR depois de nmeros positivos
Exibe numrico com o ponto e a vrgula invertidos (formato Europeu)
Insere caracteres diferentes dos caracteres de template
Exibe DB depois de nmeros negativos
Exibe zeros como brancos
Envolve nmeros negativos entre parnteses
Converte todos os caracteres alfabticos para maisculo
Templates
Contedo
X
9
#
!
*
.
,
Funcionalidade
Exibe dgitos para qualquer tipo de dado
Exibe dgitos para qualquer tipo de dado
Exibe dgitos para qualquer tipo de dado
Converte caracteres alfabticos para maisculo
Exibe asterisco no lugar de espaos em branco inicias em nmeros
Exibe a posio do ponto decimal
Exibe a posio do milhar
12.2.
A aplicao ERP utiliza o recurso de gatilhos em campo com a finalidade de auxiliar o usurio
no preenchimento de informaes durante a digitao de informaes. As funes que podem
ser utilizadas no gatilho esto diretamente relacionadas a definio da expresso de retorno
que ser executada na avaliao do gatilho do campo.
As regras que devem ser observadas na montagem de um gatilho e configurao de seu
retorno so:
Na definio da chave de busca do gatilho deve ser avaliada qual filial dever ser
utilizada como parte da chave: a filial da tabela de origem do gatilho ou a filial da
tabela que ser consultada. O que normalmente determina a filial que ser utilizada
como parte da chave justamente a informao que ser consultada, aonde:
o
de
de
de
de
Na definio da regra de retorno deve ser considerado o tipo do campo que ser
atualizado, pois este campo que determina qual tipo do retorno ser considerado
vlido para o gatilho.
12.3.
o
o
o
12.3.1.
GETMV()
SUPERGETMV()
GETNEWPAR()
PUTMV()
GETMV()
Sintaxe
GETMV(cParametro)
Descrio
GETNEWPAR()
Sintaxe
Descrio
PUTMV()
Sintaxe
PUTMV(cParametro, cConteudo)
Descrio
SUPERGETMV()
Sintaxe
Descrio
12.3.2.
12.4.
Conceitos
Um ponto de entrada uma User Function desenvolvida com a finalidade de interagir com uma
rotina padro da aplicao ERP.
A User Function dever ter um nome pr-estabelecido no desenvolvimento da rotina padro do
ERP, e de acordo esta pr-disposio e o momento no qual o ponto de entrada executado
durante um processamento, ele poder:
Complementar uma validao realizada pela aplicao;
Complementar as atualizaes realizadas pelo processamento em tabelas padres do
ERP;
Implementar a atualizao de tabelas especificas durante o processamento de uma
rotina padro do ERP;
Executar uma ao sem processos de atualizaes, mas que necessite utilizar as
informaes atuais do ambiente durante o processamento da rotina padro para
determinar as caractersticas do processo;
Substituir um processamento padro do sistema por uma regra especfica do cliente no
qual o mesmo ser implementado.
Premissas e Regras
Um ponto de entrada no deve ser utilizado para outras finalidades seno para as quais
o mesmo foi pr-definido, sob pena de causar a perda da integridade das informaes
da base de dados ou provocar eventos de erro durante a execuo da rotina padro.
Um ponto de entrada deve ser transparente para o processo padro, de forma que
todas as tabelas acessadas pelo ponto de entrada e que sejam utilizadas pela rotina
padro, devero ter sua situao imediatamente anterior execuo do ponto
restaurada ao trmino do mesmo, e para isto recomenda-se o uso das funes
GETAREA() e RESTAREA().
Como um ponto de entrada no executado da forma tradicional, ou seja, ele no
chamado como uma funo, ele no recebe parmetros. A aplicao ERP disponibiliza
uma varivel de sistema denominada PARAMIXB, a qual recebe os parmetros da
funo chamadora e os disponibiliza para serem utilizados pela rotina customizada.
A varivel PARAMIXB no possui um padro de definio nos cdigos fontes da
aplicao ERP, desta forma seu tipo pode variar deste um contedo simples (caractere,
numrico, lgico e etc.) a um tipo complexo como um array ou um objeto. Desta forma
necessrio sempre avaliar a documentao sobre o ponto bem como proteger a
funo customizada de tipos de PARAMIXB no tratados por ela.
13.
Interfaces visuais
A linguagem ADVPL possui duas formas distintas para definio de interfaces visuais no
ambiente ERP: sintaxe convencional, nos padres da linguagem CLIPPER e a sintaxe orientada
a objetos.
Alm das diferentes sintaxes disponveis para definio das interfaces visuais o ERP Protheus
possui funcionalidades pr-definidas, as quais j contm todos os tratamentos necessrios a
atender as necessidades bsicas de acesso e manuteno das informaes do sistema.
Neste tpico sero abordadas as sintaxes convencionais para definio das interfaces visuais
da linguagem ADVPL e as interfaces de manuteno disponveis no ambiente ERP Protheus.
13.1.
Os componentes da interface visual que sero tratados neste tpico, utilizando a sintaxe
ADVPL so:
MSDIALOG()
MSGET()
SAY()
BUTTON()
SBUTTON()
BUTTON()
Sintaxe
Descrio
MSDIALOG()
Sintaxe
Descrio
MSGET()
Sintaxe
Descrio
SAY()
Sintaxe
Descrio
SBUTTON()
Sintaxe
Descrio
13.2.
13.2.1.
AxCadastro()
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros
cAlias
cTitulo
Ttulo da Janela
cVldExc
cVldAlt
Exemplo:
#include "protheus.ch"
User Function XCadSA2()
Local
Local
Local
Local
cAlias := "SA2"
cTitulo := "Cadastro de Fornecedores"
cVldExc := ".T."
cVldAlt := ".T."
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return
13.2.2.
MBrowse()
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros
nLin1, nCol1,
nLin2, nCol2
cAlias
cCadastro
AADD(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0,2})
AADD(aRotina,{"Incluir"
,"AxInclui" ,0,3})
AADD(aRotina,{"Alterar"
,"AxAltera",0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta",0,5})
Exemplo:
#include "protheus.ch"
User Function MBrwSA2()
Local cAlias := "SA2"
Private cCadastro := "Cadastro de Fornecedores"
Private aRotina
:= {}
AADD(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0,2})
AADD(aRotina,{"Incluir"
,"AxInclui",0,3})
AADD(aRotina,{"Alterar"
,"AxAltera",0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta",0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return
Pesquisar
Visualizar
Incluir
Alterar
Excluir
Livre
13.2.3.
AxFunctions()
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
AXALTERA()
Sintaxe
Descrio
AXDELETA()
Sintaxe
Descrio
AXINCLUI()
Sintaxe
Descrio
AXPESQUI()
Sintaxe
AXPESQUI()
Descrio
AXVISUAL()
Sintaxe
Descrio
APNDICES
BOAS PRTICAS DE PROGRAMAO
14.
Utilizao de Identao
obrigatria a utilizao da identao, pois torna o cdigo muito mais legvel. Veja os
exemplos abaixo:
A utilizao da identao seguindo as estruturas de controle de fluxo (while, if, caso etc) torna
a compreenso do cdigo muito mais fcil:
Para identar o cdigo utilize a tecla <TAB> e na ferramenta DEV-Studio, a qual pode ser
configurada atravs da opo Preferncias:
15.
Capitulao de Palavras-Chave
15.1.
Palavras em maisculo
16.
Tipo de dado
Array
Bloco de cdigo
Caracter
Data
Lgico
Numrico
Objeto
Indefinido
Exemplo
aValores
bSeek
cNome
dDataBase
lContinua
nValor
oMainWindow
xConteudo
17.
Palavras reservadas
AADD
ABS
ASC
AT
BOF
BREAK
ENDIF
LTRIM
SPACE
CTOD
FILE
PCOUNT
TRANSFORM
DOW
IIF
CATCH
DTOS
ELSE
ELSEIF
EMPTY
ENDCASE
ENDDO
LOWER
SETPOS
COL
FIELDNAME
PCOL
TIME
DEVPOS
IF
RECNO
THROW
INKEY
INT
LASTREC
LEN
LOCK
LOG
SELECT
CMONTH
FCOUNT
MONTH
SUBSTR
DELETED
FUNCTION
RECCOUNT
UPPER
Palavras reservadas no
procedimentos ou funes;
REPLICATE
RLOCK
ROUND
ROW
RTRIM
SECONDS
CHR
EXP
MIN
STR
DAY
FOUND
PROW
TYPE
TRY
podem
ser
VAL
VALTYPE
WHILE
WORD
YEAR
CDOW
EOF
MAX
SQRT
DATE
FLOCK
PROCEDURE
TRIM
DTOC
AS
utilizadas
para
variveis,
LISTAS DE EXERCCIOS
Mdulo 01: Introduo programao
01
02
01
02
03
04
05
06
07
08
09
Desenvolver uma rotina que capture vrios CNPJs de clientes informados pelo
usurio, e verifique para cada um deles se o mesmo existe ou no na base de
dados. Ao final informar quais CNPJs foram informados, e de acordo com a
seleo do usurio, exibir os dados principais de um destes clientes.
10
11
01
02
03
04
05
06
A linguagem ADVPL
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, era necessrio criar uma linguagem que
suportasse o padro xBase para a manuteno de todo o cdigo existente do sistema de ERP
Siga Advanced. Foi ento criada a linguagem chamada Advanced 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 (de Advanced Protheus Objects). Tais APOs so mantidos em um
repositrio e carregados dinamicamente pelo PROTHEUS Server para a execuo. Como no
existe a linkedio, ou unio fsica do cdigo compilado a um determinado mdulo ou
aplicao, funes criadas em ADVPL podem ser executadas em qualquer ponto do ambiente
Advanced Protheus.
O compilador e o interpretador da linguagem ADVPL o prprio servidor PROTHEUS
(PROTHEUS Server), e existe um ambiente visual para desenvolvimento integrado
(PROTHEUSIDE) onde 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 atravs do
terminal remoto do Protheus, o Protheus Remote. O 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
Protheus Server. O Protheus Remote o principal meio de acesso a execuo de rotinas
escritas em ADVPL no 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 Protheus.
Podem-se criar rotinas para a customizao do sistema ERP Microsiga Protheus, desde
processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o ambiente
montado pelos mdulos do ERP Microsiga Protheus. Porm, com o ADVPL possvel at
mesmo criar toda uma aplicao, ou mdulo, do comeo.
Todo o cdigo do sistema ERP Microsiga Protheus escrito em ADVPL.
Rotinas escritas em ADVPL podem ser iniciadas como processos individuais (sem interface) no
Protheus Server atravs de duas maneiras: Iniciadas por outra rotina ADVPL atravs da
chamada de funes como StartJob() ou CallProc() ou iniciadas automaticamente na
inicializao do Protheus Server (quando propriamente configurado).
Programao de RPC
Programao TelNet
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto
atravs de uma aplicao cliente deste protocolo. O PROTHEUS Server pode emular um
terminal TelNet, atravs da execuo de rotinas escritas em ADVPL. Ou seja, pode-se escrever
rotinas ADVPL cuja interface final ser um terminal TelNet ou um coletor de dados mvel.
19.
Linhas de Comando
Linhas de comando possuem os comandos ou instrues que sero executadas. Por exemplo:
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Linhas de Comentrio
Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio. Podese utilizar a palavra NOTE ou dois smbolos da letra "e" comercial (&&) para realizar a funo
do sinal de asterisco. Porm todas estas formas de comentrio de linhas so obsoletas e
existem apenas para compatibilizao com o padro xBase. A melhor maneira de comentar
linhas em ADVPL utilizar duas barras transversais:
// Programa para clculo do total
// Autor: Microsiga Software S.A.
// Data: 2 de outubro de 2001
Outra forma de documentar textos utilizar as barras transversais juntamente com o
asterisco, podendo-se comentar todo um bloco de texto sem precisar comentar linha a linha:
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento
(indicada pelos caracteres */) considerado como comentrio.
Linhas Mistas
O ADVPL tambm permite que existam linhas de comando com comentrio. Isto possvel
adicionando-se as duas barras transversais (//) ao final da linha de comando e adicionando-se
o texto do comentrio:
Local nCnt
Local nSoma := 0 // Inicializa a varivel com zero para a soma
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Tamanho da Linha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no
editor de textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela
considerada para a compilao como uma nica linha de comando.
A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento da tecla
<Enter>. Ou seja, a linha lgica, a linha fsica no arquivo. Porm algumas vezes, por
limitao fsica do editor de texto ou por esttica, pode-se "quebrar" a linha lgica em mais de
uma linha fsica no arquivo texto. Isto efetuado utilizando-se o sinal de ponto-e-vrgula (;).
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como a
linha torna-se muito grande, pode-se dividi-la em mais de uma linha fsica utilizando o sinal de
- 165 ADVPL Completo
rea de Identificao
Esta uma rea que no obrigatria e dedicada a documentao do programa. Quando
existente, contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc.,
e aparece no comeo do programa, antes de qualquer linha de comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao
desejada e escolher a formatao apropriada.
#include protheus.ch
/*
+==========================================+
| Programa: Clculo do Fatorial
|
| Autor
: Microsiga Software S.A.
|
| Data
: 02 de outubro de 2001
|
+==========================================+
*/
User Function CalcFator()
// Clculo do fatorial
nFator := GetFator()
// GetFator funo ilustrativa na qual a varivel recebe a informao do
usurio.
If nFator <= 0
Alert(Informao invlida)
Return
Endif
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
rea de Encerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e o
resultado da execuo do programa utilizado. Pode-se exibir o resultado armazenado em
uma varivel ou em um arquivo ou simplesmente finalizar, caso a tarefa j tenha sido toda
completada no corpo do programa. nesta rea que se encontra o encerramento do
programa. Todo programa em ADVPL deve sempre terminar com a palavra chave return.
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
20.
Array
O Array um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O
ADVPL suporta arrays unidimensionais (vetores) ou multidimensionais (matrizes). Os
elementos de um array so acessados atravs de ndices numricos iniciados em 1,
identificando a linha e coluna para quantas dimenses existirem.
Arrays devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a
memria do servidor.
Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas
em ADVPL que podero ser executadas posteriormente.
Local
Static
Private
Public
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a
funo Filha executada, nVar ainda existe mas no pode ser acessada. Quando a execuo
da funo Pai terminar, a varivel nVar destruda. Qualquer varivel com o mesmo nome no
programa que chamou a funo Pai no afetada.
Variveis de escopo local so criadas automaticamente cada vez que a funo onde forem
declaradas for ativada. Elas continuam a existir e mantm seu valor at o fim da ativao da
funo (ou seja, at que a funo retorne o controle para o cdigo que a executou). Se uma
funo chamada recursivamente (por exemplo, chama a si mesma), cada chamada em
recurso cria um novo conjunto de variveis locais.
A visibilidade de variveis de escopo locais idntica ao escopo de sua declarao, ou seja, a
varivel visvel em qualquer lugar do cdigo fonte em que foi declarada. Se uma funo
chamada recursivamente, apenas as variveis de escopo local criadas na mais recente ativao
so visveis.
Variveis de escopo static
Variveis de escopo static funcionam basicamente como as variveis de escopo local, mas
mantm seu valor atravs da execuo e devem ser declaradas explicitamente no cdigo com
o identificador STATIC.
O escopo das variveis static depende de onde so declaradas. Se forem declaradas dentro do
corpo de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem
declaradas fora do corpo de qualquer rotina, seu escopo afeta a todas as funes declaradas
no fonte. Neste exemplo, a varivel nVar declarada como static e inicializada com o valor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente
de variveis declaradas como LOCAL ou PRIVATE, nVar continua a existir e mantm seu valor
atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por
execues subseqentes da funo Pai.
Variveis de escopo private
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com
o identificador PRIVATE.
Adicionalmente, a atribuio de valor a uma varivel no criada anteriormente
automaticamente cria a varivel como privada. Uma vez criada, uma varivel privada continua
a existir e mantm seu valor at que o programa ou funo onde foi criada termine (ou seja,
at que a funo onde foi criada retorne para o cdigo que a executou). Neste momento,
automaticamente destruda.
possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente.
Entretanto, a nova (duplicada) varivel pode apenas ser criada em um nvel de ativao
inferior ao nvel onde a varivel foi declarada pela primeira vez (ou seja, apenas em uma
funo chamada pela funo onde a varivel j havia sido criada). A nova varivel privada ir
esconder qualquer outra varivel privada ou pblica (veja a documentao sobre variveis
pblicas) com o mesmo nome enquanto existir.
Uma vez criada, uma varivel privada visvel em todo o programa enquanto no for
destruda automaticamente quando a rotina que a criou terminar ou uma outra varivel
privada com o mesmo nome for criada em uma subfuno chamada (neste caso, a varivel
existente torna-se inacessvel at que a nova varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as
funes chamadas por esta, a menos que uma funo chamada crie sua prpria varivel
privada com o mesmo nome.
Por exemplo:
Function Pai()
Private nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar criada com escopo private e inicializada com o valor 10.
Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel de escopo
local, pode ser acessada pela funo Filha. Quando a funo Pai terminar, nVar ser destruda
e qualquer declarao de nVar anterior se tornar acessvel novamente.
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
Exemplo: Private _dData
- 173 ADVPL Completo
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste exemplo, nVar criada como public e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privates,
nVar ainda existe aps o trmino da a execuo da funo Pai.
Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como
pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
Exemplo: Public _cRotina
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:
21.
DTOS
ELSE
ELSEIF
EMPTY
ENDCASE
ENDDO
LOWER
SETPOS
COL
FIELDNAME
PCOL
TIME
DEVPOS
IF
RECNO
THROW
INKEY
INT
LASTREC
LEN
LOCK
LOG
SELECT
CMONTH
FCOUNT
MONTH
SUBSTR
DELETED
FUNCTION
RECCOUNT
UPPER
Palavras reservadas no
procedimentos ou funes;
REPLICATE
RLOCK
ROUND
ROW
RTRIM
SECONDS
CHR
EXP
MIN
STR
DAY
FOUND
PROW
TYPE
TRY
podem
ser
VAL
VALTYPE
WHILE
WORD
YEAR
CDOW
EOF
MAX
SQRT
DATE
FLOCK
PROCEDURE
TRIM
DTOC
AS
utilizadas
para
variveis,
Funcionalidade
Permite apenas caracteres alfabticos.
Exibe CR depois de nmeros positivos.
Exibe numrico com o ponto e vrgula invertidos (formato Europeu).
Insere caracteres diferentes dos caracteres de template na exibio, mas no os
insere na varivel do GET.
Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro
que identifica o tamanho da regio.
Exibe DB depois de nmeros negativos.
Exibe zeros como brancos.
Exibe nmeros negativos entre parnteses com os espaos em branco iniciais.
Exibe nmeros negativos entre parnteses sem os espaos em branco iniciais.
Converte caracteres alfabticos para maisculo.
Templates
Contedo Funcionalidade
X
Permite qualquer caractere.
9
Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para
numricos.
#
Permite dgitos, sinais e espaos em branco para qualquer tipo de dado.
!
Converte caracteres alfabticos para maisculo.
*
Exibe um asterisco no lugar dos espaos em branco iniciais em nmeros.
.
Exibe o ponto decimal.
,
Exibe a posio do milhar.
Exemplo 01 Picture campo numrico
CT2_VALOR Numrico 17,2
Picture: @E 99,999,999,999,999.99
22.
Programas de Atualizao
Modelo 1 ou AxCadastro:
Para
cadastramentos
em
Exemplo: Cadastro de Cliente.
Modelo 2:
Cadastramentos
tabela,
mas
envolvendo
com
um
tela
apenas
cabealho
cheia.
uma
e,
Ideal para
itens
que,
por
isso,
so
Modelo 3:
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros:
cAlias
cTitulo
Ttulo da Janela
cVldExc
cVldAlt
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| XCADSA2
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Descrio | Exemplo de utilizao da funo AXCADASTRO()
|
|+---------------------------------------------------------------------------| Uso
| Curso ADVPL
|
|+---------------------------------------------------------------------------/*/
User Function XCadSA2()
Local
Local
Local
Local
cAlias
cTitulo
cVldExc
cVldAlt
:=
:=
:=
:=
"SA2"
"Cadastro de Fornecedores"
".T."
".T."
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return Nil
/*/
+-----------------------------------------------------------------------------| Funo
| VLDALT
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+-----------------------------------------------------------------------------| Descrio | Funo de validao de alterao para a AXCADASTRO()
|
+-----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+-----------------------------------------------------------------------------/*/
User Function VldAlt(cAlias,nReg,nOpc)
Local lRet
Local aArea
Local nOpcao
:= .T.
:= GetArea()
:= 0
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(Aterao concluda com sucesso!)
Endif
RestArea(aArea)
Return lRet
/*/
+-----------------------------------------------------------------------------| Funo
| VLDEXC
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+-----------------------------------------------------------------------------| Descrio | Funo de validao de excluso para a AXCADASTRO()
|
+-----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+-----------------------------------------------------------------------------/*/
User Function VldExc(cAlias,nReg,nOpc)
Local lRet
Local aArea
Local nOpcao
:= .T.
:= GetArea()
:= 0
nOpcao := AxExclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(Excluso concluda com sucesso!)
Endif
RestArea(aArea)
Return lRet
22.2. Modelo2()
O nome Modelo 2 foi conceituado pela Microsiga por se tratar de um prottipo de tela para
entrada de dados. Inicialmente vamos desmistificar dois pontos:
Funo Modelo2() Trata-se de uma funo pronta que contempla o prottipo
Modelo 2, porm, este um assunto que no iremos tratar aqui, visto que
uma funcionalidade simples que quando necessrio intervir em algo na rotina
no h muito recurso para tal.
Prottipo Modelo 2 Trata-se de uma tela, como a figura abaixo, onde seu
objetivo efetuar a manuteno em vrios registros de uma s vez. Por
exemplo: efetuar o movimento interno de vrios produtos do estoque em um
nico lote.
22.2.1.
Objeto MsDialog()
Deve ser utilizada como janela padro para entrada de dados, um tipo de objeto modal, ou
seja, no permite que outra janela ativa receba dados enquanto esta estiver ativa.
Toda vez que utilizar este comando o ADVPL exige que seja declarado a diretiva Include no
cabealho do programa o arquivo Protheus.ch, isto porque o compilador precisar porque
este comando trata-se de um pseudo cdigo e sua traduo ser feita na compilao. Vale
lembrar tambm que este s ser acionado depois que instanciado e ativado por outro
comando.
DEFINE MSDIALOG oDlg TITLE "Prottipo Modelo 2" FROM 0,0 TO 280,552 OF;
oMainWnd PIXEL
ACTIVATE MSDIALOG oDlg CENTER
Objeto
bOk
Objeto
bCancelar
Objeto
lMensApag
Lgico
aBotes
Vetor
Parmetros:
nRow
nCol
cText
oWnd
oFont
lCentered
lPar6
Reservado.
nClrText
nClrBack
nWidth
nHeight
lLowered
lRaised
TSay():
TSay():New([anRow],
[anCol],
[abText],
[aoWnd],
[acPicture],
[aoFont],
[lPar7],
[lPar8],
[lPar9],
[alPixels],
[anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16],
[lPar17], [lPar18], [lPar19])
Parmetros:
anRow
anCol
abText
aoWnd
acPicture
aoFont
lPar7
lPar8
lPar9
alPixels
anClrText
anClrBack
anWidth
anHeight
lPar15
lPar16
lPar17
lPar18
lPar19
Sintaxe
Parmetros:
anRow
anCol
abSetGet
aoWnd
anWidth
anHeight
acPict
abValid
anClrFore
anClrBack
aoFont
lPar12
oPar13
alPixel
cPar15
lPar16
abWhen
lPar18
lPar19
abChange
alReadOnly
alPassword
cPar23
acReadVar
cPar25
lPar26
nPar27
lPar18
Reservado.
Bloco de cdigo, opcional. Executado quando o controle
modifica o valor da varivel associada.
Lgico, opcional. Se .T. o controle no poder ser editado.
Lgico, opcional. Se .T. o controle exibir asteriscos * no
lugar dos caracteres exibidos pelo controle para simular
entrada de senha.
Reservado.
Caractere, opcional. Nome da varivel que o controle dever
manipular, dever ser a mesma varivel informada no
parmetro abSetGet, e ser o retorno da funo ReadVar( ).
Reservado.
Reservado.
Reservado.
Reservado.
Objeto MsGetDados()
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em um
vetor. Sua utilizao exige que seja utilizado trs variveis com seu escopo Private, so elas:
aRotina, aHeader e aCOLS.
Observaes importantes:
O vetor aHeader deve ser construdo com base no dicionrio de dados.
O vetor aCOLS deve ser construdo com base no vetor aHeader, porm devese criar uma coluna adicional para o controle de excluso do registro, ou
seja, quando o usurio teclar a tecla <DELETE> a linha ficar na cor cinza e
esta coluna estar com o seu valor igual a verdadeiro (.T.).
Quando instanciado este objeto possvel saber em que linha o usurio est
porque o objeto trabalha com uma varivel de escopo Public denominada n,
seu valor numrico e ter sempre no contedo a linha em que o usurio
encontra-se com o cursor.
Sintaxe:
Parmetros:
nSuperior
nEsquerda
nInferior
nDireita
nOpc
cLinhaOk
cTudoOk
cIniCpos
lApagar
aAlter
uPar1
lVazio
nMax
cCampoOk
cSuperApagar
uPar2
cApagaOk
oWnd
Contedo
Ttulo da opo.
Nome da rotina (Function).
Reservado.
Operao (1-Pesquisar;2-Visualizar;3-Incluir;4-Alterar;5-Excluso).
Acesso relacionado a rotina, se est opo no for informada nenhum
acesso ser validado.
Contedo
Ttulo do campo
Nome do campo
Mscara do campo
Tamanho do campo
Decimal do campo
Validao de usurio do campo
Uso do campo
Tipo do campo (caractere, numrico, data e etc.)
Prefixo da tabela
Contexto do campo (real ou virtual)
22.2.2.
Programa
Funo principal;
Declarao e atribuio de variveis;
Acesso a tabela principal e sua ordem;
Chamada da funo MBrowse;
Fim da funo principal.
Funo de visualizao, alterao e excluso;
Declarao e atribuio de variveis;
Acesso ao primeiro registro da chave em que est posicionado na MBrowse;
Montagem das variveis estticas em tela;
Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS de todos os registros referente a chave principal em que est
posicionado na MBrowse;
Instncia da MsDialog;
Instncia dos objetos TSay e TGet;
Instncia do objeto MsGetDados;
Ativar o objeto principal que o objeto da janela;
Se for operao diferente de visualizao e clicou no boto OK;
A operao e de Alterao?
Chamar a funo para alterar os dados;
Caso contrrio
Chamar a funo para excluir os dados;
Fim da funo de visualizao, alterao e excluso.
Funo de incluso;
Declarao e atribuio de variveis;
Montagem das variveis estticas em tela;
Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS com o seu contedo conforme o inicializador padro do campo ou
vazio, pois trata-se de uma incluso;
Instncia da MsDialog;
Instncia dos objetos TSay e TGet;
Instncia do objeto MsGetDados;
Ativar o objeto principal que o objeto da janela;
Se clicou no boto OK;
Chamar a funo para incluir os dados;
Fim da funo de incluso.
Rotina principal
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | xModelo2 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo do prottipo Modelo2.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function xModelo2()
Private cCadastro := "Prottipo Modelo 2"
Private aRotina := {}
AADD(
AADD(
AADD(
AADD(
AADD(
aRotina,
aRotina,
aRotina,
aRotina,
aRotina,
{"Pesquisar"
{"Visualizar"
{"Incluir"
{"Alterar"
{"Excluir"
,"AxPesqui" ,0,1})
,'U_Mod2Mnt',0,2})
,'U_Mod2Inc',0,3})
,'U_Mod2Mnt',0,4})
,'U_Mod2Mnt',0,5})
dbSelectArea("ZA3")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA3")
Return
Rotina de incluso
//+--------------------------------------------------------------------+
//| Rotina | Mod2Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod2Inc( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local oTPanel1
Local oTPAnel2
Local cCodigo := ZA3->ZA3_CODIGO
Local cNome
:= ZA3->ZA3_NOME
Local dData
:= dDataBase
Private aHeader := {}
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro From 8,0 To 28,80 OF oMainWnd
oTPanel1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel1:Align := CONTROL_ALIGN_TOP
@ 4, 006 SAY "Cdigo:" SIZE 70,7 PIXEL OF oTPanel1
@ 4, 062 SAY "Nome:"
SIZE 70,7 PIXEL OF oTPanel1
@ 4, 166 SAY "Emissao:" SIZE 70,7 PIXEL OF oTPanel1
@ 3, 026 MSGET cCodigo F3 "SA3" PICTURE "@!" VALID;
Mod2Vend(cCodigo, @cNome);
SIZE 030,7 PIXEL OF oTPanel1
@ 3, 080 MSGET cNome When .F. SIZE 78,7 PIXEL OF oTPanel1
@ 3, 192 MSGET dData PICTURE "99/99/99" SIZE 40,7 PIXEL OF
oTPanel1
oTPanel2 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel2:Align := CONTROL_ALIGN_BOTTOM
oGet := MSGetDados():New(0,0,0,0,nOpc,"U_Mod2LOk()",;
".T.","+ZA3_ITEM",.T.)
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
ACTIVATE MSDIALOG oDlg CENTER ON INIT ;
EnchoiceBar(oDlg,{|| IIF(U_Mod2TOk(), Mod2GrvI(),;
( oDlg:End(), NIL ) )},{|| oDlg:End() })
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod2Mnt( cAlias, nReg, nOpc )
Local
Local
Local
Local
oDlg
oGet
oTPanel1
oTPAnel2
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbGoTo( nReg )
cCodigo := ZA3->ZA3_CODIGO
cNome
:= ZA3->ZA3_NOME
cData
:= ZA3->ZA3_DATA
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro From 8,0 To 28,80 OF oMainWnd
oTPane1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPane1:Align := CONTROL_ALIGN_TOP
@ 4, 006 SAY "Cdigo:" SIZE 70,7 PIXEL OF oTPanel1
@ 4, 062 SAY "Nome:"
SIZE 70,7 PIXEL OF oTPanel1
@ 4, 166 SAY "Emissao:" SIZE 70,7 PIXEL OF oTPanel1
@ 3, 026 MSGET cCodigo When .F. SIZE 30,7 PIXEL OF oTPanel1
@ 3, 080 MSGET cNome
When .F. SIZE 78,7 PIXEL OF oTPanel1
@ 3, 192 MSGET dData
When .F. SIZE 40,7 PIXEL OF oTPanel1
oTPanel2 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel2:Align := CONTROL_ALIGN_BOTTOM
If nOpc == 4
oGet := MSGetDados():New(0,0,0,0,nOpc,"U_Mod2LOk()",;
".T.","+ZA3_ITEM",.T.)
Else
oGet := MSGetDados():New(0,0,0,0,nOpc)
Endif
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
ACTIVATE MSDIALOG oDlg CENTER ON INIT ;
EnchoiceBar(oDlg,{|| ( IIF( nOpc==4, Mod2GrvA(), ;
IIF( nOpc==5, Mod2GrvE(), oDlg:End() ) ), oDlg:End() ) },;
{|| oDlg:End() })
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2aHeader( cAlias )
Local aArea := GetArea()
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek( cAlias )
While !EOF() .And. X3_ARQUIVO == cAlias
If X3Uso(X3_USADO) .And. cNivel >= X3_NIVEL
AADD( aHeader, { Trim( X3Titulo() ),;
X3_CAMPO,;
X3_PICTURE,;
X3_TAMANHO,;
X3_DECIMAL,;
X3_VALID,;
X3_USADO,;
X3_TIPO,;
X3_ARQUIVO,;
X3_CONTEXT})
Endif
dbSkip()
End
RestArea(aArea)
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2aCOLS( cAlias, nReg, nOpc )
Local aArea := GetArea()
Local cChave := ZA3->ZA3_CODIGO
Local nI := 0
If nOpc <> 3
dbSelectArea( cAlias )
dbSetOrder(1)
dbSeek( xFilial( cAlias ) + cChave )
While !EOF() .And. ;
ZA3->( ZA3_FILIAL + ZA3_CODIGO ) == xFilial( cAlias ) + cChave
AADD( aREG, ZA3->( RecNo() ) )
- 193 ADVPL Completo
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvI | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na incluso.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2GrvI()
Local aArea := GetArea()
Local nI := 0
Local nX := 0
dbSelectArea("ZA3")
dbSetOrder(1)
For nI := 1 To Len( aCOLS )
If ! aCOLS[nI,Len(aHeader)+1]
RecLock("ZA3",.T.)
ZA3->ZA3_FILIAL := xFilial("ZA3")
ZA3->ZA3_CODIGO := cCodigo
ZA3->ZA3_DATA
:= dData
For nX := 1 To Len( aHeader )
FieldPut( FieldPos( aHeader[nX, 2] ), aCOLS[nI, nX] )
Next nX
MsUnLock()
Endif
Next nI
RestArea(aArea)
Return
Efetivao da alterao
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvA | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na alterao.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2GrvA()
Local aArea := GetArea()
Local nI := 0
Local nX := 0
dbSelectArea("ZA3")
For nI := 1 To Len( aREG )
If nI <= Len( aREG )
dbGoTo( aREG[nI] )
RecLock("ZA3",.F.)
If aCOLS[nI, Len(aHeader)+1]
dbDelete()
Endif
Else
RecLock("ZA3",.T.)
Endif
If !aCOLS[nI, Len(aHeader)+1]
ZA3->ZA3_FILIAL := xFilial("ZA3")
ZA3->ZA3_CODIGO := cCodigo
ZA3->ZA3_DATA
:= dData
For nX := 1 To Len( aHeader )
FieldPut( FieldPos( aHeader[nX, 2] ), aCOLS[nI, nX] )
Next nX
Endif
MsUnLock()
Next nI
RestArea( aArea )
Return
Efetivao da excluso
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvE | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para excluir os registros.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2GrvE()
Local nI := 0
dbSelectArea("ZA3")
For nI := 1 To Len( aCOLS )
dbGoTo(aREG[nI])
RecLock("ZA3",.F.)
dbDelete()
MsUnLock()
Next nI
Return
Funo auxiliar: Validao do cdigo do vendedor
//+--------------------------------------------------------------------+
//| Rotina | Mod2Vend | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar o cdigo do vendedor.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod2Vend( cCodigo, cNome )
If ExistCpo("SA3",cCodigo) .And. ExistChav("ZA3",cCodigo)
cNome := Posicione("SA3",1,xFilial("SA3")+cCodigo,"A3_NOME")
Endif
Return(!Empty(cNome))
//+--------------------------------------------------------------------+
//| Rotina | Mod2TOk | Autor | Robson Luiz (rleg)
| Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar toda as linhas de dados.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod2TOk()
Local lRet := .T.
Local nI := 0
Local cMensagem := "No ser permitido linhas sem o centro de custo."
For nI := 1 To Len( aCOLS )
If aCOLS[nI, Len(aHeader)+1]
Loop
Endif
If !aCOLS[nI, Len(aHeader)+1]
If Empty(aCOLS[n,GdFieldPos("ZA3_CCUSTO")])
MsgAlert(cMensagem,cCadastro)
lRet := .F.
Exit
Endif
Endif
Next nI
Return( lRet )
22.2.3.
Funo Modelo2()
A funo Modelo2() uma interface pr-definida pela Microsiga que implementa de forma
padronizada os compontes necessrios a manipulao de estruturas de dados nas quais o
cabealho e os itens da informao compartilham o mesmo registro fsico.
Seu objetivo atuar como um facilitador de codificao, permitindo a utilizao dos recursos
bsicos dos seguintes componentes visuais:
MsDialog()
TGet()
TSay()
MsNewGetDados()
EnchoiceBar()
A funo Modelo2() no implementa as regras de visualizao,
incluso, alterao e excluso, como uma AxCadastro() ou
AxFunction().
A inicializao das variveis Private utilizada nos cabealhos e rodaps,
bem como a inicializao e gravao do aCols devem ser realizadas
pela rotina que suporta a execuo da Modelo2().
Da mesma forma, o Browse deve ser tratado por esta rotina, sendo
comum a Modelo2() estar vinculada ao uso de uma MBrowse().
- 197 ADVPL Completo
Parmetros:
cTitulo
aCab
Ttulo da janela
Array contendo as informaes que sero exibidas no cabealho na forma de
Enchoice()
aCab[n][1] (Caractere) := Nome da varivel private que ser vinculada ao
campo da Enchoice().
aCab[n][2] (Array) := Array com as coordenadas do campo na tela {Linha,
Coluna}
aCab[n][3] (Caractere) := Ttulo do campo na tela
aCab[n][4] (Caractere) := Picture de formatao do get() do campo.
aCab[n][5] (Caractere) := Funo de validao do get() do campo.
aCab[n][6] (Caractere) := Nome da consulta padro que ser executada
para o campo via tecla F3
aCab[n][7] (Lgico) := Se o campo estar livre para digitao.
aRoda
aGrid
nOpc
cLinhaOk
cTudoOk
Retorno:
Lgico
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRW2SX5| Autor | ARNALDO RAYMUNDO JR. | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | UTILIZACAO DA MODELO2() PARA VISUALIZAO DO SX5.
|
//+--------------------------------------------------------------------+
//| Uso
| CURSO DE ADVPL
|
//+--------------------------------------------------------------------+
USER FUNCTION MBrw2Sx5()
Local cAlias
:= "SX5"
Private cCadastro
:= "Arquivo de Tabelas"
Private aRotina
:= {}
Private cDelFunc := ".T." // Validacao para a exclusao. Pode-se utilizar
ExecBlock
AADD(aRotina,{"Pesquisar"
AADD(aRotina,{"Visualizar"
AADD(aRotina,{"Incluir"
AADD(aRotina,{"Alterar"
AADD(aRotina,{"Excluir"
,"AxPesqui"
,"U_SX52Vis"
,"U_SX52Inc"
,"U_SX52Alt"
,"U_SX52Exc"
,0,1})
,0,2})
,0,3})
,0,4})
,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
USER FUNCTION SX52INC(cAlias,nReg,nOpc)
//Local nUsado
Local cTitulo
Local aCab
2
Local aRoda
Local aGrid
modelo2 - Padrao:
:= 0
:= "Inclusao de itens - Arquivo de Tabelas"
:= {} // Array com descricao dos campos do Cabecalho do Modelo
Exemplo (continuao):
// Variaveis para campos da Enchoice()
Private cX5Filial := xFilial("SX5")
Private cX5Tabela := SPACE(5)
// Montagem do array de cabealho
// AADD(aCab,{"Varivel"
,{L,C} ,"Ttulo","Picture","Valid","F3",lEnable})
AADD(aCab,{"cX5Filial" ,{015,010} ,"Filial","@!",,,.F.})
AADD(aCab,{"cX5Tabela" ,{015,080} ,"Tabela","@!",,,.T.})
// Montagem do aHeader
AADD(aHeader,{"Chave"
,"X5_CHAVE","@!",5,0,"AllwaysTrue()",;
"","C","","R"})
AADD(aHeader,{"Descricao"
,"X5_DESCRI","@!",40,0,"AllwaysTrue()",;
"","C","","R"})
// Montagem do aCols
aCols := Array(1,Len(aHeader)+1)
// Inicializao do aCols
For nColuna := 1 to Len(aHeader)
If aHeader[nColuna][8] == "C"
aCols[1][nColuna] := SPACE(aHeader[nColuna][4])
ElseIf aHeader[nColuna][8] == "N"
aCols[1][nColuna] := 0
ElseIf aHeader[nColuna][8] == "D"
aCols[1][nColuna] := CTOD("")
ElseIf aHeader[nColuna][8] == "L"
aCols[1][nColuna] := .F.
ElseIf aHeader[nColuna][8] == "M"
aCols[1][nColuna] := ""
Endif
Next nColuna
aCols[1][Len(aHeader)+1] := .F. // Linha no deletada
lRetMod2 := Modelo2(cTitulo,aCab,aRoda,aGrid,nOpc,cLinhaOk,cTudoOk)
IF lRetMod2
//MsgInfo("Voc confirmou a operao","MBRW2SX5")
For nLinha := 1 to len(aCols)
// Campos de Cabealho
Reclock("SX5",.T.)
SX5->X5_FILIAL := cX5Filial
SX5->X5_TABELA := cX5Tabela
// Campos do aCols
//SX5->X5_CHAVE := aCols[nLinha][1]
//SX5->X5_DESCRI := aCols[nLinha][2]
For nColuna := 1 to Len(aHeader)
SX5->&(aHeader[nColuna][2]) := aCols[nLinha][nColuna]
Next nColuna
MsUnLock()
Next nLinha
ELSE
MsgAlert("Voc cancelou a operao","MBRW2SX5")
ENDIF
Return
- 200 ADVPL Completo
22.3. Modelo3()
O nome Modelo 3, assim como a Modelo 2 foi conceituado pela Microsiga por se tratar de um
prottipo de tela para entrada de dados. Inicialmente vamos desmistifica dois pontos:
Funo Modelo3() Trata-se de uma funo pronta que contempla o prottipo
Modelo 3, porm, este um assunto que no iremos tratar aqui, visto que
uma funcionalidade simples que quando necessrio intervir em algo na rotina
no h muito recurso para tal.
Prottipo Modelo 3 Trata-se de uma tela, como a figura abaixo, onde seu
objetivo efetuar a manuteno em vrios registros de uma s vez relacionada
a outro registro de outra tabela, ou seja, aqui teremos o relacionamento de
registros pai e filho, ento preciso se preocupar com este relacionamento.
Por exemplo: efetuar a manuteno em um pedido de vendas, onde ter um
registro em uma tabela referente cabea do pedido e outra tabela com os
registros referentes aos itens deste pedido de vendas.
Para ganharmos tempo no ser apresentado aqui toda a explicao e montagens para a
funo EnchoiceBar, comando MsDialog, Say e MsGet e para os vetores aHeader e
aCOLS, entretanto todos estes estaro na codificao do cdigo fonte. A figura abaixo mostra
exatamente o que a tela prottipo Modelo 3:
aCpos
uPar4
uPar5
uPar6
uPar7
oWnd
uPar8
lMemoria
lColuna
uPar9
lSemPastas
Vale lembrar que ns programadores reaproveitamos muito o que j existe, isto para
simplesmente ganharmos tempo, e no caso da utilizao da funo Enchoice preciso criar as
variveis de memrias que levam o mesmo nome dos campos da tabela em questo. Por
exemplo o campo A2_NOME da tabela SA2 (cadastro de fornecedores) quando queremos
referenciar o campo usa-se o prefixo da tabela e o campo em questo, desta forma:
SA2->A2_NOME
Agora quando queremos referenciar a uma varivel que est com o contedo do mesmo
campo criamos outro recurso, desta forma:
M->A2_NOME
E para criar variveis com o nome do campo utilizamos um cdigo de bloco (code-block) e
mais um lao de leitura para atribuir valores iniciais a cada uma dela. Ento fica assim o
procedimento:
Private bCampo
:= { |nField| Field(nField) }
E em outro momento aproveitamos est varivel bCampo para facilitar a atribuio, veja o
exemplo abaixo :
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := Atribuio inicial ou atribuio de valor
Next nX
Ou seja, fazer para todos os campos, e a cada campo criar a varivel com a atribuio inicial
ou atribuio de valor.
22.3.1.
Programa
Funo principal;
Declarao e atribuio de variveis;
Acesso a tabela principal e sua ordem;
Chamada da funo MBrowse;
Fim da funo principal.
Funo de visualizao, alterao e excluso;
Declarao e atribuio de variveis;
Acesso ao primeiro registro da chave em que est posicionado na MBrowse;
Construo das variveis de memria M->???;
Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS de todos os registros referente a chave principal em que est
posicionado na MBrowse;
Instncia da MsDialog;
Execuo da funo Enchoice;
Instncia do objeto MsGetDados;
Ativar o objeto principal que o objeto da janela;
Se for operao diferente de visualizao e clicou no boto OK;
A operao e de Alterao?
Chamar a funo para alterar os dados;
Caso contrrio
Chamar a funo para excluir os dados;
Fim da funo de visualizao, alterao e excluso.
Funo de incluso;
Declarao e atribuio de variveis;
Construo das variveis de memria M->???;
Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS com o seu contedo conforme o inicializador padro do campo ou
vazio, pois trata-se de uma incluso;
Instncia da MsDialog;
Instncia dos objetos TSay e TGet;
Instncia do objeto MsGetDados;
Ativar o objeto principal que o objeto da janela;
Se clicou no boto OK;
Chamar a funo para incluir os dados;
Fim da funo de incluso.
Rotina principal
//+--------------------------------------------------------------------+
//| Rotina | xModelo3 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo do prottipo Modelo3.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
#Include "Protheus.ch"
User Function xModelo3()
Private cCadastro := "Prottipo Modelo 3"
Private aRotina := {}
Private oCliente
Private oTotal
Private cCliente := ""
Private nTotal := 0
Private bCampo := {|nField| FieldName(nField) }
Private
Private
Private
Private
Private
aSize := {}
aInfo := {}
aObj := {}
aPObj := {}
aPGet := {}
aRotina,
aRotina,
aRotina,
aRotina,
aRotina,
{"Pesquisar"
{"Visualizar"
{"Incluir"
{"Alterar"
{"Excluir"
,"AxPesqui" ,0,1})
,'U_Mod3Mnt',0,2})
,'U_Mod3Inc',0,3})
,'U_Mod3Mnt',0,4})
,'U_Mod3Mnt',0,5})
dbSelectArea("ZA1")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA1")
Return
Funo de Incluso
//+--------------------------------------------------------------------+
//| Rotina | Mod3Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod3Inc( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private
Private
Private
Private
aHeader := {}
aCOLS := {}
aGets := {}
aTela := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := CriaVar( FieldName( nX ), .T. )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro FROM ;
aSize[7],aSize[1] TO aSize[6],aSize[5] OF oMainWnd PIXEL
EnChoice( cAlias, nReg, nOpc, , , , , aPObj[1])
// Atualizao do nome do cliente
@ aPObj[3,1],aPGet[1,1] SAY "Cliente: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,2] SAY oCliente VAR cCliente SIZE 98,7 OF oDlg PIXEL
// Atualizao do total
@ aPObj[3,1],aPGet[1,3] SAY "Valor Total: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,4] SAY oTotal VAR nTotal ;
PICT "@E 9,999,999,999.99" SIZE 70,7 OF oDlg PIXEL
oGet := MSGetDados():New(aPObj[2,1],aPObj[2,2],aPObj[2,3],aPObj[2,4],;
nOpc,"U_Mod3LOk()",".T.","+ZA2_ITEM",.T.)
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,;
{|| IIF( Mod3TOk().And.Obrigatorio( aGets, aTela ), ( nOpcA := 1, oDlg:End() ),
NIL) },;
{|| oDlg:End() })
If nOpcA == 1 .And. nOpc == 3
Mod3Grv( nOpc )
ConfirmSXE()
Endif
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod3Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod3Mnt( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private aHeader := {}
Private aCOLS := {}
Private aGets := {}
Private aTela := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := FieldGet( nX )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro FROM ;
aSize[7],aSize[1] TO aSize[6],aSize[5] OF oMainWnd PIXEL
EnChoice( cAlias, nReg, nOpc, , , , , aPObj[1])
// Atualizao do nome do cliente
@ aPObj[3,1],aPGet[1,1] SAY "Cliente: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,2] SAY oCliente VAR cCliente SIZE 98,7 OF oDlg PIXEL
// Atualizao do total
@ aPObj[3,1],aPGet[1,3] SAY "Valor Total: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,4] SAY oTotal VAR nTotal PICTURE ;
"@E 9,999,999,999.99" SIZE 70,7 OF oDlg PIXEL
U_Mod3Cli()
oGet := MSGetDados():New(aPObj[2,1],aPObj[2,2],aPObj[2,3],aPObj[2,4],;
nOpc,"U_Mod3LOk()",".T.","+ZA2_ITEM",.T.)
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,;
{|| IIF( Mod3TOk().And.Obrigatorio( aGets, aTela ), ( nOpcA := 1, oDlg:End() ),
NIL ) },;
{|| oDlg:End() })
If nOpcA == 1 .And. ( nOpc == 4 .Or. nOpc == 5 )
Mod3Grv( nOpc, aREG )
Endif
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod3aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod3aHeader()
Local aArea := GetArea()
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("ZA2")
While !EOF() .And. X3_ARQUIVO == "ZA2"
If X3Uso(X3_USADO) .And. cNivel >= X3_NIVEL
AADD( aHeader, { Trim( X3Titulo() ),;
X3_CAMPO,;
X3_PICTURE,;
X3_TAMANHO,;
X3_DECIMAL,;
X3_VALID,;
X3_USADO,;
X3_TIPO,;
X3_ARQUIVO,;
X3_CONTEXT})
Endif
dbSkip()
End
RestArea(aArea)
Return
Funo para montar o vetor aCols
//+--------------------------------------------------------------------+
//| Rotina | Mod3aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod3aCOLS( nOpc )
Local aArea := GetArea()
Local cChave := ""
Local cAlias := "ZA2"
Local nI := 0
If nOpc <> 3
cChave := ZA1->ZA1_NUM
dbSelectArea( cAlias )
dbSetOrder(1)
dbSeek( xFilial( cAlias ) + cChave )
- 208 ADVPL Completo
Continuao:
While !EOF() .And. ZA2->( ZA2_FILIAL + ZA2_NUM ) == xFilial( cAlias ) +
cChave
AADD( aREG, ZA2->( RecNo() ) )
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
If aHeader[nI,10] == "V"
aCOLS[Len(aCOLS),nI] := CriaVar(aHeader[nI,2],.T.)
Else
aCOLS[Len(aCOLS),nI] :=
FieldGet(FieldPos(aHeader[nI,2]))
Endif
Next nI
aCOLS[Len(aCOLS),Len(aHeader)+1] := .F.
dbSkip()
End
Else
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
aCOLS[1, nI] := CriaVar( aHeader[nI, 2], .T. )
Next nI
aCOLS[1, GdFieldPos("ZA2_ITEM")] := "01"
aCOLS[1, Len( aHeader )+1 ] := .F.
Endif
Restarea( aArea )
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod3Cli | Autor | Robson Luiz (rleg)
|Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para atualizar a varivel com o nome do cliente.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
User Function Mod3Cli()
cCliente := Posicione( "SA1", 1, xFilial("SA1") + M->(ZA1_CLIENT + ZA1_LOJA),
"A1_NREDUZ" )
oCliente:Refresh()
Return(.T.)
Funo para efetuar a gravao dos dados em ZA1 e ZA2 na incluso, alterao e
excluso.
//+--------------------------------------------------------------------+
//| Rotina | Mod3Grv | Autor | Robson Luiz (rleg)
|Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para efetuar a gravao nas tabelas.
|
//+--------------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+--------------------------------------------------------------------+
Static Function Mod3Grv( nOpc, aAltera )
Local nX := 0
Local nI := 0
// Se for incluso
If nOpc == 3
// Grava os itens
dbSelectArea("ZA2")
dbSetOrder(1)
For nX := 1 To Len( aCOLS )
If !aCOLS[ nX, Len( aCOLS ) + 1 ]
RecLock( "ZA2", .T. )
For nI := 1 To Len( aHeader )
FieldPut( FieldPos( Trim( aHeader[nI, 2] ) ),
aCOLS[nX,nI] )
Next nI
ZA2->ZA2_FILIAL := xFilial("ZA2")
ZA2->ZA2_NUM := M->ZA1_NUM
MsUnLock()
Endif
Next nX
// Grava o Cabealho
dbSelectArea( "ZA1" )
RecLock( "ZA1", .T. )
For nX := 1 To FCount()
If "FILIAL" $ FieldName( nX )
FieldPut( nX, xFilial( "ZA1" ) )
Else
FieldPut( nX, M->&( Eval( bCampo, nX ) ) )
Endif
Next nX
MsUnLock()
Endif
// Se for alterao
If nOpc == 4
// Grava os itens conforme as alteraes
dbSelectArea("ZA2")
dbSetOrder(1)
For nX := 1 To Len( aCOLS )
If nX <= Len( aREG )
dbGoto( aREG[nX] )
RecLock("ZA2",.F.)
If aCOLS[ nX, Len( aHeader ) + 1 ]
dbDelete()
Endif
Else
Continuao:
If !aCOLS[ nX, Len( aHeader ) + 1 ]
RecLock( "ZA2", .T. )
Endif
Endif
If !aCOLS[ nX, Len(aHeader)+1 ]
For nI := 1 To Len( aHeader )
FieldPut( FieldPos( Trim( aHeader[ nI, 2] ) ),;
aCOLS[ nX, nI ] )
Next nI
ZA2->ZA2_FILIAL := xFilial("ZA2")
ZA2->ZA2_NUM := M->ZA1_NUM
Endif
MsUnLock()
Next nX
// Grava o Cabealho
dbSelectArea("ZA1")
RecLock( "ZA1", .F. )
For nX := 1 To FCount()
If "FILIAL" $ FieldName( nX )
FieldPut( nX, xFilial("ZA1"))
Else
FieldPut( nX, M->&( Eval( bCampo, nX ) ) )
Endif
Next
MsUnLock()
Endif
// Se for excluso
If nOpc == 5
// Deleta os Itens
dbSelectArea("ZA2")
dbSetOrder(1)
dbSeek(xFilial("ZA2") + M->ZA1_NUM)
While !EOF() .And. ZA2->(ZA2_FILIAL + ZA2_NUM) == xFilial("ZA2") +;
M->ZA1_NUM
RecLock("ZA2")
dbDelete()
MsUnLock()
dbSkip()
End
// Deleta o Cabealho
dbSelectArea("ZA1")
RecLock("ZA1",.F.)
dbDelete()
MsUnLock()
Endif
Return
22.3.2.
Funo Modelo3()
A funo Modelo3) uma interface pr-definida pela Microsiga que implementa de forma
padronizada os compontes necessrios a manipulao de estruturas de dados nas quais o
cabealho e os itens da informao esto em tabelas separadas.
Seu objetivo atuar como um facilitador de codificao, permitindo a utilizao dos recursos
bsicos dos seguintes componentes visuais:
MsDialog()
Enchoice()
EnchoiceBar()
MsNewGetDados()
Parmetros:
cTitulo
cAliasE
cAliasGetD
aCposE
cLinhaOk
cTudoOk
nOpcE
nOpcG
cFieldOk
Ttulo da janela
Alias da tabela que ser utilizada na Enchoice
Alias da tabela que ser utilizada na GetDados
Nome dos campos, pertencentes ao Alias especificado o parmetro cAliasE,
que devero ser exibidos na Enchoice:
AADD(aCposE,{nome_campo})
Funo para validao da linha na GetDados()
Funo para validao na confirmao da tela de interface da Modelo2().
Opo selecionada na MBrowse, ou que deseje ser passada para controle da
Enchoice da Modelo3, aonde:
2 Visualizar
3 - Incluir
4 - Alterar
5 - Excluir
Opo selecionada na MBrowse, ou que deseje ser passada para controle da
GetDados da Modelo3, aonde:
2 Visualizar
3 - Incluir
4 - Alterar
5 - Excluir
Validao dos campos da Enchoice()
- 213 ADVPL Completo
Retorno:
Lgico
#INCLUDE "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRWMOD3| Autor | ARNALDO RAYMUNDO JR. |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | EXEMPLO DE UTILIZACAO DA MODELO3().
|
//+--------------------------------------------------------------------+
//| Uso
| CURSO DE ADVPL
|
//+--------------------------------------------------------------------+
User Function MbrwMod3()
Private cCadastro
:= "Pedidos de Venda"
Private aRotina
:= {}
Private cDelFunc := ".T." // Validacao para a exclusao. Pode-se utilizar
ExecBlock
Private cAlias
:= "SC5"
AADD(aRotina,{
AADD(aRotina,{
AADD(aRotina,{
AADD(aRotina,{
AADD(aRotina,{
"Pesquisa","AxPesqui"
"Visual" ,"U_Mod3All"
"Inclui" ,"U_Mod3All"
"Altera" ,"U_Mod3All"
"Exclui" ,"U_Mod3All"
,0,1})
,0,2})
,0,3})
,0,4})
,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
User Function Mod3All(cAlias,nReg,nOpcx)
Local
Local
Local
Local
Local
Local
Local
Local
cTitulo :=
cAliasE :=
cAliasG :=
cLinOk :=
cTudOk :=
cFieldOk:=
aCposE :=
nUsado, nX
Exemplo (continuao):
//
// Opcoes de acesso para a Modelo 3
//
Do Case
Case nOpcx==3; nOpcE:=3 ; nOpcG:=3
// 3 - "INCLUIR"
Case nOpcx==4; nOpcE:=3 ; nOpcG:=3
// 4 - "ALTERAR"
Case nOpcx==2; nOpcE:=2 ; nOpcG:=2
// 2 - "VISUALIZAR"
Case nOpcx==5; nOpcE:=2 ; nOpcG:=2
// 5 - "EXCLUIR"
EndCase
//
// Cria variaveis M->????? da Enchoice
//
RegToMemory("SC5",(nOpcx==3 .or. nOpcx==4 )) // Se for inclusao ou alteracao
permite alterar o conteudo das variaveis de memoria
//
// 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
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 nOpcx==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
aCols[1,nX]:=CriaVar(aHeader[nX,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 nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
- 215 ADVPL Completo
Exemplo (continuao):
If Len(aCols)>0
//
// Executa a Modelo 3
//
aCposE := {"C5_CLIENTE"}
//
If lRetMod3
Aviso("Modelo3()","Confirmada operacao!",{"Ok"})
Endif
Endif
Return
22.4. Mbrowse()
A Mbrowse() uma funcionalidade de cadastro que permite a utilizao de recursos mais
aprimorados na visualizao e manipulao das informaes do sistema, possuindo os
seguintes componentes:
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros:
nLin1
nCol1
nLin2
nCol2
cAlias
aFixe
[n][1]=>Descrio do campo
[n][2]=>Nome do campo
Arquivos de trabalho
[n][1]=>Descrio do campo
[n][2]=>Nome do campo
[n][3]=>Tipo
[n][4]=>Tamanho
[n][5]=>Decimal
[n][6]=>Picture
Parmetros:
cCpo
nPar08
Parmetro reservado.
cFun
nClickDef
aColors
cTopFun
cBotFun
nPar14
bInitBloc
lNoMnuFilter
lSeeAll
lChgAll
aRotina
Ao definir as funes no array aRotina, se o nome da funo no for especificado com (), a
Mbrowse passar como parmetros as seguintes variveis de controle:
cAlias
nReg
nOpc
Pesquisar
Visualizar
Incluir
Alterar
Excluir
Livre
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWSA1
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Descrio | Exemplo de utilizao da funo MBROWSE()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MBrwSA1()
Local cAlias
:= "SA1"
Private cCadastro
:= "Cadastro de Clientes"
Private aRotina
:= {}
AADD(aRotina,{"Pesquisar"
,"AxPesqui" ,0,1})
AADD(aRotina,{"Visualizar"
,"AxVisual" ,0,2})
AADD(aRotina,{"Incluir" ,"U_Inclui"
,0,3})
Exemplo (continuao):
AADD(aRotina,{"Alterar" ,"AxAltera" ,0,4})
AADD(aRotina,{"Excluir" ,"AxDeleta" ,0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return Nil
/*/
+----------------------------------------------------------------------------| Funo
| INCLUI
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Descrio | Funo de incluso especfica chamando a AXINCLUI()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function Inclui(cAlias, nReg, nOpc)
Local cTudoOk := "(Alert('OK'),.T.)"
Local nOpcao
:= 0
nOpcao := AxInclui(cAlias,nReg,nOpc,,,,cTudoOk)
If nOpcao == 1
MsgInfo(Incluso concluda com sucesso!)
ElseIf
== 2
MsgInfo(Incluso cancelada!)
Endif
Return Nil
22.4.1.
AxFunctions()
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
AXPESQUI()
Sintaxe
AXPESQUI()
Descrio
AXVISUAL()
Sintaxe
Descrio
AXINCLUI()
Sintaxe
Descrio
AXALTERA()
Sintaxe
Descrio
AXDELETA()
Sintaxe
Descrio
22.4.2.
FilBrowse()
Parmetros:
cAlias
aQuery
lShowProc
22.4.3.
EndFilBrw()
Parmetros:
cAlias
aQuery
22.4.4.
PesqBrw()
A PesqBrw() uma funcionalidade que permite a pesquisa dentro da MBrowse(). Esta funo
dever obrigatoriamente substituir a funo AxPesqui, no array do aRotina, sempre que for
utilizada a funo FilBrowse().
Parmetros:
cAlias
nReg
Nmero do registro
Bloco de Cdigo que contm a FilBrowse()
bBrwFilter
22.4.5.
BrwLegenda ()
Parmetros:
cCadastro
cTitulo
aLegenda
Ex: {{Cor,Texto}}
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PINK
BR_PRETO
#Include "Protheus.ch"
/*/
+----------------------------------------------------------------------------| Programa | MBrwSA2
| Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------------| Descrio | Exemplo da MBrowse utilizando a tabela de Cadastro de
|
|
| Fornecedores
|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MBrwSA2()
Local cAlias := "SA2"
Local aCores := {}
Local cFiltra := "A2_FILIAL == '"+xFilial('SA2')+"' .And. A2_EST == 'SP'"
Private
Private
Private
Private
cCadastro :=
aRotina
:=
aIndexSA2 :=
bFiltraBrw:=
"Cadastro de Fornecedores"
{}
{}
{ || FilBrowse(cAlias,@aIndexSA2,@cFiltra) }
AADD(aRotina,{"Pesquisar"
AADD(aRotina,{"Visualizar"
AADD(aRotina,{"Incluir"
AADD(aRotina,{"Alterar"
AADD(aRotina,{"Excluir"
AADD(aRotina,{"Legenda"
,"PesqBrw"
,"AxVisual"
,"U_BInclui"
,"U_BAltera"
,"U_BDeleta"
,"U_BLegenda"
,0,1})
,0,2})
,0,3})
,0,4})
,0,5})
,0,3})
/*
-- CORES DISPONIVEIS PARA LEGENDA -BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PINK
BR_PRETO
*/
AADD(aCores,{"A2_TIPO == 'F'"
AADD(aCores,{"A2_TIPO == 'J'"
AADD(aCores,{"A2_TIPO == 'X'"
AADD(aCores,{"A2_TIPO == 'R'"
AADD(aCores,{"Empty(A2_TIPO)"
,"BR_VERDE"
,"BR_AMARELO"
,"BR_LARANJA"
,"BR_MARRON"
,"BR_PRETO"
})
})
})
})
})
dbSelectArea(cAlias)
dbSetOrder(1)
Exemplo (continuao):
//+-----------------------------------------------------------//| Cria o filtro na MBrowse utilizando a funo FilBrowse
//+-----------------------------------------------------------Eval(bFiltraBrw)
dbSelectArea(cAlias)
dbGoTop()
mBrowse(6,1,22,75,cAlias,,,,,,aCores)
//+-----------------------------------------------//| Deleta o filtro utilizado na funo FilBrowse
//+-----------------------------------------------EndFilBrw(cAlias,aIndexSA2)
Return Nil
//+--------------------------------------//|Funo: BInclui - Rotina de Incluso
//+--------------------------------------User Function BInclui(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxInclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Incluso efetuada com sucesso!")
Else
MsgInfo("Incluso cancelada!")
Endif
Return Nil
//+----------------------------------------//|Funo: BAltera - Rotina de Alterao
//+----------------------------------------User Function BAltera(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Alterao efetuada com sucesso!")
Else
MsgInfo("Alterao cancelada!")
Endif
Return Nil
Exemplo (continuao):
//+----------------------------------------//|Funo: BDeleta - Rotina de Excluso
//+----------------------------------------User Function BDeleta(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxDeleta(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Excluso efetuada com sucesso!")
Else
MsgInfo("Excluso cancelada!")
Endif
Return Nil
//+------------------------------------------//|Funo: BLegenda - Rotina de Legenda
//+------------------------------------------User Function BLegenda()
Local aLegenda := {}
AADD(aLegenda,{"BR_VERDE"
AADD(aLegenda,{"BR_AMARELO"
AADD(aLegenda,{"BR_LARANJA"
AADD(aLegenda,{"BR_MARRON"
AADD(aLegenda,{"BR_PRETO"
,"Pessoa Fsica" })
,"Pessoa Jurdica"
,"Exportao"
,"Fornecedor Rural"
,"No Classificado"
})
})
})
})
22.5. MarkBrowse()
A funo MarkBrow() permite que os elementos de um browse, sejam marcados ou
desmarcados. Para utilizao da MarkBrow() necessrio declarar as variveis cCadastro e
aRotina como Private, antes da chamada da funo.
Parmetros:
cAlias
cCampo
cCpo
aCampos
[n][1]
[n][2]
[n][3]
[n][4]
lInvert
Inverte a marcao.
cMarca
cCtrlM
uPar8
Parmetro reservado.
cExpIni
cExpFim
nome do campo;
- Nulo (Nil);
- Ttulo do campo;
- Mscara (picture).
cAval
bParBloco
Ao definir as funes no array aRotina, se o nome da funo no for especificado com (), a
MarkBrowse passar como parmetros as seguintes variveis de controle:
cAlias
nReg
nOpc
cMarca
lInverte
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Programa | MkBrwSA1 | Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Desc.
| MarkBrowse Genrico
|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
USER FUNCTION MkBrwSA1()
Local
Local
Local
Local
aCpos
aCampos
nI
cAlias
:= {}
:= {}
:= 0
:= "SA1"
Private aRotina
:= {}
Private cCadastro
:= "Cadastro de Clientes"
Private aRecSel
:= {}
AADD(aRotina,{"Pesquisar"
,"AxPesqui" ,0,1})
AADD(aRotina,{"Visualizar"
,"AxVisual" ,0,2})
AADD(aRotina,{"Incluir"
,"AxInclui"
,0,3})
AADD(aRotina,{"Alterar"
,"AxAltera" ,0,4})
AADD(aRotina,{"Excluir"
,"AxDeleta" ,0,5})
AADD(aRotina,{"Visualizar Lote"
,"U_VisLote"
,0,5})
AADD(aCpos,
AADD(aCpos,
AADD(aCpos,
AADD(aCpos,
AADD(aCpos,
AADD(aCpos,
"A1_OK"
"A1_FILIAL"
"A1_COD"
"A1_LOJA"
"A1_NOME"
"A1_TIPO"
)
)
)
)
)
)
dbSelectArea("SX3")
dbSetOrder(2)
For nI := 1 To Len(aCpos)
IF dbSeek(aCpos[nI])
AADD(aCampos,{X3_CAMPO,"",IIF(nI==1,"",Trim(X3_TITULO)),;
Trim(X3_PICTURE)})
ENDIF
Next
DbSelectArea(cAlias)
DbSetOrder(1)
MarkBrow(cAlias,aCpos[1],"A1_TIPO == ' '",aCampos,.F.,GetMark(,"SA1","A1_OK"))
Return Nil
/*/
+----------------------------------------------------------------------------| Programa | VisLote()
| Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Desc.
| Funo utilizada para demonstrar o uso do recurso da MarkBrowse|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
USER FUNCTION VisLote()
Local cMarca
:= ThisMark()
Local nX
:= 0
Local lInvert
:= ThisInv()
Local cTexto
:= ""
Local cEOL := CHR(10)+CHR(13)
Local oDlg
Local oMemo
DbSelectArea("SA1")
DbGoTop()
While SA1->(!EOF())
// IsMark("A1_OK", cMarca, lInverte)
IF SA1->A1_OK == cMarca .AND. !lInvert
AADD(aRecSel,{SA1->(Recno()),SA1->A1_COD, SA1->A1_LOJA, SA1->A1_NREDUZ})
ELSEIF SA1->A1_OK != cMarca .AND. lInvert
AADD(aRecSel,{SA1->(Recno()),SA1->A1_COD,SA1->A1_LOJA, SA1->A1_NREDUZ})
ENDIF
SA1->(dbSkip())
Enddo
IF Len(aRecSel) > 0
cTexto := "Cdigo | Loja | Nome Reduzido
"+cEol
//
"1234567890123456789012345678901234567890
//
"CCCCCC | LL | NNNNNNNNNNNNNNNNNNNN +cEol
For nX := 1 to Len(aRecSel)
cTexto += aRecSel[nX][2]+Space(1)+ "|"+Space(2) +
aRecSel[nX][3]+Space(3)+"|"
cTexto += Space(1)+SUBSTRING(aRecSel[nX][4],1,20)+Space(1)
cTexto += cEOL
Next nX
DEFINE MSDIALOG oDlg TITLE "Clientes Selecionados" From 000,000 TO 350,400
PIXEL
@ 005,005 GET oMemo VAR cTexto MEMO SIZE 150,150 OF oDlg PIXEL
oMemo:bRClicked := {||AllwaysTrue()}
DEFINE SBUTTON FROM 005,165 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg PIXEL
ACTIVATE MSDIALOG oDlg CENTER
LimpaMarca()
ENDIF
RETURN
/*/
+----------------------------------------------------------------------------| Programa | LimpaMarca | Autor | ARNALDO RAYMUNDO JR. | Data |
|
+----------------------------------------------------------------------------| Desc.
| Funo utilizada para demonstrar o uso do recurso da MarkBrowse|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
STATIC FUNCTION LimpaMarca()
Local nX := 0
For nX := 1 to Len(aRecSel)
SA1->(DbGoto(aRecSel[nX][1]))
RecLock("SA1",.F.)
SA1->A1_OK := SPACE(2)
MsUnLock()
Next nX
RETURN
23.
CriaTrab()
A CriaTrab() uma funcionalidade que permite criar um arquivo fsico ou gerar um nome
aleatrio.
Parmetros
aCampo
lCriar
cExt
23.2.2.
dbUseArea()
A dbUseArea() uma funcionalidade que permite definir um arquivo de base de dados, com
uma rea de trabalho disponvel na aplicao.
Parmetros
lNewArea
cDriver
cName
cAlias
lShared
lReadOnly
23.2.3.
IndRegua()
A IndRegua() uma funcionalidade que permite criar ndices temporrios para o alias
especificado, podendo ou no ter um filtro.
Parmetros
cAlias
cNIndex
cExpress
xOrdem
Parmetro nulo
cFor
cMens
Parmetro nulo
lShow
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Programa | GeraTrab | Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Desc.
| Utilizao de arquivos e ndices temporrios
|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GeraTrab()
Local
Local
Local
Local
Local
aStru
aArqTRB
nI
cIndTRB
cNomArq
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
AADD(
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
aStru,
:=
:=
:=
:=
:=
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{
{}
{}
0
""
""
"PRODUTO"
"DESCRICAO"
"GRUPO"
"DESCGRUPO"
"TIPO"
"DESCTIPO"
"CC"
"DESC_CC"
"SERIE"
"DOCTO"
"TIPONOTA"
"EMISSAO"
"CLIENTE"
"LOJA"
"NOME"
"QTDE"
"UNIT"
"TOTAL"
"ALIQICMS"
"VALICMS"
"ALIQIPI"
"VALIPI"
"VALMERC"
"TOTSEMICMS"
"VALPIS"
"LIQUIDO"
"CUSTO"
,"B1_COD"
,"B1_DESC"
,"BM_GRUPO"
,"BM_DESC"
,"B1_TIPO"
,"B1_DESC"
,"CTT_CC"
,"CTT_DESC"
,"D2_SERIE"
,"D2_COD"
,"D2_TP"
,"D2_EMISSAO"
,"D2_CLIENTE"
,"D2_LOJA"
,"A1_NOME"
,"D2_QUANT"
,"D2_PRCVEN"
,"D2_TOTAL"
,"D2_PICM"
,"D2_VALICM"
,"D2_IPI"
,"D2_VALIPI"
,"D2_TOTAL"
,"D2_TOTAL"
,"D2_TOTAL"
,"D2_TOTAL"
,"D2_TOTAL"
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
)
dbSelectArea("SX3")
dbSetOrder(2)
For nI := 1 To Len( aStru )
dbSeek( aStru[nI,2] )
AADD( aArqTRB, { aStru[nI,1], X3_TIPO, X3_TAMANHO, X3_DECIMAL } )
Next nI
Exemplo (continuao):
// ndice que ser criado
cIndTRB := "PRODUTO+DTOS(EMISSAO)"
cNomArq := CriaTrab( aArqTRB, .T. )
dbUseArea( .T., "DBFCDX", cNomArq, "TRB", .T. ,.T. )
IndRegua( "TRB", cNomArq, cIndTRB )
dbSetOrder(1)
// ( ... ) fazer o processamento necessrio
dbSelectArea("TRB")
dbCloseArea()
If MsgYesNo("Apagar o arquivo gerado \system\"+cNomArq+".dbf ?",FunName())
Ferase(cNomArq+".dbf")
Ferase(cNomArq+OrdBagExt())
Endif
Return Nil
O array aStru foi criado com base nos campos existentes no sistema,
ao invs de criarmos novas estruturas dos campos, utilizamos as j
existentes no dicionrios de dados (SX3).
/*/
+----------------------------------------------------------------------------| Programa | IndTwoReg | Autor | MICHEL DANTAS
| Data |
|
+----------------------------------------------------------------------------| Desc.
| Utilizao de dois ndices temporrios com DBFCDX
|
+----------------------------------------------------------------------------| Uso
| Curso de ADVPL
|
+----------------------------------------------------------------------------/*/
User Function IndTwoReg()
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
nOrder
cArq1
cChave1
cArq2
cChave2
:=
:=
:=
:=
:=
0
CriaTrab(NIL,.F.)
"A1_FILIAL+A1_EST"
CriaTrab(NIL,.F.)
"A1_FILIAL+A1_NOME"
dbSelectArea("SA1")
IndRegua("SA1",cArq1,cChave1,,,"Selecionando Regs...")
IndRegua("SA1",cArq2,cChave2,,,"Selecionando Regs...")
nOrder := RetIndex("SA1")
dbSetIndex(cArq1+OrdBagExt())
dbSetIndex(cArq2+OrdBagExt())
Alert("Agora vai por estado")
dbsetOrder(nOrder+1)
dbGoTop()
While !Eof()
Alert("Estado : " + SA1->A1_EST +"
dbSkip()
End
"+" Nome
: " + SA1->A1_NOME)
"+" Nome
: " + SA1->A1_NOME)
24.
Relatrios no grficos
24.1.1.
Neste tpico ser demonstrada a construo de relatrio no grfico baseado no uso da funo
SetPrint() o qual atende os formatos de base de dados ISAM e Topconnect, porm no
contemplando a tecnologia Protheus Embedded SQL.
Estrutura do programa
Linhas
1
2
3
4
5
6
7
8
9
Programa
Funo principal;
Declarao e atribuio de variveis;
Atualizao do arquivo de perguntas atravs da funo especfica CriaSX1();
Definio as perguntas atravs da funo Pergunte();
Definio das ordens disponveis para impresso do relatrio;
Chamada da funo SetPrint;
Atualizao das configuraes de impresso com a funo SetDefault();
Execuo da rotina de impresso atravs da funo RptStatus()
Fim da funo principal.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
25
26
Funo Principal
//+-----------------------------------------------------------------+
//| Rotina | Inform | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para gerar relatrio utilizando as funes
|
//|
| SetPrint() e SetDefault().
|
//+-----------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+-----------------------------------------------------------------+
User Function INFORM()
//+------------------------//| Declaraes de variveis
//+------------------------Local cDesc1
conforme"
Local cDesc2
Local cDesc3
Continuao:
- 239 ADVPL Completo
VENCTO"
SALDO "
AADD(
AADD(
AADD(
AADD(
AADD(
aOrd,
aOrd,
aOrd,
aOrd,
aOrd,
"Fornecedor"
"Titulo"
"Emisso"
"Vencimento"
"Vencto. Real"
)
)
)
)
)
//+-----------------------------------------------------------------+
//| Rotina | ImpRel | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina de processamento e impresso.
|
//+-----------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+-----------------------------------------------------------------+
Static Function ImpRel(lEnd)
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
nIndice := 0
cArq := ""
cIndice := ""
cFiltro := ""
aCol := {}
cFornec := ""
nValor := 0
nPago := 0
nSaldo := 0
nT_Valor := 0
nT_Pago := 0
nT_Saldo := 0
cArqExcel := ""
cAliasImp
oExcelApp
Titulo += aOrd[aReturn[8]]
#IFNDEF TOP
cAliasImp := "SE2"
cFiltro
cFiltro
cFiltro
cFiltro
cFiltro
cFiltro
cFiltro
:=
+=
+=
+=
+=
+=
+=
If aReturn[8] == 1 //Fornecedor
cIndice := "E2_FORNECE+E2_LOJA+E2_NUM"
Elseif aReturn[8] == 2 //Titulo
cIndice := "E2_NUM+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 3 //Emissao
Continuao:
cIndice := "Dtos(E2_EMISSAO)+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 4 //Vencimento
cIndice := "Dtos(E2_VENCTO)+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 5 //Vencimento Real
cIndice := "Dtos(E2_VENCREA)+E2_FORNECE+E2_LOJA"
Endif
cArq := CriaTrab(NIL,.F.)
dbSelectArea(cAliasImp)
IndRegua(cAliasImp,cArq,cIndice,,cFiltro)
nIndice := RetIndex()
nIndice := nIndice + 1
dbSetIndex(cArq+OrdBagExt())
dbSetOrder(nIndice)
#ELSE
cAliasImp := GetNextAlias()
cQuery := "SELECT "
cQuery += "E2_PREFIXO, E2_NUM, E2_PARCELA, E2_TIPO, E2_FORNECE, E2_LOJA,
E2_NOMFOR, "
cQuery += "E2_EMISSAO, E2_VENCTO, E2_VENCREA, E2_VALOR, E2_SALDO "
cQuery += "FROM "+RetSqlName("SE2")+" "
cQuery += "WHERE E2_FILIAL = '"+xFilial("SE2")+"' "
cQuery += "AND E2_FORNECE >= '"+mv_par01+"' "
cQuery += "AND E2_FORNECE <= '"+mv_par02+"' "
cQuery += "AND E2_TIPO >= '"+mv_par03+"' "
cQuery += "AND E2_TIPO <= '"+mv_par04+"' "
cQuery += "AND E2_VENCTO >= '"+Dtos(mv_par05)+"' "
cQuery += "AND E2_VENCTO <= '"+Dtos(mv_par06)+"' "
cQuery += "AND D_E_L_E_T_ <> '*' "
cQuery += "ORDER BY "
If aReturn[8] == 1 //Fornecedor
cQuery += "E2_FORNECE,E2_LOJA,E2_NUM"
Elseif aReturn[8] == 2 //Titulo
cQuery += "E2_NUM,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 3 //Emissao
cQuery += "E2_EMISSAO,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 4 //Vencimento
cQuery += "E2_VENCTO,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 5 //Vencimento Real
cQuery += "E2_VENCREA,E2_FORNECE,E2_LOJA"
Endif
dbUseArea( .T., "TOPCONN", TcGenQry(,,cQuery), cAliasImp, .T., .F. )
dbSelectArea(cAliasImp)
/* Instruo SQL Embedded
---------------------If aReturn[8] == 1 //Fornecedor
cOrder := "E2_FORNECE,E2_LOJA,E2_NUM"
Elseif aReturn[8] == 2 //Titulo
cOrder := "E2_NUM,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 3 //Emissao
cOrder := "E2_EMISSAO,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 4 //Vencimento
cOrder := "E2_VENCTO,E2_FORNECE,E2_LOJA"
Continuao:
- 242 ADVPL Completo
Date
Date
Date
Numeric(12)
Numeric(12)
SELECT
E2_PREFIXO, E2_NUM, E2_PARCELA, E2_TIPO, E2_FORNECE,
E2_LOJA, E2_NOMFOR, E2_EMISSAO, E2_VENCTO, E2_VENCREA, E2_VALOR,
E2_SALDO
FROM
%Table:SE2
WHERE
E2_FILIAL = %xFilial% AND
E2_FORNECE BETWEEN %Exp:mv_par01% AND %Exp:mv_par02% AND
E2_TIPO BETWEEN%Exp:mv_par03% AND %Exp:mv_par04% AND
E2_VENCTO BETWEEN %Exp:mv_par05% AND %Exp:mv_par06% AND
%NotDel%
ORDER BY %Order:cOrder%
EndSQL
*/
#ENDIF
dbGoTop()
SetRegua(0)
//+-------------------//| Coluna de impresso
//+-------------------AADD( aCol, 004 ) //Prefixo
AADD( aCol, 012 ) //Titulo
AADD( aCol, 024 ) //Parcela
AADD( aCol, 031 ) //Tipo
AADD( aCol, 036 ) //Emissao
AADD( aCol, 046 ) //Vencimento
AADD( aCol, 058 ) //Vencimento Real
AADD( aCol, 070 ) //Valor Original
AADD( aCol, 090 ) //Pago
AADD( aCol, 110 ) //Saldo
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
While !Eof() .And. !lEnd
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
Continuao:
- 243 ADVPL Completo
:=
:=
:=
:=
Replicate("-",Limite)
PSay
PSay
PSay
PSay
"TOTAL....."
nValor PICTURE "@E 99,999,999,999.99"
nPago PICTURE "@E 99,999,999,999.99"
nSaldo PICTURE "@E 99,999,999,999.99"
(cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
0
0
0
End
Continuao:
- 244 ADVPL Completo
If lEnd
@ Li, aCol[1] PSay cCancel
Return
Endif
@ Li,
Li ++
@ Li,
@ Li,
@ Li,
@ Li,
PSay
PSay
PSay
PSay
"TOTAL GERAL....."
nT_Valor PICTURE "@E 99,999,999,999.99"
nT_Pago PICTURE "@E 99,999,999,999.99"
nT_Saldo PICTURE "@E 99,999,999,999.99"
If Li <> 80
Roda(cbCont,cbTxt,Tamanho)
Endif
//+---------------------------------------------------------------------//| Gera arquivo do tipo .DBF com extenso .XLS p/ usurio abrir no Excel
//+---------------------------------------------------------------------cArqExcel := __RELDIR+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS"
Copy To &cArqExcel
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
dbCloseArea()
#ENDIF
dbSetOrder(1)
dbGoTop()
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
//+-----------------------//| Abrir planilha MS-Excel
//+-----------------------If mv_par08 == 1
__CopyFile(cArqExcel,"c:\"+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS")
If ! ApOleClient("MsExcel")
MsgAlert("MsExcel no instalado")
Return
Endif
oExcelApp := MsExcel():New()
oExcelApp:WorkBooks:Open( "c:\"+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS" )
oExcelApp:SetVisible(.T.)
Endif
Ms_Flush()
Return
//+-----------------------------------------------------------------+
//| Rotina | CriaSX1 | Autor | Robson Luiz (rleg)| Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para criar o grupo de parmetros.
|
//+-----------------------------------------------------------------+
//| Uso
| Para treinamento e capacitao.
|
//+-----------------------------------------------------------------+
Static Function CriaSx1()
Local aP := {}
Local i := 0
Local cSeq
Local cMvCh
Local cMvPar
Local aHelp := {}
/******
Parmetros da funo padro
--------------------------PutSX1(cGrupo,;cOrdem,;
cPergunt,cPerSpa,cPerEng,;
cVar,;
cTipo,;
nTamanho,;
nDecimal,;
nPresel,;
cGSC,;
cValid,;
cF3,;
cGrpSxg,;
cPyme,;
cVar01,;
cDef01,cDefSpa1,cDefEng1,;
cCnt01,;
cDef02,cDefSpa2,cDefEng2,;
cDef03,cDefSpa3,cDefEng3,;
cDef04,cDefSpa4,cDefEng4,;
cDef05,cDefSpa5,cDefEng5,;
aHelpPor,aHelpEng,aHelpSpa,;
cHelp)
Caracterstica do vetor p/ utilizao da funo SX1
--------------------------------------------------[n,1] --> texto da pergunta
[n,2] --> tipo do dado
[n,3] --> tamanho
[n,4] --> decimal
[n,5] --> objeto G=get ou C=choice
[n,6] --> validao
[n,7] --> F3
[n,8] --> definio 1
[n,9] --> definio 2
[n,10] -> definio 3
[n,11] -> definio 4
[n,12] -> definio 5
***/
Continuao:
AADD(aP,{"Fornecedor de","C",6,0,"G","","SA2",""
,""
,"","",""})
AADD(aP,{"Fornecedor ate","C",6,0,"G","(mv_par02>=mv_par01)","SA2",;
""
,""
,"","",""})
AADD(aP,{"Tipo de","C",3,0,"G","","05" ,""
,""
,"","",""})
AADD(aP,{"Tipo ate","C",3,0,"G","(mv_par04>=mv_par03)","05" ,""
,;
""
,"","",""})
AADD(aP,{"Vencimento de","D",8,0,"G","",""
,""
,""
,"","",""})
AADD(aP,{"Vencimento ate","D",8,0,"G","(mv_par06>=mv_par05)",""
,;
""
,""
,"","",""})
AADD(aP,{"Aglutinar pagto.de fornec.","N",1,0,"C","","",;
"Sim","No","","",""})
AADD(aP,{"Abrir planilha MS-Excel"
,"N",1,0,"C","","",;
"Sim","No","","",""})
AADD(aHelp,{"Informe o cdigo do fornecedor.","inicial."})
AADD(aHelp,{"Informe o cdigo do fornecedor.","final."})
AADD(aHelp,{"Tipo de ttulo inicial."})
AADD(aHelp,{"Tipo de ttulo final."})
AADD(aHelp,{"Digite a data do vencimento inicial."})
AADD(aHelp,{"Digite a data do vencimento final."})
AADD(aHelp,{"Aglutinar os ttulos do mesmo forne-",;
"cedor totalizando seus valores."})
AADD(aHelp,{"Ser gerada uma planilha para ",;
"MS-Excel, abrir esta planilha?"})
For i:=1 To Len(aP)
cSeq
:= StrZero(i,2,0)
cMvPar := "mv_par"+cSeq
cMvCh := "mv_ch"+IIF(i<=9,Chr(i+48),Chr(i+87))
PutSx1(cPerg,;
cSeq,;
aP[i,1],aP[i,1],aP[i,1],;
cMvCh,;
aP[i,2],;
aP[i,3],;
aP[i,4],;
0,;
aP[i,5],;
aP[i,6],;
aP[i,7],;
"",;
"",;
cMvPar,;
aP[i,8],aP[i,8],aP[i,8],;
"",;
aP[i,9],aP[i,9],aP[i,9],;
aP[i,10],aP[i,10],aP[i,10],;
aP[i,11],aP[i,11],aP[i,11],;
aP[i,12],aP[i,12],aP[i,12],;
aHelp[i],;
{},;
{},;
"")
Next i
Return
25.
Manipulao de arquivos I
FWrite(),
FClose(),
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Programa | GeraTXT
| Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------------| Descrio | Gera o arquivo TXT, a partir do Cadastro de Clientes
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GeraTXT()
//+--------------------------------+
//| Declarao de Variveis
|
//+--------------------------------+
Local oGeraTxt
Private cPerg
:= "EXPSA1"
Private cAlias
:= "SA1"
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
dbSelectArea(cAlias)
dbSetOrder(1)
//+-----------------------------------+
//| Montagem da tela de processamento.|
//+-----------------------------------+
DEFINE MSDIALOG oGeraTxt TITLE OemToAnsi("Gerao de Arquivo Texto") ;
FROM 000,000 TO 200,400 PIXEL
@ 005,005 TO 095,195 OF oGeraTxt PIXEL
@ 010,020 Say " Este programa ira gerar um arquivo texto, conforme os parame- ";
OF oGeraTxt PIXEL
@ 018,020 Say " tros definidos pelo usurio, com os registros do arquivo de ";
OF oGeraTxt PIXEL
@ 026,020 Say " SA1 " OF oGeraTxt PIXEL
DEFINE SBUTTON FROM 070, 030 TYPE 1 ;
ACTION (OkGeraTxt(),oGeraTxt:End()) ENABLE OF oGeraTxt
DEFINE SBUTTON FROM 070, 070 TYPE 2 ;
ACTION (oGeraTxt:End()) ENABLE OF oGeraTxt
DEFINE SBUTTON FROM 070, 110 TYPE 5 ;
ACTION (Pergunte(cPerg,.T.)) ENABLE OF oGeraTxt
ACTIVATE DIALOG oGeraTxt CENTERED
Return Nil
Exemplo (continuao):
/*/
+----------------------------------------------------------------------------| Funo
| OKGERATXT | Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------------| Descrio | Funo chamada pelo boto OK na tela inicial de processamento. |
|
| Executa a gerao do arquivo texto.
|
+----------------------------------------------------------------------------/*/
Static Function OkGeraTxt
//+----------------------------------------------------------------------------//| Cria o arquivo texto
//+----------------------------------------------------------------------------Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl
:= fCreate(cArqTxt)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser executado! Verifique os
parmetros.","Ateno!")
Return
Endif
Exemplo (continuao):
//+-------------------------------------------------------------------+
//| Gravao no arquivo texto. Testa por erros durante a gravao da |
//| linha montada.
|
//+-------------------------------------------------------------------+
If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin)
If !MsgAlert("Ocorreu um erro na gravao do arquivo."+;
"Continua?","Ateno!")
Exit
Endif
Endif
(cAlias)->(dbSkip())
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na funo
anterior
fClose(nHdl)
Return Nil
Note que para a gerao do arquivo TXT foram utilizadas, basicamente, as funes
FCreate, FWrite e FClose que, respectivamente, gera o arquivo, adiciona dados e fecha
o arquivo.
No exemplo, o formato estabelecido pela concatenao dos dados na
varivel cLin a qual utilizada na gravao dos dados. Para a leitura de dados TXT sero
utilizada as funes FOpen e FRead.
Exemplo: Leitura de arquivo TXT, utilizando a primeira famlia de funes
#Include "protheus.ch"
/*/
+----------------------------------------------------------------------| Programa | LeTXT
| Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------| Descrio | Leitura de arquivo TXT
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function LeTXT()
//+-------------------------------------------------------------------+
//| Declarao de Variveis
|
//+-------------------------------------------------------------------+
Local cPerg := "IMPSA1"
Local oLeTxt
Private cAlias := "SA1"
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
Exemplo (continuao):
dbSelectArea(cAlias)
dbSetOrder(1)
//+-------------------------------------------------------------------+
// Montagem da tela de processamento
|
//+-------------------------------------------------------------------+
DEFINE MSDIALOG oLeTxt TITLE OemToAnsi("Leitura de Arquivo Texto");
FROM 000,000 TO 200,400 PIXEL
@ 005,005 TO 095,195 OF oLeTxt PIXEL
@ 10,020 Say " Este programa ira ler o contedo de um arquivo texto, conforme";
OF oLeTxt PIXEL
@ 18,020 Say " os parmetros definidos pelo usurio, com os registros do
arquivo";
OF oLeTxt PIXEL
@ 26,020 Say " SA1" OF oLeTxt PIXEL
DEFINE SBUTTON FROM 070, 030 TYPE 1 ;
ACTION (OkLeTxt(),oLeTxt:End()) ENABLE OF oLeTxt
DEFINE SBUTTON FROM 070, 070 TYPE 2 ;
ACTION (oLeTxt:End()) ENABLE OF oLeTxt
DEFINE SBUTTON FROM 070, 110 TYPE 5 ;
ACTION (Pergunte(cPerg,.T.)) ENABLE OF oLeTxt
ACTIVATE DIALOG oLeTxt CENTERED
Return Nil
/*/
+----------------------------------------------------------------------------| Funo
| OKLETXT
| Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------------| Descrio | Funo chamada pelo boto OK na tela inicial de processamento |
|
| Executa a leitura do arquivo texto
|
+----------------------------------------------------------------------------/*/
Static Function OkLeTxt()
//+-------------------------------------------------------------------+
//| Abertura do arquivo texto
|
//+-------------------------------------------------------------------+
Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl
:= fOpen(cArqTxt,68)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser aberto! Verifique os
parmetros.","Ateno!")
Return
Endif
// Inicializa a rgua de processamento
Processa({|| RunCont() },"Processando...")
Return Nil
Exemplo (continuao):
/*/
+----------------------------------------------------------------------------| Funo
| RUNCONT
| Autor | SERGIO FUZINAKA | Data |
|
+----------------------------------------------------------------------------| Descrio | Funo auxiliar chamada pela PROCESSA. A funo PROCESSA
|
|
| monta a janela com a rgua de processamento.
|
+----------------------------------------------------------------------------/*/
Static Function RunCont
Local
Local
Local
Local
Local
Local
Local
nTamFile
nTamLin
cBuffer
nBtLidos
cFilSA1
cCodSA1
cLojaSA1
:= 0
:= 56
:= ""
:= 0
:= ""
:= ""
:= ""
//1234567890123456789012345678901234567890123456789012345678901234567890
//00000000010000000002000000000300000000040000000005000000000600000000070
//FFCCCCCCLLNNNNNNNNNNNNNNNNNNNNVVVVVVVVVVVVVVVVDDDDDDDD
//A1_FILIAL
- 01, 02 - TAM: 02
//A1_COD
- 03, 08 - TAM: 06
//A1_LOJA
- 09, 10 - TAM: 02
//A1_NREDUZ - 11, 30 - TAM: 20
//A1_MCOMPRA
- 31, 46 - TAM: 14,2
//A1_ULTCOM - 47, 54 - TAM: 08
nTamFile := fSeek(nHdl,0,2)
fSeek(nHdl,0,0)
cBuffer := Space(nTamLin) // Varivel para criao da linha do registro para
leitura
ProcRegua(nTamFile) // Numero de registros a processar
While nBtLidos < nTamFile
//Incrementa a rgua
IncProc()
// Leitura da primeira linha do arquivo texto
nBtLidos += fRead(nHdl,@cBuffer,nTamLin)
cFilSA1
cCodSA1
cLojaSA1
While .T.
IF dbSeek(cFilSA1+cCodSA1+cLojaSA1)
cCodSA1 := SOMA1(cCodSA1)
Loop
Else
Exit
Endif
Enddo
Exemplo (continuao):
dbSelectArea(cAlias)
RecLock(cAlias,.T.)
(cAlias)->A1_FILIAL
(cAlias)->A1_COD
(cAlias)->A1_LOJA
(cAlias)->A1_NREDUZ
//- 11, 30 - TAM: 20
(cAlias)->A1_MCOMPRA
//- 31, 46 - TAM: 14,2
(cAlias)->A1_ULTCOM
//- 47, 54 - TAM: 08
MSUnLock()
:=
:=
:=
:=
:= Val(Substr(cBuffer,31,16))/100
:= STOD(Substr(cBuffer,47,08))
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na funo
anterior.
fClose(nHdl)
Return Nil
#Include "Protheus.ch"
/*/
+----------------------------------------------------------------------------| Programa | LeArqTXT | Autor | Robson Luiz
| Data |
|
+----------------------------------------------------------------------------| Descrio | Leitura de arquivo TXT
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function LeArqTxt()
Private
Private
Private
Private
nOpc
cCadastro
aSay
aButton
:=
:=
:=
:=
0
"Ler arquivo texto"
{}
{}
AADD( aSay, "O objetivo desta rotina e efetuar a leitura em um arquivo texto" )
AADD( aButton, { 1,.T.,{|| nOpc := 1,FechaBatch()}})
AADD( aButton, { 2,.T.,{|| FechaBatch() }} )
FormBatch( cCadastro, aSay, aButton )
If nOpc == 1
Processa( {|| Import() }, "Processando..." )
Endif
Return Nil
- 254 ADVPL Completo
Exemplo (continuao):
//+------------------------------------------//| Funo - Import()
//+------------------------------------------Static Function Import()
Local
Local
Local
Local
cBuffer
cFileOpen
cTitulo1
cExtens
:=
:=
:=
:=
""
""
"Selecione o arquivo"
"Arquivo TXT | *.txt"
/***
* _________________________________________________________
* cGetFile(<ExpC1>,<ExpC2>,<ExpN1>,<ExpC3>,<ExpL1>,<ExpN2>)
*
* <ExpC1> - Expresso de filtro
* <ExpC2> - Titulo da janela
* <ExpN1> - Numero de mascara default 1 para *.Exe
* <ExpC3> - Diretrio inicial se necessrio
* <ExpL1> - .F. boto salvar - .T. boto abrir
* <ExpN2> - Mascara de bits para escolher as opes de visualizao do objeto
* (prconst.ch)
*/
cFileOpen := cGetFile(cExtens,cTitulo1,,cMainPath,.T.)
If !File(cFileOpen)
MsgAlert("Arquivo texto: "+cFileOpen+" no localizado",cCadastro)
Return
Endif
FT_FUSE(cFileOpen) //ABRIR
FT_FGOTOP() //PONTO NO TOPO
ProcRegua(FT_FLASTREC()) //QTOS REGISTROS LER
While !FT_FEOF()
IncProc()
// Capturar dados
cBuffer := FT_FREADLN() //LENDO LINHA
cMsg
cMsg
cMsg
cMsg
cMsg
cMsg
:=
+=
+=
+=
+=
+=
"Filial: "
+SubStr(cBuffer,01,02) +
"Cdigo: "
+SubStr(cBuffer,03,06) +
"Loja: "
+SubStr(cBuffer,09,02) +
"Nome fantasia: " +SubStr(cBuffer,11,15) +
"Valor: "
+SubStr(cBuffer,26,14) +
"Data: "
+SubStr(cBuffer,40,08) +
MsgInfo(cMsg)
FT_FSKIP()
EndDo
Chr(13)+Chr(10)
Chr(13)+Chr(10)
Chr(13)+Chr(10)
Chr(13)+Chr(10)
Chr(13)+Chr(10)
Chr(13)+Chr(10)
26.
Oficina de programao I
BUTTON()
CHECKBOX()
COMBOBOX()
FOLDER()
MSDIALOG()
MSGET()
- 256 ADVPL Completo
RADIO()
SAY()
SBUTTON()
BUTTON()
Sintaxe
Descrio
CHECKBOX()
Sintaxe
Descrio
COMBOBOX()
Sintaxe
Descrio
FOLDER()
Sintaxe
Descrio
MSDIALOG()
Sintaxe
Descrio
MSGET()
Sintaxe
Descrio
RADIO()
Sintaxe
Descrio
SAY()
Sintaxe
Descrio
SBUTTON()
Sintaxe
Descrio
RPTSTATUS()
PROCESSA()
MSNEWPROCESS()
MSAGUARDE()
MSGRUN()
26.2.1.
RptStatus()
Retorno: Nil
Parmetros:
bAcao
cMensagem
Aparncia
/*/
+--------------------------------------------------------------------------| Funo
| GRPTSTATUS | Autor | ROBSON LUIZ
| Data |
|
+--------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao das funes RPTSTATUS() |
|
| SETREGUA() E INCREGUA()
|
+--------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+--------------------------------------------------------------------------/*/
User Function
Local aSay
Local aButton
Local nOpc
Local cTitulo
Local cDesc1
conjunto"
Local cDesc2
GRptStatus()
:= {}
:= {}
:= 0
:= "Exemplo de Funes"
:= "Este programa exemplifica a utilizao da funo Processa() em
:= "com as funes de incremento ProcRegua() e IncProc()"
/*/
+----------------------------------------------------------------------------| Funo
| RUNPROC
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Funo de processamento executada atravs da
RPTSTATUS()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
SETREGUA()
A funo SetRegua() utilizada para definir o valor mximo da rgua de progresso criada
atravs da funo RptStatus().
Sintaxe: SetRegua(nMaxProc)
Parmetros:
nMaxProc
Retorno:
Nenhum
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetRegua(LastRec())
While !Eof()
IncRegua()
If Li > 60
...
INCREGUA()
A funo IncRegua() utilizada para incrementar valor na rgua de progresso criada atravs
da funo RptStatus()
Sintaxe: IncRegua(cMensagem)
Parmetros:
cMensagem
Retorno:
Nenhum
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetRegua(LastRec())
While !Eof()
IncRegua(Avaliando cliente:+SA1->A1_COD)
If Li > 60
...
26.2.2.
Processa()
Retorno: Nil
Parmetros:
bAcao
cMensagem
Aparncia
/*/
+----------------------------------------------------------------------------| Funo
| GPROCES1
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao das funes PROCESSA()
|
|
| PROCREGUA() E INCPROC()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function
Local aSay
Local aButton
Local nOpc
Local cTitulo
Local cDesc1
Local cDesc2
Local cDesc3
GProces1()
:= {}
:= {}
:= 0
:= "Exemplo de Funes"
:= "Este programa exemplifica a utilizao da funo Processa()"
:= " em conjunto com as funes de incremento ProcRegua() e"
:= " IncProc()"
Exemplo (continuao):
Private cPerg := "PROCES"
CriaSX1()
Pergunte(cPerg,.F.)
AADD( aSay, cDesc1 )
AADD( aSay, cDesc2 )
AADD( aButton, { 5, .T., {|| Pergunte(cPerg,.T. )
}} )
AADD( aButton, { 1, .T., {|| nOpc := 1, FechaBatch() }} )
AADD( aButton, { 2, .T., {|| FechaBatch()
}} )
FormBatch( cTitulo, aSay, aButton )
If nOpc <> 1
Return Nil
Endif
Processa( {|lEnd| RunProc(@lEnd)}, "Aguarde...","Executando rotina.", .T. )
Return Nil
/*/
+----------------------------------------------------------------------------| Funo
| RUNPROC
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Funo de processamento executada atravs da
PROCRSSA()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
Static Function RunProc(lEnd)
Local nCnt := 0
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5")+mv_par01,.T.)
dbEval( {|x| nCnt++ },,{||X5_FILIAL==xFilial("SX5").And.X5_TABELA<=mv_par02})
dbSeek(xFilial("SX5")+mv_par01,.T.)
ProcRegua(nCnt)
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA <= mv_par02
IncProc("Processando tabela: "+SX5->X5_CHAVE)
If lEnd
MsgInfo(cCancela,"Fim")
Exit
Endif
dbSkip()
End
Return .T.
SETPROC()
A funo SetProc() utilizada para definir o valor mximo da rgua de progresso criada
atravs da funo Processa().
Sintaxe: Processa(nMaxProc)
Parmetros:
nMaxProc
Retorno:
Nenhum
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetProc(LastRec())
While !Eof()
IncProc()
If Li > 60
...
INCPROC()
A funo IncProc() utilizada para incrementar valor na rgua de progresso criada atravs da
funo Processa()
Sintaxe: IncProc(cMensagem)
Parmetros:
cMensagem
Retorno:
Nenhum
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetProc(LastRec())
While !Eof()
IncProc(Avaliando cliente:+SA1->A1_COD)
If Li > 60
...
26.2.3.
MsNewProcess().
Parmetros:
bAcao
cMensagem
Aparncia
Mtodos:
Activate()
SetRegua1()
IncRegua1()
SetRegua2()
IncRegua2()
/*/
+----------------------------------------------------------------------------| Funo
| GPROCES2
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MsNewProcess()
|
|
| e seus mtodos IncReguaX() e SetReguaX()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GProces2()
Private oProcess := NIL
oProcess := MsNewProcess():New({|lEnd| RunProc(lEnd,oProcess)};
"Processando","Lendo...",.T.)
oProcess:Activate()
Return Nil
/*/
+----------------------------------------------------------------------------| Funo
| RUNPROC
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Funo de processamento executada atravs da MsNewProcess()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
Static Function RunProc(lEnd,oObj)
Local i := 0
Local aTabela := {}
Local nCnt := 0
aTabela := {{"00",0},{"13",0},{"35",0},{"T3",0}}
dbSelectArea("SX5")
cFilialSX5 := xFilial("SX5")
dbSetOrder(1)
For i:=1 To Len(aTabela)
dbSeek(cFilialSX5+aTabela[i,1])
While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1]
If lEnd
Exit
Endif
nCnt++
dbSkip()
End
aTabela[i,2] := nCnt
nCnt := 0
Next i
Exemplo (continuao):
oObj:SetRegua1(Len(aTabela))
For i:=1 To Len(aTabela)
If lEnd
Exit
Endif
oObj:IncRegua1("Lendo Tabela: "+aTabela[i,1])
dbSelectArea("SX5")
dbSeek(cFilialSX5+aTabela[i,1])
oObj:SetRegua2(aTabela[i,2])
While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1]
oObj:IncRegua2("Lendo chave: "+X5_CHAVE)
If lEnd
Exit
Endif
dbSkip()
End
Next i
Return
26.2.4.
MsAguarde().
Retorno: Nil
Parmetros:
bAcao
cMensagem
cTitulo
Aparncia
Exemplo: MSAguarde()
/*/
+----------------------------------------------------------------------------| Funo
| GMSAGUARDE | Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao das funes MSAGUARDE()
|
|
| e MSPROCTXT()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
USER FUNCTION GMsAguarde()
PRIVATE lEnd := .F.
MsAguarde({|lEnd| RunProc(@lEnd)},"Aguarde...","Processando Clientes",.T.)
RETURN
/*/
+----------------------------------------------------------------------------| Funo
| RUNPROC
| Autor | ROBSON LUIZ
| Data |
|
+----------------------------------------------------------------------------| Descrio | Funo de processamento
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
STATIC FUNCTION RunProc(lEnd)
dbSelectArea("SX5")
dbSetOrder(1)
dbGoTop()
While !Eof()
If lEnd
MsgInfo(cCancel,"Fim")
Exit
Endif
MsProcTxt("Tabela: "+SX5->X5_TABELA+" Chave: "+SX5->X5_CHAVE)
dbSkip()
End
RETURN
26.2.5.
MsgRun().
Retorno: Nil
Parmetros:
cMensagem
cTitulo
bAcao
Aparncia
Exemplo: MSGRun()
/*/
+----------------------------------------------------------------------------| Funo
| GMSGRUN
| Autor | ROBSON LUIZ
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao das funes MSGRUN()
|
|
| e DBEVAL()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
USER FUNCTION GMsgRun()
LOCAL nCnt := 0
dbSelectArea("SX1")
dbGoTop()
MsgRun("Lendo arquivo, aguarde...","Ttulo opcional",{|| dbEval({|x| nCnt++}) })
MsgInfo("Ufa!!!, li "+AllTrim(Str(nCnt))+" registros",FunName())
RETURN
26.3. ListBox()
A sintaxe clssica da linguagem ADVPL permite que o componente visual ListBox implemente
dois tipos distintos de objetos:
Lista simples: lista de apenas uma coluna no formato de um vetor, a qual no
necessita da especificao de um cabealho.
Lista com colunas: lista com diversas colunas que necessita de um cabealho no
formato de um aHeader (array de cabealho).
26.3.1.
ListBox simples
Sintaxe:
Parmetros:
nLinha,nColuna
oListBox
nLista
aLista
nLargura,nAltura
oObjetoRef
UNIDADE
CHANGE
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| LISTBOXITE | Autor | ROBSON LUIZ
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do LISTBOX() como lista
|
|
| simples.
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function ListBoxIte()
Local
Local
Local
Local
Local
Local
aVetor
oDlg
oLbx
cTitulo
nChave
cChave
:=
:=
:=
:=
:=
:=
{}
Nil
Nil
"Consulta Tabela"
0
""
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5"))
CursorWait()
//+-----------------------------------------+
//| Carrega o vetor conforme a condio |
//+-----------------------------------------+
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA=="00"
AADD( aVetor, Trim(X5_CHAVE)+" - "+Capital(Trim(X5_DESCRI)) )
dbSkip()
End
CursorArrow()
If Len( aVetor ) == 0
Aviso( cTitulo, "No existe dados a consultar", {"Ok"} )
Return
Endif
//+-----------------------------------------------+
//| Monta a tela para usurio visualizar consulta |
//+-----------------------------------------------+
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 0,0 TO 240,500 PIXEL
@ 10,10 LISTBOX oLbx VAR nChave ITEMS aVetor SIZE 230,95 OF oDlg PIXEL
oLbx:bChange := {|| cChave := SubStr(aVetor[nChave],1,2) }
DEFINE SBUTTON FROM 107,183 TYPE 14 ACTION LoadTable(cChave) ENABLE OF oDlg
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg CENTER
Return
/*/
+----------------------------------------------------------------------------| Funo
| LISTBOXITE | Autor | ROBSON LUIZ
|Data |
|
+----------------------------------------------------------------------------| Descrio | Funo que carrega os dados da tabela selecionada em um
|
|
| listbox.
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
STATIC FUNCTION LoadTable(cTabela)
LOCAL aTabela := {}
LOCAL oDlg := NIL
LOCAL oLbx := NIL
dbSelectArea("SX5")
dbSeek(xFilial("SX5")+cTabela)
//+------------------------------------------------------------//| O vetor pode receber carga de duas maneiras, acompanhe... |
//+------------------------------------------------------------//| Utilizando While/End
|
//+------------------------------------------------------------dbEval({|| AADD(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})},,{||
X5_TABELA==cTabela})
If Len(aTabela)==0
Aviso( "FIM", "Necessrio selecionar um item", {"Ok"} )
Return
Endif
DEFINE MSDIALOG oDlg TITLE "Dados da tabela selecionada" FROM 300,400 TO 540,900
PIXEL
@ 10,10 LISTBOX oLbx FIELDS HEADER "Tabela", "Descrio" SIZE 230,095 OF oDlg
PIXEL
oLbx:SetArray( aTabela )
oLbx:bLine := {|| {aTabela[oLbx:nAt,1],aTabela[oLbx:nAt,2]} }
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg
RETURN
26.3.2.
Sintaxe:
Parmetros:
nLinha,nColuna
oListBox
nLista
Header1,...,HeaderX
nLargura,nAltura
oObjetoRef
UNIDADE
CHANGE
Mtodos:
SetArray()
Atributos:
bLine
Aparncia:
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Funo
| LIST_BOX
| Autor | ROBSON LUIZ
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao de um LISTBOX() com
|
|
| grid.
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function List_Box()
Local
Local
Local
Local
Local
aVetor := {}
oDlg
oLbx
cTitulo := "Cadastro de Bancos"
cFilSA6
dbSelectArea("SA6")
dbSetOrder(1)
cFilSA6 := xFilial("SA6")
dbSeek(cFilSA6)
// Carrega o vetor conforme a condio.
While !Eof() .And. A6_FILIAL == cFilSA6
AADD( aVetor, { A6_COD, A6_AGENCIA, A6_NUMCON, A6_NOME, A6_NREDUZ, A6_BAIRRO,
A6_MUN } )
dbSkip()
End
// Se no houver dados no vetor, avisar usurio e abandonar rotina.
If Len( aVetor ) == 0
Aviso( cTitulo, "No existe dados a consultar", {"Ok"} )
Return
Endif
// Monta a tela para usurio visualizar consulta.
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 0,0 TO 240,500 PIXEL
// Primeira opo para montar o listbox.
@ 10,10 LISTBOX oLbx FIELDS HEADER ;
"Banco", "Agencia", "C/C", "Nome Banco", "Fantasia", "Bairro", "Municpio" ;
SIZE 230,95 OF oDlg PIXEL
oLbx:SetArray( aVetor )
oLbx:bLine := {|| {aVetor[oLbx:nAt,1],;
aVetor[oLbx:nAt,2],;
aVetor[oLbx:nAt,3],;
aVetor[oLbx:nAt,4],;
aVetor[oLbx:nAt,5],;
aVetor[oLbx:nAt,6],;
aVetor[oLbx:nAt,7]}}
Exemplo (continuao):
// Segunda opo para monta o listbox
/*
oLbx :=
TWBrowse():New(10,10,230,95,,aCabecalho,,oDlg,,,,,,,,,,,,.F.,,.T.,,.F.,,,)
oLbx:SetArray( aVetor )
oLbx:bLine := {|| aEval(aVetor[oLbx:nAt],{|z,w| aVetor[oLbx:nAt,w] } ) }
*/
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg CENTER
Return
26.4. ScrollBox()
O ScrollBox o objeto utilizado para permitir a um Dialog exibir barras de rolagem verticais e
Horizontais. Algumas aplicaes com objetos definem automaticamente o ScrollBox, tais como:
Enchoice() ou MsMGet()
NewGetDados()
ListBox()
Quando definido um objeto ScrollBox, os demais componentes da janela devero referenciar
este objeto e no mais o objeto Dialog.
Desta forma o ScrollBox atribudo a um objeto Dialog, e os componentes ao ScrollBox.
MsDialog() ScrollBox()
ScrollBox() Componentes Visuais
Sintaxe:
@
nLinha,nColuna
SCROLLBOX
oScrollBox
nLargura,nAltura OF oObjetoRef BORDER
HORIZONTAL
VERTICAL
Parmetros:
nLinha,nColuna
oScrollBox
HORIZONTAL
VERTICAL
nLargura,nAltura
oObjetoRef
BORDER
SIZE
Aparncia:
#INCLUDE "PROTHEUS.CH"
/*/
+-----------------------------------------------------------------------| Funo
| SCROLL()
| Autor | ROBSON LUIZ
|Data |
|
+-----------------------------------------------------------------------| Descrio | Programa que demonstra como montar uma enchoice apenas
|
|
| com variveis, incluindo o recurso de rolagem.
|
+-----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+-----------------------------------------------------------------------/*/
USER FUNCTION Scroll()
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
oDlg := NIL
oScroll := NIL
oLbx1 := NIL
oLbx2 := NIL
bGet := NIL
oGet := NIL
aAIIPM := {}
aTitulo := {}
nTop := 5
nWidth := 0
cGet := ""
cPict := ""
cVar := ""
n := 0
Exemplo (continuao):
PRIVATE
PRIVATE
PRIVATE
PRIVATE
cProcesso
cPrefixo
cTipo
cCliente
cLoja
cNome
cCGC
dData
nTotal
nUFESP
cStatus
cCond
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
"P00001"
"UNI"
"MAN"
"000001"
"01"
"JOSE DA SILVA SANTOS SOARES"
"00.000.000/0001-91"
"26/03/03"
5922.00
1000.00
"Z"
"001"
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
,"@!"})
TO
OF
OF
OF
//scrollbox
@ 019,006 SCROLLBOX oScroll HORIZONTAL VERTICAL SIZE 131,182 OF oDlg BORDER
For n:=1 TO Len(aSay)
- 278 ADVPL Completo
Exemplo (continuao):
bGet := &("{|| '"+aSay[n][1]+"'}")
cVar := aSay[n][5]
cGet := "{|u| IIF(PCount()>0,"+cVar+":=u,"+cVar+")}"
cPict := aSay[n][6]
TSay():New(nTop,5,bGet,oScroll,,,.F.,.F.,.F.,.T.,,,;
GetTextWidth(0,Trim(aSay[n][1])),15,;
.F.,.F.,.F.,.F.,.F.)
oGet:=TGet():New(nTop-2,40,&cGet,oScroll,,7,cPict,,,,,.F.,,.T.,;
,.F.,,.F.,.F.,,.T.,.F.,,(cVar),,,,.T.)
nTop+=11
Next n
//listbox ttulos
@ 019,199 LISTBOX oLbx1 FIELDS HEADER ;
"Parcela","Vencto","Vencto.Real","Valor R$","Qtd.UFESP";
COLSIZES 21,24,33,63,100;
SIZE 095,059 OF oDlg PIXEL
oLbx1:SetArray( aTitulo )
oLbx1:bLine := {||{aTitulo[oLbx1:nAt,1],aTitulo[oLbx1:nAt,2],;
aTitulo[oLbx1:nAt,3],aTitulo[oLbx1:nAt,4],aTitulo[oLbx1:nAt,5]}}
//listbox aiipm
@ 089,199 LISTBOX oLbx2 FIELDS HEADER "AIIPM","Placa","Data Multa" ;
COLSIZES 24,21,30 SIZE 095,061 OF oDlg PIXEL
oLbx2:SetArray( aAIIPM )
oLbx2:bLine :=
{||{aAIIPM[oLbx2:nAt,1],aAIIPM[oLbx2:nAt,2],aAIIPM[oLbx2:nAt,3]}}
ACTIVATE MSDIALOG oDlg CENTER ON INIT
EnchoiceBar(oDlg,{||oDlg:End()},{||oDlg:End()})
RETURN
26.5. ParamBox()
Implementa uma tela de parmetros, que no necessita da criao de um grupo de perguntas
no SX1, e com funcionalidades que a Pergunte() no disponibiliza, tais como CheckBox e
RadioButtons.
Cada componente da ParamBox ser associado a um parmetro Private denominado
MV_PARxx, de acordo com a ordem do componente na tela. Os parmetros da ParamBox
podem ser utilizados de forma independente em uma rotina especfica, ou complementando
opes de uma rotina padro.
Cuidados
Ao utilizar a ParamBox em uma funo que tambm utilize parmetros definidos pela
funo Pergunte() deve-se:
Salvar e restaurar os MV_PARs da Pergunte()
Definir variveis Private prprias para a ParamBox, as quais iro armazenar o
contedo das MV_PARs que esta retorna.
Parmetros:
aParamBox
cTitulo
aRet
bOk
aButtons
lCentered
nPosx
nPosy
oMainDlg
cLoad
lCanSave
lUserSave
Aparncia:
[1] Tipo do parmetro: Para cada tipo de parmetro as demais posies do array variam de
contedo conforme abaixo:
1[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
MsGet
: Descrio
: String contendo o inicializador do campo
: String contendo a Picture do campo
: String contendo a validao
: Consulta F3
: String contendo a validao When
: Tamanho do MsGet
: Flag .T./.F. Parmetro Obrigatrio ?
2[2]
[3]
[4]
[5]
[6]
[7]
Combo
: Descrio
: Numrico contendo a opo inicial do combo
: Array contendo as opes do Combo
: Tamanho do Combo
: Validao
: Flag .T./.F. Parmetro Obrigatrio ?
- 281 ADVPL Completo
3[2]
[3]
[4]
[5]
[6]
[7]
Radio
: Descrio
: Numrico contendo a opo inicial do Radio
: Array contendo as opes do Radio
: Tamanho do Radio
: Validao
: Flag .T./.F. Parmetro Obrigatrio ?
4[2]
[3]
[4]
[5]
[6]
[7]
5[2]
[3]
[4]
[5]
[6]
6 - File
[2] : Descrio
[3] : String contendo o inicializador do campo
[4] : String contendo a Picture do campo
[5] : String contendo a validao
[6] : String contendo a validao When
[7] : Tamanho do MsGet
[8] : Flag .T./.F. Parmetro Obrigatrio ?
[9] : Texto contendo os tipos de arquivo
Ex.: "Arquivos .CSV |*.CSV"
[10]: Diretrio inicial do CGETFILE()
[11]: Parmetros do CGETFILE()
7[2]
[3]
[4]
[5]
8[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
MsGet Password
: Descrio
: String contendo o inicializador do campo
: String contendo a Picture do campo
: String contendo a validao
: Consulta F3
: String contendo a validao When
: Tamanho do MsGet
: Flag .T./.F. Parmetro Obrigatrio ?
9[2]
[3]
[4]
[5]
MsGet Say
: String Contendo o Texto a ser apresentado
: Tamanho da String
: Altura da String
: Negrito (lgico)
#include protheus.ch
/*/
+----------------------------------------------------------------------| Funo
| xParamBox
| Autor | ROBSON LUIZ
|Data |
|
+----------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao da PARAMBOX como
|
|
| forma alternativa de disponibilizar parmetros em um
|
|
| processamento.
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function xParamBox()
Local aRet := {}
Local aParamBox := {}
Local aCombo :=
{"Janeiro","Fevereiro","Maro","Abril","Maio","Junho","Julho","Agosto","Setembro
","Outubro","Novembro","Dezembro"}
Local i
:= 0
Private cCadastro := "xParambox"
AADD(aParamBox,{1,"Produto",Space(15),"","","SB1","",0,.F.})
AADD(aParamBox,{2,"Tipo de cliente",1,aCombo,50,"",.F.})
AADD(aParamBox,{3,"Mostra
deletados",IIF(Set(_SET_DELETED),1,2),{"Sim","No"},50,"",.F.})
AADD(aParamBox,{4,"Marca todos ?",.F.,"Marque todos se necessrio
for.",50,"",.F.})
AADD(aParamBox,{5,"Marca todos ?",.F.,50,"",.F.})
AADD(aParamBox,{6,"Qual arquivo",Space(50),"","","",50,.F.,;
"Arquivo .DBF |*.DBF"})
AADD(aParamBox,{7,"Monte o filtro","SX5","X5_FILIAL==xFilial('SX5')"})
AADD(aParamBox,{8,"Digite a senha",Space(15),"","","","",80,.F.})
If ParamBox(aParamBox,"Teste Parmetros...",@aRet)
For i:=1 To Len(aRet)
MsgInfo(aRet[i],"Opo escolhida")
Next
Endif
Return
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| XPARBOX()
| Autor | ARNALDO RAYMUNDO JR.|Data |
|
+----------------------------------------------------------------------------| Descrio | Funo utilizando a PARAMBOX() e protegendo os MV_PARs
|
|
| ativos do programa principal.
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
Static Function XPARBOX(cPerg)
Local
Local
Local
Local
Local
Local
Local
Local
aParamBox
:= {}
cTitulo
:= "Transferncia para Operao"
bOk
:= {|| .T.}
aButtons
:= {}; Local aRet := {}
nPosx; Local nPosy; Local nX := 0
cLoad
:= ""
lCentered
:= .T.; Local lCanSave := .F.; Local lUserSave := .F.
aParamAtu := Array(4)
27.1. Definies
Objeto
Um objeto uma entidade do mundo real que tem uma identidade. Objetos podem
representar entidades concretas (um arquivo no meu computador, uma bicicleta) ou entidades
conceituais (uma estratgia de jogo, uma poltica de escalonamento em um sistema
operacional). Cada objeto ter sua identidade significa que dois objetos so distintos mesmo
que eles apresentem exatamente as mesmas caractersticas.
Embora objetos tenham existncia prpria no mundo real, em termos de linguagem de
programao um objeto necessita um mecanismo de identificao. Esta identificao de objeto
deve ser nica, uniforme e independente do contedo do objeto. Este um dos mecanismos
que permite a criao de colees de objetos, as quais so tambm objetos em si.
A estrutura de um objeto representada em termos de atributos. O comportamento de um
objeto representado pelo conjunto de operaes que podem ser executadas sobre o objeto.
Classe
Objetos com a mesma estrutura e o mesmo comportamento so agrupados em classes. Uma
classe uma abstrao que descreve propriedades importantes para uma aplicao e
simplesmente ignora o resto.
Cada classe descreve um conjunto (possivelmente infinito) de objetos individuais. Cada objeto
dito ser uma instncia de uma classe. Assim, cada instncia de uma classe tem seus prprios
valores para cada atributo, mas dividem os nomes dos atributos e mtodos com as outras
instncias da classe. Implicitamente, cada objeto contm uma referncia para sua prpria
classe, em outras palavras, ele sabe o que ele .
Polimorfismo
Polimorfismo significa que a mesma operao pode se comportar de forma diferente em
classes diferentes. Por exemplo, a operao move quando aplicada a uma janela de um
sistema de interfaces tem um comportamento distinto do que quando aplicada a uma pea de
um jogo de xadrez. Um mtodo uma implementao especfica de uma operao para uma
certa classe.
Polimorfismo tambm implica que uma operao de uma mesma classe pode ser
implementada por mais de um mtodo. O usurio no precisa saber quantas implementaes
existem para uma operao, ou explicitar qual mtodo deve ser utilizado: a linguagem de
programao deve ser capaz de selecionar o mtodo correto a partir do nome da operao,
classe do objeto e argumentos para a operao. Desta forma, novas classes podem ser
adicionadas sem necessidade de modificao de cdigo j existente, pois cada classe apenas
define os seus mtodos e atributos.
No mundo real, alguns objetos e classes podem ser descritos como casos especiais, ou
especializaes, de outros objetos e classes. Por exemplo, a classe de computadores pessoais
com processador da linha 80x86 uma especializao de computadores pessoais, que por sua
vez uma especializao de computadores. No desejvel que tudo que j foi descrito para
computadores tenha de ser repetido para computadores pessoais ou para computadores
pessoais com processador da linha 80x86.
Herana
Herana o mecanismo do paradigma de orientao a objetos que permite compartilhar
atributos e operaes entre classes baseada em um relacionamento hierrquico. Uma classe
pode ser definida de forma genrica e depois refinada sucessivamente em termos de
subclasses ou classes derivadas. Cada subclasse incorpora, or herda, todas as propriedades de
sua superclasse (ou classe base) e adiciona suas propriedades nicas e particulares. As
propriedades da classe base no precisam ser repetidas em cada classe derivada. Esta
capacidade de fatorar as propriedades comuns de diversas classes em uma superclasse pode
reduzir dramaticamente a repetio de cdigo em um projeto ou programa, sendo uma das
principais vantagens da abordagem de orientao a objetos.
27.3.1.
Objetos e Classes
Objeto definido neste modelo como um conceito, abstrao ou coisa com limites e
significados bem definidos para a aplicao em questo. Objetos tm dois propsitos:
promover o entendimento do mundo real e suportar uma base prtica para uma
implementao computacional. No existe uma maneira correta de decompor um problema
em objetos; esta decomposio depende do julgamento do projetista e da natureza do
problema. Todos os objetos tm identidade prpria e so distinguveis.
Uma classe de objetos descreve um grupo de objetos com propriedades (atributos) similares,
comportamentos (operaes) similares, relacionamentos comuns com outros objetos e uma
semntica comum. Por exemplo, Pessoa e Companhia so classes de objetos. Cada pessoa
tem um nome e uma idade; estes seriam os atributos comuns da classe. Companhias tambm
podem ter os mesmos atributos nome e idade definidos. Entretanto, devido distino
semntica elas provavelmente estariam agrupados em outra classe que no Pessoa. Como se
pode observar, o agrupamento em classes no leva em conta apenas o compartilhamento de
propriedades.
Todo objeto sabe a que classe ele pertence, ou seja, a classe de um objeto um atributo
implcito do objeto. Este conceito suportado na maior parte das linguagens de programao
orientada a objetos, inclusive em ADVPL.
OMT define dois tipos de diagramas de objetos, diagramas de classes e diagramas de
instncias. Um diagrama de classe um esquema, ou seja, um padro ou gabarito que
descreve as muitas possveis instncias de dados. Um diagrama de instncias descreve como
um conjunto particular de objetos est relacionado. Diagramas de instncias so teis para
apresentar exemplos e documentar casos de testes; diagramas de classes tm uso mais
amplos. A Figura abaixo apresenta a notao adotada para estes diagramas.
27.3.2.
Atributos
Um atributo um valor de dado assumido pelos objetos de uma classe. Nome, idade e peso
so exemplos de atributos de objetos Pessoa. Cor, peso e modelo so possveis atributos de
objetos Carro. Cada atributo tem um valor para cada instncia de objeto. Por exemplo, o
atributo idade tem valor ``29'' no objeto Pedro Y. Em outras palavras, Pedro Y tem 29 anos de
idade. Diferentes instncias de objetos podem ter o mesmo valor para um dado atributo.
Cada nome de atributo nico para uma dada classe, mas no necessariamente nico entre
todas as classes. Por exemplo, ambos Pessoa e Companhia podem ter um atributo chamado
endereo.
No diagrama de classes, atributos so listados no segundo segmento da caixa que representa
a classe. O nome do atributo pode ser seguido por detalhes opcionais, tais como o tipo de
dado assumido e valor default. A Figura abaixo mostra esta representao.
27.3.3.
Operaes e Mtodos
Uma operao uma funo ou transformao que pode ser aplicada a ou por objetos em uma
classe. Por exemplo, abrir, salvar e imprimir so operaes que podem ser aplicadas a objetos
da classe Arquivo. Todos os objetos em uma classe compartilham as mesmas operaes.
Toda operao tem um objeto-alvo como um argumento implcito. O comportamento de uma
operao depende da classe de seu alvo. Como um objeto sabe qual sua classe, possvel
escolher a implementao correta da operao. Alm disto, outros argumentos (parmetros)
podem ser necessrios para uma operao.
Uma mesma operao pode se aplicar a diversas classes diferentes. Uma operao como esta
dita ser polimrfica, ou seja, ela pode assumir distintas formas em classes diferentes.
Um mtodo a implementao de uma operao para uma classe. Por exemplo, a operao
imprimir pode ser implementada de forma distinta, dependendo se o arquivo a ser impresso
contm apenas texto ASCII, um arquivo de um processador de texto ou binrio. Todos estes
mtodos executam a mesma operao: imprimir o arquivo; porm, cada mtodo ser
implementado por um diferente cdigo.
A assinatura de um mtodo dada pelo nmero e tipos de argumentos do mtodo, assim
como por seu valor de retorno. Uma estratgia de desenvolvimento recomendvel manter
assinaturas coerentes para mtodos implementando uma dada operao, assim como um
comportamento consistente entre as implementaes.
Em termos de diagramas OMT, operaes so listadas na terceira parte da caixa de uma
classe. Cada nome de operao pode ser seguida por detalhes opcionais, tais como lista de
argumentos e tipo de retorno. A lista de argumentos apresentada entre parnteses aps o
nome da operao. Uma lista de argumentos vazia indica que a operao no tem
argumentos; da ausncia da lista de argumentos no se pode concluir nada. O tipo de
resultado vem aps a lista de argumentos, sendo precedido por dois pontos (:). Caso a
operao retorne resultado, este no deve ser omitido, pois esta a forma de distingui-la de
operaes que no retornam resultado. Exemplos de representao de operaes em OMT so
apresentados na Figura abaixo:
27.3.4.
Sugestes de desenvolvimento
28.
Neste tpico ser detalhada a forma com a qual a linguagem ADVPL implementa os conceitos
de orientao a objetos e a sintaxe utilizada no desenvolvimento de aplicaes.
CLASS
CONSTRUCTOR
DATA
ENDCLASS
FROM
METHOD
SELF
CLASS
Descrio
Sintaxe 1
CLASS <nome_da_classe>
Sintaxe 2
CONSTRUCTOR
Descrio
Sintaxe
DATA
Descrio
Sintaxe
DATA <nome_do_atributo>
ENDCLASS
Descrio
Sintaxe
ENDCLASS
FROM
Descrio
Sintaxe
METHOD
Descrio
Sintaxe 1
METHOD <nome_do_mtodo()>
Sintaxe 2
SELF
Descrio
Sintaxe
Return SELF
Operadores especficos
Exemplo 1
cNome := oAluno:sNome
Exemplo 2
cNota := oAluno:GetNota(cCurso)
::
Exemplo
IF nPosCurso > 0
nNota := ::aCursos[nPosCurso][2]
ENDIF
Return nNota
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
METHOD Create() CONSTRUCTOR
METHOD SetNome()
METHOD SetIdade()
ENDCLASS
Manipulao de atributos
Os atributos definidos para uma classe com a utilizao da palavra reservada DATA em sua
declarao podem ser manipulados por seus mtodos utilizando o operador ::.
A utilizao deste operador permite ao interpretador ADVPL diferenciar variveis comuns
criadas pelas funes e mtodos que utilizam este objeto dos atributos propriamente ditos.
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
METHOD Create() CONSTRUCTOR
METHOD SetNome()
METHOD SetIdade()
ENDCLASS
METHOD Create(cNome, nIdade) CLASS Pessoa
::cNome := cNome
::nIdade := nIdade
Return SELF
oPessoa
cNome :=
dNascimento:= CTOD()
aDados := {}
aDados := GetDados()
oPessoa := Pessoa():Create(cNome,dNascimento)
Return
Create() CONSTRUCTOR
Inscrever()
Avaliar()
GetNota()
GetStatus()
ENDCLASS
// Os objetos da classe Aluno, possuem todos os mtodos e atributos da classe
Pessoa, alm
// dos mtodos e atributos declarados na prpria classe.
29.
A linguagem ADVPL possui diversos componentes visuais e auxiliares, os quais podem ser
representados utilizando a estrutura abaixo:
Classes Auxiliares
Tfont
Classes de Janelas
Msdialog
Tdialog
Twindow
Classes de Componentes
Tcontrol
Classes de Componentes
Visuais
Brgetddb
Mscalend
Mscalendgrid
Msselbr
Msworktime
Sbutton
Tbar
Tbitmap
Tbrowsebutton
Tbtnbmp
Tbtnbmp2
Tbutton
Tcbrowse
Tcheckbox
Tcolortriangle
Tcombobox
Tfolder
Tfont
Tget
Tgroup
Thbutton
Tibrowser
Tlistbox
Tmenu
Tmenubar
Tmeter
Tmsgraphic
Tmsgbar
Tmultibtn
Tmultiget
Tolecontainer
Tpageview
Tpanel
Tradmenu
Tsbrowse
Tsay
Tscrollbox
Tsimpleeditor
Tslider
Classes de Componentes
Visuais
Tsplitter
Ttabs
Ttoolbox
Twbrowse
Vcbrowse
Classes auxiliares
TFONT()
Descrio
Classes de janelas
MSDIALOG()
Descrio
Classe de objetos que deve ser utilizada como padro de janela para
entrada de dados. MSDialog um tipo de janela dilogo modal, isto ,
no permite que outra janela ativa receba dados enquanto esta estiver
ativa.
TDIALOG()
Descrio
TWINDOW()
Descrio
Classes de componentes
TCONTROL()
Descrio
MSCALEND()
Descrio
MSCALENDGRID()
Descrio
MSSELBR()
Descrio
MSWORKTIME()
Descrio
SBUTTON()
Descrio
TBAR()
Descrio
TBITMAP()
Descrio
TBROWSEBUTTON()
Descrio
TBTNBMP()
Descrio
TBTNBMP2()
Descrio
TBUTTON()
Descrio
TCBROWSE()
Descrio
TCHECKBOX()
Descrio
TCOLORTRIANGLE()
Descrio
TCOMBOBOX()
Descrio
TFOLDER()
Descrio
TGET()
Descrio
TGROUP()
Descrio
THBUTTON()
Descrio
TIBROWSER()
Descrio
TLISTBOX()
Descrio
TMENU()
Descrio
TMENUBAR()
Descrio
TMETER()
Descrio
TMSGRAPHIC()
Descrio
TMSGBAR()
Descrio
TMULTIBTN()
Descrio
TMULTIGET()
Descrio
TOLECONTAINER()
Descrio
TPAGEVIEW()
Descrio
TPANEL()
Descrio
TRADMENU()
Descrio
TSBROWSE()
Descrio
TSAY()
Descrio
TSCROLLBOX()
Descrio
TSIMPLEEDITOR()
Descrio
TSLIDER()
Descrio
TSPLITTER()
Descrio
TTABS()
Descrio
TTOOLBOX()
Descrio
TWBROWSE()
Descrio
VCBROWSE()
Descrio
R
0
0
0
0
255
255
255
255
G
0
0
255
255
0
0
255
255
B
0
255
0
255
0
255
0
255
Valor
0
16711680
65280
16776960
255
16711935
65535
16777215
Para atribuir as cores aos objetos visuais devem ser observados os atributos utilizados para
estes fins em cada objeto, como por exemplo:
MSDIALOG()
nClrPane
nClrText
TSAY()
nClrPane
nClrText
Funo RGB()
A linguagem ADVPL possui a funo RGB() a qual retorna o valor da cor a ser definido, de
acordo com a parametrizao de cada um dos elementos da paleta RGB.
RGB(nRed, nGreen, nBlue)
nRed
nGreen
nBlue
Retorno
30.
30.1.1.
Enchoice()
Sintaxe: Enchoice( cAlias, nReg, nOpc, aCRA, cLetra, cTexto, aAcho, aPos,
aCpos, nModelo, nColMens, cMensagem, cTudoOk, oWnd, lF3,
lMemoria, lColumn, caTela, lNoFolder, lProperty)
Retorno: Nil
Parmetros:
cAlias
nReg
nOpc
aCRA
cLetra
cTexto
aAcho
aPos
aCpos
nModelo
nColMens
cMensagem
cTudoOk
oWnd
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWENCH
| Autor | ARNALDO RAYMUNDO JR.|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao da funo Enchoice()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwEnch()
Private cCadastro := " Cadastro de Clientes"
Private aRotina
:=
{{"Pesquisar"
, "axPesqui"
{"Visualizar"
, "U_ModEnc"
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
User Function ModEnc(cAlias,nReg,nOpc)
Local aCpoEnch
Local aAlter
:= {}
:= {}
Local cAliasE
:=
Local aAlterEnch :=
Local aPos
:=
Local nModelo
:=
Local lF3
:=
Local lMemoria
:=
Local lColumn
:=
Local caTela
:=
Local lNoFolder
:=
Local lProperty
:=
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
cAlias
{}
{000,000,400,600}
3
.F.
.T.
.F.
""
.F.
.F.
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
, 0, 1},;
, 0, 2}}
Exemplo (continuao):
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 000,000 TO 400,600 PIXEL
RegToMemory("SA1", If(nOpc==3,.T.,.F.))
Enchoice(cAliasE, nReg, nOpc, /*aCRA*/, /*cLetra*/, /*cTexto*/, ;
aCpoEnch, aPos, aAlterEnch, nModelo, /*nColMens*/,;
/*cMensagem*/,/*cTudoOk*/, oDlg, lF3, lMemoria, lColumn,;
caTela, lNoFolder, lProperty)
ACTIVATE MSDIALOG oDlg CENTERED
Return
30.1.2.
MsMGet()
lMemoria
lColumn
caTela
lNoFolder
lProperty
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWMSGET | Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MsMget()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwMsGet()
Private cCadastro := " Cadastro de Clientes"
Private aRotina
:=
{{"Pesquisar"
, "axPesqui"
{"Visualizar"
, "U_ModEnc"
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
User Function ModEnc(cAlias,nReg,nOpc)
Local aCpoEnch
:= {}
Local aAlter
:= {}
Local cAliasE
Local aAlterEnch :=
Local aPos
:=
Local nModelo
:=
Local lF3
:=
Local lMemoria
:=
Local lColumn
Local caTela
Local lNoFolder
:=
Local lProperty
:=
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
:= cAlias
{}
{000,000,400,600}
3
.F.
.T.
:= .F.
:= ""
.F.
.F.
, 0, 1},;
, 0, 2}}
Exemplo (continuao):
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
oDlg
:= MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE, nReg, nOpc, /*aCRA*/, /*cLetra*/,;
/*cTexto*/, aCpoEnch, aPos, aAlterEnch, nModelo, /*nColMens*/,;
/*cMensagem*/, /*cTudoOk*/,oDlg,lF3,lMemoria,lColumn, caTela,;
lNoFolder, lProperty)
oDlg:lCentered := .T.
oDlg:Activate()
Return
MSGETDB()
MSGETDADOS()
MSNEWGETDADOS()
Grids no digitveis: permitem somente a visualizao de informaes, comumente
utilizados como browses do ERP Protheus, tais como:
TWBROWSE()
MAWNDBROWSE()
MBROWSE()
Neste tpico sero tratadas as grids digitveis disponveis na linguagem ADVPL para o
desenvolvimento de interfaces de cadastros e manuteno de informaes.
30.2.1.
MsGetDB()
A classe de objetos visuais MsGetDB() permite a criao de um grid digitvel com uma ou mais
colunas, baseado em uma tabela temporria.
Sintaxe:
Parmetros:
nTop
nLeft
nBottom
nRight
nOpc
cLinhaOk
cTudoOk
cIniCpos
lDelete
aAlter
nFreeze
lEmpty
uPar1
cFieldOk
cTRB
lCondicional
lAppend
cDelOk
lDisparos
uPar2
cSuperDel
oWnd
Aparncia:
Variveis private:
aRotina
aHeader
Pesquisar
Visualizar
Incluir
Alterar
Excluir
lRefresh
Variveis pblicas:
nBrLin
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Funo
| GETDBSA1
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MsGetDB()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GetDbSA1()
Local
Local
Local
Local
Local
nI
oDlg
oGetDB
nUsado := 0
aStruct := {}
Private
Private
Private
Private
lRefresh := .T.
aHeader := {}
aCols := {}
aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
Exemplo (continuao):
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AADD(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
AADD(aStruct,{SX3->X3_CAMPO,SX3->X3_TIPO,SX3->X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
DbSkip()
End
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg
30.2.2.
MsGetDados()
A classe de objetos visuais MsGetDados() permite a criao de um grid digitvel com uma ou
mais colunas, baseado em um array.
Parmetros:
nTop
nLeft
nBottom
nRight
nOpc
cLinhaOk
cTudoOk
cIniCpos
lDelete
aAlter
uPar1
lEmpty
nMax
cFieldOk
cSuperDel
uPar2
cDelOk
oWnd
Aparncia:
Variveis private:
aRotina
aHeader
lRefresh
Variveis pblicas:
N
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
Hide()
Show()
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Funo
| GETDADOSA1 | Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MSGETADOS()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GetDadoSA1()
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
Exemplo (continuao):
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AADD(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
EndIf
DbSkip()
End
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg
30.2.3.
MsNewGetDados()
A classe de objetos visuais MsNewGetDados() permite a criao de um grid digitvel com uma
ou mais colunas, baseado em um array.
Parmetros:
nSuperior
nEsquerda
nInferior
nDireita
nOpc
cLinOk
cTudoOk
cIniCpos
aAlterGDa
nFreeze
nMax
cFieldOk
cSuperDel
cDelOk
oDLG
aHeader
aCols
Aparncia:
Variveis private:
aRotina
aHeader
Pesquisar
Visualizar
Incluir
Alterar
Excluir
lRefresh
Variveis pblicas:
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
Hide()
Show()
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWGETD
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao dos objetos
|
|
| MsNewGetDados() e MsMGet() combinados
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwGetD()
Private cCadastro := "Pedidos de Venda"
Private aRotina
:=
{{"Pesquisar"
{"Visualizar"
{"Incluir"
, "axPesqui"
, "U_ModGtd"
, "U_ModGtd"
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
User Function ModGtd(cAlias,nReg,nOpc)
Local
Local
Local
Local
Local
Local
nX
nUsado
aButtons
aCpoEnch
cAliasE
aAlterEnch
:=
:=
:=
:=
:=
:=
0
0
{}
{}
cAlias
{}
, 0, 1},;
, 0, 2},;
, 0, 3}}
Exemplo (continuao):
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aPos
nModelo
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
aCpoGDa
cAliasGD
nSuperior
nEsquerda
nInferior
nDireita
cLinOk
cTudoOk
cIniCpos
nFreeze
nMax
cFieldOk
cSuperDel
cDelOk
aHeader
aCols
aAlterGDa
Private
Private
Private
Private
Private
:=
:=
:=
:=
:=
:=
:=
:=
{000,000,080,400}
3
.F.
.T.
:= .F.
:= ""
.F.
.F.
:= {}
"SC6"
:= 081
:= 000
:= 250
:= 400
:= "AllwaysTrue"
:= "AllwaysTrue"
:= "C6_ITEM"
:= 000
:= 999
:= "AllwaysTrue"
:= ""
:= "AllwaysFalse"
:= {}
:= {}
{}
oDlg
oGetD
oEnch
aTELA[0][0]
aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "C5_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasGD
If
!(AllTrim(SX3->X3_CAMPO) $ "C6_FILIAL") .And.;
cNivel >= SX3->X3_NIVEL .And. X3Uso(SX3->X3_USADO)
AADD(aCpoGDa,SX3->X3_CAMPO)
EndIf
DbSkip()
End
- 326 ADVPL Completo
Exemplo (continuao):
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
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 nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
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 nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
oDlg
:= MSDIALOG():New(000,000,400,600, cCadastro,,,,,,,,,.T.)
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/,/*cTexto*/,;
aCpoEnch,aPos,aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
/*cTudoOk*/, oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,;
lProperty)
oGetD:= MsNewGetDados():New(nSuperior, nEsquerda, nInferior, nDireita,;
nOpc,cLinOk,cTudoOk, cIniCpos, aAlterGDa, nFreeze, nMax,cFieldOk,;
cSuperDel,cDelOk, oDLG, aHeader, aCols)
oDlg:bInit := {|| EnchoiceBar(oDlg, {||oDlg:End()},{||oDlg:End()},,aButtons)}
oDlg:lCentered := .T.
oDlg:Activate()
Return
30.2.3.1.
Conforme visto no tpico sobre definio das propriedades de cores para os componentes
visuais, cada objeto possui caractersticas que devem ser respeitadas para correta utilizao
deste recurso.
Atributos adicionais:
lUseDefaultColors
Mtodos adicionais:
SetBlkBackColor
Mtodo que define a cor que ser utilizada para cada linha do
grid. No necessrio utilizar o mtodo Refresh() aps a
definio da cor por este mtodo.
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MRBWGTCL
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao dos objetos
|
|
| MsNewGetDados() e MsMGet() combinados e tratamento de cores
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwGtCl()
Private cCadastro := "Pedidos de Venda"
Private aRotina
:=
{{"Pesquisar"
{"Visualizar"
{"Incluir"
, "axPesqui"
, "U_ModGtd"
, "U_ModGtd"
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
User Function ModGtd(cAlias,nReg,nOpc)
Local nX
:= 0
Local nUsado
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aButtons
aCpoEnch
cAliasE
aAlterEnch
aPos
nModelo
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
aCpoGDa
cAliasGD
nSuperior
nEsquerda
nInferior
nDireita
cLinOk
cTudoOk
cIniCpos
nFreeze
nMax
:= 0
:= {}
:= {}
:= cAlias
{}
{000,000,080,400}
3
.F.
.T.
:= .F.
:= ""
:= .F.
:= .F.
:= {}
:= "SC6"
:= 081
:= 000
:= 250
:= 400
:= "AllwaysTrue"
:= "AllwaysTrue"
:= "C6_ITEM"
:= 000
:= 999
:=
:=
:=
:=
:=
, 0, 1},;
, 0, 2},;
, 0, 3}}
Exemplo (continuao):
Local
Local
Local
Local
Local
Local
cFieldOk
cSuperDel
cDelOk
aHeader
aCols
aAlterGDa
Private
Private
Private
Private
Private
:=
:=
:=
:=
:=
"AllwaysTrue"
""
"AllwaysFalse"
{}
{}
:= {}
oDlg
oGetD
oEnch
aTELA[0][0]
aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "C5_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasGD
If
!(AllTrim(SX3->X3_CAMPO) $ "C6_FILIAL") .And. cNivel >= SX3>X3_NIVEL .And. X3Uso(SX3->X3_USADO)
AADD(aCpoGDa,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
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
Exemplo (continuao):
If nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
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 nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
oDlg := MSDIALOG():New(000,000,400,600, cCadastro,,,,,,,,,.T.)
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/, /*cTexto*/,;
aCpoEnch,aPos, aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
cTudoOk,oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,lProperty)
oGetD:= MsNewGetDados():New(nSuperior,nEsquerda,nInferior,nDireita, nOpc,;
cLinOk,cTudoOk,cIniCpos,aAlterGDa,nFreeze,nMax,cFieldOk, cSuperDel,;
cDelOk, oDLG, aHeader, aCols)
// Tratamento para definio de cores especficas,
// logo aps a declarao da MsNewGetDados
oGetD:oBrowse:lUseDefaultColors := .F.
oGetD:oBrowse:SetBlkBackColor({|| GETDCLR(oGetD:aCols,oGetD:nAt,aHeader)})
oDlg:bInit := {|| EnchoiceBar(oDlg, {||oDlg:End()}, {||oDlg:End()},,aButtons)}
oDlg:lCentered := .T.
oDlg:Activate()
Return
Exemplo (continuao):
// Funo para tratamento das regras de cores para a grid da MsNewGetDados
Static Function GETDCLR(aLinha,nLinha,aHeader)
Local
Local
Local
Local
Local
nCor2
nCor3
nPosProd
nUsado
nRet
:=
:=
:=
:=
:=
30.3.1.
EnchoiceBar()
Funo que cria uma barra de botes no formato padro utilizado pelas interfaces de cadastro
da aplicao Protheus.
Esta barra possui os botes padres para confirmar ou cancelar a interface e ainda permite a
adio de botes adicionais com a utilizao do parmetro aButtons.
Sintaxe:
Parmetros:
oDlg
bOk
bCancel
lMsgDel
aButtons
nRecno
cAlias
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| DENCHBAR
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao da funo
|
|
| EnchoiceBar()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function DEnchBar()
Local oDlg, oBtn
Local aButtons := {}
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600 PIXEL OF;
oMainWnd
AADD( aButtons, {"HISTORIC", {|| TestHist()}, "Histrico...",;
"Histrico",{|| .T.}} )
@ -15,-15 BUTTON oBtn PROMPT "..." SIZE 1,1 PIXEL OF oDlg
ACTIVATE MSDIALOG oDlg ;
ON INIT (EnchoiceBar(oDlg,{||lOk:=.T.,oDlg:End()},{||oDlg:End()},,@aButtons))
Return
30.3.2.
TBar()
Parmetros:
oWnd
nBtnWidth
nBtnHeight
l3D
cMode
No utilizado.
oCursor
cResource
lNoAutoAdjust
Aparncia:
#include 'protheus.ch'
/*/
+----------------------------------------------------------------------------| Funo
| TSTBAR
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto TBar()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function TstTBar()
Local oDlg
oDlg
Exemplo (continuao):
oTBar := TBar():New( oDlg,25,32,.T.,,,,.F. )
oTBtnBmp2_1 := TBtnBmp2():New( 00, 00, 35, 25, 'copyuser' ,,,,;
{||Alert('TBtnBmp2_1')}, oTBar,'msGetEx',,.F.,.F. )
oTBtnBmp2_2 := TBtnBmp2():New( 00, 00, 35, 25, 'critica'
{||},oTBar,'Critica',,.F.,.F. )
,,,,;
,,,,;
,,,,;
oDlg:lCentered := .T.
oDlg:Activate()
Return
30.3.3.
ButtonBar
Sintaxe:
DEFINE BUTTONBAR oBar SIZE nWidth, nHeight 3D MODE OF oDlg
CURSOR
Retorno: ().
Parmetros:
oBar
nWidth
nHeight
3D
oDlg
MODE
CURSOR
A sintaxe ButtonBar requer a adio dos botes como recursos adicionais da barra
previamente definida utilizando a sintaxe abaixo:
Sintaxe adicional:
DEFINE BUTTON RESOURCE cBitMap OF oBar ACTION cAcao TOOLTIP
cTexto
Parmetros:
cBitMap
oBar
cAcao
cTexto
Aparncia:
#include 'protheus.ch'
/*/
+----------------------------------------------------------------------| Funo
| TstBBar
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto TBar()
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function TstBBar()
Local oDlg
Local oBtn1
Local oBtn2
oDlg
Exemplo (continuao):
DEFINE
DEFINE
DEFINE
DEFINE
ACTION
oBtn1:cTitle:="Calc"
DEFINE BUTTON RESOURCE "S4WB009N"
DEFINE BUTTON RESOURCE "S4WB010N"
DEFINE BUTTON RESOURCE "S4WB016N"
ACTION HelProg() TOOLTIP "Ajuda"
30.3.4.
Conforme mencionado nos tpicos anteriores, os botes visuais do tipo barra de botes
permitem a definio de itens com aes e imagens vinculadas.
Dentre os objetos e funes mencionados, foi citada a EnchoiceBar(), a qual permite a adio
de botes adicionais atravs do parmetro aButton, sendo que os itens deste array devem
possuir o seguinte formato:
Sintaxe: AADD(aButtons,{cBitMap, bAcao, cTexto})
Estrutura:
cBitMap
bAcao
cTexto
DISCAGEM
EDIT
EDITABLE
EXCLUIR
FORM
GRAF2D
GRAF3D
LINE
NOTE
OBJETIVO
OK
PENDENTE
PRECO
PRODUTO
S4SB014N
S4WB001N
S4WB005N
S4WB006N
S4WB007N
S4WB008N
S4WB009N
S4WB010N
S4WB011N
S4WB013N
S4WB014A
S4WB016N
SIMULACA
VENDEDOR
USER
Exemplo:
AADD(aButtons,{"USER",{||AllwaysTrue()},"Usurio"})
APNDICES
BOAS PRTICAS DE PROGRAMAO
31.
Arredondamento
If (Valor/30) == 50
If Round(Valor/30, 0) == 50
Exemplo 02:
32.
Utilizao de Identao
obrigatria a utilizao da identao, pois torna o cdigo muito mais legvel. Veja os
exemplos abaixo:
While !SB1->(Eof())
If mv_par01 == SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == 01 .OR. SB1->B1_LOCAL == 02
TrataLocal(SB1->B1_COD, SB1->B1_LOCAL)
Case SB1->B1_LOCAL == 03
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD, SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
A utilizao da identao seguindo as estruturas de controle de fluxo (while, IF, caso etc.)
torna a compreenso do cdigo muito mais fcil:
While !SB1->(Eof())
If mv_par01 == SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == 01 .OR. SB1->B1_LOCAL == 02
TrataLocal(SB1->B1_COD, SB1->B1_LOCAL)
Case SB1->B1_LOCAL == 03
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD, SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
Para identar o cdigo utilize a tecla <TAB> e na ferramenta DEV-Studio, a qual pode ser
configurada atravs da opo Preferncias:
33.
Capitulao de Palavras-Chave
Variveis de memria:
Campos:
SC6->C6_NUMPED
Querys:
SELECT * FROM...
34.
35.
Tipo de dado
Array
Bloco de cdigo
Caracter
Data
Lgico
Numrico
Objeto
Indefinido
Exemplo
aValores
bSeek
cNome
dDataBase
lContinua
nValor
oMainWindow
xConteudo
Funcionalmente correto
Eficiente
Legvel
Reutilizvel
Extensvel
Portvel
Com a otimizao do cdigo da funo GetAnswer(), pode facilmente verificar que a mesma
no realiza nada adicional chamada de GetOk(), podendo ser substituda por uma chamada
direta desta, continuando a funcionar corretamente.
Codificao auto-documentvel
Nenhum comentrio substitui um cdigo claramente escrito, e este no um acidente.
Considere o exemplo:
cVar := "
" // 11 espaos
cVar := Space(11)
O mesmo princpio pode ser aplicado para qualquer string longa de caracteres repetidos. A
funo Replicate pode ser utilizada como a seguir:
Este tipo de programao deixa o cdigo fcil de digitar, fcil de ler e mais flexvel.
Se o valor da varivel nVar for igual a zero (0) no momento da execuo desta linha de
cdigo, ambas as comparaes separadas pelo operador lgico .Or. sero efetuadas: Aps ser
avaliada, a primeira comparao ir falhar. A segunda comparao ser ento avaliada e
falhar tambm. Como resultado, o cdigo existente dentro da estrutura de fluxo If no ser
executado. Tal cdigo somente ser executado quando o valor desta varivel for maior OU
menor do que zero. Ou seja, sempre que for DIFERENTE de zero, o que torna a linha a seguir
mais eficiente:
If nVar != 0
Este tipo de alterao torna o cdigo mais legvel e o processamento mais rpido, evitando a
avaliao de instrues desnecessariamente.
Existem outras situaes onde a simplificao pode ser utilizada. A expresso de avaliao a
seguir:
If cVar $ "ABCD"
Existe uma opo de soluo de auto-ajuste disponvel que fcil de digitar e tem a garantia
de executar a tarefa igualmente (tornar todos os caracteres maisculos):
Este cdigo pode ser escrito de uma forma muito mais simples, conforme demonstrado abaixo:
nVar := nVar + 1
nVar := nVar -1
++nVar
--nVar
Deve-se apenas
podem aparecer
utilizada dentro
resultado. Para
ADVPL.
Local nCnt := 0
For nCnt := 1 To 10
<cdigo>
Next nCnt
Local nCnt
While ( nCnt++ < 10 )
<cdigo>
EndDo
Em ADVPL, variveis no inicializadas sempre tem seu valor contendo nulo (nil) a princpio, o
que far com que uma exceo em tempo de execuo acontea quando a instruo de
repetio while for executada.
Diferentemente do primeiro exemplo, onde a inicializao da varivel no fazia diferena
alguma, neste segundo exemplo a inicializao absolutamente necessria. Deve-se procurar
inicializar variveis numricas com zero (0) e variveis caracter com string nula ("") apenas
quando realmente necessrio.
Utilizao de alternativas
Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para
explorar duas ou trs diferentes abordagens. Quando se est trabalhando em algo mais
complexo, deve-se planejar prototipar algumas a mais. Considere o seguinte cdigo:
If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif
Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. Este
cdigo foi ento convertido e armazenado como uma string. Pode-se notar que a cor "Preto"
ser atribuda se nenhuma outra opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto reduz
o nmero de comandos replace:
Do Case
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
cColor := "Preto"
EndCase
Replace hair With cColor
local ncnt
while ( ncnt++ < 10 )
ntotal += ncnt * 2
enddo
Local nCnt
While ( nCnt++ < 10 )
nTotal += nCnt * 2
EndDo
Esse tipo de mensagem pode dar informaes demais para o usurio e deix-lo sentindo-se
desconfortvel se no souber o que significa "reindexando", etc. E de fato, o usurio no devia
ser incomodado com tais detalhes. Apenas a frase "Aguarde, indexando." funcionaria
corretamente, assim como palavras "processando" ou "reorganizando".
Outra boa idia evitar a referencia a um item corrente de uma tabela como um "registro":
A impresso que se tem aps uma leitura deste cdigo de que valores esto sendo atribudos
s variveis ou que constantes esto sendo utilizadas. Se o objetivo flexibilidade, o cdigo
anterior deve ser substitudo por:
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK
5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
LISTAS DE EXERCCIOS
Mdulo 04.1.: Desenvolvendo aplicaes em ADVPL
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
25
26
27
28
29
para
interagir
com
classe
Aluno()
30
31
32
33
34
35
36
01
02
36.
A linguagem ADVPL possui diversos componentes visuais e auxiliares, os quais podem ser
representados utilizando a estrutura abaixo:
Classes Auxiliares
Tfont
Classes de Janelas
Msdialog
Tdialog
Twindow
Classes de Componentes
Tcontrol
Classes de Componentes
Visuais
Brgetddb
Mscalend
Mscalendgrid
Msselbr
Msworktime
Sbutton
Tbar
Tbitmap
Tbrowsebutton
Tbtnbmp
Tbtnbmp2
Tbutton
Tcbrowse
Tcheckbox
Tcolortriangle
Tcombobox
Tfolder
Tfont
Tget
Tgroup
Thbutton
Tibrowser
Tlistbox
Tmenu
Tmenubar
Tmeter
Tmsgraphic
Tmsgbar
Tmultibtn
Tmultiget
Tolecontainer
Tpageview
Tpanel
Tradmenu
Tsbrowse
Tsay
Tscrollbox
Tsimpleeditor
Tslider
Classes de Componentes
Visuais
Tsplitter
Ttabs
Ttoolbox
Twbrowse
Vcbrowse
Propriedades:
nLeft
nTop
nWidth
nHeight
cCaption
cTooltip
lShowHint
cMsg
nClrText
nClrPane
bWhen
bValid
blClicked
brClicked
blDblClick
oWnd
lVisible
Cargo
bLostFocus
bGotFocus
Parmetros:
Nenhum
Mtodos auxiliares:
SetFocus
Descrio: Fora mudana do foco de entrada de dados para o controle.
Sintaxe: SetFocus( )
Parmetros:
Nenhum
Retorno:
Nil
Hide
Descrio: Torna objeto invisvel.
Sintaxe: Hide( )
Parmetros:
Nenhum
Retorno:
Nil
Show
Descrio: Torna objeto visvel.
Sintaxe: Show( )
Parmetros:
Nenhum
Retorno:
Nil
Enable
Descrio: Habilita o objeto.
Sintaxe: Enable( )
Parmetros:
Nenhum
Retorno:
Nil
Disable
Descrio: Desabilita o objeto.
Sintaxe: Disable( )
Parmetros:
Nenhum
Retorno:
Nil
Refresh
Descrio: Fora atualizao (sincronia) de propriedades entre o programa e o
Protheus Remote.
Sintaxe: Refresh( )
Parmetros:
Nenhum
Retorno:
Nil
Exemplo:
Classes auxiliares
TFONT()
Descrio: Classe de objetos que define a fonte do texto utilizado nos controles
visuais.
Propriedades:
-
Parmetros:
acName
nPar2
anHeight
lPar4
alBold
nPar6
lPar7
nPar8
alItalic
alUnderline
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oSay
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE 'My dialog' PIXEL
// Cria font para uso
oFont:= TFont():New('Courier New',,-14,.T.)
// Apresenta o tSay com a fonte Courier New
oSay := TSay():New( 10, 10, {|| 'Mensagem'},oDlg,, oFont,,,, .T.,
CLR_WHITE,CLR_RED )
oSay:lTransparent:= .F.
ACTIVATE MSDIALOG oDlg CENTERED
Return
Classes de janelas
MSDIALOG()
Descrio: Classe de objetos que deve ser utilizada como padro de janela para
entrada de dados. MSDialog um tipo de janela dilogo modal, isto
, no permite que outra janela ativa receba dados enquanto esta
estiver ativa.
Propriedades:
-
Parmetros:
anTop
anLeft
anBotom
anRight
acCaption
cPar6
nPar7
lPar8
nPar9
anClrText
anClrBack
oPar12
aoWnd
alPixel
oPar15
oPar16
nPar17
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
// cria dilogo
Local oDlg := MSDialog():New(10,10,300,300,'Meu
dialogo',,,,,CLR_BLACK,CLR_WHITE,,,.T.)
// ativa dilogo centralizado
oDlg:Activate(,,,.T.,{||msgstop('validou!'),.T.},,{||msgstop('iniciando'
)} )
Return
TDIALOG()
Propriedades:
-
Parmetros:
anTop
anLeft
anBotom
anRight
ou caracteres.
Caractere, opcional. Ttulo da janela.
Reservado.
Reservado.
Reservado.
Reservado.
Numrico,opcional. Cor do texto.
Numrico,opcional. Cor de fundo.
Reservado.
Objeto, opcional. Janela me da janela a ser criada, padro
a janela principal do programa.
Lgico, opcional. Se .T. considera as coordenadas passadas
em pixels, se .F. considera caracteres.
Reservado.
Reservado.
Reservado.
Numrico, opcional. Largura da janela em pixels.
Numrico, opcional. Altura da janela em pixels.
acCaption
cPar6
nPar7
lPar8
nPar9
anClrText
anClrBack
oPar12
aoWnd
alPixel
oPar15
oPar16
nPar17
anWidth
anHeight
Mtodos auxiliares:
Activate
Descrio: Ativa (exibe) o dilogo. Chamar somente uma vez este
mtodo.
Sintaxe: Activate([bPar1], [bPar2], [bPar3], [alCentered], [abValid],
[lPar6], [abInit], [bPar8], [bPar9] )
Parmetros:
bPar1
bPar2
bPar3
Reservado.
Reservado.
Reservado.
Lgico, opcional. Se .T. exibe a janela centralizada, .F.
padro.
Bloco de cdigo, opcional. Deve retornar .T. se contedo
do dilogo vlido, se retornar .F. o dilogo no fechar
quando solicitada de encerrar.
Reservado.
Bloco de cdigo, opcional. Executado quando o dilogo
inicia exibio.
Reservado.
Reservado.
alCentered
abValid
lPar6
abInit
bPar8
bPar9
Retorno:
Nenhum
End
Descrio: Encerra (fecha) o dilogo.
Sintaxe: End( )
Parmetros:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
// cria dilogo
oDlg := MSDialog():New(10,10,300,300,'Meu
dialogo',,,,,CLR_BLACK,CLR_WHITE,,,.T.)
// ativa dilogo centralizado
oDlg:Activate(,,,.T.,{||msgstop('validou!'),.T.},,{||msgstop('iniciando..
.')} )
/* os comandos abaixo proporcionam o mesmo resultado
// cria dilogo
DEFINE DIALOG oDlg TITLE 'Meu dialogo' FROM 10,10 TO 300,300 COLOR
CLR_BLACK,CLR_WHITE PIXEL
// ativa dilogo centralizado
ACTIVATE DIALOG oDlg CENTER ON INIT (msgstop('iniciando...')) VALID
(msgstop('validou!'),.T.)
*/
Return Nil
TWINDOW()
Propriedades:
-
Parmetros:
nTop
nLeft
nBottom
nRight
cTitle
nPar6
oPar7
oPar8
oPar9
oParent
lPar11
lPar12
nClrFore
nClrText
oPar15
cPar16
lPar17
lPar18
lPar19
lPar20
lPixel
Mtodos auxiliares:
Activate
Descrio: Ativa (exibe) a janela. Chamar esse mtodo apenas uma vez.
Sintaxe: Activate([acShow], [bPar2], [bPar3], [bPar4], [bPar5], [bPar6],
[ abInit ], [bPar8], [bPar9], [bPar10], [bPar11], [bPar12] ,[bPar13],
[bPar14], [bPar15], [abValid], [bPar17], [bPar18] ).
Parmetros:
acShow
bPar2
bPar3
bPar4
bPar5
bPar6
abInit
bPar8
bPar9
bPar10
bPar11
bPar12
bPar13
bPar14
bPar15
abValid
bPar17
bPar18
Retorno:
Nenhum
End
Descrio: Solicita encerramento da janela.
Sintaxe: End( )
Parmetros:
Nenhum
Center
Descrio: Centraliza a janela.
Sintaxe: Center( )
Parmetros:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oWindow
Local abInit:= {||conout('ativando!')}
Local abValid:= {||conout('encerrando!'),.T.}
oWindow:= tWindow():New( 10, 10, 200, 200, 'Meu
programa',,,,,,,,CLR_WHITE,CLR_BLACK,,,,,,,.T. )
oWindow:Activate('MAXIMIZED',,,,,,abInit,,,,,,,,,abValid,,)
/* os comandos abaixo proporcionam o mesmo resultado
DEFINE WINDOW oWindow FROM 10, 10 TO 200,200 PIXEL TITLE 'Meu programa'
COLOR CLR_WHITE,CLR_BLACK
ACTIVATE WINDOW oWindow MAXIMIZED ON INIT abInit VALID abValid
*/
Return
.
Classes de componentes
TCONTROL()
Propriedades:
Numrico. Alinhamento do controle no espao
disponibilizado pelo seu objeto parente. 0 = Nenhum
(padro), 1= no topo, 2 = no rodap, 3= a esquerda, 4 = a
direita e 5 = em todo o parente.
Lgico. Se .T. indica que o contedo da varivel associada
ao controle foi modificado.
Lgico. Se .T. o contedo da varivel associada ao controle
permanecer apenas para leitura.
Numrico. Handle (identificador) do objeto sobre o qual o
controle foi criado.
Bloco de cdigo. Executado quando o estado ou contedo do
controle modificado pela ao sobre o controle.
Align
lModified
lReadOnly
hParent
bChange
Parmetros:
Nenhum
Mtodos auxiliares:
SetFocus
Descrio: Fora mudana do foco de entrada de dados para o controle.
Sintaxe: SetFocus( )
Parmetros:
Nenhum
Retorno:
Nil
Exemplo:
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
bFields
aHeaders
aColSizes
oDlg
cField
uValue1
uValue2
bChange
bLDblClick
bRClick
oFont
oCursor
nClrFore
nClrBack
cMsg
lUpdate
cAlias
lPixel
bWhen
lDesign
bValid
aAlter
oMother
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
- 379 ADVPL Completo
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 302,402 PIXEL TITLE 'Exemplo'
DbSelectArea('SA1')
oBrowse := BrGetDDB():New(
1,1,200,150,,,,oDlg,,,,,,,,,,,,.F.,'SA1',.T.,,.F.,,, )
oBrowse:AddColumn(TCColumn():New('Codigo',{||SA1->A1_COD
},,,,'LEFT',,.F.,.F.,,,,.F.,))
oBrowse:AddColumn(TCColumn():New('Loja' ,{||SA1>A1_LOJA},,,,'LEFT',,.F.,.F.,,,,.F.,))
oBrowse:AddColumn(TCColumn():New('Nome' ,{||SA1>A1_NOME},,,,'LEFT',,.F.,.F.,,,,.F.,))
// Principais commandos
TButton():New(160,001,'GoUp()',oDlg,{|| oBrowse:GoUp()
},40,10,,,,.T.)
TButton():New(170,001,'GoDown()',oDlg,{|| oBrowse:GoDown()
},40,10,,,,.T.)
TButton():New(180,001,'GoTop()',oDlg,{|| oBrowse:GoTop()
},40,10,,,,.T.)
TButton():New(190,001,'GoBottom()' , oDlg,{|| oBrowse:GoBottom()
},40,10,,,,.T.)
TButton():New(160,060,'nAt (Linha selecionada)',oDlg,;
{|| Alert (oBrowse:nAt)},80,10,,,,.T.)
TButton():New(170,060,'nRowCount (Nr de linhas visiveis)',oDlg,;
{|| Alert(oBrowse:nRowCount()) },80,10,,,,.T.)
TButton():New(180,060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oBrowse:nLen) },80,10,,,,.T.)
Propriedades:
+
bChange
bChangeMes
dDiaAtu
Parmetros:
nRow
nCol
oDlg
lCanMultSel
Aparncia:
Exemplo:
#include 'protheus.ch'
user function Calend_Ex()
DEFINE MSDIALOG oDlg FROM 0,0 TO 1000,1000 PIXEL TITLE 'Exemplo de
MsCalend'
// Cria objeto
oCalend:=MsCalend():New(01,01,oDlg,.T.)
// Code-Block para mudana de Dia
oCalend:bChange := {|| Alert('Dia Selecionado: ' +
dtoc(oCalend:dDiaAtu)) }
// Code-Block para mudana de mes
oCalend:bChangeMes := {|| alert('Mes alterado') }
ACTIVATE MSDIALOG oDlg CENTERED
Return
MSCALENDGRID()
Propriedades:
bAction
bRClick
Parmetros:
aoWnd
anRow
anCol
anHeight
anWidth
dDateIni
nResolution
abWhen
abAction
nDefColor
bRClick
lFillAll
Mtodos auxiliares:
Add
Descrio: Adiciona periodo na Grid.
Sintaxe: Add(cCaption, nLin, nInitial, nFinal, nColor, cDescri )
Parmetros:
cCaption
nLin
nInitial
nFinal
nColor
cDescri
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
nResolution := 1
oMsCalendGrid := MsCalendGrid():New( oDlg, 01, 01, 500,300,;
date(), nResolution, ,{|x,y| Alert(x) },;
RGB(255,255,196), {|x,y|Alert(x,y)}, .T.
)
oMsCalendGrid:Add('caption 01', 1, 10, 20, RGB(255,000,0),
'Descricao 01')
oMsCalendGrid:Add('caption 02', 2, 20, 30, RGB(255,255,0),
'Descricao 02')
oMsCalendGrid:Add('caption 03', 3, 01, 05, RGB(255,0,255),
'Descricao 03')
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
MSSELBR()
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
bFields
aHeaders
aColSizes
oDlg
cField
uValue1
uValue2
bChange
bLDblClick
bRClick
oFont
oCursor
nClrFore
nClrBack
cMsg
lUpdate
cAlias
lPixel
bWhen
lDesign
bValid
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 302,402 PIXEL TITLE 'Exemplo'
DbSelectArea('SA1')
oBrowse := MsSelBr():New(
1,1,200,150,,,,oDlg,,,,,,,,,,,,.F.,'SA1',.T.,,.F.,,, )
oBrowse:AddColumn(TCColumn():New('Codigo',{||SA1->A1_COD
},,,,'LEFT',,.F.,.F.,,,,.F.,))
oBrowse:AddColumn(TCColumn():New('Loja' ,{||SA1>A1_LOJA},,,,'LEFT',,.F.,.F.,,,,.F.,))
oBrowse:AddColumn(TCColumn():New('Nome' ,{||SA1>A1_NOME},,,,'LEFT',,.F.,.F.,,,,.F.,))
// Principais commandos
TButton():New(160,001,'GoUp()',oDlg,{|| oBrowse:GoUp()
},40,10,,,,.T.)
TButton():New(170,001,'GoDown()',oDlg,{|| oBrowse:GoDown()
},40,10,,,,.T.)
TButton():New(180,001,'GoTop()',oDlg,{|| oBrowse:GoTop()
},40,10,,,,.T.)
TButton():New(190,001,'GoBottom()' , oDlg,{|| oBrowse:GoBottom()
},40,10,,,,.T.)
TButton():New(160,060,'nAt (Linha selecionada)',oDlg,{||
Alert(oBrowse:nAt)},80,10,,,,.T.)
TButton():New(170,060,'nRowCount (Nr de linhas visiveis)',oDlg,;
{|| Alert(oBrowse:nRowCount()) },80,10,,,,.T.)
TButton():New(180,060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oBrowse:nLen) },80,10,,,,.T.)
Propriedades:
bChange
Parmetros:
aoWnd
anRow
anCol
[anWidth],
caracteres.
Numrico, opcional. Altura do boto em pixels.
Numrico, opcional. Largura do boto em pixels.
Numrico, Resoluo a ser aplicada na grid do Calendrio
Caracter, opcional. Descritivo
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Bloco de cdigo, opcional. Bloco que dever ser acionado
quando o boto for pressionado.
anHeight
anWidth
nResolution
cValue
abWhen
abChange
Mtodos auxiliares:
GetValue
Descrio: Retorna os item selecionados no formato XX X XX.
Sintaxe: GetValue()
Parmetros:
Nenhum
Retorno:
Caracter
GetInterTime
Descrio: Retorna periodo selecionado.
Sintaxe: GetInterTime()
Parmetros:
Nenhum
Retorno:
Caracter
SetResol
Descrio: Define a resoluo da demonstrao da barra de perodos.
Sintaxe: SetResol (nResolution)
Parmetros:
nResolution
Resoluo
Retorno:
Nil
SetValue
Descrio: Atribui um determindo contedo para um objeto ou atributo
de um objeto.
Sintaxe: SetValue(xValue, cPicture)
Parmetros:
xValue
cPicture
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oMsWorkTime := MsWorkTime():New(oDlg,04,04,280,133,0,'',{||.T.},;
{|oWorkTime|Alert('GetValue():
'+oWorkTime:GetValue()+chr(13)+;
'GetInterTime():
'+oWorkTime:GetInterTime())} )
oMsWorkTime:SetValue('X X XX X')
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
SBUTTON()
Propriedades:
Bloco de cdigo. Executado ao precionar o boto esquerdo
do mouse.
bAction
Parmetros:
Parmetro
[bAction],
[oWnd],
[lEnable],
Tipo / Descrio
Numrico, opcional. Coordenada vertical em pixels ou
carateres.
Numrico, opcional. Coordenada horizontal em pixels ou
caracteres.
Numrico. Tipo do Boto
Bloco de cdigo, opcional. Bloco que dever ser acionado
quando o boto for pressionado.
Objeto, opcional. Janela ou controle onde o boto dever ser
criado.
Logico, opcional. Habilita/Desabilita boto
Caracter, Opicional. Descrio do tipo tooltip(hint) do item
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
nTop
nLeft
nType
bAction
oWnd
lEnable
cMsg
abWhen
[nType],
Mtodos auxiliares:
Create
Descrio: Retorna Mtodo construtor opcional da classe.
Sintaxe: Create()
Parmetros:
Nenhum
Retorno:
Objeto
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oSButton1 := SButton():New( 01,01,1,{||Alert('SButton
01')},oDlg,.T.,,)
oSButton2 := SButton():New( 21,01,2,{||Alert('SButton
02')},oDlg,.T.,,)
oSButton3 := SButton():New( 41,01,3,{||Alert('SButton
03')},oDlg,.T.,,)
oSButton4 := SButton():New( 61,01,4,{||Alert('SButton
04')},oDlg,.T.,,)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TBAR()
Propriedades:
-
Construtor:
Parmetros:
oWnd
nBtnWidth
nBtnHeight
l3D
cMode
No utilizado.
oCursor
cResource
lNoAutoAdjust
Aparncia:
Exemplo:
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------| Funo
| TSTBAR
| Autor | MICROSIGA
|Data |
|
+-----------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto TBar()
|
+-----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+-----------------------------------------------------------------------/*/
User Function TstTBar()
Local oDlg
oDlg
Exemplo (continuao):
oTBar := TBar():New( oDlg,25,32,.T.,,,,.F. )
oTBtnBmp2_1 := TBtnBmp2():New( 00, 00, 35, 25, 'copyuser' ,,,,;
{||Alert('TBtnBmp2_1')}, oTBar,'msGetEx',,.F.,.F. )
oTBtnBmp2_2 := TBtnBmp2():New( 00, 00, 35, 25, 'critica'
{||},oTBar,'Critica',,.F.,.F. )
,,,,;
,,,,;
,,,,;
oDlg:lCentered := .T.
oDlg:Activate()
Return
TBITMAP()
Propriedades:
cResName
cBmpFile
lStretch
lAutoSize
lTransparent
Parmetros:
anTop
anLeft
anWidth
anHeight
acResName
acBmpFile
alNoBorder
aoWnd
abLClicked
abRClicked
alScroll
alStretch
aoCursor
acMsg
alUpdate
abWhen
alPixel
abValid
alDesign
alIsIcon
alIsJpeg
Mtodos auxiliares:
Create
Descrio: Retorna Mtodo construtor opcional da classe.
Sintaxe: Create()
Parmetros:
Nenhum
Retorno:
Objeto
SetBmp
Descrio: Mtodo para carregar uma imagem do repositrio.
Sintaxe: SetBmp( acResName )
Parmetros:
acResName
Retorno:
Nenhum
Load
Descrio: Mtodo para carregar uma imagem do repositrio ou local.
Sintaxe: Load( acResName, acBmpFile )
Parmetros:
acResName
acBmpFile
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
Propriedades:
bAction
Parmetros:
nRow
nCol
cCaption
oWnd
bAction
nWidth
nHeight
nHelpId
oFont
lDefault
lPixel
lDesign
cMsg
lUpdate
bWhen
bValid
lCancel
Reservado
Reservado
Reservado
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Reservado
Reservado
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oTBrowseButton := TBrowseButton():New( 01,01,'TBrowseButton',oDlg,;
{||Alert('TBrowseButton')},40,10,,,.F.,.T.,.F.,,.F.,,,)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TBTNBMP()
Descrio: Classe de objetos visuais do tipo boto, o qual permite que seja
vinculada uma imagem ao controle.
Propriedades:
bAction
Parmetros:
cResName1
cResName2
cBmpFile1
cBmpFile2
cMsg
bAction
lGroup
oWnd
lAdjust
bWhen
cToolTip
lPressed
bDrop
cAction
nPos
cPrompt
oFont
cResName3
cBmpFile3
lBorder
Mtodos auxiliares:
LoadBitmaps
Descrio: Atribui ao boto os bitmaps ou recursos para exibio.
Sintaxe:
LoadBitmaps([cResName1],
[cResName2],
[cBmpFile1],
[cBmpFile2], [cResName3], [cBmpFile3])
Parmetros:
cResName1
cResName2
cBmpFile1
cBmpFile2
cResName3
cBmpFile3
Caractere,
Caractere,
Caractere,
Caractere,
Caractere,
Caractere,
Nome
Nome
Nome
Nome
Nome
Nome
do
do
do
do
do
do
resource
resource
arquivo BMP
arquivo BMP
resource
resource
Retorno:
Nenhum
SetPopUpMenu
Descrio: Seta o objeto do tipo TMenu referente ao boto.
Sintaxe: SetPopupMenu(oMenu)
Parmetros:
Nenhum
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oTBar := TBar():New( oDlg,25,32,.T.,,,,.F. ) // Orig: 25,45
oTBtnBmp1 := TBtnBmp() :NewBar('RPMNEW',,,,'Msg 01',;
{||Alert('TBtnBmp
01')},.F.,oTBar,.T.,{||.T.},,.F.,,,1,,,,,.T. )
oTBtnBmp2 := TBtnBmp() :NewBar('copyuser',,,,'Msg 02',;
{||Alert('TBtnBmp
02')},.F.,oTBar,.T.,{||.T.},,.F.,,,1,,,,,.T. )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TBTNBMP2()
Propriedades:
-
Parmetros:
anTop
anLeft
anWidth
anHeight
acResName1
acResName2
acBmpFile1
acBmpFile2
abAction
aoWnd
acMsg
abWhen
lAdjust
lUpdate
Mtodos auxiliares:
- 401 ADVPL Completo
LoadBitmaps
Descrio: Atribui ao boto os bitmaps ou recursos para exibio.
Sintaxe:
LoadBitmaps([cResName1],
[cResName2],
[cBmpFile1],
[cBmpFile2], [cResName3], [cBmpFile3])
Parmetros:
cResName1
cResName2
cBmpFile1
cBmpFile2
cResName3
cBmpFile3
Caractere,
Caractere,
Caractere,
Caractere,
Caractere,
Caractere,
Nome
Nome
Nome
Nome
Nome
Nome
do
do
do
do
do
do
resource
resource
arquivo BMP
arquivo BMP
resource
resource
Retorno:
Nenhum
SetPopUpMenu
Descrio: Seta o objeto do tipo TMenu referente ao boto.
Sintaxe: SetPopupMenu(oMenu)
Parmetros:
Nenhum
Retorno:
Nenhum
Aparncia:
Exemplo:
Local oBtn := TBtnBmp2():New( 10, 10, 25, 25, 'printer_r2' , , , , , oDlg,
, , )
Exemplo 2 (Popup)
#INCLUDE 'PROTHEUS.CH'
User Function BtnBmpPopUp
Local oDlg
Local oBtn
DEFINE MSDIALOG oDlg TITLE '' FROM 0,0 TO 100,200 PIXEL
oBtn := TBtnBmp2():New( 10, 10, 13, 13, 'IBF-MENU.BMP' , 'IBF-MENU.BMP' ,
, , , oDlg, , , .T.)
oBtn:SetPopupmenu(TShowMenu())
ACTIVATE MSDIALOG oDlg CENTERED
Return
/**************************/
Static Function TShowMenu()
Local oMenu
oMenu := TMenu():New(0,0,0,0,.T.)
oMenu:Add(TMenuItem():New(,'Detalhes', 'Detalhes',,, ,,,,,,,,,.T.))
oMenu:Add(TMenuItem():New(,'Add Info', 'Add Info',,, ,,,,,,,,,.T.))
Return oMenu
TBUTTON()
Propriedades:
lProcessing
bAction
Parmetros:
Parmetro
anRow
anCol
acCaption
aoWnd
abAction
anWidth
anHeight
nPar8
aoFont
Tipo / Descrio
Numrico, opcional. Coordenada vertical em pixels ou
carateres.
Numrico, opcional. Coordenada horizontal em pixels ou
caracteres.
Caractere, opcional. Titulo do boto.
Objeto, opcional. Janela ou controle onde o boto dever ser
criado.
Bloco de cdigo, opcional. Bloco que dever ser acionado
quando o boto for pressionado.
Numrico, opcional. Largura do boto em pixels.
Numrico, opcional. Altura do boto em pixels.
Reservado.
Objeto, opcional. Objeto tipo tFont com propriedades da
fonte utilizada para o ttulo do boto.
- 403 ADVPL Completo
lPar10
alPixel
lPar12
cPar13
lPar14
abWhen
bPar16
lPar17
Reservado.
Lgico, opcional. Se .T. considera as coordenadas passadas
em pixels, se .F. (padro) considera em caracteres.
Reservado.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Reservado.
Reservado.
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo
aItems:= {'item1','item2','item3'}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu Combo'
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop('Mudou item')},,,,.T.,,,,,,,,,'cCombo')
// Boto para fechar a janela
oButton:=tButton():New(30,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'O valor '+cCombo )
Return NIL
TCBROWSE()
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
bFields
aHeaders
aColSizes
oDlg
cField
uValue1
uValue2
bChange
bLDblClick
bRClick
oFont
oCursor
nClrFore
nClrBack
cMsg
lUpdate
cAlias
lPixel
bWhen
lDesign
bValid
lHScroll
lVScroll
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
user function TcBrowse_EX()
Local oOK
:= LoadBitmap(GetResources(),'br_verde')
Local oNO
:= LoadBitmap(GetResources(),'br_vermelho')
Local aList := {} // Vetor com elementos do Browse
Local nX
// Cria Vetor para teste
for nX := 1 to 100
aListAux := {.T., strzero(nX,10), 'Descrio do Produto '+;
strzero(nX,3), 1000.22+nX}
aadd(aList, aListAux)
next
DEFINE MSDIALOG oDlg FROM 0,0 TO 520,600 PIXEL TITLE 'Exemplo da TCBrowse'
// Cria objeto de fonte que sera usado na Browse
Define Font oFont Name 'Courier New' Size 0, -12
// Cria Browse
oList := TCBrowse():New( 01 , 01, 300, 200,,;
'','Codigo','Descrio','Valor'},{20,50,50,50},;
oDlg,,,,,{||},,oFont,,,,,.F.,,.T.,,.F.,,, )
// Seta o vetor a ser utilizado
oList:SetArray(aList)
// Monta a linha a ser exibina no Browse
oList:bLine := {||{ If(aList[oList:nAt,01],oOK,oNO),;
aList[oList:nAt,02],;
aList[oList:nAt,03],;
Transform(aList[oList:nAT,04],'@E 99,999,999,999.99') } }
// Evento de DuploClick (troca o valor do primeiro elemento do Vetor)
oList:bLDblClick := {|| aList[oList:nAt][1] :=;
!aList[oList:nAt][1],oList:DrawSelect() }
// Principais commandos
oBtn := TButton():New( 210, 001,'GoUp()' , oDlg,{||oList:GoUp()},;
40, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 220, 001,'GoDown()', oDlg,{||oList:GoDown()},;
40, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 230, 001,'GoTop()' , oDlg,{||oList:GoTop()}, ;
40, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 240, 001,'GoBottom()', oDlg,{||oList:GoBottom()},;
40, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 210, 060, 'nAt (Linha selecionada)'
,;
oDlg,{|| Alert(oList:nAt)},;
90, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 220, 060, 'nRowCount (Nr de linhas visiveis)',
oDlg,;{|| Alert(oList:nRowCount()) }, 90, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 230, 060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oList:nLen) }, 90, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 240, 060, 'lEditCell (Edita a celula)', oDlg,;
{|| lEditCell(@aList,oList,'@!',3) }, 90, 010,,,.F.,.T.,.F.,,.F.,,,.F. )
ACTIVATE MSDIALOG oDlg CENTERED
return
TCHECKBOX()
Propriedades:
bLClicked
bSetGet
bWhen
bValid
Parmetros:
nRow
nCol
cCaption
bSetGet
oDlg
nWidth
nHeight
aHelpIds
bLClicked
oFont
bValid
nClrText
nClrPane
lDesign
lPixel
cMsg
lUpdate
bWhen
Aparncia:
Exemplo:
#include 'protheus.ch'
user function TCheckBox()
DEFINE MSDIALOG oDlg FROM 0,0 TO 270,400 PIXEL TITLE 'Exemplo da
TCBrowse'
lCheck1 := .T.
oCheck1 := TCheckBox():New(01,01,'CheckBox 001',,oDlg,
100,210,,,,,,,,.T.,,,)
oCheck2 := TCheckBox():New(11,01,'CheckBox 002',,oDlg,
100,210,,,,,,,,.T.,,,)
oCheck3 := TCheckBox():New(21,01,'CheckBox 003',,oDlg,
100,210,,,,,,,,.T.,,,)
oCheck4 :=TCheckBox():New(31,01,'CheckBox 004',,oDlg,
100,210,,,,,,,,.T.,,,)
oCheck5 := TCheckBox():New(41,01,'CheckBox
005',,oDlg,100,210,,,,,,,,.T.,,,)
TCOLORTRIANGLE()
Propriedades:
-
Parmetros:
Numrico, opcional. Coordenada vertical em pixels ou
carateres.
Numrico, opcional. Coordenada horizontal em pixels ou
caracteres.
Objeto, opcional. Janela ou controle onde a paleta dever
ser criada.
Numrico, opcional. Largura da paleta em pixels.
Numrico, opcional. Altura da paleta em pixels.
anRow
anCol
aoWnd
anWidth
anHeight
Mtodos auxiliares:
Create
Descrio: Mtodo construtor opcional da classe.
Sintaxe: Create(aoWnd)
Parmetros:
aoWnd
Retorno:
Objeto
RetColor
Descrio: Retorna o RGB da cor selecionada
Sintaxe: RetColor ( )
Parmetros:
Nenhum
Retorno:
Numrico
SetColorIni
Descrio: Define a cor inicial selecionada para o controle.
Sintaxe: SetColorIni (nColor )
Parmetros:
nColor
Retorno:
Nenhum
SetColor
Descrio: Define a cor corrente.
Sintaxe: SetColor (nColor )
Parmetros:
nColor
Retorno:
Nenhum
SetSizeTriangule
Descrio: Define o tamanho do tringulo de configurao das cores.
Sintaxe: SetSizeTriangule (nWidh, nHeight)
Parmetros:
nWidth
nHeight
Numrico. Largura
Numrico.Altura
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
Propriedades:
aItems
nAt
Parmetros:
Parmetro
anRow
anCol
abSetGet
anItems
anWidth
anHeight
aoWnd
nPar8
abChange
abValid
anClrBack
anClrText
alPixel
aoFont
cPar15
lPar16
abWhen
lPar18
aPar19
bPar20
cPar21
acReadVar
Mtodos auxiliares:
Select
Descrio: Muda o item selecionado no combobox.
Sintaxe: Select( [anItem] )
Parmetros:
anItem
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo
aItems:= {'item1','item2','item3'}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu Combo'
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop('Mudou item')},,,,.T.,,,,,,,,,'cCombo')
// Boto para fechar a janela
oButton:=tButton():New(30,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'O valor '+cCombo )
Return NIL
TFOLDER()
Propriedades:
aPrompts
aDialogs
nOption
bSetOption
Parmetros:
Numrico, opcional. Coordenada vertical em pixels ou
carateres.
Numrico, opcional. Coordenada horizontal em pixels ou
caracteres.
Array, Titulo dos folders
Array, Nome dos dilogos
Objeto, opcional. Janela ou controle onde a boto dever ser
criado
Numrico, opcional. Folder selecionado
Numrico, opcional. Cor de frente
Numrico, opcional. Cor de fundo
Lgico, opcional. Utiliza coordenadas em pixel
Lgico, opcional. NO USADO
Numrico, opcional. Largura em pixels.
Numrico, opcional. Altura em pixels.
Caractere, Mensagem de Hint
Lgico, opcional. NO USADO
anTop
anLeft
aPrompts
aDialogs
aoWnd
anOption
anClrFore
anClrBack
alPixel
alDesign
anWidth
anHeight
acMsg
alAllWidth
Mtodos auxiliares:
SetOption
Descrio: Seleciona folder desejado
Sintaxe: SetOption( nOption )
Parmetros:
nOption
Retorno:
Nenhum
AddItem
Descrio: Insere um folder
Sintaxe: AddItem ( cItem, lVisible )
Parmetros:
cItem
lVisible
Retorno:
Nenhum
aEnable
Descrio: Habilita/Desabilita um folder
Sintaxe: aEnable( nItem, lEnable )
Parmetros:
nItem
lEnable
Retorno:
Nenhum
Aparncia:
Exemplo:
Local oFolder
Local aFolder := { 'Folder 1', 'Folder 2', 'Folder 3' }
oFolder := TFolder():New( 0, 0, aFolder, aFolder, oDlg,,,, .T., , 200,;
200 )
TGET()
Propriedades:
lPassword
Picture
Parmetros:
anRow
anCol
abSetGet
aoWnd
anWidth
anHeight
acPict
abValid
anClrFore
anClrBack
aoFont
lPar12
oPar13
alPixel
cPar15
lPar16
abWhen
lPar18
lPar19
abChange
alReadOnly
alPassword
cPar23
acReadVar
cPar25
lPar26
nPar27
lPar28
controle.
Reservado.
Reservado.
Lgico, opcional. Se .T. as coordenadas informadas so em
pixels, se .F. so em caracteres.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando o controle
modifica o valor da varivel associada.
Lgico, opcional. Se .T. o controle no poder ser editado.
Lgico, opcional. Se .T. o controle exibir asteriscos * no
lugar dos caracteres exibidos pelo controle para simular
entrada de senha.
Reservado.
Caractere, opcional. Nome da varivel que o controle dever
manipular, dever ser a mesma varivel informada no
parmetro abSetGet, e ser o retorno da funo ReadVar( ).
Reservado.
Reservado.
Reservado.
Reservado.
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, nGet1:=0
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu Get'
oGet1:= TGet():New(10,10,{|u| if(PCount()>0,nGet1:=u,nGet1)}, oDlg,;
100,20,'@E 999,999.99',;
{|o|nGet1>1000.00},,,,,,.T.,,,,,,,,,,'nGet1')
// Boto para fechar a janela
oButton:=tButton():New(30,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'O valor '+Transform(nGet1,'@E 999,999.00') )
Return NIL
TGROUP()
Propriedades:
-
Parmetros:
anTop
anLeft
anBottom
anRight
acCaption
aoWnd
anClrText
anClrPane
alPixel
lPar10
[acCaption],
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oButton, oCombo, cCombo, cGet1:='Teste'
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu test'
oGroup:= tGroup():New(10,10,130,130,'grupo de gets',oDlg,,,.T.)
@ 18,16 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL
@ 38,16 MSGET oGet2 VAR cGet1 SIZE 100,10 OF oGroup PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
THBUTTON()
Propriedades:
bAction
Parmetros:
Parmetro
anRow
anCol
acCaption
aoWnd
abAction
anWidth
anHeight
aoFont
abWhen
[aoWnd],
[abAction],
Tipo / Descrio
Numrico, opcional. Coordenada vertical em pixels ou
carateres.
Numrico, opcional. Coordenada horizontal em pixels ou
caracteres.
Caractere, opcional. Titulo do boto.
Objeto, opcional. Janela ou controle onde o boto dever ser
criado.
Bloco de cdigo, opcional. Bloco que dever ser acionado
quando o boto for pressionado.
Numrico, opcional. Largura do boto em pixels.
Numrico, opcional. Altura do boto em pixels.
Objeto, opcional. Objeto tipo tFont com propriedades da
fonte utilizada para o ttulo do boto.
Bloco de cdigo, opcional. Executado quando mudana de
foco de entrada de dados est sendo efetuada na janela
onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Mtodos auxiliares:
Create
Descrio: Mtodo construtor opcional da classe.
Sintaxe: Create(aoWnd)
Parmetros:
aoWnd
Retorno:
Objeto
Aparncia:
Exemplo:
#include protheus.ch
#include hbutton.ch
User Function MyhBtn()
Local oDlg, ohBtn
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE Meu hButton
// Usando o mtodo create
ohBtn:= tHButton():Create( oDlg )
ohBtn:nTop
:= 100
ohBtn:nLeft
:= 10
ohBtn:nWidth
:= 100
ohBtn:nHeight
:= 30
ohBtn:cCaption := 'hButton'
ohBtn:blClicked := { || MsgStop( 'Cliquei' ) }
// Usando o command
@ 200,100 HBUTTON ohBtn PROMPT 'Exemplo hButton' SIZE 100,30 ACTION
MsgStop('Cliquei') OF oDlg MESSAGE 'hButton'
ACTIVATE MSDIALOG oDlg CENTERED
Return Nil
TIBROWSER()
Propriedades:
-
Parmetros:
nRow
nCol
nWidth
nHeigth
cPage
oWnd
Aparncia:
- 423 ADVPL Completo
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
// Habilitar no Remote(Config) -> BrowserEnabled=1
oTIBrowser:=
TIBrowser():New(0,0,306,134,'http://www.microsiga.com.br',oDlg )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TLISTBOX()
Descrio: Classe de objetos visuais do tipo controle tListbox, a qual cria uma
janela com itens selecionveis e barra de rolagem. Ao selecionar um
item, uma varivel atualizada com o contedo do item selecionado.
Propriedades:
nAt
aItems
Construtor:
New([anRow], [anCol], [abSetGet], [aaItems], [anWidth],
[anHeigth],
[abChange],
[aoWnd],
[abValid],
[anClrFore],
[anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [cPar16],
[lPar17], [abWhen], [aPar19], [bPar20], [lPar21], [lPar22],
[abRightClick] )
Parmetros:
anRow
anCol
abSetGet
aaItems
anWidth
anHeight
abChange
aoWnd
abValid
anClrFore
anClrBack
alPixel
lPar13
abLDBLClick
aoFont
cPar16
lPar17
abWhen
aPar19
bPar20
lPar21
lPar22
Reservado.
Reservado.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando acionado click
do boto direito do mouse sobre o controle.
abRightClick
Mtodos auxiliares:
Select
Descrio: Fora a seleo de um item.
Sintaxe: Select( [anItem] )
Parmetros:
nItem
Retorno:
Nenhum
Add
Descrio: Adiciona novo item.
Sintaxe: Add( cText, nPos )
Parmetros:
cText
nPos
Retorno:
Nenhum
Modify
Descrio: Modifica o texto de um item.
Sintaxe: Modify( cText, nPos )
Parmetros:
cText
nPos
Retorno:
Nenhum
Del
Descrio: Remove um item.
Sintaxe: Del( nPos )
Parmetros:
nPos
Retorno:
Nenhum
Len
Descrio: Retorna o nmero de itens.
Sintaxe: Len( )
Parmetros:
Nenhum
Retorno:
Numrico
Nmero de itens.
Reset
Descrio: Apaga todos os itens.
Sintaxe: Reset( )
Parmetros:
Nenhum
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oList, nList:= 1
Local aItems:={}
Aadd(aItems,'Item 1')
Aadd(aItems,'Item 2')
Aadd(aItems,'Item 3')
Aadd(aItems,'Item 4')
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE 'Teste'
oList:= tListBox():New(10,10,{|u|if(Pcount()>0,nList:=u,nList)};
,aItems,100,100,,oDlg,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TMENU()
Propriedades:
-
Parmetros:
nTop
nLeft
nHeight
nWidth
lPopUp
cBmpName
oWnd
nClrNoSelect
nClrSelect
cArrowUpNoSel
cArrowUpSel
cArrowDownNoSel
cArrowDownSel
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oMenu := TMenu():New( 0,0,0,0,.F.,'',oDlg,CLR_WHITE,CLR_BLACK)
// Adiciona Item ao Menu Principal
oMenuItem1 := TMenuItem():New2( oMenu:Owner(),'Item 001','Item
001',,,)
oMenu:Add( oMenuItem1 )
// Adiciona sub-Itens
oMenuItem2 := TMenuItem():New2( oMenu:Owner(),'Sub-Item
001',,,{||Alert('TMenuItem')})
oMenuItem3 := TMenuItem():New2( oMenu:Owner(),'Sub-Item
002',,,{||Alert('TMenuItem')})
oMenuItem1:Add( oMenuItem2 )
oMenuItem1:Add( oMenuItem3 )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TMENUBAR()
Propriedades:
-
Construtor: New([oWnd])
Parmetros:
oWnd
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
// Monta um Menu Suspenso
TMenuBar := TMenuBar():New(oDlg)
TMenuBar:nClrPane := RGB(183,208,248) // Cor de fundo do Menu
oTMenu1 := TMenu():New(0,0,0,0,.T.,,oDlg)
oTMenu2 := TMenu():New(0,0,0,0,.T.,,oDlg)
TMenuBar:AddItem('Arquivo' , oTMenu1, .T.)
TMenuBar:AddItem('Relatorio', oTMenu2, .T.)
// Cria Itens do Menu
oTMenuItem := TMenuItem():New(oDlg,'TMenuItem 01',,,,;
{||Alert('TMenuItem 01')},,'AVGLBPAR1',,,,,,,.T.)
oTMenu1:Add(oTMenuItem)
oTMenu2:Add(oTMenuItem)
oTMenuItem := TMenuItem():New(oDlg,'TMenuItem 02',,,,;
{||Alert('TMenuItem 02')},,,,,,,,,.T.)
oTMenu1:Add(oTMenuItem)
oTMenu2:Add(oTMenuItem)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TMETER()
Descrio: Classe de objetos visuais do tipo controle tMeter, a qual exibe uma
rgua (gauge) de processamento, descrevendo o andamento de um
processo atravs da exibio de uma barra horizontal.
Propriedades:
nTotal
lPercentage
nClrBar
Parmetros:
anRow
anCol
abSetGet
anTotal
aoWnd
anWidth
anHeight
lPar8
alPixel
oPar10
cPar11
alNoPerc
anClrPane
nPar14
anClrBar
nPar16
lPar17
Mtodos auxiliares:
Set
Descrio: Atualiza a posio da rgua de processamento.
Sintaxe: Set( [nVal] )
Parmetros:
nVal
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
STATIC lRunning:=.F., lStop:=.F.
User Function Teste()
Local oDlg, oMeter, nMeter:=0, oBtn1, oBtn2
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE 'Teste' Pixel
oMeter:= tMeter():New(10,10,{|u|if(Pcount()>0,nMeter:=u,nMeter)};
,100,oDlg,100,16,,.T.) // cria a rgua
// boto para ativar andamento da rgua
@ 30,10 BUTTON oBtn1 PROMPT 'Run ' OF oDlg PIXEL ACTION RunMeter(oMeter)
@ 50,10 BUTTON oBtn2 PROMPT 'Stop' OF oDlg PIXEL ACTION lStop:=.T.
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
STATIC Function RunMeter(oMeter)
If lRunning
Return
Endif
lRunning:= .T.
oMeter:Set(0)
// inicia a rgua
While .T. .and. !lStop
Sleep(1000) // pra 1 segundo
ProcessMessages() // atualiza a pintura da janela, processa mensagens do
windows
nCurrent:= Eval(oMeter:bSetGet) // pega valor corrente da rgua
nCurrent+=10 // atualiza rgua
oMeter:Set(nCurrent)
if nCurrent==oMeter:nTotal
Return
endif
Enddo
lRunning:= .F.
lStop:= .F.
Return
TMSGRAPHIC()
Propriedades:
l3D
lAxisVisib
Construtor:
New([anRow],
[anCol],
[aoWnd],
[anClrBack], [anWidth], [anHeight])
Parmetros:
anRow
anCol
aoWnd
aoFont
anClrText
anClrBack
anWidth
anHeight
[aoFont],
[anClrText],
Mtodos auxiliares:
CreateSerie
Descrio: Mtodo para criao de uma serie para o grfico.
Sintaxe:
CreateSerie(
[nSerieType],
[cLegend],
[nDecimals],
[lShowValues] )
Parmetros:
nSerieType
cLegend
nDecimals
lShowValues
Retorno:
Numrico
Add
Descrio: Mtodo para adicionar um item ao grfico.
Sintaxe: Add(nSerie, nVal, cLegend, nColor )
Parmetros:
nSerie
nVal
cLegend
nColor
Retorno:
Nenhum
SetGradiente
Descrio: Mtodo para setar o fundo do grfico com uma cor gradiente
em determinada direo.
Sintaxe: SetGradient(nDirection, StartColor, EndColor )
Parmetros:
nDirection
StartColor
EndColor
Retorno:
Nenhum
SetTitle
Descrio: Define o titulo do grfico.
Sintaxe: SetTitle(cTitle, cTitle2, Color, Aligment, lFoot)
Parmetros:
cTitle
cTitle2
Color
Aligment
lFoot
Retorno:
Nenhum
SetLegenProp
Descrio: Mtodo para setar propriedades da legenda.
Sintaxe: SetLegenProp(Align, Color, Style, Visible )
Parmetros:
Align
Color
Style
Visible
Retorno:
Nenhum
SetMargins
Descrio: Mtodo para setar as margens superior, inferior e laterais do
grfico.
Sintaxe: SetMargins(nTop, nLeft, nBottom, nRight )
Parmetros:
nTop
nLeft
nBottom
nRight
Numrico.
Numrico.
Numrico.
Numrico.
Posio
Posio
Posio
Posio
em
em
em
em
relao
relao
relao
relao
ao topo do grfico.
a esquerda.
ao rodap.
a direita.
Retorno:
Nenhum
SetRangeY
Descrio: Define a escala dos valores do eixo Y
Sintaxe: SetRangeY (min, max, delta).
Parmetros:
Min
Max
delta
valor inicial
valor final
intervalo entre os valores [ opcional, calculado
automaticamente ]
Retorno:
Nenhum
SaveToBMP
Descrio: Mtodo para salvar o grfico atual em um bitmap no
server(Obsoleto, ver SaveToImage).
Sintaxe: SaveToBMP(BmpName, PathToWrite )
Parmetros:
BmpName
PathToWrite
Retorno:
Lgico
SaveToImage
Descrio: Mtodo para salvar o grfico atual em um formato de prdeterminado no server.
Sintaxe: SaveToImage(BmpName, PathToWrite, TypeImage)
Parmetros:
BmpName
PathToWrite
TypeImage
Retorno:
Lgico
DelSerie
Descrio: Mtodo para deletar uma srie do grafico.
Sintaxe: DelSerie ( nSerie )
Parmetros:
nSerie
Retorno:
Lgico
ZoomIn
Descrio: Mtodo para efetuar zoom interno ( + ).
Sintaxe: ZoomIn()
Parmetros:
Nenhum
Retorno:
Nenhum
ZoomOut
Descrio: Mtodo para efetuar zoom externo ( - ).
Sintaxe: ZoomOut()
Parmetros:
Nenhum
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'MSGRAPHI.CH'
User Function tMsGraphicTst()
DEFINE MSDIALOG oDlg TITLE '' FROM 0,0 TO 250,330 PIXEL
@ 001, 001 MSGRAPHIC oGraphic SIZE 120,120 OF oDlg
oGraphic:SetTitle('Titulo do Grafico', DTOC(Date()), CLR_BLACK,
A_LEFTJUST, GRP_TITLE )
oGraphic:SetMargins(2,6,6,6)
oGraphic:SetGradient(GDBOTTOMTOP, CLR_HGRAY, CLR_WHITE)
oGraphic:SetLegenProp(GRP_SCRRIGHT, CLR_HGRAY, GRP_AUTO,.T.)
nSerie
:=
oGraphic:CreateSerie( 10 )
oGraphic:l3D := .T. // Grafico em 3D
oGraphic:lAxisVisib
:= .T.
// Mostra os eixos
// Itens do Grafico
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
oGraphic:Add(nSerie,
200,
180,
210,
110,
100,
080,
110,
'Item01',
'Item02',
'Item03',
'Item04',
'Item05',
'Item06',
'Item07',
CLR_BLUE
CLR_RED
CLR_BLUE
CLR_BLUE
CLR_BLUE
CLR_BLUE
CLR_BLUE
)
)
)
)
)
)
)
TMSGBAR()
Propriedades:
-
Parmetros:
Objeto, opcional. Janela ou controle onde a boto dever ser
criado
Caracter. Descrio na Barra
Logico. Define centralizao do texto
Nao utilizado
Nao utilizado
Nao utilizado
Numerico, opcional. Define cor da fonte da barra
Numerico, opcional. Define cor do fundo da barra
Objeto, opcional. Objeto tipo tFont com propriedades da
fonte utilizada para o ttulo do boto.
Nao utilizado
Caracter, opcional. Insere figura lateral esquerda
oWnd
cPrompt
lCentered
lClock
lDate
lKbd
nClrFore
nClrBack
oFont
lInset
imageName
Mtodos auxiliares:
AddItem
Descrio: Mtodo insere um subitem no rodap
Sintaxe: AddItem( oTMsgItem )
Parmetros:
Objeto do tipo TMsgItem que ser inserido como subitem
do rodap.
oTMsgItem
Retorno:
Nenhum
SetMsg
Descrio: Define a descrio da barra de rodap
Sintaxe: SetMsg(cTexto )
Parmetros:
cTexto
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oTMsgBar := TMsgBar():New(oDlg, 'MP10 | Totvs/Software',
.F.,.F.,.F.,.F., RGB(116,116,116),,,.F.)
oTMsgItem1 := TMsgItem():New( oTMsgBar,'oTMsgItem1', 204,,,, .T.,
{||})
oTMsgItem2 := TMsgItem():New( oTMsgBar,'oTMsgItem2', 040,,,, .T.,
{||Alert('Item da Barra Acionado')} )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TMSGITEM()
Propriedades:
-
Parmetros:
oMsgBar
cMsg
nSize
oFont
nClrFore
nClrBack
lEnable
bAction
cImagem
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oTMsgBar := TMsgBar():New(oDlg, 'MP10 | Totvs/Software',
.F.,.F.,.F.,.F., RGB(116,116,116),,,.F.)
oTMsgItem1 := TMsgItem():New( oTMsgBar,'oTMsgItem1', 204,,,, .T.,
{||})
oTMsgItem2 := TMsgItem():New( oTMsgBar,'oTMsgItem2', 040,,,, .T.,
{||Alert('Item da Barra Acionado')} )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
.
TMULTIBTN()
Propriedades:
bAction
Parmetros:
nRow
nCol
oWnd
bAction
nWidth
nHeigth
imgName
ori
cMsg
btnPerLine
[nWidth],
Mtodos auxiliares:
LoadImage
Descrio: Muda a figura a esquerda do componente
Sintaxe: LoadImage(cImagem)
Parmetros:
cImagem
Retorno:
Nenhum
AddButton
Descrio: Insere um boto
Sintaxe: AddButton(cTexto)
Parmetros:
cTexto
Retorno:
Nenhum
SetTitle
Descrio: Muda o titulo e o numero de botes por linha
Sintaxe: SetTitle(cTexto, nBotoes)
Parmetros:
cTexto
nBotoes
Retorno:
Nenhum
SetFonts
Descrio: Muda a font do titulo e dos botes
Sintaxe: SetTitle(cFontTit, nSizeTit, nFontBut, nSizeBut)
Parmetros:
cFontTit
nSizeTit
nFontBut
nSizeBut
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
otMultiBtn := tMultiBtn():New( 01,01,'cTitle1',oDlg,;
{|x|Alert(Str(x)) },200,150,'afastamento',0,'cTitle',3
)
otMultiBtn:SetFonts('Tahoma',16,'Tahoma',10)
otMultiBtn:AddButton('btn01')
otMultiBtn:AddButton('btn02')
otMultiBtn:AddButton('btn04')
otMultiBtn:AddButton('btn05')
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
.
TMULTIGET()
Propriedades:
lWordWrap
Parmetros:
Parmetro
anRow
anCol
abSetGet
aoWnd
anWidth
anHeight
aoFont
alHScroll
anClrFore
anClrBack
oPar11
alPixel
cPar13
lPar14
abWhen
lPar16
lPar17
alReadOnly
abValid
bPar20
lPar21
alNoBorder
alNoVScroll
Mtodos auxiliares:
EnableVScroll
Descrio: Habilita a barra de rolagem vertical.
Sintaxe: EnableVScroll( lEnable )
Parmetros:
Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra
de rolagem.
lEnable
Retorno:
Nenhum
EnableHScroll
Descrio: Habilita a barra de rolagem horizontal.
Sintaxe: EnableHScroll( lEnable )
Parmetros:
Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra
de rolagem.
lEnable
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
User Function Teste()
Local oDlg, oMemo, cMemo:= space(50)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test
oMemo:= tMultiget():New(10,10,{|u|if(Pcount()>0,cMemo:=u,cMemo)};
,oDlg,100,100,,,,,,.T.)
@ 200,10 BUTTON oBtn PROMPT Fecha OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop(cMemo)
Return NIL
TOLECONTAINER()
Propriedades:
-
Parmetros:
nRow
nCol
nWidth
nHeight
oWnd
lAutoActivate
cFileName
Numrico, opcional.
carateres.
Numrico, opcional.
caracteres.
Numrico, opcional.
Numrico, opcional.
Mtodos auxiliares:
OpenFromFile
Descrio: Abre arquivo do tipo OLE.
Sintaxe: New([cFileName, [lAsIcon], [allowInPlace])
Parmetros:
cFileName
lAsIcon
allowInPlace
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
// TOleContainer
oTOleContainer := TOleContainer():New(
05,05,306,134,oDlg,.T.,'C:\Lixo\TesteRemote.doc' )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TPAGEVIEW()
Propriedades:
-
Parmetros:
Numrico, opcional.
carateres.
Numrico, opcional.
caracteres
Numrico, opcional.
Numrico, opcional.
nCol
nRow
nWidth
nHeigth
oPrinter
oWnd
nPageWidth
nPageHeight
Mtodos auxiliares:
PageSize
Descrio: Define o tamanho da pagina.
Sintaxe: AddItem(nLargura, nAltura)
Parmetros:
nLargura
nAltura
Lagura da pgina
Altura da pgina
Retorno:
Nenhum
PrintPage
Descrio: Imprime uma determinada pgina.
Sintaxe: PrintPage(nNrPagina)
Parmetros:
nNrPagina
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
// TPageView
__RelDir := WSPLRelDir()
oPrinter := TMsPrinter():New()
oPrinter:SetFile(__RELDIR + 'matr020.prt',.F.)
oTPageView := TPageView():New(
0,0,500,300,oPrinter,oTFolder2:aDialogs[07],550,350 )
oTPageView:Reset(400,400)
oTPageView:PrintPage(1)
oTPageView:Show()
oTPageView:nZoom := 150
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TPANEL()
Propriedades:
-
Parmetros:
anRow
anCol
acText
aoWnd
alCentered
lPar6
anClrText
anClrBack
anWidth
anHeight
alLowered
alRaised
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oButton, oCombo, cCombo, cGet1:='Teste'
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu test'
oPanel:= tPanel():New(10,10,,oDlg,,,,,CLR_BLUE,100,100) // cria o
painel
@ 10,10 BUTTON oBtn1 PROMPT 'hide' OF oPanel ACTION oPanel:Hide() // cria
boto sobre o painel
@ 200,10 BUTTON oBtn2 PROMPT 'show' OF oDlg ACTION oPanel:Show() // cria
boto fora o painel
ACTIVATE MSDIALOG oDlg CENTERED
Return
TRADMENU()
Propriedades:
bChange
bSetGet
bWhen
bValid
Parmetros:
nRow
nCol
aItems
bSetGet
oDlg
aHelpIds
bChange
nClrText
nClrPane
cMsg
lUpdate
bWhen
nWidth
nHeight
bValid
lDesign
l3d
lPixel
Mtodos auxiliares:
SetOption
Descrio: Seleciona um item.
Sintaxe: SetOption(nItem)
Parmetros:
nItem
Retorno:
Nenhum
EnableItem
Descrio: Habilita/Desabilita um Item
Sintaxe: EnableItem(nItem, lStatus)
Parmetros:
nItem
lStatus
Retorno:
Nenhum
Enable
Descrio: Habilita um item.
Sintaxe: Enable(nItem)
Parmetros:
nItem
Retorno:
Nenhum
Disable
Descrio: Desabilita um item
Sintaxe: Disable(nItem)
Parmetros:
nItem
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
user function TRadMenu()
DEFINE MSDIALOG oDlg FROM 0,0 TO 270,400 PIXEL TITLE 'Exemplo da
TCBrowse'
// Variavel numerica que guarda o item selecionado do Radio
nRadio := 1
// Cria o Objeto
oRadio := TRadMenu():New
(01,01,{'Item01','Item02','Item03','Item04','Item05'},;
,oDlg,,,,,,,,200,200,,,,.T.)
// Seta Eventos
oRadio:bchange
:= {|| Alert('bChange') }
oRadio:bSetGet
:= {|u|Iif (PCount()==0,nRadio,nRadio:=u)}
oRadio:bWhen
:= {|| .T. }
oRadio:bValid
:= {|| Alert('bValid') }
// Principais comandos
oBtn := TButton():New( 060, 001, 'Retorna item selecionado',;
oDlg,{|| Alert(nRadio)
}, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 070, 001, 'SetOption(2) (Seta um
item)',;
oDlg,{|| oRadio:SetOption(2)
}, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 080, 001, 'EnableItem(2,.T.) (Habilita
item)',;
oDlg,{|| oRadio:EnableItem(2,.T.) }, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 090, 001, 'EnableItem(2,.F.)
(Desabilita item)',;
oDlg,{|| oRadio:EnableItem(2,.F.) }, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 100, 001, 'Enable(3) (Habilita
item)',;
oDlg,{|| oRadio:Enable(3)
}, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
oBtn := TButton():New( 110, 001, 'Disable(3) (Desabilita
item)',;
oDlg,{|| oRadio:Disable(3)
}, 120,
010,,,.F.,.T.,.F.,,.F.,,,.F. )
ACTIVATE MSDIALOG oDlg CENTERED
Return
TSBROWSE()
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
oWnd
bChange
nHWidth
oFont
nLines
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
LEditCell
Descrio: Edita o valor de uma coluna.
Sintaxe: lEditCell( aList, oList, cPicture, nCol )
Parmetros:
aList
oList
cPicture
nCol
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 302,402 PIXEL TITLE 'Exemplo'
aBrowse
001'},;
001'},;
{'CLIENTE 001','RUA CLIENTE 001','BAIRRO CLIENTE 001'}
}
oBrowse := TSBrowse():New(01,01,245,150,oDlg,,16,,5)
nForeCor := CLR_GRAY
nBackCor := CLR_WHITE
oBrowse:AddColumn( TcColumn():New('Nome',,,{|| nForeCor },{||
nBackCor }) )
oBrowse:AddColumn( TcColumn():New('Endereo',,,{|| nForeCor },{||
nBackCor }) )
oBrowse:AddColumn( TcColumn():New('Bairro',,,{|| nForeCor },{||
nBackCor }) )
oBrowse:SetArray(aBrowse)
// Principais commandos
TButton():New(160,001,'GoUp()',oDlg,{|| oBrowse:GoUp()
},40,10,,,,.T.)
TButton():New(170,001,'GoDown()',oDlg,{|| oBrowse:GoDown()
},40,10,,,,.T.)
TButton():New(180,001,'GoTop()',oDlg,{|| oBrowse:GoTop()
},40,10,,,,.T.)
TButton():New(190,001,'GoBottom()' , oDlg,{|| oBrowse:GoBottom()
},40,10,,,,.T.)
TButton():New(160,060,'nAt (Linha selecionada)',oDlg,;
{|| Alert (oBrowse:nAt)},80,10,,,,.T.)
TButton():New(170,060,'nRowCount (Nr de linhas visiveis)',oDlg,;
{|| Alert(oBrowse:nRowCount()) },80,10,,,,.T.)
TButton():New(180,060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oBrowse:nLen) },80,10,,,,.T.)
TButton():New( 190, 060, 'lEditCell (Edita a celula)', oDlg,;
{|| lEditCell(@aBrowse,oBrowse,'@!',3)
},40,10,,,,.T.)
TSAY()
Propriedades:
lWordWrap
lTransparent
Parmetros:
anRow
anCol
abText
aoWnd
acPicture
aoFont
lPar7
lPar8
lPar9
alPixels
anClrText
anClrBack
anWidth
anHeight
lPar15
lPar16
lPar17
lPar18
lPar19
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oButton, oCombo, cCombo, cGet1:='Teste'
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Meu test'
oSay:= tSay():New(01,01,{||'para exibir'},oDlg,,,,;
,,.T.,CLR_RED,CLR_WHITE,100,20)
ACTIVATE MSDIALOG oDlg CENTERED
Return
TSCROLLBOX()
Propriedades:
-
Parmetros:
aoWnd
anTop
anLeft
anHeight
anWidth
alVertical
alHorizontal
alBorder
[anHeight],
[anWidth],
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg, oScr, oGet1, oGet2, oGet3
Local cGet1, cGet2, cGet3
cGet1:= Space(10)
cGet2:= Space(10)
cGet3:= Space(10)
DEFINE MSDIALOG oDlg FROM 0,0 TO 220,220 PIXEL TITLE 'Meu test'
oScr:= TScrollBox():New(oDlg,10,10,100,100,.T.,.T.,.T.) // cria controles
dentro do scrollbox
@ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oScr PIXEL
@ 50,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oScr PIXEL
@ 150,100 MSGET oGet3 VAR cGet3 SIZE 100,10 OF oScr PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Return
TSIMPLEEDITOR()
Propriedades:
-
Parmetros:
anRow
anCol
aoWnd
anWidth
anHeight
acText
alReadOnly
Mtodos auxiliares:
Create
Descrio: Mtodo construtor opcional da classe.
Sintaxe: Create( aoWnd )
Parmetros:
aoWnd
Retorno:
Objeto
Load
Descrio: Carrega um texto para o editor.
Sintaxe: Load( acTexto )
Parmetros:
acTexto
Retorno:
Nenhum
TextBold
Descrio: Texto em Negrito.
Sintaxe: TextBold( alBold )
Parmetros:
alBold
Retorno:
Nenhum
TextUnderline
Descrio: Texto Sublinhado.
Sintaxe: TextUnderline( alUnderline )
Parmetros:
alUnderline
Retorno:
Nenhum
TextItalic
Descrio: Texto Itlico.
Sintaxe: TextItalic( alItalic )
Parmetros:
alItalic
Retorno:
Nenhum
TextFamily
Descrio: Famlia de fontes.
Sintaxe: TextFamily( acFamily )
Parmetros:
acFamily
Retorno:
Nenhum
TextSize
Descrio: Tamanho da fonte.
Sintaxe: TextSize( anSize )
Parmetros:
anSize
Retorno:
Nenhum
TextStyle
Descrio: Estilo do pargrafo.
Sintaxe: TextStyle( anStyle )
Parmetros:
Numrico. Estilo do pargrafo a ser utilizada na sesso do
texto.
anStyle
1
2
3
4
5
6
7
Normal
Disco (Bullet)
Circulo (Bullet)
Quadrado (Bullet)
Ordem decimal
Ordem alfanumrica minsculo
Ordem alfanumrica maisculo
Retorno:
Nenhum
TextAlign
Descrio: Alinhamento do texto.
Sintaxe: TextAlign( anAlign )
Parmetros:
anAlign
Retorno:
Nenhum
TextFormat
Descrio: Formato do texto.
Sintaxe: TextFormat( anFormat )
Parmetros:
anFormat
Retorno:
Nenhum
RetText
Descrio: Retorna o texto em formato string.
Sintaxe: RetText( void )
Parmetros:
void
Retorno:
Nenhum
RetTextSel
Descrio: Retorna o texto selecionado em formato string..
Sintaxe: RetText()
Parmetros:
Nenhum
Retorno:
String
Texto selecionado.
TextStatus
Descrio: Retorna um array com as propriedades do texto posicionado.
Sintaxe: TextStatus()
Parmetros:
Nenhum
Retorno:
Retorna um array com as seguintes propriedades
Array
1
2
3
4
5
6
Lgico Negrito
Lgico Itlico
Lgico Sublinhado
Caracter RGB da cor
Caracter Tamanho da fonte
Caracter Fonte
Aparncia:
Exemplo:
#include protheus.ch
TSLIDER()
Propriedades:
bChange
Parmetros:
anRow
anCol
aoWnd
abChange
anWidth
anHeight
acMsg
abWhen
[abChange],
[anWidth],
Mtodos auxiliares:
Create
Descrio: Mtodo construtor da classe.
Sintaxe: Create( aoWnd )
Parmetros:
aoWnd
Retorno:
Objeto
setRange
Descrio: Especifica a faixa de valores.
Sintaxe: setRange( min, max )
Parmetros:
Min
Max
Retorno:
Nenhum
setMarks
Descrio: Especifica o tipo de marcao do boto.
Sintaxe: setMarks( nTipo )
Parmetros:
nTipo
Max
Retorno:
Nenhum
setInterval
Descrio: Especifica a distncia entre um marcador e outro.
Sintaxe: setInterval( nInterval )
Parmetros:
nInterval
Retorno:
Nenhum
setValue
Descrio: Especifica um valor para o boto.
Sintaxe: setValue( nVal )
Parmetros:
nVal
Retorno:
Nenhum
setStep
Descrio: Especifica o valor dos passos do boto.
Sintaxe: setStep( nStep )
Parmetros:
nStep
Retorno:
Nenhum
setOrient
Descrio: Especifica a orientao do boto, horizontal ou vertical.
Sintaxe: setOrient( nOrient )
Parmetros:
nOrient
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
#include hbutton.ch
User Function MytSlider()
Local oDlg, oSlider
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE Meu tSlider
// Usando o mtodo create
oSlider:= tSlider():Create( oDlg )
oSlider:nTop
:= 100
oSlider:nLeft
:= 10
oSlider:nWidth
:= 100
oSlider:nHeight
:= 30
// Usando o command
@ 100, 10 SLIDER oSlider SIZE 30, 100 OF oDlg MESSAGE 'tSlider'
ACTIVATE MSDIALOG oDlg CENTERED
Return Nil
TSPLITTER()
Propriedades:
-
Parmetros:
anRow
anCol
aoWnd
anWidth
anHeight
anOrientation
[anCol],
[aoWnd],
[anWidth],
[anHeight],
Mtodos auxiliares:
Create
Descrio: Mtodo construtor da classe.
Sintaxe: Create( aoWnd )
Parmetros:
aoWnd
Retorno:
Objeto
setOrient
Descrio: Especifica a orientao do divisor, horizontal ou vertical.
Sintaxe: setOrient( nOrient )
Parmetros:
nOrient
Retorno:
Nenhum
setChildCollapse
Descrio: Especifica se os elementos podem ser collapsibles.
Sintaxe: setChildCollpse( lColl )
Parmetros:
lColl
Retorno:
Nenhum
setCollapse
Descrio: Especifica o objeto que pode ser collapsible.
Sintaxe: setCollapse( oObj, lColl )
Parmetros:
oObj
lColl
Retorno:
Nenhum
movToLast
Descrio: Coloca o objeto como ultimo das divises.
Sintaxe: movToLast( oObj )
Parmetros:
oObj
Retorno:
Nenhum
movToFirst
Descrio: Coloca o objeto como primeiro das divises.
Sintaxe: movToFirst( oObj )
Parmetros:
oObj
Retorno:
Nenhum
setOpaqueResize
Descrio: Especifica se o resize deve ser opaco.
Sintaxe: setOpaqueResize( lOpaq )
Parmetros:
lOpaq
Retorno:
Nenhum
setResizeMode
Descrio: Especifica o mode de resize do objeto..
Sintaxe: setResizeMode ( oObj, nMode )
Parmetros:
oObj
nMode
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
#include hbutton.ch
User Function MytSplitter()
Local oDlg, oSplitter, oPanel1, oPanel2, oPanel3
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE Meu tSplitter
// Usando o mtodo create
oSplitter := tSplitter():Create( oDlg )
@ 1, 1 MSPANEL oPanel1 OF oSplitter
@ 1, 2 MSPANEL oPanel2 OF oSplitter
@ 1, 3 MSPANEL oPanel3 OF oSplitter
// Usando o command
@ 1, 1 SPLITTER oSplitter
@ 1, 1 MSPANEL oPanel1 OF
@ 1, 2 MSPANEL oPanel2 OF
@ 1, 3 MSPANEL oPanel3 OF
TTABS()
Propriedades:
-
Parmetros:
anTop
anLeft
aPrompts
bAction
oWnd
nOption
nClrFore
nClrBack
lPixel
lDesign
nWidth
nHeigth
cMsg
Mtodos auxiliares:
AddItem
Descrio: Adiciona uma aba na pasta
Sintaxe: AddItem(cTtulo)
Parmetros:
cTtulo
Retorno:
Nenhum
SetOption
Descrio: Seleciona a Aba
Sintaxe: SetOption( nNrAba )
Parmetros:
nNrAba
Retorno:
Nenhum
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
oTTabs := TTabs():New(01,01,{'Aba01','Aba02','Aba03'},;
{||oPanel01:LVISIBLECONTROL:=(oTTabs:nOption==1)},;
oDlg,,RGB(255,0,0),RGB(255,255,0),.T.,,120,120,)
oPanel01 := TPanel():New( 000, 000,'',oTTabs,,,,,,100,100,,.T. )
oPanel01:lVisibleControl := .T.
oBtn01 := TButton():New( 01,01,'TButton01',oPanel01,;
{||oTTabs:SetOption(2)}, 037,
012,,,.F.,.T.,.F.,,.F.,,,.F. )
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
TTOOLBOX()
Propriedades:
bChangeGrp
Parmetros:
anRow
anCol
aoWnd
anWidth
anHeight
aoFont
acMsg
abWhen
Mtodos auxiliares:
Create
Descrio: Mtodo construtor opcional da classe.
Sintaxe: Create( aoWnd )
Parmetros:
aoWnd
Retorno:
Objeto
addGroup
Descrio: Adiciona um grupo
Sintaxe: addGroup( aoObj, acName, aoIcon )
Parmetros:
aoObj
acName
aoIcon
Retorno:
Nenhum
removeGroup
Descrio: Remove um grupo
Sintaxe: removeGroup( aoObj )
Parmetros:
aoObj
Retorno:
Nenhum
setCurrentGroup
Descrio: Define o grupo corrente
Sintaxe: setCurrentGroup( aoObj )
Parmetros:
aoObj
Retorno:
Nenhum
Aparncia:
Exemplo:
#include protheus.ch
User Function MytToolbox()
Local oDlg, oTb
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE Meu Toolbox
// Usando o mtodo create
oTb:= tToolbox():Create( oDlg )
oTb:nTop
:= 100
oTb:nLeft
:= 10
oTb:nWidth
:= 100
oTb:nHeight
:= 30
oTb:Add( oPanel, Opo 1, oIcone)
// Usando o command
@ 200,100 TOOLBOX oTb SIZE 100,30 OF oDlg
TOOLBOX oTb ADDGROUP TITLE Opo 1 OBJECT oPanel ICON oIcone
ACTIVATE MSDIALOG oDlg CENTERED
Return Nil
TWBROWSE()
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
bFields
aHeaders
aColSizes
oDlg
cField
uValue1
uValue2
bChange
bLDblClick
bRClick
oFont
oCursor
nClrFore
nClrBack
cMsg
lUpdate
cAlias
lPixel
bWhen
lDesign
bValid
lHScroll
lVScroll
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
LEditCell
Descrio: Edita o valor de uma coluna.
Sintaxe: lEditCell( aList, oList, cPicture, nCol )
Parmetros:
aList
oList
cPicture
nCol
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
Local oOK := LoadBitmap(GetResources(),'br_verde')
Local oNO := LoadBitmap(GetResources(),'br_vermelho')
DEFINE MSDIALOG oDlg FROM 0,0 TO 402,402 PIXEL TITLE 'Exemplo'
oBrowse := TWBrowse():New( 01 , 01, 245, 150,,;
{'','Codigo','Descrio'},{20,30,30}, oDlg, ,,,,;
{||},,,,,,,.F.,,.T.,,.F.,,, )
aBrowse
:= {{.T.,'CLIENTE 001','RUA CLIENTE 001','BAIRRO CLIENTE
001'},;
{.F.,'CLIENTE 002','RUA CLIENTE 002','BAIRRO CLIENTE
002'},;
{.T.,'CLIENTE 003','RUA CLIENTE 003','BAIRRO CLIENTE
003'} }
oBrowse:SetArray(aBrowse)
oBrowse:bLine := {||{;
If(aBrowse[oBrowse:nAt,01],oOK,oNO),;
aBrowse[oBrowse:nAt,02],;
aBrowse[oBrowse:nAt,03],;
aBrowse[oBrowse:nAt,04] } }
oBrowse:bLDblClick := ;
{|| aBrowse[oBrowse:nAt][1] :=
!aBrowse[oBrowse:nAt][1],oBrowse:DrawSelect()}
// Principais commandos
TButton():New(160,001,'GoUp()',oDlg,{|| oBrowse:GoUp()
},40,10,,,,.T.)
TButton():New(170,001,'GoDown()',oDlg,{|| oBrowse:GoDown()
},40,10,,,,.T.)
TButton():New(180,001,'GoTop()',oDlg,{|| oBrowse:GoTop()
},40,10,,,,.T.)
TButton():New(190,001,'GoBottom()' , oDlg,{|| oBrowse:GoBottom()
},40,10,,,,.T.)
TButton():New(160,060,'nAt (Linha selecionada)',oDlg,;
{|| Alert (oBrowse:nAt)},80,10,,,,.T.)
TButton():New(170,060,'nRowCount (Nr de linhas visiveis)',oDlg,;
{|| Alert(oBrowse:nRowCount()) },80,10,,,,.T.)
TButton():New(180,060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oBrowse:nLen) },80,10,,,,.T.)
TButton():New(190,060, 'lEditCell (Edita a celula)', oDlg,;
{|| lEditCell(@aBrowse,oBrowse,'@!',3)
},80,10,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
VCBROWSE()
Propriedades:
+
nAt
nLen
Parmetros:
nRow
nCol
nWidth
nHeight
bFields
aHeaders
aColSizes
oDlg
cField
uValue1
uValue2
bChange
bLDblClick
bRClick
oFont
oCursor
nClrFore
nClrBack
cMsg
lUpdate
cAlias
lPixel
bWhen
lDesign
bValid
lHScroll
lVScroll
Mtodos auxiliares:
GoUp
Descrio: Salta uma linha para cima.
Sintaxe: GoUp( )
Parmetros:
Nenhum
Retorno:
Nil
GoDown
Descrio: Salta uma linha para baixo.
Sintaxe: GoDown( )
Parmetros:
Nenhum
Retorno:
Nil
GoTop
Descrio: Salta para primeira linha.
Sintaxe: GoTop( )
Parmetros:
Nenhum
Retorno:
Nil
GoBottom
Descrio: Salta para ultima linha.
Sintaxe: GoBottom( )
Parmetros:
Nenhum
Retorno:
Nil
RowCount
Descrio: Retorna numero de linhas visiveis.
Sintaxe: RowCount( )
Parmetros:
Nenhum
Retorno:
Nil
LEditCell
Descrio: Edita o valor de uma coluna.
Sintaxe: lEditCell( aList, oList, cPicture, nCol )
Parmetros:
aList
oList
cPicture
nCol
Retorno:
Nil
Aparncia:
Exemplo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
Local oOK := LoadBitmap(GetResources(),'br_verde')
Local oNO := LoadBitmap(GetResources(),'br_vermelho')
DEFINE MSDIALOG oDlg FROM 0,0 TO 402,402 PIXEL TITLE 'Exemplo'
oBrowse := VCBrowse():New( 01 , 01, 245, 150,,;
{'','Codigo','Descrio'},{20,30,30}, oDlg, ,,,,;
{||},,,,,,,.F.,,.T.,,.F.,,, )
aBrowse
:= {{.T.,'CLIENTE 001','RUA CLIENTE 001','BAIRRO CLIENTE
001'},;
{.F.,'CLIENTE 002','RUA CLIENTE 002','BAIRRO CLIENTE
002'},;
{.T.,'CLIENTE 003','RUA CLIENTE 003','BAIRRO CLIENTE
003'} }
oBrowse:SetArray(aBrowse)
oBrowse:bLine := {||{;
If(aBrowse[oBrowse:nAt,01],oOK,oNO),;
aBrowse[oBrowse:nAt,02],;
aBrowse[oBrowse:nAt,03],;
aBrowse[oBrowse:nAt,04] } }
oBrowse:bLDblClick :=;
{|| aBrowse[oBrowse:nAt][1] :=
!aBrowse[oBrowse:nAt][1],oBrowse:DrawSelect()}
// Principais commandos
TButton():New(160,001,'GoUp()',oDlg,{|| oBrowse:GoUp()
},40,10,,,,.T.)
TButton():New(170,001,'GoDown()',oDlg,{|| oBrowse:GoDown()
},40,10,,,,.T.)
TButton():New(180,001,'GoTop()',oDlg,{|| oBrowse:GoTop()
},40,10,,,,.T.)
TButton():New(190,001,'GoBottom()' , oDlg,{|| oBrowse:GoBottom()
},40,10,,,,.T.)
TButton():New(160,060,'nAt (Linha selecionada)',oDlg,;
{|| Alert (oBrowse:nAt)},80,10,,,,.T.)
TButton():New(170,060,'nRowCount (Nr de linhas visiveis)',oDlg,;
{|| Alert(oBrowse:nRowCount()) },80,10,,,,.T.)
TButton():New(180,060, 'nLen (Numero total de linhas)', oDlg,;
{|| Alert(oBrowse:nLen) },80,10,,,,.T.)
TButton():New(190,060, 'lEditCell (Edita a celula)', oDlg,;
{|| lEditCell(@aBrowse,oBrowse,'@!',3)
},40,10,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
R
0
0
0
0
255
255
255
255
G
0
0
255
255
0
0
255
255
B
0
255
0
255
0
255
0
255
Valor
0
16711680
65280
16776960
255
16711935
65535
16777215
Para atribuir as cores aos objetos visuais devem ser observados os atributos utilizados para
estes fins em cada objeto, como por exemplo:
MSDIALOG()
nClrPane
nClrText
TSAY()
nClrPane
nClrText
Funo RGB()
A linguagem ADVPL possui a funo RGB() a qual retorna o valor da cor a ser definido, de
acordo com a parametrizao de cada um dos elementos da paleta RGB.
RGB(nRed, nGreen, nBlue)
nRed
nGreen
nBlue
Retorno
37.
37.1.1.
Enchoice()
Sintaxe: Enchoice( cAlias, nReg, nOpc, aCRA, cLetra, cTexto, aAcho, aPos,
aCpos, nModelo, nColMens, cMensagem, cTudoOk, oWnd, lF3,
lMemoria, lColumn, caTela, lNoFolder, lProperty)
Retorno: Nil
Parmetros:
cAlias
nReg
nOpc
aCRA
cLetra
cTexto
aAcho
aPos
aCpos
nModelo
nColMens
cMensagem
cTudoOk
oWnd
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWENCH
| Autor | ARNALDO RAYMUNDO JR.|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao da funo Enchoice()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwEnch()
Private cCadastro := " Cadastro de Clientes"
Private aRotina
:=
{{"Pesquisar"
, "axPesqui"
{"Visualizar"
, "U_ModEnc"
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
User Function ModEnc(cAlias,nReg,nOpc)
Local aCpoEnch
Local aAlter
:= {}
:= {}
Local cAliasE
:=
Local aAlterEnch :=
Local aPos
:=
Local nModelo
:=
Local lF3
:=
Local lMemoria
:=
Local lColumn
:=
Local caTela
:=
Local lNoFolder
:=
Local lProperty
:=
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
cAlias
{}
{000,000,400,600}
3
.F.
.T.
.F.
""
.F.
.F.
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
, 0, 1},;
, 0, 2}}
Exemplo (continuao):
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 000,000 TO 400,600 PIXEL
RegToMemory("SA1", If(nOpc==3,.T.,.F.))
Enchoice(cAliasE, nReg, nOpc, /*aCRA*/, /*cLetra*/, /*cTexto*/, ;
aCpoEnch, aPos, aAlterEnch, nModelo, /*nColMens*/,;
/*cMensagem*/,/*cTudoOk*/, oDlg, lF3, lMemoria, lColumn,;
caTela, lNoFolder, lProperty)
ACTIVATE MSDIALOG oDlg CENTERED
Return
37.1.2.
MsMGet()
lMemoria
lColumn
caTela
lNoFolder
lProperty
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWMSGET | Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MsMget()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwMsGet()
Private cCadastro := " Cadastro de Clientes"
Private aRotina
:=
{{"Pesquisar"
, "axPesqui"
{"Visualizar"
, "U_ModEnc"
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
User Function ModEnc(cAlias,nReg,nOpc)
Local aCpoEnch
:= {}
Local aAlter
:= {}
Local cAliasE
Local aAlterEnch :=
Local aPos
:=
Local nModelo
:=
Local lF3
:=
Local lMemoria
:=
Local lColumn
Local caTela
Local lNoFolder
:=
Local lProperty
:=
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
:= cAlias
{}
{000,000,400,600}
3
.F.
.T.
:= .F.
:= ""
.F.
.F.
, 0, 1},;
, 0, 2}}
Exemplo (continuao):
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
oDlg
:= MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE, nReg, nOpc, /*aCRA*/, /*cLetra*/,;
/*cTexto*/, aCpoEnch, aPos, aAlterEnch, nModelo, /*nColMens*/,;
/*cMensagem*/, /*cTudoOk*/,oDlg,lF3,lMemoria,lColumn, caTela,;
lNoFolder, lProperty)
oDlg:lCentered := .T.
oDlg:Activate()
Return
MSGETDB()
MSGETDADOS()
MSNEWGETDADOS()
Grids no digitveis: permitem somente a visualizao de informaes, comumente
utilizados como browses do ERP Protheus, tais como:
TWBROWSE()
MAWNDBROWSE()
MBROWSE()
Neste tpico sero tratadas as grids digitveis disponveis na linguagem ADVPL para o
desenvolvimento de interfaces de cadastros e manuteno de informaes.
37.2.1.
MsGetDB()
A classe de objetos visuais MsGetDB() permite a criao de um grid digitvel com uma ou mais
colunas, baseado em uma tabela temporria.
Sintaxe:
Parmetros:
nTop
nLeft
nBottom
nRight
nOpc
cLinhaOk
cTudoOk
cIniCpos
lDelete
aAlter
nFreeze
lEmpty
uPar1
cFieldOk
cTRB
lCondicional
lAppend
cDelOk
lDisparos
uPar2
cSuperDel
oWnd
Aparncia:
Variveis private:
aRotina
aHeader
lRefresh
Variveis pblicas:
nBrLin
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Funo
| GETDBSA1
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MsGetDB()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GetDbSA1()
Local
Local
Local
Local
Local
nI
oDlg
oGetDB
nUsado := 0
aStruct := {}
Private
Private
Private
Private
lRefresh := .T.
aHeader := {}
aCols := {}
aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
Exemplo (continuao):
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AADD(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
AADD(aStruct,{SX3->X3_CAMPO,SX3->X3_TIPO,SX3->X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
DbSkip()
End
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg
37.2.2.
MsGetDados()
A classe de objetos visuais MsGetDados() permite a criao de um grid digitvel com uma ou
mais colunas, baseado em um array.
Parmetros:
nTop
nLeft
nBottom
nRight
nOpc
cLinhaOk
cTudoOk
cIniCpos
lDelete
aAlter
uPar1
lEmpty
nMax
cFieldOk
cSuperDel
uPar2
cDelOk
oWnd
Aparncia:
Variveis private:
aRotina
aHeader
lRefresh
Variveis pblicas:
N
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
Hide()
Show()
#include protheus.ch
/*/
+----------------------------------------------------------------------------| Funo
| GETDADOSA1 | Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto MSGETADOS()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function GetDadoSA1()
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
Exemplo (continuao):
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
AADD(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
EndIf
DbSkip()
End
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg
37.2.3.
MsNewGetDados()
A classe de objetos visuais MsNewGetDados() permite a criao de um grid digitvel com uma
ou mais colunas, baseado em um array.
Parmetros:
nSuperior
nEsquerda
nInferior
nDireita
nOpc
cLinOk
cTudoOk
cIniCpos
aAlterGDa
nFreeze
nMax
cFieldOk
cSuperDel
cDelOk
oDLG
aHeader
aCols
Aparncia:
Variveis private:
aRotina
aHeader
lRefresh
Variveis pblicas:
Funes de validao:
cLinhaOk
cTudoOk
Mtodos adicionais:
ForceRefresh()
Hide()
Show()
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MBRWGETD
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao dos objetos
|
|
| MsNewGetDados() e MsMGet() combinados
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwGetD()
Private cCadastro := "Pedidos de Venda"
Private aRotina
:=
{{"Pesquisar"
{"Visualizar"
{"Incluir"
, "axPesqui"
, "U_ModGtd"
, "U_ModGtd"
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
User Function ModGtd(cAlias,nReg,nOpc)
Local
Local
Local
Local
Local
Local
nX
nUsado
aButtons
aCpoEnch
cAliasE
aAlterEnch
:=
:=
:=
:=
:=
:=
0
0
{}
{}
cAlias
{}
, 0, 1},;
, 0, 2},;
, 0, 3}}
Exemplo (continuao):
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aPos
nModelo
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
aCpoGDa
cAliasGD
nSuperior
nEsquerda
nInferior
nDireita
cLinOk
cTudoOk
cIniCpos
nFreeze
nMax
cFieldOk
cSuperDel
cDelOk
aHeader
aCols
aAlterGDa
Private
Private
Private
Private
Private
:=
:=
:=
:=
:=
:=
:=
:=
{000,000,080,400}
3
.F.
.T.
:= .F.
:= ""
.F.
.F.
:= {}
"SC6"
:= 081
:= 000
:= 250
:= 400
:= "AllwaysTrue"
:= "AllwaysTrue"
:= "C6_ITEM"
:= 000
:= 999
:= "AllwaysTrue"
:= ""
:= "AllwaysFalse"
:= {}
:= {}
{}
oDlg
oGetD
oEnch
aTELA[0][0]
aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "C5_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasGD
If
!(AllTrim(SX3->X3_CAMPO) $ "C6_FILIAL") .And.;
cNivel >= SX3->X3_NIVEL .And. X3Uso(SX3->X3_USADO)
AADD(aCpoGDa,SX3->X3_CAMPO)
EndIf
DbSkip()
End
- 510 ADVPL Completo
Exemplo (continuao):
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
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 nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
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 nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
oDlg
:= MSDIALOG():New(000,000,400,600, cCadastro,,,,,,,,,.T.)
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/,/*cTexto*/,;
aCpoEnch,aPos,aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
/*cTudoOk*/, oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,;
lProperty)
oGetD:= MsNewGetDados():New(nSuperior, nEsquerda, nInferior, nDireita,;
nOpc,cLinOk,cTudoOk, cIniCpos, aAlterGDa, nFreeze, nMax,cFieldOk,;
cSuperDel,cDelOk, oDLG, aHeader, aCols)
oDlg:bInit := {|| EnchoiceBar(oDlg, {||oDlg:End()},{||oDlg:End()},,aButtons)}
oDlg:lCentered := .T.
oDlg:Activate()
Return
37.2.3.1.
Conforme visto no tpico sobre definio das propriedades de cores para os componentes
visuais, cada objeto possui caractersticas que devem ser respeitadas para correta utilizao
deste recurso.
Atributos adicionais:
lUseDefaultColors
Mtodos adicionais:
SetBlkBackColor
Mtodo que define a cor que ser utilizada para cada linha do
grid. No necessrio utilizar o mtodo Refresh() aps a
definio da cor por este mtodo.
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| MRBWGTCL
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao dos objetos
|
|
| MsNewGetDados() e MsMGet() combinados e tratamento de cores
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function MrbwGtCl()
Private cCadastro := "Pedidos de Venda"
Private aRotina
:=
{{"Pesquisar"
{"Visualizar"
{"Incluir"
, "axPesqui"
, "U_ModGtd"
, "U_ModGtd"
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
User Function ModGtd(cAlias,nReg,nOpc)
Local nX
:= 0
Local nUsado
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aButtons
aCpoEnch
cAliasE
aAlterEnch
aPos
nModelo
lF3
lMemoria
lColumn
caTela
lNoFolder
lProperty
aCpoGDa
cAliasGD
nSuperior
nEsquerda
nInferior
nDireita
cLinOk
cTudoOk
cIniCpos
nFreeze
nMax
:= 0
:= {}
:= {}
:= cAlias
{}
{000,000,080,400}
3
.F.
.T.
:= .F.
:= ""
:= .F.
:= .F.
:= {}
:= "SC6"
:= 081
:= 000
:= 250
:= 400
:= "AllwaysTrue"
:= "AllwaysTrue"
:= "C6_ITEM"
:= 000
:= 999
:=
:=
:=
:=
:=
, 0, 1},;
, 0, 2},;
, 0, 3}}
Exemplo (continuao):
Local
Local
Local
Local
Local
Local
cFieldOk
cSuperDel
cDelOk
aHeader
aCols
aAlterGDa
Private
Private
Private
Private
Private
:=
:=
:=
:=
:=
"AllwaysTrue"
""
"AllwaysFalse"
{}
{}
:= {}
oDlg
oGetD
oEnch
aTELA[0][0]
aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "C5_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.;
X3Uso(SX3->X3_USADO)
AADD(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
While !Eof() .And. SX3->X3_ARQUIVO == cAliasGD
If
!(AllTrim(SX3->X3_CAMPO) $ "C6_FILIAL") .And. cNivel >= SX3>X3_NIVEL .And. X3Uso(SX3->X3_USADO)
AADD(aCpoGDa,SX3->X3_CAMPO)
EndIf
DbSkip()
End
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
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
Exemplo (continuao):
If nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
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 nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
oDlg := MSDIALOG():New(000,000,400,600, cCadastro,,,,,,,,,.T.)
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/, /*cTexto*/,;
aCpoEnch,aPos, aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
cTudoOk,oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,lProperty)
oGetD:= MsNewGetDados():New(nSuperior,nEsquerda,nInferior,nDireita, nOpc,;
cLinOk,cTudoOk,cIniCpos,aAlterGDa,nFreeze,nMax,cFieldOk, cSuperDel,;
cDelOk, oDLG, aHeader, aCols)
// Tratamento para definio de cores especficas,
// logo aps a declarao da MsNewGetDados
oGetD:oBrowse:lUseDefaultColors := .F.
oGetD:oBrowse:SetBlkBackColor({|| GETDCLR(oGetD:aCols,oGetD:nAt,aHeader)})
oDlg:bInit := {|| EnchoiceBar(oDlg, {||oDlg:End()}, {||oDlg:End()},,aButtons)}
oDlg:lCentered := .T.
oDlg:Activate()
Return
Exemplo (continuao):
// Funo para tratamento das regras de cores para a grid da MsNewGetDados
Static Function GETDCLR(aLinha,nLinha,aHeader)
Local
Local
Local
Local
Local
nCor2
nCor3
nPosProd
nUsado
nRet
:=
:=
:=
:=
:=
37.3.1.
EnchoiceBar()
Funo que cria uma barra de botes no formato padro utilizado pelas interfaces de cadastro
da aplicao Protheus.
Esta barra possui os botes padres para confirmar ou cancelar a interface e ainda permite a
adio de botes adicionais com a utilizao do parmetro aButtons.
Sintaxe:
Parmetros:
oDlg
bOk
bCancel
lMsgDel
aButtons
nRecno
cAlias
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------------| Funo
| DENCHBAR
| Autor | ARNALDO RAYMUNDO JR. |Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao da funo
|
|
| EnchoiceBar()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function DEnchBar()
Local oDlg, oBtn
Local aButtons := {}
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600 PIXEL OF;
oMainWnd
AADD( aButtons, {"HISTORIC", {|| TestHist()}, "Histrico...",;
"Histrico",{|| .T.}} )
@ -15,-15 BUTTON oBtn PROMPT "..." SIZE 1,1 PIXEL OF oDlg
ACTIVATE MSDIALOG oDlg ;
ON INIT (EnchoiceBar(oDlg,{||lOk:=.T.,oDlg:End()},{||oDlg:End()},,@aButtons))
Return
37.3.2.
TBar()
Parmetros:
oWnd
nBtnWidth
nBtnHeight
l3D
cMode
No utilizado.
oCursor
cResource
lNoAutoAdjust
Aparncia:
#include 'protheus.ch'
/*/
+----------------------------------------------------------------------------| Funo
| TSTBAR
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto TBar()
|
+----------------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------------/*/
User Function TstTBar()
Local oDlg
oDlg
Exemplo (continuao):
oTBar := TBar():New( oDlg,25,32,.T.,,,,.F. )
oTBtnBmp2_1 := TBtnBmp2():New( 00, 00, 35, 25, 'copyuser' ,,,,;
{||Alert('TBtnBmp2_1')}, oTBar,'msGetEx',,.F.,.F. )
oTBtnBmp2_2 := TBtnBmp2():New( 00, 00, 35, 25, 'critica'
{||},oTBar,'Critica',,.F.,.F. )
,,,,;
,,,,;
,,,,;
oDlg:lCentered := .T.
oDlg:Activate()
Return
37.3.3.
ButtonBar
Sintaxe:
DEFINE BUTTONBAR oBar SIZE nWidth, nHeight 3D MODE OF oDlg
CURSOR
Retorno: ().
Parmetros:
oBar
nWidth
nHeight
3D
oDlg
MODE
CURSOR
A sintaxe ButtonBar requer a adio dos botes como recursos adicionais da barra
previamente definida utilizando a sintaxe abaixo:
Sintaxe adicional:
DEFINE BUTTON RESOURCE cBitMap OF oBar ACTION cAcao TOOLTIP
cTexto
Parmetros:
cBitMap
oBar
cAcao
cTexto
Aparncia:
#include 'protheus.ch'
/*/
+----------------------------------------------------------------------| Funo
| TstBBar
| Autor | MICROSIGA
|Data |
|
+----------------------------------------------------------------------| Descrio | Programa que demonstra a utilizao do objeto TBar()
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function TstBBar()
Local oDlg
Local oBtn1
Local oBtn2
oDlg
Exemplo (continuao):
DEFINE
DEFINE
DEFINE
DEFINE
ACTION
oBtn1:cTitle:="Calc"
DEFINE BUTTON RESOURCE "S4WB009N"
DEFINE BUTTON RESOURCE "S4WB010N"
DEFINE BUTTON RESOURCE "S4WB016N"
ACTION HelProg() TOOLTIP "Ajuda"
37.3.4.
Conforme mencionado nos tpicos anteriores, os botes visuais do tipo barra de botes
permitem a definio de itens com aes e imagens vinculadas.
Dentre os objetos e funes mencionados, foi citada a EnchoiceBar(), a qual permite a adio
de botes adicionais atravs do parmetro aButton, sendo que os itens deste array devem
possuir o seguinte formato:
Sintaxe: AADD(aButtons,{cBitMap, bAcao, cTexto})
Estrutura:
cBitMap
bAcao
cTexto
DISCAGEM
EDIT
EDITABLE
EXCLUIR
FORM
GRAF2D
GRAF3D
LINE
NOTE
OBJETIVO
OK
PENDENTE
PRECO
PRODUTO
S4SB014N
S4WB001N
S4WB005N
S4WB006N
S4WB007N
S4WB008N
S4WB009N
S4WB010N
S4WB011N
S4WB013N
S4WB014A
S4WB016N
SIMULACA
VENDEDOR
USER
Exemplo:
AADD(aButtons,{"USER",{||AllwaysTrue()},"Usurio"})
38.
38.1. MaWndBrowse()
Descrio: Browse que permite a visualizao de registros para arquivos / tabelas que
no possuem estrutura definida no Dicionrio de Dados do sistema.
Sintaxe: MaWndBrowse (nLin1, nCol1, nLin2, nCol2, cTitle, cAlias, aCampos, aRotina,
cFunLeg, cTopFun, cBotFun, lCentered, aResource, nMod, aPesqui, cSeek,
lDic, lSavOrd)
Parmetros:
nLin1
nCol1
nLin2
nCol2
cTitle
cAlias
aCampos
aRotina
cFunLeg
cTopFun
cBotFun
lCentered
aResource
nModelo
aPesqui
cSeek
lDic
lSavOrd
Aparncia:
#include "protheus.ch"
/*/
+----------------------------------------------------------------------| Funo
| WndBrwTRB
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Demonstra a utilizao da MaWndBrowse com Temporrio
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function WndBrwTRB()
// Variveis para o Arquivo Temporario
Local cChave
:= ""
Local cArqTrb
:= ""
Local aStruTRB := {}
// Variveis para o MaWndBrowse
Local cTitulo
:= "Cadastro Temporario"// Ttulo obrigatrio
Local cAlias
:= "TRB" // Alias da tabela corrente podendo ser TRB
Local cFunLeg
:= "" // Funo que dever retornar um valor lgico e com isso
ser atribudo semafro na primeira coluna do browse
Local cTopFun
:= "" // Mostrar os registros com a chave de
Local cBotFun
:= "" // Mostrar os registros com a chave ate
Local lCentered := .T. // Valor verdadeiro centraliza
Local aResource := {} // aAdd(aResource,{"IMAGEM","Texto significativo"})
Local nModelo
:= 1 // 1- Menu do aRotina
Local aPesqui
:= {} // aAdd(aPesqui{"Ttulo",nOrdem}), se no passado ser
utilizado o AxPesqui
Local cSeek
:= "" // Chave principal para a busca, exemplo: xFilial("???")
Local lDic
:= .F. // Parmetro em conjunto com aCampos
Local lSavOrd
:= .T. // Estabelecer a ordem aps pesquisas.
- 525 ADVPL Completo
,"@!" ,"Filial"
,"@!" ,"Matricula"
,"@!" ,"Nome"
,"@E 999","Idade"
,"@!" ,"Status"
,02,"C",".F.",.T.})
,14,"C",".F.",.T.})
,20,"C",".T.",.F.})
,03,"N",".T.",.F.})
,01,"C",".T.",.T.})
//
cArqTrb
:= CriaTrab(aStruTRB,.t.)
dbUseArea(.T.,,cArqTrb,"TRB",.T.,.F.)
cChave
:= "TRB_FILIAL+TRB_ID"
IndRegua("TRB",cArqTrb,cChave,,,"Selecionando Registros...")
dbSelectArea( "TRB" )
MaWndBrowse(aSize[7],aSize[2],aSize[6],aSize[5],cTitulo,cAlias,aCampos,aRotina,,
cTopFun,cBotFun,lCentered,,nModelo,,cSeek,lDic,lSavOrd)
If ( Select( "TRB" ) <> 0 )
dbSelectArea ( "TRB" )
dbCloseArea ()
Endif
Return
38.1.1.
Parmetros:
oDlg
aCampos
nLeftE
nTopE
nHeightE
nWidthE
lEnchBar
"<lWhen>"
<Tamanho>
AADD(aCposEnch,
{"<Variavel>"
,{nLinha,nColuna} ,"<Titulo>",;
"<Picture>", "<Validacao>", "<F3>", "<lWhen>",;
<Tamanho>})
Aparncia:
/*/
+----------------------------------------------------------------------| Funo
| TEnchoice
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
Static Function TEnchoice(oDlg, aCampos, nLeftE, nTopE, nHeightE, nWidthE,;
lEnchBar)
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aSays
aGets
cCaption
cPict
cValid
cF3
cWhen
cBlKSay
cBlkGet
cBlKVld
cBlKWhen
nLeft
nTop
nI
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
{}
{}
""
""
""
""
""
""
""
""
""
0
0
0
nWidthG
,aCampos[nI,3])
,aCampos[nI,4])
".t." ,aCampos[nI,5])
NIL
,aCampos[nI,6])
,aCampos[nI,7])
:= Iif(Empty(aCampos[nI,8]), 100,;
IiF(aCampos[nI,8]*3.5 > 100,100,nil))
- 529 ADVPL Completo
/*/
+----------------------------------------------------------------------| Funo
| TVisual
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TVisual(cAlias,nReg,nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
:= {||oDlg:End()}
bCancel
:= {||oDlg:End()}
nX
/*/
+----------------------------------------------------------------------| Funo
| TInclui
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TInclui(cAlias,nReg,nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
aArea
:= GetArea()
nX
:= Space(aCampos[nX][4])
:= 0
:= CTOD("")
:= .F.
:= Space(aCampos[nX][4])
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
TEnchoice(oDlg, aCposEnch,,,,,.T.)
bOk := {|| IIF( U_TValid(cAlias,nReg,nOpcE,aCampos),;
(U_TGravar(cAlias,nReg,nOpcE,aCampos),oDlg:End()),)}
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
Exemplo: Funo TAltera ( MaWndBrowse com TEnchoice)
/*/
+----------------------------------------------------------------------| Funo
| TAltera
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TAltera(cAlias,nReg,nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
aArea
:= GetArea()
nX
TEnchoice(oDlg, aCposEnch,,,,,.T.)
bOk := {|| IIF( U_TValid(cAlias,nReg,nOpcE,aCampos),;
(U_TGravar(cAlias,nReg,nOpcE,aCampos),oDlg:End()),)}
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
/*/
+----------------------------------------------------------------------| Funo
| TExclui
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TExclui(cAlias, nReg, nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
nX
TEnchoice(oDlg, aCposEnch,,,,,.T.)
bOk := {|| IIF( U_TValid(cAlias,nReg,nOpcE,aCampos),;
(U_TGravar(cAlias,nReg,nOpcE,aCampos),oDlg:End()),)}
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
Exemplo: Funo TValid ( MaWndBrowse com TEnchoice)
/*/
+----------------------------------------------------------------------| Funo
| TValid
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TValid(cAlias,nReg,nOpc,aCampos)
LOCAL lRet
LOCAL nX
LOCAL nPosObrig := Len(aCampos[1])
For nX := 1 to Len(aCampos)
IF aCampos[nX,nPosObrig] == .T.
IF !(lRet := !Empty(&("_"+aCampos[nX,1])))
Help("TEnchoice",1,"HELP","OBRIGATORIO","Existem campos
obrigatorios nao preenchidos",1,0)
RETURN lRet // EXIT
ENDIF
ENDIF
Next nX
IF nOpc == 3
IF !(lRet := !((cAlias)->(dbSeek(_TRB_FILIAL+_TRB_ID))))
Help("TEnchoice",1,"HELP","INCLUSAO","Ja existe um registro com esta
chave",1,0)
ENDIF
ELSE
IF !(lRet := (cAlias)->(dbSeek(_TRB_FILIAL+_TRB_ID)))
Help("TEnchoice",1,"HELP","ALTERACAO","Nao existe um registro com
esta chave",1,0)
ENDIF
ENDIF
RETURN lRet
/*/
+----------------------------------------------------------------------| Funo
| TGravar
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TGravar(cAlias,nReg,nOpc,aCampos)
LOCAL nX
RecLock(cAlias,nOpc==3)
IF nOpc == 5
DbDelete()
ELSE
For nX := 1 to Len(aCampos)
(cAlias)->&(aCampos[nX][1]) := &("_"+aCampos[nX][1])
Next nX
ENDIF
Msunlock()
RETURN
38.2. DbTree()
Descrio: Classe Advpl que permite a criao de um objeto visual do tipo Tree.
Propriedades:
bChange
Mtodos principais:
New
AddTree
AddTreeItem
EndTree
Aparncia:
Mtodo: New()
Parmetros:
nTop
nLeft
nBottom
nRight
oWnd
bchange
bRClick
lCargo
lDisable
Retorno:
Objeto
Mtodo: AddTree()
Parmetros:
cLabel
lPar02
cResOpen
cResClose
cBMPOpen
cBMPClose
cCargo
Retorno:
Nenhum
Mtodo: AddTreeItem()
Parmetros:
cLabel
cResource
cBitMap
cCargo
Retorno:
Nenhum
Mtodo: EndTree()
Sintaxe: oObj:EndTree ( )
Parmetros:
Nenhum
Retorno:
Nenhum
Exemplo:
#include "Protheus.ch"
/*/
+----------------------------------------------------------------------| Funo
| TDBTree
| Autor | MICROSIGA
| Data |
|
+----------------------------------------------------------------------| Descrio | Exemplo de utilizao da funo DbTree
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function TDBTree()
Local cBmp1 := "PMSEDT3"
Local cBmp2 := "PMSDOC"
Private cCadastro := "Meu Computador"
Private oDlg
Private oDBTree
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 0,0 TO 240,500 PIXEL
oDBTree := dbTree():New(10,10,95,240,oDlg,{|| U_Proc(oDBTree:GetCargo())},;
,.T.)
oDBTree:AddTree("Pentium 4"+Space(24),.T.,cBmp1,cBmp1,,,"1.0")
oDBTree:AddTreeItem("Gabinete",cBmp2,,"1.1")
oDBTree:AddTreeItem("Monitor" ,cBmp2,,"1.2")
oDBTree:AddTreeItem("Teclado" ,cBmp2,,"1.3")
oDBTree:AddTreeItem("Mouse",cBmp2,,"1.4")
oDBTree:AddTreeItem("Som",cBmp2,,"1.5")
oDBTree:AddTree("Placa Me",.T.,cBmp1,cBmp1,,,"2.0")
oDBTree:AddTreeItem("Processador",cBmp2,,"2.1")
oDBTree:AddTreeItem("Memria" ,cBmp2,,"2.2")
oDBTree:AddTreeItem("Vdeo",cBmp2,,"2.3")
oDBTree:AddTreeItem("Fonte",cBmp2,,"2.4")
oDBTree:EndTree()
oDBTree:EndTree()
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg CENTER
Return
38.3. MsSelect()
Descrio: A classe MsSelect cria um objeto browse (ou grid), com a primeira coluna
sendo do tipo marcao.
Propriedades:
oWnd
oBrowse
Mtodos principais:
New
Aparncia:
Mtodo: New()
aCampos
lInv
cMar
aCord
cTopFun
cBotFun
oWnd
reserved
aColors
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARROM
BR_PINK
BR_PRETO
BR_VERDE
BR_VERMELHO
Retorno:
Objeto
Exemplo:
DEFINE MSDIALOG oDlg1 TITLE "Selecao para Transferencia" From 9,0 To 32,80;
OF oMainWnd
@1.4,.8 Say "Valor Total:"
@1.4, 7 Say oValor
VAR nValor Picture "@E 999,999,999,999.99"
@1.9,.8 Say "Quantidade:"
@1.9, 9 Say oQtda
VAR nQtdBem Picture "@E 99999" SIZE 50,10
@1.4,15 Say Iif(MVParBox01==1,;
"Somente grupos de ["+MVParBox02+"] ate ["+MVParBox03+"]","")
If cTipoDet == "D"
@12.4,01 Say "Qtde. a Detalhar"
@158,60 MSGET nQtde Picture "@E 999" SIZE 036, 10 OF oDlg PIXEL;
VALID nQtde > 0
ElseIf cTipoDet == "P"
@12.4,01 Say oLabel Var cLabel := "Tipo de Projeto"
oRad := TRadMenu():New(169,005,{"Industrial","Florestal"},;
bSetGet(nOpcRad),oDlg,,{|| AF250RAD(nOpcRad)},,,,,,100,12,,,,.T.)
@15.5,01 Say oLabel2 Var cLabel2 := "Detalhamento:"
oRad2 := TRadMenu():New(210,005,{"Manter","Alterar"},;
bSetGet(nOpcRad2),oDlg,,{|| AF250RAD2(nOpcRad2)},,,,,,;
100,12,,,,.T.)
@16.4,01 Say oLabel3 Var cLabel3 := "Percentual"
oGet := TGet():New(210,043,bSetGet(nPerc),oDlg,030,010,;
"@E 999.99",,,,,,,.T.)
@18.2,01 Say oLabel4 Var cLabel4 := "Qtde. Det."
oGet2 := TGet():New(235,040,bSetGet(nQtde),oDlg,030,010,;
"@E 999",,,,,,,.T.)
oGet:Hide()
oGet2:Hide()
oLabel3:Hide()
oLabel4:Hide()
EndIf
oMark := MsSelect():New("SN3","N3_OK","!N3_BAIXA",,@lInverte,;
@cMarca,{35,1,143,315})
oMark:bMark := {| | a250Display(cMarca,lInverte,oValor,oQtda)}
ACTIVATE MSDIALOG oDlg1
ON INIT EnchoiceBar(oDlg1,;
{|| nOpct:=1,iif(DeParaEnt(),oDlg1:End(),.f.)},{|| nOpct:=2,oDlg1:End()})
39.
39.1. TReport()
39.1.1.
Introduo
Finalidade
O Protheus oferece o recurso personalizao para alguns relatrios de cadastros e
movimentaes do sistema. Ele tem como principais funcionalidades a definio de cores,
estilos, tamanho, fontes, quebras, mscara das clulas para cada seo, criao de frmulas e
funes (Soma, Mdia, etc.), possibilidade de salvar as configuraes por usurio e criao de
grficos.
Com a funcionalidade de Relatrios Personalizveis, o usurio pode modificar os relatrios
padres, criando seu prprio layout.
Vale lembrar que nem todos os relatrios so personalizveis. Por exemplo, relatrios que
tenham layout pr-definidos por lei e formulrios (boletos, notas-fiscais, etc) no podero ser
alterados.
Os relatrios personalizados so gravados com extenso .PRT, diferenciando-se dos relatrios
padres que recebem a extenso .##R.
Descrio
O TReport uma classe de impresso que substitui as funes SetPrint, SetDefault,
RptStatus e Cabec.
A classe TReport permite que o usurio personalize as informaes que sero apresentadas no
relatrio, alterando fonte (tipo, tamanho, etc), cor, tipo de linhas, cabealho, rodap, etc.
Estrutura do componente TReport:
Pr-Requisitos
Para utilizar o TReport, verifique se o seu repositrio est com o Release 4 do Protheus-8, ou
verso superior.
A funo TRepInUse() verifica se a lib do TReport est liberada no repositrio em uso. O
retorno uma varivel lgica.
#include "protheus.ch"
User Function MyReport()
Local oReport
If TRepInUse()
//verifica se a opo relatrios personalizveis est
disponvel
Pergunte("MTR025",.F.)
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
Verifique tambm o parmetro MV_TReport. Para utilizar os relatrios personalizveis, o
parmetro MV_TREPORT (tipo numrico) deve ser alterado no ambiente Configurador,
conforme uma das opes que seguem:
1 = utiliza relatrio no formato tradicional (antigo);
2 = utiliza relatrio personalizvel;
3 = pergunta qual relatrio ser utilizado: tradicional (antigo) ou personalizvel.
39.1.2.
Cada componente da tela de impresso do TReport, deve ser configurado no programa, para
que o usurio tenha acesso s personalizaes:
39.1.2.1.
Parmetros de impresso
A caixa de listagem apresentada deve ser utilizada conforme o meio de sada do relatrio. Veja
a seguir.
Impresso
Arquivo
O relatrio ser gravado em disco com o nome apresentado. Caso seja escolhida a opo
"Servidor" ele ser gravado no diretrio determinado na senha do usurio, atravs do
configurador, sendo este sempre no servidor (padro \SPOOL\). Na escolha da opo "Local"
ser aberta uma janela para que seja escolhido o local onde o relatrio ser gravado na
mquina do usurio.
O relatrio gerado a partir desta opo pode ser impresso ou enviado por e-mail aps ser
apresentado na tela.
Spool
Direciona o relatrio para impresso via configurao do Windows das impressoras
instaladas.
E-mail
Envia o relatrio por e-mail (Internet). Para isto, devem ser configurados os seguintes
parmetros no Ambiente Configurador:
MV_RELACNT
Define a conta de e-mail para identificar
Exemplo: relprotheus@microsiga.com.br
provenincia
dos
relatrios.
do
relatrio.
MV_RELPSW
Define a senha da conta de e-mail para envio dos relatrios.
MV_RELSERV
Define
o
servidor
da
conta
Exemplo: smtp.microsiga.com.br
de
para
envio
Quando selecionada esta opo, deve-se informar, no campo em destaque na figura abaixo, o
e-mail para o qual o relatrio deve ser remetido.
O Protheus Server pode tambm ser executado como um servidor Web, respondendo a
requisies HTTP. No momento destas requisies, pode executar rotinas escritas em ADVPL
como processos individuais, enviando o resultado das funes como retorno das requisies
para o cliente HTTP (como por exemplo, um Browser de Internet). Qualquer rotina escrita em
ADVPL que no contenha comandos de interface pode ser executada atravs de requisies
HTTP. O Protheus permite a compilao de arquivos HTML contendo cdigo ADVPL embutido.
So os chamados arquivos ADVPL ASP, para a criao de pginas dinmicas.
Programao TelNet
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto
atravs de uma aplicao cliente deste protocolo. O PROTHEUS Server pode emular um
terminal TelNet, atravs da execuo de rotinas escritas em ADVPL. Ou seja, pode-se escrever
rotinas ADVPL cuja interface final ser um terminal TelNet ou um coletor de dados mvel.
Papel
Tamanho do papel
Selecione o tamanho do papel em que o relatrio ser impresso.
39.1.3.
Personalizao
39.1.3.1.
O primeiro passo entender a nova estrutura dos relatrios desenvolvidos com a ferramenta
TReport.
O Relatrio possui Sees e Clulas. chamada de Seo, cada um dos grupos de
informaes, e de Clula, cada um dos campos que sero impressos.
39.1.4.
DEFINE REPORT
A funo DEFINE REPORT responsvel pela criao do objeto Report, ou seja, o relatrio.
Internamente, o DEFINE REPORT ir executar o mtodo TReport():New().
Estrutura do componente TReport:
O relatrio (TReport) contm 1 ou mais sees (TRSection);
Uma seo (TRSection) pode conter 1 ou mais sees;
A seo (TRSection) contm clulas pr-definidas e clulas selecionadas pelo usurio;
A seo (TRSection) tambm contm as quebras (TRBreak) para impresso de
totalizadores (TRFunction);
Os totalizadores so includos pela seo que automaticamente inclui no relatrio
(TReport).
DEFINE SECTION
Ainda no ReportDef(), so definidas as sees (oSection) do relatrio.
As sees do relatrio representam os diferentes grupos de informaes exibidos.
H a seo principal e as especficas.
Internamente, o DEFINE SECTION ir executar o mtodo TRSection():New().
A classe TRSection pode ser entendida como um layout do relatrio, por conter clulas,
quebras e totalizadores que daro um formato para sua impresso.
Com a classe TRSection possvel definir uma query, filtro ou ndice com filtro (IndRegua) que
ser utilizada por ela para processamento do relatrio, atravs do mtodo Print e utilizando as
clulas de posicionamento (TRPosition).
DEFINE CELL
Para cada seo, devem ser definidas as clulas. Clula cada informao que dever ser
impressa. Pode ser um campo do cadastro, ou um resultado de uma operao. uma Clula
de impresso de uma seo (TRSection) de um relatrio que utiliza a classe TReport
Internamente, o DEFINE CELL ir executar o mtodo TRCell():New ().
Bancos:
Database
MSSQL 2000
INFORMIX
ORACLE
MYSQL
DB2
Tipo
Caracter
Caracter
Caracter
Caracter
Caracter
Tamanho
10
10
10
10
10
Contedo
0000000001
0000000001
0000000001
0000000001
0000000001
Bancos:
Database
MSSQL 2000
POSTGRES
INFORMIX
ORACLE
MYSQL
DB2
Tipo
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Tamanho
10
0
10
10
10
10
Contedo
Vazio
Vazio
Vazio
Vazio
Vazio
Vazio
Retorno: Todos os bancos que suportam a funo LEFT() retornaram uma coluna
de informaes, onde os 5 primeiros bytes eram '00000'.
Bancos:
Database
MSSQL 2000
MYSQL
DB2
Tipo
Caracter
Caracter
Caracter
Tamanho
5
5
4000
Contedo
00000
00000
00000
Bancos:
Database
MSSQL 2000
POSTGRES
INFORMIX
ORACLE
MYSQL
DB2
Tipo
Caracter
Caracter
Caracter
Caracter
Caracter
Caracter
Tamanho
4
2000
4
4
4
4
Contedo
0000
0000
0000
0000
0000
0000
Vale a pena salientar que, cada banco de dados possui, com pequenas variaes, uma sintaxe
para permitir o CAST de um retorno. Para maiores detalhes, a documentao do banco deve
ser consultada.
Comportamento diferenciado com Bandos de Dados PostGres
O Banco de Dados Postgres possuem um comportamento diferenciado entre os Builds do
Server do Banco, e possui uma parametrizao na configurao do ODBC que pode interferir
na maneira como os atributos das colunas de retorno de uma query so retornados.
Em verses inferiores o Postgres 8.x, as diferenas de comportamento em relao os demais
Bancos de Dados possuem um diferencial muito significativo, em praticamente todas as
funes de retorno calculado. Para estes casos, em se tratando de Postgres verses inferiores
a 8.x, a preciso de retorno da coluna corresponde ao tamanho mximo de retorno do tipo
VarChar. ( Este tamanho mximo pode ser configurado na conexo ODBC do PostgreSql, e o
valor default 65536 bytes. )
Na funo Substring(), mesmo que esteja especificado no 3. parmetro da funo, a
quantidade final limitada de Bytes, o Banco de Dados descreve esta coluna de retorno como
sendo um VarChar() com a preciso do maior valor VARCHAR() a ser retornado pelo client. Na
funo Max(), quando especificado um campo da base do tipo Char ou Varchar, temos um
comportamento semelhante.
Quando foram homologados os Bancos Postgres para uso com o ERP Microsiga e TOPConnect
4, praticamente no eram utilizadas queries com colunas calculadas nas aplicaes Advpl, e
este comportamento diferenciado no foi percebido. Conforme as rotinas foram evoluindo,
buscando mais performance atravs do uso de Queries, tornou-se perceptvel estas diferenas
operacionais.
Algumas destas diferenas operacionais foram assimiladas pelas funes do ERP, por exemplo
a ChangeQuery, que em verso atualizada (** Protheus 8 e P10, fonte aplib070.prw com data
igual ou superior a 08/03/2008) , aplicam o CAST() automaticamente para SELECT
MAX(CAMPO), quando o banco Postgres, e o campo selecionado for um campo da base de
dados, presente no Dicionrio de Campos ( SX3 ).
Para todos os efeitos, para utilizao com as verses homologadas de Postgres inferiores a
8.x, necessrio alterar a configurao de ODBC do Postgres, para limitar o retorno do tipo
VarChar para 2000 Bytes, pois o retorno do valor default ( 65536 bytes ) no suportado pelo
TOPConnect / TOTVSDBAccess. Alteramos esta configurao no arquivo .odbc.ini no linux, e/ou
no arquivo de configurao do ODBC do Postgres utilizado, inserindo na seo da conexo /
identificao do banco a chave abaixo :
MaxLongVarcharSize=2000
0
-1
-2
-4
-5
-6
-8
-9
-10
-11
-11
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-40
-41
-50
-58
-67
-76
-76
COMM_INITPGM_ERROR
COMM_PARAM_ERROR
COMM_PROGRAM_ERROR
COMM_INSMEM_ERROR
INVALID_BUILD
INVALID_TOPAPI
-81
-86
-88
-90
-99
-100
TCCANOPEN
TCCONTYPE
TCDELFILE
TCGENQRY
TCGETDB
TCLINK
TCQUERY
TCQUIT
TCSETCONN
TCSETFIELD
TCSPEXEC
TCSPEXIST
TCSQLERROR
TCSQLEXEC
TCSRVTYPE
TCUNLINK
TCCHKOBJ
TCEXEERROR
TCPGMEXE
TCSYSEXE
Lista das funes acessrias utilizadas nos fontes como facilitadoras:
CHANGEQUERY
RETFULLNAME
RETSQLCOND
RETSQLNAME
RETSQLTABLE
SQLCOPY
SQLORDER
SQLTOTRB
Parmetros:
cTable
cIndice
Retorno:
Lgico
Exemplo:
TCCONTYPE()
Especifica o protocolo de comunicao a ser utilizado pelo TOPConnect.
Sintaxe: TCConType(cType)
Parmetros:
cType
Retorno:
Nenhum
Exemplo:
#INCLUDE "TOPCONN.CH"
//Especifica conexo TCP/IP
TCConType("TCPIP")
//Conecta-se ao ambiente SIGAADV no Microsoft SQL-Server
TCLink("MSSQL/SIGAADV")
TCDELFILE()
Exclui uma tabela no servidor.
Sintaxe: TCDelFile(cTable)
Parmetros:
cTable
Retorno:
Nenhum
Exemplo:
TCDelFile("CUSTOMER")
TCGENQRY()
Permite a execuo de uma query de seleo no banco de dados e retorna um recordset com o
resultado.
Sintaxe: TCGENQRY(xParam1,xParam2,cQuery)
Parmetros:
xParam1
Parmetro reservado.
xParam2
Parmetro reservado.
cQuery
Query de seleo com sintaxe no padro SQL ANSI a ser executada no banco
de dados.
Retorno:
RecordSet
Exemplo:
TCGETDB()
Retorna o tipo de Banco de Dados corrente.
Sintaxe: TCGETDB()
Parmetros:
Nenhum
Retorno:
Caracter
Exemplo:
TCLINK()
Abre uma conexo com o Servidor TOPConnect.
Sintaxe: TCLink(cConectString,cServer)
Parmetros:
cConectString
cServer
Observaes:
Para o TOPConnect NT acessando Oracle, um ambiente o nome do Alias criado
com o utilitrio SQL-Net.
Para o TOPConnect NT acessando os demais SGDB's um ambiente um System
DSN criado atravs do ODBC Data Source Administrator.
Para o TOPConnect AS/400 um ambiente uma Library criada atravs do comando
CRTTOPENV do TOPConnect.
Retorno:
Numrico
Exemplo:
TCQUERY()
Executa uma Query no servidor e coloca seu retorno em uma WorkArea.
Durante o processo de compilao, a sintaxe TCQUERY() substituda pelas
expresso:
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery), ALIAS ,.T.,.F.)
Esta substituio realizada conforme as definies do include TOPCONN.CH.
Desta forma recomendvel a utilizao direta da sintaxe DbUseArea() +
TcGeQry().
Parmetros:
cSQLExpr
ALIAS cAlias
NEW
VIA "TOPCONN"
Observaes:
A Work Area criada com o comando TCQUERY READ-ONLY, portanto no
permitido o uso de APPEND's ou REPLACE's.
O TOPConnect tem apenas um cursor para a Query executada portando apenas os
seguintes comandos so suportados em uma Work Area criada com TCQUERY:
o
o
o
o
o
GO TOP - DbGoTop()
GO BOTTOM - DbGoBottom()
SKIP - DbSkip()
Eof()
Bof()
Ao executar uma Query que retorne um ou mais valores calculados, o nome dos
campos da WorkArea sero COLUMN1, COLUMN2... COLUMNn.
Retorno:
Nenhum
Exemplo:
TCQUIT()
Encerra todas as conexes com o TOPConnect.
Sintaxe: TCQuit()
Parmetros:
Nenhum
Retorno:
Nenhum
TCSETCONN()
Seleciona a conexo ativa.
Sintaxe: TCSETCONN(nConn)
Parmetros:
nConn
Nmero da conexo
Retorno:
Nenhum
Exemplo:
TCSETFIELD()
Esta funo serve como apoio ao comando TCQUERY, na recuperao de campos tipo
NUMERIC, DATE e LOGICAL, pois os mesmos so gravados fisicamente no Banco de Dados
como caracteres, e no caso dos numricos como float.
Parmetros:
cAlias
cField
cType
nTam
nDec
Retorno:
Nenhum
Exemplo 01:
TCQUERY "SELECT NOME, DATA, MARRIED, VALOR FROM CUSTOMER" ALIAS QUERY VIA
"TOPCONN"
TCSetField("QUERY","DATA","D")
TCSetField("QUERY","VALOR","N",12,2)
Exemplo 02:
Local
Local
Local
Local
Local
cQuery
cCampos
aStruSA1
nX
nMax
:=
:=
:=
:=
:=
""
""
SA1->(DbStruct())
0
Len(aStruSA1)
Continuao:
For nX := 1 to Len(aStruSA1)
IF !( aStrutSA1[nX][2] $ "C/M")
TCSetField( cAlias,aStruSA1[nX][1],aStruSA1[nX][2],;
aStruSA1[nX][3],aStruSA1[nX][4])
ENDIF
Next nX
TCSPEXEC()
Executa uma Stored Procedure no Banco de Dados.
Devido a uma limitao em alguns dos Bancos de Dados suportados na
obteno dos tipos de parmetros (se so de INPUT e/ou OUTPUT) todos as
Stored Procedures a serem executadas atravs do TOPConnect devero
obedecer o seguinte padro de nomenclatura de seus parmetros :
Parmetros de INPUT devem comear com IN_... Ex. IN_VALOR.
Parmetros de OUTPUT devem comear com OUT_... Ex. OUT_CODIGO
Aps a execuo de uma Stored Procedure o TOPConnect retornar ao ADVPL
um array com 'n' elementos, onde n o nmero de parmetros de OUTPUT da
Stored Procedure.
Sintaxe: TCSPExec(cSPName,xParam1,xParam2...xParamN)
Parmetros:
cSPName
xParamN
Retorno:
Array
Exemplo:
TCSPEXIST()
Verifica a existncia de uma determinada Stored Procedure no servidor.
Sintaxe: TCSPExist(cSPName)
Parmetros:
CSPName
Retorno:
Lgico
Exemplo:
If TCSPExist("MAT001_01")
TCSPExec("MAT001_01",...)
Endif
Sintaxe: TCSQLError()
Parmetros:
Nenhum
Retorno:
String
Exemplo:
If
TCSQLEXEC()
Permite a execuo de comandos de atualizao no servidor de banco de dados.
Sintaxe: TCSQLExec(cCommand)
Parmetros:
cCommand
Retorno:
Numrico
Exemplo:
Sintaxe: TCSrvType()
Parmetros:
Nenhum
Retorno:
String
Exemplo:
TCLink("MSSQL/TESTE","TOPSRV")
ALERT(TCSrvtype())
Sintaxe: TCUnlink(nConn)
Parmetros:
nConn
Retorno:
Nenhum
Exemplo:
TCConType("NPIPE")
nConn := TCLink("MSSQL/TOPCONN","TOPSRV")
TCUnLink(nConn)
TCCHKOBJ()
Verifica a existncia de um objeto no servidor AS/400
Sintaxe: TCChkObj(cObj,cLibrary,cType)
Parmetros:
cObj
cLibrary
cType
Retorno:
Numrico
Exemplo:
nError := TCChkObj("CALCCUST","PRODUCAO","*PGM")
TCEXEERROR()
Retorna uma string com a mensagem de erro retornada pela execuo das funes
TCPGMEXE() e TCSYSEXE().
Sintaxe: TCExeError()
Parmetros:
Nenhum
Retorno:
String
Mensagem de erro.
Exemplo:
If TCPGMEXE("CALCCUST") != 0
ALERT(TCExeError())
Endif
TCPGMEXE()
Executa um programa no servidor AS/400.
Sintaxe: TCPGMEXE(cProgram)
Parmetros:
cProgram
Retorno:
Numrico
Exemplo:
If TCPGMEXE("CALCCUST") != 0
ALERT(TCExeError())
Endif
TCSYSEXE()
Permite a execuo de um comando utilizando a sintaxe e recursos nativos do DB2/400,
diretamente no servidor do banco de dados.
Sintaxe: TCSysExe(cCommand)
Parmetros:
cCommand
Retorno:
Numrico
Exemplo:
cCommand
cCommand
cCommand
cCommand
:=
+=
+=
+=
Funes acessrias para uso em fontes com interao com o TOTVS DbAccess
CHANGEQUERY()
Funo que efetua as adequaes necessrias a query para que a mesma possa ser executada
adequadamente no banco de dados em uso pela aplicao ERP atravs do TopConnect.
Esta funo necessria pois a aplicao ERP Protheus pode ser utilizada com diversos bancos
de dados, e cada banco possui particularidades em sua sintaxe, de forma que mesmo uma
query escrita respeitando o padro SQL ANSI pode necessitar de adequaes.
Sintaxe: ChangeQuery(cQuery)
Parmetros:
cQuery
Retorno:
String
Exemplo:
Parmetros:
cAlias
cEmp
Retorno:
String
Exemplo:
SA1->(DbSetOrder(1)) // A1_FILIAL+A1_COD+A1_LOJA
cOrder := SqlOrder(IndexKey())
cQuery := "SELECT * FROM "+RETSQLNAME("SA1")+ " WHERE "
cQuery += RetSqlCond("SA1")
cQuery += " ORDER BY "+cOrder
dbUseArea(.T.,"TOPCONN", TcGenQry(,,cQuery), "TRBSQL", .T., .F.)
cRealName := RetFullName("TRBSQL")
RETSQLCOND()
Retorna uma string com as condies padres de uso em uma query.
Sintaxe: RetSqlCond(cAlias)
Parmetros:
cAlias
Retorno:
String
Exemplo:
RETSQLNAME()
Retorna o nome padro da tabela para seleo no banco de dados atravs da query.
Sintaxe: RetSqlName(cAlias)
Parmetros:
cAlias
Retorno:
String
Exemplo:
RETSQLTABLE()
Retorna o nome real da tabela para seleo no banco de dados atravs da query.
Sintaxe: RetSqlTable(cAlias)
Parmetros:
cAlias
Retorno:
String
Exemplo:
SQLCOPY()
Cria um arquivo no formato especificado pela configurao LOCALFILES do ambiente com o
retorno da query.
Parmetros:
cFile
cWhere
aStru
cAlias
aDates
Array com os nomes dos campos que devero ter o tratamento da funo
TCSetField() para o formato de data.
Se copia o contedo da coluna R_E_C_N_O_ para o arquivo gerado.
lRecno
Retorno:
Nenhum
SQLORDER()
Converte a sintaxe de um indce em formato ISAM (CODEBASE) para o formato SQL ANSI
Sintaxe: SqlOrdem(cOrder)
Parmetros:
cOrder
Retorno:
String
Exemplo:
SA1->(DbSetOrder(1)) // A1_FILIAL+A1_COD+A1_LOJA
cOrder := SqlOrder(IndexKey())
cQuery := "SELECT * FROM "+RETSQLNAME("SA1")+ " WHERE "
cQuery += RetSqlCond("SA1")
cQuery += " ORDER BY "+cOrder
dbUseArea(.T.,"TOPCONN", TcGenQry(,,cQuery), "TRBSQL", .T., .F.)
cRealName := RetFullName("TRBSQL")
SQLTOTRB()
Preenche um arquivo temporrio com o contedo do retorno da query.
Parmetros:
cQuery
aStru
cAlias
Retorno:
Nenhum
Exemplo:
40.3.1.
#include "protheus.ch"
/*/
+----------------------------------------------------------------------| Funo
| WndSQLTRB
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Demonstra a utilizao da MaWndBrowse com SQL
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
Continuao:
aAdd(aRotina,{"Visualizar","U_TcVisual",0,2}) // Desenvolver Enchoice para
campos de arquivo temporrio
aAdd(aRotina,{"Incluir"
,"U_TcInclui",0,3}) // Desenvolver Enchoice para
campos de arquivo temporrio
aAdd(aRotina,{"Alterar"
,"U_TcAltera",0,4}) // Desenvolver Enchoice para
campos de arquivo temporrio
aAdd(aRotina,{"Excluir"
,"U_TcExclui",0,5}) // Desenvolver Enchoice para
campos de arquivo temporrio
// Estrutura do Arquivo: Nome do campo / tipo, tamanho, decimais (SX3 para
temporrio)
/*
AADD(aStruTRB,{"TRB_FILIAL"
,"C",02,0})
// Nome_Campo , Tipo_Campo, Tamanho, Decimal
AADD(aStruTRB,{"TRB_ID"
,"C",14,0})
AADD(aStruTRB,{"TRB_NOME"
,"C",20,0})
AADD(aStruTRB,{"TRB_IDADE"
,"N",03,0})
AADD(aStruTRB,{"TRB_STATUS"
,"C",01,0})
*/
// aCampos padro para a MaWndBrowse
//AADD(aCampos,{<Nome_Campo>,<Picture>,<Titulo>,<Tamanho>})
// aCampos melhorado para a WndBrwTRB
//AADD(aCampos,{<Nome_Campo>,<Picture>,<Titulo>,<Tamanho>,<Tipo>,<cWhen>,;
//<lObrigatorio>})
// Nota: lObrigatorio deve ser sempre a ultima informacao do aCampos
/*
AADD(aCampos,{"TRB_FILIAL"
,"@!" ,"Filial"
,02,"C",".F.",.T.})
AADD(aCampos,{"TRB_ID"
,"@!" ,"Matricula"
,14,"C",".F.",.T.})
AADD(aCampos,{"TRB_NOME"
,"@!" ,"Nome"
,20,"C",".T.",.F.})
AADD(aCampos,{"TRB_IDADE"
,"@E 999","Idade"
,03,"N",".T.",.F.})
AADD(aCampos,{"TRB_STATUS"
,"@!" ,"Status"
,01,"C",".T.",.T.})
*/
If ( Select( cAlias ) <> 0 )
dbSelectArea ( cAlias )
dbCloseArea ()
Endif
// Arquivo de trabalho que ser utilizado pela MaWndBrowse
cCampos:= ""
nX
:= 0
nMax
:= Len(aStruSQL)
aEval( aStruSQL,{|aCampo| nX++, cCampos += aCampo[1] +;
IIF(nX == nMax,' ',', ')})
cArqTrb := CriaTrab(aStruSQL,.T.)
dbUseArea(.T.,__LOCALDRIVER,cArqTrb,cAlias,.T.,.F.)
cQuery := "SELECT "+cCampos+" FROM "+RetSqlName("SA1")+" (NOLOCK) "
SqlToTrb(cQuery,aStruSQL,cAlias)
Continuao:
cArqInd := CriaTrab(Nil,.F.)
cChave
:= "A1_FILIAL+A1_COD+A1_LOJA"
IndRegua(cAlias,cArqInd,cChave,,,"Indexando Registros...")
dbSelectArea( cAlias )
dbGotop()
MaWndBrowse(aSize[7],aSize[2],aSize[6],aSize[5],cTitulo,cAlias,/*aCampos*/,;
aRotina,,cTopFun,cBotFun,lCentered,,nModelo,,cSeek,lDic,lSavOrd)
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
:= {||oDlg:End()}
bCancel
:= {||oDlg:End()}
nX
Continuao:
- 586 ADVPL Completo
For nX := 1 to Len(aCampos)
If nX > 1
nLinha := IIF(nX%2 > 0 ,nLinha := nLinha +015,nLinha) // Impar
nColuna := IIF(nX%2 == 0,nColuna := nColuna+170,10)// Par
Endif
AADD(aCposEnch,{"_"+aCampos[nX][1],{nLinha,nColuna} ,;
aCampos[nX][3],aCampos[nX][2],"AllwaysTrue()",;
"",".F.",aCampos[nX][4]})
SetPrvt("_"+aCampos[nX][1])
&("_"+aCampos[nX][1]) := (cAlias)->&(aCampos[nX][1])
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
TEnchoice(oDlg, aCposEnch,,,,,.T.)
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
/*/
+----------------------------------------------------------------------| Funo
| TcInclui
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TcInclui(cAlias,nReg,nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
aArea
:= GetArea()
nX
Continuao:
For nX := 1 to Len(aCampos)
If nX > 1
nLinha := IIF(nX%2 > 0 ,nLinha := nLinha +015,nLinha) // Impar
nColuna := IIF(nX%2 == 0,nColuna := nColuna+170,10)// Par
Endif
AADD(aCposEnch,{"_"+aCampos[nX][1],{nLinha,nColuna} ,;
aCampos[nX][3],aCampos[nX][2],"AllwaysTrue()",;
"",".T.",aCampos[nX][4]})
SetPrvt("_"+aCampos[nX][1])
Do Case
Case aCampos[nX][5] == "C"
&("_"+aCampos[nX][1])
Case aCampos[nX][5] == "N"
&("_"+aCampos[nX][1])
Case aCampos[nX][5] == "D"
&("_"+aCampos[nX][1])
Case aCampos[nX][5] == "L"
&("_"+aCampos[nX][1])
Case aCampos[nX][5] == "M"
&("_"+aCampos[nX][1])
EndCase
:= Space(aCampos[nX][4])
:= 0
:= CTOD("")
:= .F.
:= Space(aCampos[nX][4])
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
TEnchoice(oDlg, aCposEnch,,,,,.T.)
bOk := {|| IIF( U_TValid(cAlias,nReg,nOpcE,aCampos),;
( U_TGravar(cAlias,nReg,nOpcE,aCampos),oDlg:End()),)}
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| TcAltera
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TcAltera(cAlias,nReg,nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
aArea
:= GetArea()
nX
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| TcExclui
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TcExclui(cAlias, nReg, nOpc)
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
//
//
//
//
aCposEnch := {}
nLinha
:= 15
nColuna
:= 10
nOpcE
:= aRotina[nOpc][4] // Opcao de verdade
bOk
bCancel
:= {||oDlg:End()}
nX
For nX := 1 to Len(aCampos)
If nX > 1
nLinha := IIF(nX%2 > 0 ,nLinha := nLinha +015,nLinha) // Impar
nColuna := IIF(nX%2 == 0,nColuna := nColuna+170,10)// Par
Endif
AADD(aCposEnch,{"_"+aCampos[nX][1],{nLinha,nColuna} ,;
aCampos[nX][3],aCampos[nX][2],"AllwaysTrue()",;
"",".F.",aCampos[nX][4]})
SetPrvt("_"+aCampos[nX][1])
&("_"+aCampos[nX][1]) := (cAlias)->&(aCampos[nX][1])
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
TEnchoice(oDlg, aCposEnch,,,,,.T.)
bOk := {|| IIF( U_TValid(cAlias,nReg,nOpcE,aCampos),;
(U_TGravar(cAlias,nReg,nOpcE,aCampos),oDlg:End()),)}
oDlg:bInit := {|| EnchoiceBar(oDlg, bOk, bCancel,.F.,{},nReg,cAlias)}
oDlg:lCentered := .T.
oDlg:Activate()
RETURN
Continuao:
- 590 ADVPL Completo
/*/
+----------------------------------------------------------------------| Funo
| TcValid
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION TcValid(cAlias,nReg,nOpc,aCampos)
LOCAL lRet
LOCAL nX
LOCAL nPosObrig := Len(aCampos[1])
For nX := 1 to Len(aCampos)
IF aCampos[nX,nPosObrig] == .T.
IF !(lRet := !Empty(&("_"+aCampos[nX,1])))
Help("TEnchoice",1,"HELP","OBRIGATORIO","Existem campos
obrigatorios nao preenchidos",1,0)
RETURN lRet // EXIT
ENDIF
ENDIF
Next nX
IF nOpc == 3
IF !(lRet := !((cAlias)->(dbSeek(_TRB_FILIAL+_TRB_ID))))
Help("TEnchoice",1,"HELP","INCLUSAO","Ja existe um registro com esta
chave",1,0)
ENDIF
ELSE
IF !(lRet := (cAlias)->(dbSeek(_TRB_FILIAL+_TRB_ID)))
Help("TEnchoice",1,"HELP","ALTERACAO","Nao existe um registro com
esta chave",1,0)
ENDIF
ENDIF
RETURN lRet
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| TcGravar
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| TEnchoice
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | Enchoice para arquivos temporarios
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
Static Function TEnchoice(oDlg, aCampos, nLeftE, nTopE, nHeightE, nWidthE,;
lEnchBar)
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aSays
aGets
cCaption
cPict
cValid
cF3
cWhen
cBlKSay
cBlkGet
cBlKVld
cBlKWhen
nLeft
nTop
nI
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
{}
{}
""
""
""
""
""
""
""
""
""
0
0
0
,aCampos[nI,3])
,aCampos[nI,4])
".t." ,aCampos[nI,5])
NIL
,aCampos[nI,6])
Continuao:
nWidthG
:= Iif(Empty(aCampos[nI,8]), 100,;
IiF(aCampos[nI,8]*3.5 > 100,100,nil))
40.3.2.
O termo Banco de dados de interface utilizado para classificar uma aplicao ADVPL escrita
com funes de interao com a aplicao TopConnect / TOTVS DbAccess para realizar a
integrao entre a aplicao ERP Protheus e outro sistema, utilizando como meio de
comunicao um banco de dados e no mais importao de arquivos em N formatos, tais
como .TXT, .DBF e similares.
Este tipo de integrao no visa substituir formatos de integraes padres j
existentes como o padro CNAB e o padro Web XML.
Sua aplicao integrao direta entre sistemas atravs de um banco de
dados com formato e padres comuns entre elas.
As vantagens da utilizao do conceito de Banco de Dados de Interface em comparao da
integrao por importao / exportao de arquivos so:
Maior controle da integrao das informaes entre os sistemas, permitindo um
tratamento adequado de eventos de erros;
Transparncia e rastreabilidade das informaes integradas, implementando
confiabilidade no processo;
Possibilidade de utilizao de um tipo de banco de dados pela aplicao ERP
Protheus e de outro tipo de banco de dados para integrao entre os sistemas.
Possibilidade de desenvolvimento de ferramentas para monitorar e gerenciar a
integrao entre os sistemas atravs do controle da rea de interface no banco
de dados, inclusive com a utilizao de Stored Procedures para aumentar a
performance da aplicao de interface.
Consideraes relevantes sobre as funes TCLink() e TCSetConn()
A funo TCLink() permite a abertura de uma conexo com um banco de dados,
desde que haja o OBDC configurado no ambiente da aplicao e na aplicao
TOPConnect / TOTVS DBAccess;
Cada abertura de conexo atravs da funo TcLink() consome uma licensa de
usurio do TOPConnect / TOTVS DBAccess. Aps a abertura de uma conexo a
mesma deve ser selecionada pela funo TcSetConn() para se tornar a conexo
ativa;
Podem ser utilizadas diversas conexes em uma mesma aplicao ADVPL, e
podem ser utilizadas as informaes das tabelas j abertas e vinculadas a uma
rea de trabalho independente da conexo que est ativa. Somente deve ser
verificado que para abertura de uma tabela e vnculo desta com uma rea de
trabalho obrigatoriamente deve estar ativa a conexo com o banco de dados que
contm esta tabela.
A conexo aberta entre o ERP Protheus e o TopConnect / DbAccess possu o
nmero de referncia 0. Desta forma, aps finalizar uma conexo aberta com o
comando TCLink() deve ser efetuado um TCSetConn(0) para restaurar como
conexo ativa a conexo padro do Protheus com o TopConnec.
A figura abaixo ilustra a estrutura tpica de uma aplicao utilizando o conceito de Banco de
Dados de Interface, com foco na aplicao ERP Protheus e seus recursos pr-disponveis:
Tarefa
Descrio
01
02
03
04
05
Detalhamento
Utilizao de queries ou stored
procedures para atualizao das
tabelas do banco DBInterface no
formato
necessrio
ao
ERP
X,
executadas a partir do ERP Protheus.
Ferramentas proprietrias do ERP X
para
leitura
do
DBInterface
e
tratamento das informaes para
atualizao do banco de dados desta
aplicao.
Pode ser uma ferramenta proprietria
da aplicao ERP X, ou pode ser um
conjunto
de
queries
e
stored
procedures
desenvolvidas
em
conjunto com a equipe do ERP X e a
equipe TOTVS, permitindo o controle
de execuo da extrao pelo ERP
Protheus.
Utilizao de queries ou stored
procedures
para
leitura
das
informaes
do
DBInterface
e
atualizao de tabelas intermedirias
no banco de dados do ERP Protheus,
executadas a partir do ERP Protheus.
Utilizao de funes prprias para
esta finalidade no ERP Protheus para
efetivao
das
informaes
importadas em informaes vlidas no
ERP. Estas funes normalmente so
compatveis com a execuo atravs
do recurso de MsExecAuto().
tam_cp := GetE2ValorSize()
BeginSql alias 'E2TEMP'
column E2_EMISSAO as Date, E2_VALOR as Numeric(tam_cp,2)
. . .
EndSql
Erros de Compilao
Caso seja utilizado algum argumento invlido para especificar as colunas, ou erros de sintaxe
nas expresses a serem transformadas para a montagem da query, a compilao do fonte
interrompida com a ocorrncia 'Syntax Error', informando a linha onde a primeira ocorrncia
foi encontrada.
Syntax error:)
Caso a ocorrncia de compilao aponte diretamente para a linha do cdigo-fonte, onde est
escrita a instruo EndSql, verifique se existe algum espao em branco ou tabulao, a partir
do incio da linha, antes da instruo EndSql. A verso atual desde ambiente no suporta esta
declarao, exigindo que a instruo EndSql seja alinhada esquerda do fonte, sem espaos
ou tabulaes.
Erros de Execuo
'Query Argument Error : Alias [XXX] already in use.'
Caso a instruo BeginSQL especifique um alias que j esteja aberto (em uso), a aplicao
abortada com a ocorrncia de erro fatal acima, informando em XXX o alias utilizado.
'Query Argument Error : Invalid Value Type [X]'
Caso alguma expresso informada na Query, atravs da tag %exp: ... %, retorne um valor de
tipo diferente de 'C' Catacter, 'D' Data, 'N' Numrico, ou 'L' Lgico, a aplicao abortada com
a ocorrncia de erro acima, onde o tipo do argumento inesperado mostrado em [X].
'Type Mismach on +'
Esta ocorrncia, se reproduzida, informar na pilha de chamadas o nmero da linha do cdigofonte correspondente instruo EndSQL. Ocorre caso alguma funo intermediria do engine
do Embedded SQL, excluindo-se as funes especificadas na query com a sintaxe %exp: ... %
, retornar um contedo no-caractere a ser acrescentado na Query. Esta ocorrncia de mais
difcil localizao, sendo til nestes casos a anlise do arquivo temporrio gerado pelo Protheus
IDE, no momento da compilao.
Help NOFUNCW - Funo __EXECSQL
Caso um fonte com o Embedded SQL seja executado em um repositrio que no tenha sido
atualizado, OU que no seja um Repositrio para o ambiente TOPConnect ( RPODB=TOP), a
aplicao exibir a ocorrncia acima, indicando que a funo interna de execuo da Query
no est presente no ambiente. Verifique se a lib est atualizada, e se o RPO em uso de um
ambiente TOPConnect.
__execSql(
'E2TEMP',
' SELECT SE2.E2_PREFIXO,SE2.E2_NUM, SE2.E2_FORNECE, SE2.E2_LOJA,SE2.E2_VALOR,
SE2.D_E_L_E_T_ DEL1, QEK.D_E_L_E_T_ DEL2 , QEK.QEK_SKLDOC, SE2.R_E_C_N_O_
SE2RECNO FROM
SE2.E2_FILIAL=
SE2.E2_PREFIXO<>
'' +xFilial('SE2')+''
'+
41.
Funcionalidade MsExecAuto
Parmetros
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, nOpc)
(xAutoCab, nOpc)
(xAutoCab, xAutoItens)
(nOpcAuto, aAuto)
(nOpcAuto, aAuto)
(aRotAuto, nOpcAuto, aRotItem)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(nOpcAuto, aAuto)
(nOpcAuto, aAutoCab)
(nOpcAuto, xAutoCab, xAutoAD2, xAutoAD3, xAutoAD4, xAutoAD9)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoVend, xAutoTask, xAutoCalend)
(aRotAuto, nOpcAuto)
(aRotAuto, nOpcAuto)
(aRotAuto, nOpcion, nOpcAuto)
(xAutoCab, nOpc)
(xAutoCab, nOpc)
(nPosArotina, xAutoCab, nOpcAuto)
(aAuto, nOpcAuto)
(aRotauto, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto, lWhenGet, xAutoImp)
(xReservCab, xReservItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, lInclui)
(nFuncao, xAutoCab, xAutoItens, nOpcAuto, )
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoIt, xAutoIt2, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
- 604 ADVPL Completo
Rotina
MATA175
MATA185
MATA200
MATA230
MATA241
MATA242
MATA261
MATA265
MATA266
MATA267
MATA360
MATA410
MATA415
MATA416
MATA490
MATA685
MATA700
MATA920
TMKA061
TMKA062
TMKA271
TMSA040
TMSA050
TMSA170
TMSA360
TMSA430
TMSA440
Parmetros
(xRotAuto, xOpcAuto)
(xAutoSCP, xAutoSD3, nOpcAuto, xPerg)
(xAutoCab, xAutoItens, nOpcAuto)
(aAuto, nOpcAuto)
(xAutoCab, xAutoItens, nCallOpcx)
(xAutoCab, xAutoItens, nOpcAuto)
(aAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(aAutoItens)
(aAutoItens)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens)
(xAuto, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAuto, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
(xAutoCab, xAutoItens, xItensPesM3, xItensEnder, nOpcAuto)
(xAutoCab, nOpcAuto)
(xAutoCab, xAutoItens, xAutoNFAva, nOpcAuto)
(cAlias, xAutoCab, xAutoVei, xAutoMot, nOpcAuto)
(xAutoCab, xAutoItens, nOpcAuto)
Exemplo:
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
,
,
,
,
Nil})
Nil})
Nil})
Nil})
Exemplo:
AADD(xAutoCab,{F1_FILIAL
AADD(xAutoCab,{F1_DOC
AADD(xAutoCab,{F1_SERIE
AADD(xAutoCab,{F1_FORNECE
AADD(xAutoCab,{F1_LOJA
,
,
,
,
,
xFilial(SF1)
000001
1
000001
01
,
,
,
,
,
Nil})
Nil})
Nil})
Nil})
Nil})
For nX := 1 to 2
xAutoItem := {}
AADD(xAutoItem,{D1_FILIAL
AADD(xAutoItem,{D1_DOC
AADD(xAutoItem,{D1_SERIE
AADD(xAutoItem,{D1_FORNECE
AADD(xAutoItem,{D1_LOJA
AADD(xAutoItem,{D1_ITEM
AADD(xAutoItem,{D1_COD
AADD(xAutoItem,{D1_QUANT
AADD(xAutoItem,{D1_VUNIT
AADD(xAutoItem,{D1_TOTAL
AADD(xAutoItem,{D1_TES
,
,
,
,
,
,
,
,
,
,
,
xFilial(SD1)
000001
1
000001
01
STRZERO(nx,04)
STRZERO(nx,15)
100*nX
5*nX
(100*nX)*(5*nX)
001
,
,
,
,
,
,
,
,
,
,
,
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
Nil})
AADD(xAutoItens, xAutoItem)
Next nX
MsExecAuto({|x,y,z| MATA103(x,y,z)}, xAutoCab, xAutoItens, 3)
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
,
,
,
,
Nil})
Nil})
Nil})
Nil})
OTHERWISE
AADD(xAutoCab,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]), NIL})
ENDCASE
ELSE
AADD(xAutoCab,{aStruSN1[nX][1],;
CRIAVAR(aStruSN1[nX][1]), NIL})
ENDIF
NEXT nX
...
MsExecAuto({|x,y,z| ATFA010(x,y,z)}, xAutoCab, xAutoItens, 3)
END
,"NAT01"
,NIL})
,"S"
,NIL})
Controle de transao
A utilizao do controle de transao permite garantir a integridade das informaes gravadas
pelo processamento.
Para utilizao do controle de transao na aplicao podem ser utilizados os seguintes blocos
de controle:
Begin Transaction ... DisarmTransaction() ... End Transaction
Um bloco de cdigo determinado pelos comandos Begin Transaction ... End Transaction
ter suas informaes atualizadas somente se antes do execuo do comando End
Transaction no for executada a funo DisarmTransaction().
Desta forma pode-se implementar um controle de transao por item processado, sendo
executado o DisarmTransaction() para aquele elemento em que houve algum problema
de processamento.
Seguindo este mesmo raciocnio, caso ocorra um erro fatal na aplicao, somente o item
que est em processamento ser desconsiderado, pois a aplicao ERP efetua um
DisarTransaction() automaticamente, fechamento as transaes pendentes e
restaurando as situaes anteriores, mas apenas para aqueles processamento protegidos
pelo bloco de controle de transao.
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ENDIF
END TRANSACTION
,
,
,
,
Nil})
Nil})
Nil})
Nil})
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
,
,
,
,
Nil})
Nil})
Nil})
Nil})
BeginTran()
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ELSE
EndTran()
ENDIF
MsUnlockAll()
Private lMsHelpAuto
:= .T.
Private lAutoErrNoFile := .F.
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
,
,
,
,
Nil})
Nil})
Nil})
Nil})
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro()
DisarmTransaction()
ENDIF
END TRANSACTION
:= .T.
:= .F.
Private lMsHelpAuto
:= .T.
Private lAutoErrNoFile := .F.
AADD(xAutoCab,{A1_FILIAL
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
,
,
,
,
xFilial(SA1)
000001
01
TESTE-000001
,
,
,
,
Nil})
Nil})
Nil})
Nil})
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro(\system\)
DisarmTransaction()
ENDIF
END TRANSACTION
Private lMSHelpAuto
:= .F.
Private lAutoErrNoFile := .T.
AADD(xAutoCab,{A1_COD
AADD(xAutoCab,{A1_LOJA
AADD(xAutoCab,{A1_NOME
, 000001
, 01
, TESTE-000001
, Nil})
, Nil})
, Nil})
aTiposFile
MvParBox01
MvParBox02
MvParBox03
MvParBox04
MvParBox05
MvParBox06
MVParBox07
PRIVATE _cDirectory
:=
:=
:=
:=
:=
:=
:=
:=
{".DBF",".DTC",".TXT"}
0
0
""
""
0
""
0
:= ""
RpcSetType(3)
RpcSetEnv("99", "01",,,,,
{"CT1","SF9","SN1","SN2","SN3","SN4","SN5","SNG","SM2"})
SET DATE FORMAT "dd/mm/yyyy"
oMainWnd := TWindow():New( 000, 000, 001, 001, "Importao: Fichas do
imobilizado",,,,,,,,,,,,,,,,.T.)
oMainWnd:bInit := {|| IIF(IC001PARBX(),(oProcess:= MsNewProcess():New({|lEnd|
PROCATIVO(.F.,oProcess)}),oProcess:Activate(),oMainWnd:End()),oMainWnd:End())}
oMainWnd:Activate("ICONIZED")
RpcClearEnv()
RETURN
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| PROCATIVO
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | PROCESSAMENTO DA IMPORTACAO DO CADASTRO DE IMOBILIZADO
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION PROCATIVO(lEnd,oProcess)
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
aArea
aDadosSN1
aDadosSN3
aDadosSF9
aDadosTN1
aDadosTN2
aDadosTN3
aItemSN3
cArqSN1
cArqSN2
cArqSN3
cArqSA2
aStruSN1
aStruSN2
aStruSN3
aStruSF9
nX
nTotRegs
nProcRegs
nPosDados
cCodFor
cLojaFor
cDescFor
cFilAtu
cDirArq
cHistorico
nX
cFileExt
lImpSF9
lImpSNG
cKeyImp
aAutoErro
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
:=
GetArea()
{}
{}
{}
{}
{}
{}
{}
""
""
""
""
{}
{}
{}
{}
0
0
0
0
""
""
""
cFilAnt
Alltrim(MVParBox03)
""
0
aTiposFile[MvParBox01]
MvParBox07==1
.F. // Ainda nao implementado
""
{}
:= .F.
:= .F.
- 617 ADVPL Completo
Continuao:
Private lAutoErrNoFile := .T.
// Garante a abertura dos arquivos padres do sistema
DbSelectArea("CT1")
DbSetOrder(2) // FILIAL + COD.REDUZIDO
DbSelectArea("SM2")
DbSetOrder(1)
DbSelectArea("SN1")
DbSetOrder(1)
aStruSN1 := SN1->(DbStruct())
DbSelectArea("SN2")
DbSetOrder(1)
aStruSN2 := SN2->(DbStruct())
DbSelectArea("SN3")
DbSetOrder(1)
aStruSN3 := SN3->(DbStruct())
DbSelectArea("SF9")
DbSetOrder(1)
aStruSF9 := SF9->(DbStruct())
// Prepara o arquivo no formato .DBF para gravao dos eventos de erro
XDBFLOG()
DbSelectArea("SNG")
cIndSNG := CRIATRAB(Nil,.F.)
IndRegua("SNG",cIndSNG,"NG_FILIAL+NG_CCONTAB",,,"Selecionando Registros...")
nIndex := RetIndex()
#IFNDEF TOP
DbSetIndex(cIndSNG+OrdBagExt())
#ENDIF
DbSetOrder(nIndex)
PERGUNTE("ATF010",.F.)
MV_PAR02 := 1 // Permite repetir chapa definido como sim
IF Select("SN1IMP") > 0
DbSelectArea("SN1IMP")
DbCloseArea()
ENDIF
IF Select("SN2IMP") > 0
DbSelectArea("SN2IMP")
DbCloseArea()
ENDIF
IF Select("SN3IMP") > 0
DbSelectArea("SN3IMP")
DbCloseArea()
ENDIF
IF Select("SF9IMP") > 0
DbSelectArea("SF9IMP")
DbCloseArea()
ENDIF
Continuao:
IF Select("CTAIMP") > 0
DbSelectArea("CTAIMP")
DbCloseArea()
ENDIF
cArqSN1:= cDirArq+"SN1IMP"
IF File(cArqSN1+cFileExt)
dbUseArea(.T.,,cArqSN1+cFileExt,"SN1IMP",.F.,.F.)
IndRegua("SN1IMP",cArqSN1+OrdBagExt(),"N1_FILIAL+N1_CBASE+N1_ITEM",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN1IMP no existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSN2:= cDirArq+"SN2IMP"
IF File(cArqSN2+cFileExt )
dbUseArea(.T.,,cArqSN2+cFileExt,"SN2IMP",.F.,.F.)
IndRegua("SN2IMP",cArqSN2+OrdBagExt(),;
"N2_FILIAL+N2_CBASE+N2_ITEM+N2_TIPO+N2_SEQ",,,"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN2IMP no existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSN3:= cDirArq+"SN3IMP"
IF File(cArqSN3+cFileExt)
dbUseArea(.T.,,cArqSN3+cFileExt,"SN3IMP",.F.,.F.)
IndRegua("SN3IMP",cArqSN3+OrdBagExt(),"N3_FILIAL+N3_CBASE+N3_ITEM",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN3IMP no existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
IF lImpSF9
cArqSF9:= cDirArq+"SF9IMP"
IF File(cArqSF9+cFileExt )
dbUseArea(.T.,,cArqSF9+cFileExt,"SF9IMP",.F.,.F.)
IndRegua("SF9IMP",cArqSF9+OrdBagExt(),"F9_FILIAL+F9_CODIGO",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SF9IMP no existe."+;
CRLF+"Verifique caminho informado.",1,0)
RETURN
ENDIF
ENDIF
Continuao:
cArqCTA:= cDirArq+"CTAIMP"
IF File(cArqCTA+cFileExt)
dbUseArea(.T.,,cArqCTA+cFileExt,"CTAIMP",.F.,.F.)
IndRegua("CTAIMP",cArqCTA+OrdBagExt(),"CODIGO_CON",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO CTAIMP no existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSM2:= cDirArq+"SM2IMP"
IF File(cArqSM2+cFileExt)
dbUseArea(.T.,,cArqSM2+cFileExt,"SM2IMP",.F.,.F.)
IndRegua("SM2IMP",cArqSM2+OrdBagExt(),"DTOS(BTN_DATA)",,,"Selecionando
Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SM2IMP no existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
lMSHelpAuto := .T.
DbSelectArea("SN1IMP")
DbGotop()
//
// Preparao para inicio do processamento
//
cKeyImp := DTOS(dDatabase)+StrZero(HoraToInt(Time()),6)
// Identidficador dos registros do log de erros
ConOut("Processando importao:")
ConOut("Inicio: "+Time())
ConOut("Registros SN1IMP: "+CValToChar(SN1IMP->(RecCount())))
ConOut("Registros SN2IMP: "+CValToChar(SN2IMP->(RecCount())))
ConOut("Registros SN3IMP: "+CValToChar(SN3IMP->(RecCount())))
dbEval( {|x| nTotRegs++ },,{||SN1IMP->(!EOF())})
oProcess:SetRegua1(nTotRegs+2)
oProcess:IncRegua1("Iniciando processamento...")
oProcess:SetRegua2(nTotRegs+1)
oProcess:IncRegua2("Ficha de Ativo:")
DbSelectArea("SN1IMP")
DbGotop()
Continuao:
While SN1IMP->(!Eof())
nProcRegs++
oProcess:IncRegua1("Processando item: "+CValToChar(nProcRegs)+" / "+;
CValToChar(nTotRegs))
oProcess:IncRegua2("Ficha de Ativo: ")
aDadosSN1 := {}
aDadosSN3 := {}
// Compatibilizao para utilizao do CRIAVAR()
REGTOMEMORY("SN1",.T.)
//Monstagem do array com dados sem tratamento e com as informao da IMP
FOR nX := 1 TO LEN(aStruSN1)
IF SN1IMP->(FieldPos(aStruSN1[nX][1]))>0
DO CASE
CASE EMPTY(SN1IMP->&(aStruSN1[nX][1]))
AADD(aDadosSN1,{aStruSN1[nX][1],;
CRIAVAR(aStruSN1[nX][1]), NIL})
CASE aStruSN1[nX][2] == "C"
AADD(aDadosSN1,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]),;
"",aStruSN1[nX][3]), NIL})
CASE aStruSN1[nX][2] == "N"
AADD(aDadosSN1,{aStruSN1[nX][1],;
ABS(SN1IMP->&(aStruSN1[nX][1])), NIL})
OTHERWISE
AADD(aDadosSN1,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]), NIL})
ENDCASE
ELSE
AADD(aDadosSN1,{aStruSN1[nX][1], CRIAVAR(aStruSN1[nX][1]),;
NIL})
ENDIF
NEXT nX
// Alterao das informaes do array de acordo com a necessidade
// AADD(aDadosTN1,{"CAMPO",CONTEUDO,"VALIDACAO"})
aDadosTN1
:= {}
// ALTERACAO DO ARRAY ADADOSSN1 COM AS INFORMACOES TRABALHADAS E
// ARMAZENADAS EM ADADOSTN1
// AADD(aDadosTN1,{"N1_XXXXXX"
,xConteudo
,Nil})
For nX := 1 TO LEN(aDadosTN1)
IF (nPosField := aScan(aDadosSN1,{|aDadoSN1| aDadosSN1[1] ==;
aDadosTN1[nX][1]})) > 0
aDadosSN1[nPosField][2] := aDadosTN1[nX][2]
aDadosSN1[nPosField][3] := aDadosTN1[nX][3]
ENDIF
Next nX
Continuao:
IF SN1->(DbSeek(aDadosSN1[1][2]+aDadosSN1[2][2]+aDadosSN1[3][2]))
ConOut("Registro j importado: "+;
aDadosSN1[1][2]+"/"+aDadosSN1[2][2]+"/"+aDadosSN1[3][2])
ConOut("Registros importados com sucesso: "+CValToChar(nProcRegs))
SN1IMP->(dbSkip())
Loop
ENDIF
SN3IMP->(DbSeek(SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM)))
While SN3IMP->(!Eof()) .AND. SN3IMP->(N3_FILIAL+N3_CBASE+N3_ITEM) ==;
SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM)
aItensSN3 := {}
// Monstagem do array com dados sem tratamento e com as informaes
FOR nX := 1 TO LEN(aStruSN3)
IF SN3IMP->(FieldPos(aStruSN3[nX][1]))>0
DO CASE
CASE EMPTY(SN3IMP->&(aStruSN3[nX][1]))
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), NIL})
CASE aStruSN3[nX][2] == "C"
AADD(aItensSN3,{aStruSN3[nX][1],;
SN3IMP->&(aStruSN3[nX][1]),;
aStruSN3[nX][3]), NIL})
CASE aStruSN3[nX][2] == "N"
AADD(aItensSN3,{aStruSN3[nX][1],;
ABS(SN3IMP->&(aStruSN3[nX][1])),;
".T."})
OTHERWISE
AADD(aItensSN3,{aStruSN3[nX][1],;
SN3IMP->&(aStruSN3[nX][1]), NIL})
ENDCASE
ELSEIF aStruSN3[nX][2] == "N"
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), ".T."})
ELSE
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), NIL})
ENDIF
NEXT nX
// Alterao das informaes do array de acordo com a necessidade
// AADD(aDadosTN3,{"CAMPO"
,CONTEUDO,"VALIDACAO"})
aDadosTN3 := {}
// ALTERACAO DO ARRAY aItenSN3
// ARMAZENADAS EM aDadosTN3
For nX := 1 TO LEN(aDadosTN3)
IF (nPosField := aScan(aItensSN3,{|aItenSN3| aItenSN3[1] ==;
aDadosTN3[nX][1]})) > 0
aItensSN3[nPosField][2] := aDadosTN3[nX][2]
aItensSN3[nPosField][3] := aDadosTN3[nX][3]
- 622 ADVPL Completo
Continuao:
ENDIF
Next nX
AADD(aDadosSN3,aItensSN3)
SN3IMP->(DbSkip())
Enddo
IF
SN1->N1_FILIAL
SN1->N1_CBASE
SN1->N1_ITEM
"01"
"001"
STRZERO(nX,2)
SUBSTR(cHistorico,nX,40)
NEXT nX
// TRATAMENTO DA CARGA DO CIAP
IF lImpSF9
IATFCIAP(aStruSF9,aDadosSF9)
ENDIF
ConOut("Registros importados com sucesso: "+;
CValToChar(nProcRegs))
ENDIF
End Transaction
- 623 ADVPL Completo
Continuao:
ENDIF
SN1IMP->(DbSkip())
Enddo
oProcess:IncRegua1("Processamento finalizado")
DbSelectArea("SN1IMP")
DbCloseArea()
IF File(cArqSN1+OrdBagExt())
FErase(cArqSN1+OrdBagExt())
ENDIF
DbSelectArea("SN2IMP")
DbCloseArea()
IF File(cArqSN2+OrdBagExt())
FErase(cArqSN2+OrdBagExt())
ENDIF
DbSelectArea("SN3IMP")
DbCloseArea()
IF File(cArqSN3+OrdBagExt())
FErase(cArqSN3+OrdBagExt())
ENDIF
IF lImpSF9
DbSelectArea("SF9IMP")
DbCloseArea()
IF File(cArqSF9+OrdBagExt())
FErase(cArqSF9+OrdBagExt())
ENDIF
ENDIF
IF lImpSNG
DbSelectArea("SNGIMP")
DbCloseArea()
IF File(cIndSNG+OrdBagExt())
FErase(cIndSNG+OrdBagExt())
ENDIF
ENDIF
DbSelectArea("CTAIMP")
DbCloseArea()
IF File(cArqCTA+OrdBagExt())
FErase(cArqCTA+OrdBagExt())
ENDIF
DbSelectArea("SM2IMP")
DbCloseArea()
IF File(cArqSM2+OrdBagExt())
FErase(cArqSM2+OrdBagExt())
ENDIF
Continuao:
DbSelectArea("LOGIMP")
DbCloseArea()
ConOut("Total de registros importados: "+CValToChar(nProcRegs))
ConOut("Trmino da importao: "+Time())
cFilAnt := cFilAtu
RestArea(aArea)
RETURN
/*/
+----------------------------------------------------------------------| Funo
| CT001PARBX
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | TELA DE PARAMETROS ESPECIFICOS DA ROTINA CUSTOMIZADA
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION IC001PARBX()
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
LOCAL
aParamBox
cTitulo
aRet
bOk
aButtons
lCentered
nPosx
nPosy
cLoad
lCanSave
lUserSave
nX
lRet
:=
:=
:=
:=
:=
:=
{}
"Importacao de cadastros"
{}
{|| .T.}
{}
.T.
:=
:=
:=
:=
:=
""
.T.
.T.
0
.F.
AADD(aParamBox,{2,"Tipo de informao"
,1 ,aTiposFile ,060,;
"AllwaysTrue()", .T.})
AADD(aParamBox,{2,"LayOut do arquivo "
,1 ,;
{"Padro","Especifico"},060, "AllwaysTrue()", .T.})
AADD(aParamBox,{1,"Diretorio de dados"
,Space(60)
,;
"@!","AllwaysTrue()","HSSDIR" ,".T.",120,.T.})
AADD(aParamBox,{1,"Arquivo de layout "
,Space(60)
,;
"@!","AllwaysTrue()","" ,".T.",120,.F.})
AADD(aParamBox,{2,"Operacao
"
,1 ,;
{"Incluir","Alterar","Excluir"},060, "AllwaysTrue()", .T.})
AADD(aParamBox,{1,"Diretorio de Log "
,Space(60)
,;
"@!","AllwaysTrue()","HSSDIR" ,".T.",120,.F.})
AADD(aParamBox,{2,"Importa CIAP
"
,1 ,;
{"Sim","No"} ,060, "AllwaysTrue()", .T.})
lRet := ParamBox(aParamBox, cTitulo, aRet, bOk, aButtons, lCentered, nPosx,;
nPosy, /*oMainDlg*/ , cLoad, lCanSave, lUserSave)
Continuao:
IF ValType(aRet) == "A" .AND. Len(aRet) == Len(aParamBox)
For nX := 1 to Len(aParamBox)
If aParamBox[nX][1] == 1
&("MvParBox"+StrZero(nX,2)) := aRet[nX]
ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "C"
&("MvParBox"+StrZero(nX,2)) := aScan(aParamBox[nX][4],;
{|x| Alltrim(x) == aRet[nX]})
ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "N"
&("MvParBox"+StrZero(nX,2)) := aRet[nX]
Endif
Next nX
ENDIF
RETURN lRet
/*/
+----------------------------------------------------------------------| Funo
| IATFCIAP
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | IMPORTACAO DO LIVRO FISCAL CIAP
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION IATFCIAP(aStruSF9,aDadosSF9)
Local aDadosCIAP := {}
Local nX
:= 0
Local nPosSF9
:= 0
// Monta array com dados padres do SF9 de acordo com o SX3
FOR nX := 1 to Len(aStruSF9)
AADD(aDadosCIAP,{aStruSF9[nX][1],CRIAVAR(aStruSF9[nX][1]),NIL})
NEXT nX
// Atualiza dados do array com as informaes presentes no SN1
FOR nX := 1 to Len(aDadosSF9)
IF (nPosSF9 := aScan(aDadosCIAP,{|aLinhaCIAP| aLinhaCIAP[1] ==
aDadosSF9[nX][1]})) > 0
aDadosCIAP[nPosSF9][2] := aDadosSF9[nX][2]
ENDIF
NEXT nX
ConOut("Iniciando MsExecAuto - ATFCIAP: "+Time())
lMsErroAuto := .F.
MSExecAuto({|x,y| U_ATFCIAP(x,y)},aDadosCIAP,3) // Dados e Opo
ConOut("Finalizada MsExecAuto - ATFCIAP: "+Time())
RETURN lMsErroAuto
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| XDBFLOG
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | CRIACAO DO ARQUIVO DBF PARA TRATAMENTO DOS EVENTOS DE ERR|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION XDBFLOG()
LOCAL aCampos
:= {}
LOCAL cArqLog
:= MVParBox06+"LOGIMP"+GetDbExtension()
IF !File(cArqLog)
AADD(aCampos,{"CKEYIMP" ,"C",014,0})
AADD(aCampos,{"CKEYREG" ,"C",020,0})
AADD(aCampos,{"CDESCR" ,"C",040,0})
AADD(aCampos,{"CSEQMSG" ,"C",003,0})
AADD(aCampos,{"CMSGERR" ,"C",254,0})
dbCreate(cArqLog,aCampos,__LocalDriver)
ENDIF
dbUseArea(.T., __LocalDriver, cArqLog, "LOGIMP", .T., .F.)
RETURN
/*/
+----------------------------------------------------------------------| Funo
| XGRVLOG
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | GRAVACAO DA MENSAGEM DE ERRO NO ARQUIVO DBF DE CONTROLE |
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION XGRVLOG(cKeyImp, cKeyReg, cDescReg, cMsgErr)
LOCAL cSeqLog := "000"
FOR nX := 1 TO Len(cMsgErr) STEP 254
cSeqLog := SOMA1(cSeqLog)
RECLOCK("LOGIMP",.T.)
LOGIMP->CKEYIMP
:= cKeyImp
LOGIMP->CKEYREG
:= cKeyReg
LOGIMP->CDESCR
:= cDescReg
LOGIMP->CSEQMSG
:= cSeqLog
LOGIMP->CMSGERR
:= SUBSTR(cMsgErr,nX,254)
MSUNLOCK()
NEXT nX
RETURN
Continuao:
/*/
+----------------------------------------------------------------------| Funo
| XCONVERRLOG
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | CONVERTE O ARRAY AAUTOERRO EM TEXTO CONTINUO.
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
STATIC FUNCTION XCONVERRLOG(aAutoErro)
LOCAL cRet := ""
LOCAL nX := 1
FOR nX := 1 to Len(aAutoErro)
cRet += aAutoErro[nX]+CHR(13)+CHR(10)
NEXT nX
RETURN cRet
42.
Neste tpico sero descritas as funes da linguagem ADVPL que permitem o envio e o
recebimento de mensagens atravs de e-mails.
Funes para manipulao de e-mails
CALLPROC
MAILSMTPON
MAILPOPON
MAILSMTPOFF
MAILPOPOFF
MAILRECEIVE
MAILAUTH
POPMSGCOUNT
MAILSEND
MAILGETERR
Parmetros:
cFuncao
xParamN
Retorno:
Nenhum
MAILSMTPON()
Ativa uma conexo com o servio de SMTP para a thread ativa.
Sintaxe clssica:
CONNECT SMTP SERVER cServer ACCOUNT cUser PASSWORD cPass TIMEOUT nTimeOut IN
SERVER oRpcSrv RESULT lResult
Parmetros:
Cserver
Cuser
CPass
NTimeOut
Retorno:
Lgico
MAILPOPON()
Ativa uma conexo com o servio de POP para a thread ativa. -> lReturn
Sintaxe clssica:
TIMEOUT nTimeOut
Parmetros:
Cserver
Cuser
CPass
NTimeOut
Retorno:
Lgico
IN
MAILSMTPOFF()
Encerra a conexo com o servio de SMTP.
Sintaxe: MailSmtpOff()
Sintaxe clssica:
RESULT lResult
Parmetros:
Nenhum
IN SERVER oRpcSrv
Retorno:
Lgico
MAILPOPOFF()
Encerra a conexo com o servio de POP
Sintaxe: MailPopOff()
Sintaxe clssica:
RESULT lResult
Parmetros:
Nenhum
IN SERVER oRpcSrv
Retorno:
Lgico
MAILRECEIVE()
Efetua o recebimento de um e-mail, salvando-o no local definido.
Sintaxe clssica:
Parmetros:
nNumber
cFrom
cTo
cCc
cSubject
cBody
aFiles
cBcc
cPath
lDelete
Retorno:
Lgico
MAILAUTH()
Funo que executa a autenticao do usurio no servio ativo.
Parmetros:
cUser
cPassword
Retorno:
Lgico
POPMSGCOUNT()
Verifica quantas mensagens existem na caixa de entrada do servio POP ativo.
Sintaxe: PopMsgCount(@nMsgCount)
Sintaxe clssica:
Parmetros:
nMsgCount
Retorno:
Lgico
MAILSEND()
Envia um e-mail utilizando a servio de SMTP ativo.
Sintaxe clssica:
SEND MAIL FROM cFrom TO aTo,... CC aCc,... BCC aBcc,... SUBJECT cSubject BODY
cBody FORMAT TEXT ATTACHMENT aFiles,... IN SERVER oRpcSrv RESULT lResult
Parmetros:
cFrom
aTo
aCc
aBcc
cSubject
cBody
aFiles
lText
Retorno:
Lgico
MAILGETERR()
Retorna o erro que ocorreu no envio do e-mail.
Sintaxe: MailGetErr()
Sintaxe clssica:
Parmetros:
Nenhum
Retorno:
Caracter
#include "protheus.ch"
#include "tbiconn.ch"
#include "AP5MAIL.CH"
/*/
+----------------------------------------------------------------------| Funo
| SENDMAIL
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | ENVIO DE E-MAIL GENERICO
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION SendMail(_lJob)
Local lResulConn := .T.
Local lResulSend := .T.
Local cError := ""
Local
Local
Local
Local
cServer
cEmail
cPass
lRelauth
Local cDe
Local cPara
:=
:=
:=
:=
AllTrim(GetMV("MV_RELSERV"))
AllTrim(GetMV("MV_RELACNT"))
AllTrim(GetMV("MV_RELPSW"))
GetMv("MV_RELAUTH")
:= cEmail
:= "arnaldojr@microsiga.com.br"
- 635 ADVPL Completo
Continuao:
Local
Local
Local
Local
cCc
cAssunto
cAnexo
cMsg
Default _lJob
cMsg
cMsg
cMsg
cMsg
:=
+=
+=
+=
:=
:=
:=
:=
""
"Teste de envio de e-mail: Curso ADVPL"
"\SYSTEM\lgrl99.bmp"
Space(200)
:= .T.
"--------------------------------------------------"
"CURSO DE ADVPL
"
"--------------------------------------------------"
"Voc est recebendo um e-mail do curso de ADVPL avanado"
CONNECT SMTP SERVER cServer ACCOUNT cEmail PASSWORD cPass RESULT lResulConn
If !lResulConn
GET MAIL ERROR cError
If _lJob
ConOut(Padc("Falha na conexao "+cError,80))
Else
MsgAlert("Falha na conexao "+cError)
Endif
Return(.F.)
Endif
// Sintaxe: SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
// Todos os e-mail tero: De, Para, Assunto e Mensagem, porm precisa analisar
se tem: Com Cpia e/ou Anexo
If lRelauth
lResult := MailAuth(Alltrim(cEmail), Alltrim(cPass))
//Se nao conseguiu fazer a Autenticacao usando o E-mail completo, tenta fazer
a autenticacao usando apenas o nome de usuario do E-mail
If !lResult
nA := At("@",cEmail)
cUser := If(nA>0,Subs(cEmail,1,nA-1),cEmail)
lResult := MailAuth(Alltrim(cUser), Alltrim(cPass))
Endif
Endif
If lResult
If Empty(cCc) .And. Empty(cAnexo)
SEND MAIL FROM cDe TO cPara SUBJECT cAssunto BODY cMsg RESULT
lResulSend
Else
If Empty(cCc) .And. !Empty(cAnexo)
SEND MAIL FROM cDe TO cPara SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
ElseIf !Empty(cCc) .And. !Empty(cAnexo)
SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
ElseIf Empty(cCc) .And. Empty(cAnexo)
SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
RESULT lResulSend
Endif
Endif
- 636 ADVPL Completo
Continuao:
If !lResulSend
GET MAIL ERROR cError
If _lJob
ConOut(Padc("Falha no Envio do e-mail "+cError,80))
Else
MsgAlert("Falha no Envio do e-mail " + cError)
Endif
Endif
Else
If _lJob
ConOut(Padc("Falha na autenticao do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticao do e-mail:" + cError)
Endif
Endif
DISCONNECT SMTP SERVER
IF lResulSend
If _lJob
ConOut(Padc("E-mail enviado com sucesso",80))
Else
MsgInfo("E-mail enviado com sucesso" + cError)
Endif
ENDIF
RETURN lResulSend
#include "protheus.ch"
#include 'tbiconn.ch'
#include "AP5MAIL.CH"
/*/
+----------------------------------------------------------------------| Funo
| SENDMAIL
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | ENVIO DE E-MAIL GENERICO
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION FSendMail(_lJob)
Local
Local
Local
Local
lResulConn := .T.
lResulSend := .T.
lResult
:= .T.
cError := ""
Local
Local
Local
Local
cServer
cEmail
cPass
lRelauth
:=
:=
:=
:=
AllTrim(GetMV("MV_RELSERV"))
AllTrim(GetMV("MV_RELACNT"))
AllTrim(GetMV("MV_RELPSW"))
GetMv("MV_RELAUTH")
Local
Local
Local
Local
Local
Local
Local
cDe
cPara
cCc
cBcc
cAssunto
cAnexo
cMsg
:=
:=
:=
:=
:=
:=
:=
cEmail
"arnaldojr@microsiga.com.br"
""
""
"Teste de envio de e-mail: Curso ADVPL"
"\SYSTEM\lgrl99.bmp"
Space(200)
Default _lJob
cMsg
cMsg
cMsg
cMsg
:=
+=
+=
+=
:= .F.
"--------------------------------------------------"
"CURSO DE ADVPL
"
"--------------------------------------------------"
"Voc est recebendo um e-mail do curso de ADVPL avanado"
//CONNECT SMTP SERVER cServer ACCOUNT cEmail PASSWORD cPass RESULT lResulConn
lResulConn := MailSmtpOn( cServer, cEmail, cPass)
If !lResulConn
//GET MAIL ERROR cError
cError := MailGetErr()
If _lJob
ConOut(Padc("Falha na conexao "+cError,80))
Else
MsgAlert("Falha na conexao "+cError)
Endif
Return(.F.)
Endif
Continuao:
// Sintaxe: SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
// Todos os e-mail tero: De, Para, Assunto e Mensagem, porm precisa analisar
se tem: Com Cpia e/ou Anexo
If lRelauth
lResult := MailAuth(Alltrim(cEmail), Alltrim(cPass))
//Se nao conseguiu fazer a Autenticacao usando o E-mail completo, tenta fazer
a autenticacao usando apenas o nome de usuario do E-mail
If !lResult
nA := At("@",cEmail)
cUser := If(nA>0,Subs(cEmail,1,nA-1),cEmail)
lResult := MailAuth(Alltrim(cUser), Alltrim(cPass))
Endif
Endif
If lResult
/*
If Empty(cCc) .And. Empty(cAnexo)
SEND MAIL FROM cDe TO cPara SUBJECT cAssunto BODY cMsg RESULT
lResulSend
Else
If Empty(cCc) .And. !Empty(cAnexo)
SEND MAIL FROM cDe TO cPara SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
ElseIf !Empty(cCc) .And. !Empty(cAnexo)
SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
ElseIf Empty(cCc) .And. Empty(cAnexo)
SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
RESULT lResulSend
Endif
Endif
*/
lResulSend := MailSend(cDe,{cPara},{cCc},{cBcc},cAssunto,cMsg,{cAnexo},.T.)
If !lResulSend
//GET MAIL ERROR cError
cError := MailGetErr()
If _lJob
ConOut(Padc("Falha no Envio do e-mail "+cError,80))
Else
MsgAlert("Falha no Envio do e-mail " + cError)
Endif
Endif
Else
If _lJob
ConOut(Padc("Falha na autenticao do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticao do e-mail:" + cError)
Endif
Endif
Continuao:
- 639 ADVPL Completo
#include "protheus.ch"
#include "tbiconn.ch"
#include "AP5MAIL.CH"
/*/
+----------------------------------------------------------------------| Funo
| POPMAIL
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | RECEBIMENTO DE E-MAIL GENERICO
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
USER FUNCTION FPopMail(_lJob)
Local
Local
Local
Local
lResulConn := .T.
lResulPop := .T.
lResult
:= .T.
cError := ""
Local
Local
Local
Local
cServer
cEmail
cPass
lRelauth
Local
Local
Local
Local
Local
Local
Local
Local
Local
Local
cDe
:=
cPara
:=
cCc
:=
cBcc
:=
cAssunto :=
aAnexo
:=
cMsg
:=
cPath
:=
nMsgCount:=
nNumber :=
Default _lJob
:=
:=
:=
:=
AllTrim(GetMV("MV_RELSERV"))
AllTrim(GetMV("MV_RELACNT"))
AllTrim(GetMV("MV_RELPSW"))
GetMv("MV_RELAUTH")
""
""
""
""
""
{}
""
"\MailBox"
0
0
:= .F.
Continuao:
/*If lRelauth
lResult := MailAuth(Alltrim(cEmail), Alltrim(cPass))
// Se nao conseguiu fazer a Autenticacao usando o E-mail completo, tenta
// fazer a autenticacao usando apenas o nome de usuario do E-mail
If !lResult
nA := At("@",cEmail)
cUser := If(nA>0,Subs(cEmail,1,nA-1),cEmail)
lResult := MailAuth(Alltrim(cUser), Alltrim(cPass))
Endif
Endif*/
If lResult
PopMsgCount(@nMsgCount)
For nNumber := 1 to nMsgCount
lResulPop := MailReceive(nNumber, @cDe, @cPara, @cCc, @cBcc,;
@cAssunto, @cMsg, @aAnexo , cPath, .F.)
If !lResulPop
cError := MailGetErr()
If _lJob
ConOut(Padc("Falha no recebimento do e-mail "+cError,80))
Else
MsgAlert("Falha no recebimento do e-mail " + cError)
Endif
Else // Salvar mensagem de e-mail
cMessage
cMessage
cMessage
cMessage
cMessage
cMessage
:=
+=
+=
+=
+=
+=
"DE: "+cDe+CRLF
"PARA: "+cPara+CRLF
"CC: "+cCc+CRLF
"BCC: "+cBcc+CRLF
"ASSUNTO: "+cAssunto+CRLF
"MENSAGEM: "+cMsg+CRLF
MsgInfo(cMessage,"E-mail Recebido")
Endif
End-For // Next nNumber
Else
If _lJob
ConOut(Padc("Falha na autenticao do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticao do e-mail:" + cError)
Endif
Endif
MailPopOff()
Continuao:
IF lResulPop
If _lJob
ConOut(Padc("E-mails recebidos com sucesso",80))
Else
MsgInfo("E-mail recebidos com sucesso" + cError)
Endif
ENDIF
RETURN lResulPop
43.
Parmetros:
cOrigem
cTitulo
aDadosCab
aDadosItens
Retorno:
Nenhum
#include "protheus.ch"
/*/
+----------------------------------------------------------------------| Funo
| GExpExcel
| Autor | Arnaldo R. Junior | Data |
|
+----------------------------------------------------------------------| Descrio | EXPORTACAO PARA EXCEL GENERICO
|
+----------------------------------------------------------------------| Uso
| Curso ADVPL
|
+----------------------------------------------------------------------/*/
User Function GExpExcel()
Local aCabExcel
:={}
Local aItensExcel
:={}
Continuao:
While SA1->(!EOF())
aItem := Array(Len(aHeader))
For nX := 1 to Len(aHeader)
IF aHeader[nX][2] == "C"
aItem[nX] := CHR(160)+SA1->&(aHeader[nX][1])
ELSE
aItem[nX] := SA1->&(aHeader[nX][1])
ENDIF
Next nX
AADD(aCols,aItem)
aItem := {}
SA1->(dbSkip())
End
Return
APNDICES
Relao de imagens para aplicaes visuais
AFASTAME
BPMSDOCI
COLTOT
AFASTAMENTO
BPMSEDT1
CONTAINR
ALT_CAD
BPMSEDT2
DBG05
AMARELO
BPMSEDT3
DBG06
ANALITICO
BPMSEDT4
DBG09
ANALITIC
BPMSRELA
DBG3
AGENDA
BPMSTASK1
DESTINOS
ALTERA
BPMSTASK2
DESTINOS2
AREA
BPMSTASK3
DISABLE
ASIENTOS
BPMSTASK4
DISCAGEM
AUTOM
BR_AMARELO
DOWN
BAIXATIT
BR_AZUL
E5
BAR
BR_AZUL_OCEAN
EDITABLE
BMPCALEN
BR_CINZA
EXCLUIR
BMPEMERG
BR_LARANJA
FILTRO
BMPGROUP
BR_MARROM
FINAL
BMPINCLUIR
BR_PRETO
FOLDER10
BMPPERG
BR_VERDE
FOLDER11
BMPPOST
BR_VERDE_OCEAN
FOLDER12
BMPTABLE
BR_VERMELHO
FOLDER14
BMPTRG
BR_VERMELHO_OCEAN
FOLDER5
BMPUSER
BUDGET
FOLDER6
BMPVISUAL
BUDGETY
FOLDER7
BONUS
CADEADO
GEOROTA
BOTTOM
CALCULADORA
GRAF2D
BPMSDOC
CANCEL
GRAF3D
BPMSDOCA
CHAVE2
HISTORIC
BPMSDOCE
CHECKED
INSTRUME
IMPRESSAO
PCO_ITALT
PMSSETATOP
LBNO
PCO_ITEXC
PMSSETAUP
LBOK
PCOCO
PMSTASK1
LBTIK
PCOCUBE
PMSTASK2
LEFT
PCOFXCANCEL
PMSTASK3
LINE
PCOFXOK
PMSTASK4
LIQCHECK
PENDENTE
PMSUSER
LJPRECO
PESQUISA
PMSZOOMIN
LOCALIZA
PGNEXT
PMSZOOMOUT
LUPA
PGPREV
POSCLI
MAQFOTO
PMSCOLOR
PRECO
MATERIAL
PMSEDT3
PREV
METAS_BAIXO_16
PMSEDT4
PRINT03
METAS_BAIXO_LEG
PMSEXCEL
PRODUTO
METAS_CIMA_16
PMSEXPALL
RECALC
METAS_CIMA_LEG
PMSEXPCMP
RECORTAR
MSGHIGH
PMSMAIS
RIGHT
MSVISIO
PMSMATE
RPMNEW
NEXT
PMSMENOS
RPMSAVE
NOTE
PMSPESQ
S4SB014N
NOVACELULA
PMSPRINT
S4WB001N
OBJETIVO
PMSRELA
S4WB005N
OK
PMSRRFSH
S4WB006N
ORDEM
PMSSETABOT
S4WB007N
PARAMETROS
PMSSETADIR
S4WB008N
PCO_COINC
PMSSETADOWN
S4WB009N
PCO_CONOR
PMSSETAESQ
S4WB010N
S4WB011N
WEB
CARAGANEW
S4WB014B
WFCHK
CARGASEQ
S4WB016N
WFUNCHK
CCTCALC
SALVAR
ADDCONTAINER
CHAT
SDUIMPORT
ADICIONAR_001
CHAT1
SDUPACK
ARMAZEM
CHAT2
SDUPROPR
ATALHO
CHAT3
SDUSETDEL
AVGARMAZEM
CHECK
SDUSOFTSEEK
AVGBOX1
CHECKOK
SHORTCUTDEL
AVGLBPAR1
CLOCK01
SHORTCUTEDIT
AVGOIC1
CLOCK02
SHORTCUTMINUS
AVIAO
CLOCK03
SHORTCUTNEW
AZUL
CLOCK04
SHORTCUTPLUS
BALANCA
DEVOLNF
SIMULACA
BGCOLOR
COBROWSR
SIMULACAO
BMPPARAM
COLFORM
SUGESTAO
BMPCONS
COMPTITL
SUMARIO
BMPCPO
COMSOM
SVM
BMPDEL
CRITICA
TK_VERTIT
BR_BRANCO
COPYUSER
UNCHECKED
BRANCO
CTBLANC
UP
BR_CANCEL
CTBREPLA
USER
BR_MARROM
DBG07
VCDOWN
BR_PINK
DELWEB
VCUP
BTCALC
COLOR
VENDEDOR
BTPESQ
DBG12
VERNOTA
CARGA
DBG10
DEPENDENTES
F7_VERM
F14_PINK
GEO
F8_NULL
F14_PRET
EDITWEB
F10_AMAR
F14_VERD
EMPILHADEIRA
F10_AZUL
F14_VERM
ENABLE
F10_CINZ
FRIAS
ESCALA
F10_LARA
FILTRO1
ESTOMOVI
F10_MARR
FOLDER8
F5_AZUL
F10_NULL
FOLDER13
F5_NULL
F10_PINK
FOLDER15
F5_VERD
F10_PRET
FORM
F5_VERM
F10_VERD
FRCOLOR
F6_NULL
F10_VERM
FRTOFFLINE
F5_AMAR
F11_NULL
FRTONLINE
F5_CINZ
F12_AMAR
GEO
F5_LARA
F12_AZUL
GEOEMAIL
F5_MARR
F12_CINZ
GEOTRECHO
F5_PINK
F12_LARA
GERPROJ
F5_PRET
F12_MARR
GLOBO
F7_AMAR
F12_PINK
IC_17
F7_AZUL
F12_PRET
INSTRUME
F7_CINZ
F12_VERD
LANDSCAPE
F7_LARA
F12_VERM
LIGHTBLU
F7_MARR
F14_AMAR
MDIHELP
F7_NULL
F14_AZUL
MDILOGOFF
F7_PINK
F14_CINZ
MDIRUN
F7_PRET
F14_LARA
MDISPOOL
F7_VERD
F14_MARR
MEDEXT
MENURUN
RPMCABEC
SDUFIELDS
MPWIZARD
RPMCPO
SDUFIND
NCO
RPMDES
SDUGOTO
NEWWEB
RPMFORM
SDUNEW
NOCONNECT
RPMFUNC
SDUOPEN
NOCHECKED
RPMGROUP
SDUOPENIDX
NOMEDICA
RPMIMP
SDUORDER
NORMAS
RPMIMPORT
SDURECALL
OPEN
RPMNEW2
SDUREPL
OPERACAO
RPMOPEN
SDUSEEK
OUTLOOK
RPMPERG
SDUSTRUCT
PAPEL_ESCRITO
RPMTABLE
SDUSUM
PEDIDO
S4WB004N
SDUZAP
PIN
S4WB013N
SEMSOM
PMSINFO
S4WB014A
SOLICITA
PREDIO
SALARIOS
SSFONTES
PRINT02
SAVECLOCK
TAB1
PROCESSA
SDUADDTBL
TABPRICE
PRODUT2
SDUAPPEND
TEXTBOLD
PROJETPMS
SDUCLOSE
TEXTCENTER
PRTETQ
SDUCLOSEIDX
XCLOSE
QMT_COND
SDUCOPYTO
TEXTITALIC
QMT_NO
SDUCOUNT
TEXTJUSTIFY
QMT_OK
SDUCREATEIDX
TEXTLEFT
RESPADEX
SDUDELETE
TEXTRIGHT
RESPONSA
SDUDRPTBL
TEXTUNDERLINE
ROSA
SDUERASE
TK_ALTFIN
TK_CLIFIN
BPMSEDT3A
GCT_NEW
TK_FIND
BPMSEDT3E
INVOICE1
TK_FONE
BPMSEDT3I
MSGGROUP
TK_HISTORY
BPMSEDT4A
MSGHIGH
TK_NOVO
BPMSEDT4E
PCO_COALT
TK_REFRESH
BPMSEDT4I
PCO_COEXC
TPOPAGTO1
BPMSREC
PCO_ITINC
UPDWARNING
BPMSRECA
PCOCOLA
UPDERROR
BPMSRECE
PCOCOPY
UPDINFORMATION
BPMSRECI
PCOEDIT
VERDE
BPMSRELAA
PCOFX
VERMELHO
BPMSRELAE
PCOLOCK
VERMESCURO
BPMSRELAI
PEDIDO2
WATCH
BPMSTSK1A
PEDIDO2_MDI
CLIENTE
BPMSTSK1E
PGRSAVE
ACAO
BPMSTSK1I
PMSAPONT
BOXBOM1
BPMSTSK2A
PMSCANC
BOXBOM2
BPMSTSK2E
PMSCOLUM
BOXBOM3
BPMSTSK2I
PMSCONS
BOXBOM4
BPMSTSK3A
PMSCUSTO
BOXBOM5
BPMSTSK3E
PMSDATE
BPMSEDT1A
BPMSTSK3I
PMSESTRU
BPMSEDT1E
BPMSTSK4A
PMSEXCEL
BPMSEDT1I
BPMSTSK4E
PMSEXEC
BPMSEDT2A
BPMSTSK4I
PMSEXPEXC
BPMSEDT2E
ENGRENAGEM2
PMSFILTER
BPMSEDT2I
GCT_EDIT
PMSGRAPH
PMSNEXT
MSGFORWD
UNSELECTALL
PMSOPCAO
MSGREPLY
BSTART
PMSPESQ
OMSDIVIDE
BTURNSHARPLEFT
PMSPREV
PMSUPDOWN
BTURNSHARPRIGHT
PMSPREVIO
SHAPE01
ENGRENAGEM
PMSPRINT
SHAPE02
PAGEDOWN
PMSPROG
SHAPE03
PAGEUP
PMSSUPALOC
SHAPE04
SELECT
PMSTOOLS
SHAPE05
SELECTALL
PMSUSERP
TRIDOWN
BBEARRIGHT
REFRESH
WORD
BEND
SHAPE06
ROTEIRO
BKEEPLEFT
TRILEFT
CLIPS_PQ
BKEEPRIGHT
TRIRIGHT
NEXT_PQ
BLEFT
VINCULA1
RELACIONAMENTO_DIREIRA_PQ
BRIGHT
BAHEAD
PREV_PQ
CANCEL
BBEARLEFT
UP.GIF
CONFIRM
DOWN
GOTOP
GOBOTTOM
INVERTSELECTION
LISTAS DE EXERCCIOS
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
Implementar uma funo que realize o envio de um texto simples para uma
conta de e-mail @totvs, que permita sua fcil identificao.
17
18
Projeto 01
Projeto 02
Projeto 03
REFERNCIAS BIBLIOGRFICAS
Referncias bibliogrficas
Gesto empresarial com ERP
Ernesto Haberkorn, 2006
Programao Orientada a Objetos com C ++
Ivan Luiz Marques Ricarte, 1996
Modelagem e Projetos baseados em objetos
James Rumbaugh, 1994 11. Edio
Programao orientada objetos no FiveWin
Gilmer FiveWin Brasil
Oficina de Programao
Robson Luiz Estefani Gonalves
Apostila de Treinamento - TReport
Tnia Bronzeri
Apostila de Treinamento - ADVPL
Educao corporativa
Apostila de Treinamento Boas Prticas de Programao
Inteligncia Protheus e Fbrica de Software
DEM Documentao Eletrnica Microsiga
Microsiga Software S.A.
Materiais diversos de colaboradores Microsiga
Colaboradores Microsiga
Colaboradores
Reviso 01
Arnaldo Raymundo Junior
Luis Akira Tamura
Mrcia Satiko Sasaki Tokura
Patricia Lopes Legas
Robson Luiz Estefani Gonalves
Srgio Sueo Fuzinaka
Data: 04.2008
CSA
Educao Corporativa
ACR-N1_FRAMEW1
Educao Corporativa
Fbrica de Software
Inteligncia Protheus