Escolar Documentos
Profissional Documentos
Cultura Documentos
Pr ogr a m a çã o e m AD VPL
Com ple t o
Mat riz – Av. Br az Lem e, 1.717 – 02511- 000 – São Paulo – SP – Br asil.
Tel.: 55 ( 11) 3981- 7001 www.m icr osiga.com .br
- 2 -
- 3 -
- 4 -
- 5 -
- 6 -
- 7 -
- 8 -
- 9 -
- 10 -
Com foco nest a necessidade, est e t ópico irá descr ev er r esum idam ent e os conceit os envolvidos
no pr ocesso de desenv olvim ent o de um program a at rav és dos conceit os r elacionados à:
1 .1 . Lógica de Pr ogr a m a çã o
Lógica
A lógica de program ação é necessária para pessoas que desej am t rabalhar com
desenvolvim ent o de sist em as e pr ogram as, ela perm it e definir a seqüência lógica para o
desenvolvim ent o. Ent ão o que é lógica?
Est es pensam ent os, podem ser descrit os com o um a seqüência de inst ruções, que dev em ser
seguidas para se cum prir um a det erm inada t arefa.
I n st r u çõe s
Na linguagem com um , ent ende- se por inst ruções “ um conj unt o de r egras ou norm as definidas
para a realização ou em prego de algo” .
Em inform át ica, porém , inst rução é a inform ação que indica a um com put ador um a ação
elem ent ar a ex ecut ar . Convém r essalt ar que um a ordem isolada não per m it e realizar o
processo com plet o, par a isso é necessário um conj unt o de inst ruções colocadas em ordem
seqüencial lógica.
Por ex em plo, se quiser m os fazer um a om elet e de bat at as, pr ecisar em os colocar em prát ica
um a série de inst ruções: descascar as bat at as, bat er os ov os, frit ar as bat at as, et c. É evident e
que essas inst ruções t êm que ser ex ecut adas em um a ordem adequada – não se pode
descascar as bat at as depois de frit á- las.
Dessa m aneira, um a inst rução t om ada em separado não t em m uit o sent ido; para obt erm os o
result ado, precisam os colocar em prát ica o conj unt o de t odas as inst ruções, na ordem cor ret a.
- 11 -
Alg or it m o
Um algorit m o é for m alm ent e um a seqüência finit a de passos que lev am a execução de um a
t arefa. Podem os pensar em algorit m o com o um a receit a, um a seqüência de inst ruções que dão
cabo de um a m et a específica. Est as t arefas não podem ser r edundant es nem subj et ivas na sua
definição, dev em ser claras e precisas.
Com o ex em plos de algorit m os podem os cit ar os algorit m os das oper ações básicas ( adição,
m ult iplicação, divisão e subt ração) de núm er os r eais decim ais. Out ros exem plos seriam os
m anuais de aparelhos elet rônicos, com o um videocasset e, que explicam passo- a- passo com o,
por ex em plo, gravar um ev ent o.
At é m esm o as coisas m ais sim ples, podem ser descrit as por seqüências lógicas, t ais com o:
“ Chupar um a bala”
1. Pegar a bala;
2. Ret irar o papel;
3. Chupar a bala;
4. Jogar o papel no lixo.
Por isso os algorit m os são independent es das linguagens de pr ogr am ação, sendo que ao
cont rário de um a linguagem de pr ogram ação não exist e um form alism o rígido de com o dev e
ser escrit o o algorit m o.
O algorit m o deve ser fácil de int erpret ar e fácil de codificar. Ou sej a, ele dev e ser o
int erm ediário ent r e a linguagem falada e a linguagem de pr ogram ação.
- 12 -
Fa se s
Para im plem ent ar de um algorit m o de sim ples int erpr et ação e codificação é necessário
inicialm ent e dividir o pr oblem a apr esent ado em t rês fases fundam ent ais, as quais são:
Nest e t ópico serão dem onst rados alguns algorit m os do cot idiano, os quais foram
im plem ent ados ut ilizando os princípios descrit os nos t ópicos ant erior es.
M a sca r u m ch icle t e
Ut iliz a r u m t e le fon e p ú blico – ca r t ã o
Fr it a r u m ovo
Tr oca r lâ m pa da s
D e sca sca r b a t a t a s
Joga r o j ogo d a f or ca
Ca lcu la r a m é dia de n ot a s
Joga r o j ogo d a v e lh a – con t r a o a lgor it m o
M a sca r u m ch icle t e
1. Pegar o chiclet e
2. Ret irar o papel
3. Mast igar
4. Jogar o papel no lixo
- 13 -
Tr oca r lâ m pa da s
D e sca sca r b a t a t a s
Joga r o j ogo d a f or ca
1. Escolher a palavra
2. Mont ar o diagram a do j ogo
3. Enquant o houv er lacunas vazias e o corpo est iver incom plet o:
3.1. Se acert ar a let ra: escr ever na lacuna corr espondent e
3.2. Se er rar a let ra: desenhar um a part e do corpo na forca
Ca lcu la r a m é dia de n ot a s
- 14 -
Após desenv olver um algorit m o ele dev erá sem pr e ser t est ado. Est e t est e é cham ado de
TESTE D E M ESA, que significa seguir as inst ruções do algorit m o de m aneira pr ecisa para
verificar se o procedim ent o ut ilizado est á cor ret o ou não.
Te st e de m e sa :
1. Par a cada not a infor m ada, r eceber e r egist rar na t abela abaixo:
ID N ot a
2. Ao t érm ino das not as, a t abela deverá cont er t odas as not as inform adas, com o abaixo:
ID N ot a
1 8 .0
2 7 .0
3 8 .0
4 8 .0
5 7 .0
6 7 .0
- 15 -
2 .1 . D ia gr a m a de bloco
O diagram a de blocos é um a form a padr onizada e eficaz para r epr esent ar os passos lógicos de
um det erm inado processam ent o.
Com o diagram a podem os definir um a seqüência de sím bolos, com significado bem definido,
port ant o, sua principal função é a de facilit ar a visualização dos passos de um pr ocessam ent o.
Sim bolog ia
Exist em diver sos sím bolos em um diagram a de bloco. No quadr o abaixo est ão represent ados
alguns dos sím bolos m ais ut ilizados:
Sím bolo Fu n çã o
Pr oce ssa m e n t o
Cada sím bolo irá cont er um a descrição pert inent e a form a com o qual o
m esm o foi ut ilizado no fluxo, indicando o processam ent o ou a inform ação
que o m esm o r epr esent a.
- 16 -
Alg or it m o 0 1 : Fr it a r u m ovo
- 17 -
- 18 -
Com o foco na ut ilização da linguagem ADVPL serão ilust radas as seguint es est rut uras:
Est r u t u r a s de de cisã o
o I F...ELSE
o DO CASE ... CASE
Est r u t u r a s de r e pe t içã o
o WHI LE...END
o FOR...NEXT
2 .2 .1 . Est r ut ur a s de de cisã o
Os com andos de decisão são ut ilizados em algorit m os cuj a solução não é obt ida at ravés da
ut ilização de ações m eram ent e seqüenciais, perm it indo que est e avalie as condições
necessárias para opt ar por um a ou out ra m aneira de cont inuar seu fluxo.
I F...ELSE
D O CASE ... CASE
I F...ELSE
A est rut ura I F...ELSE ( Se/ Senão) perm it e a análise de um a condição e a part ir da qual ser
ex ecut ada um a de duas ações possíveis: se a análise da condição r esult ar em um valor
verdadeiro ou se a análise da condição r esult ar em um valor falso.
Ações anteriores
...
Ação vinculada ao
Ação vinculada ao
resultado
resultado falso
verdadeiro
Continuação do
fluxo após a
tomada da
decisão
- 19 -
Ações anteriores
...
Análise da Falso
condição
Verdadeiro
Ação vinculada ao
resultado
verdadeiro
Continuação do
fluxo após a
tomada da
decisão
Apesar das linguagens de pr ogram ação possuírem variações para a est rut ura
I F...ELSE, conceit ualm ent e t odas as r epr esent ações podem ser descrit as com
base no m odelo apr esent ado.
A linguagem ADVPL possui um a variação para a est rut ura I F...ELSE, descrit a
com o I F...ELSEI F...ELSE.
Com est a est rut ura é possível realizar a análise de diversas condições em
seqüência, para as quais será avaliada som ent e a ação da prim eira ex pressão
cuj o análise r esult ar em um valor v erdadeiro.
- 20 -
A est rut ura DO CASE...ENDCASE ( Caso) perm it e a análise de diversas condições consecut ivas,
para as quais som ent e a condição a prim eira condição v erdadeira será sua ação vinculada
ex ecut ada.
O r ecurso de análise de m últ iplas condições é necessário para solução de problem as m ais
com plexos, nos quais as possibilidades de solução superam a m er a análise de um único
result ado verdadeiro ou falso.
Ações anteriores
...
Falso
Falso
Falso
Falso
Continuação do
fluxo após a
tomada da
decisão
Apesar das linguagens de program ação possuírem variações para a est rut ura
DO CASE...CASE, conceit ualm ent e t odas as repr esent ações podem ser
descrit as com base no m odelo apresent ado.
- 21 -
Os com andos de r epet ição são ut ilizados em algorit m os nas sit uações em que é necessário
realizar um a det erm inada ação ou um conj unt o de ações para um núm ero definido ou
indefinido de v ezes, ou ainda enquant o um a det erm inada condição for verdadeira.
W H I LE...EN D
FOR...TO...N EXT
W H I LE...EN D
Nest a est rut ura, o conj unt o de ações será execut ado enquant o a análise de um a condição de
referência result ar em um valor v erdadeiro. É im port ant e v erificar que o bloco som ent e ser á
ex ecut ado, inclusive se na prim eira análise a condição result ar em um valor v erdadeiro.
Re pr e se n t a çã o: W H I LE...EN D
Ações anteriores
...
Análise da Falso
condição
Loop Verdadeiro
Ação vinculada ao
resultado
verdadeiro
Continuação do
fluxo
...
Exist em diver sas variações para a est rut ura WHI LE...END, na qual há a
possibilidade da prim eira ex ecução ser r ealizada sem a análise da condição, a
qual valerá apenas a part ir da segunda ex ecução.
A linguagem ADVPL aceit a a sint axe DO WHI LE...ENDDO, que em out ras
linguagens represent a a sit uação descrit a ant eriorm ent e ( análise da condição
som ent e a part ir da segunda execução) , m as em ADVPL est a sint axe t em o
m esm o efeit o do WHI LE...END.
- 22 -
Nest a est rut ura, o conj unt o de ações será execut ado um a quant idade de v ezes definida,
norm alm ent e referenciada com o “ passo” .
Para cada “ passo” realizado pela est rut ura FOR...TO...NEXT, será avaliada um a condição que
verificará se foi at ingido o núm ero de ex ecuções previam ent e definido. Dest a form a a
est rut ura com preende um cont role de núm ero de “ passos” ex ecut ados, o qual é increm ent ado
na análise da expressão NEXT.
Sem elhant e a est rut ura WHI LE...END, a prim eira ação som ent e será realizada m ediant e um
result ado verdadeiro na análise da condição.
Re pr e se n t a çã o: FOR...TO...N EXT
Ações anteriores
...
Análise da Falso
condição
Verdadeiro
Ação vinculada ao
resultado
verdadeiro
Incrementa o
contador de
“passos”
Continuação do
fluxo
...
Em ADVPL pode ser ut ilizada a inst rução “ STEPS” para alt erar o valor a ser
adicionado no cont ador de passos a cada ex ecução da inst rução NEXT, sendo
que est e valor poder á ser at é negat ivo, viabilizando um a cont agem
decrescent e.
- 23 -
O ADVPL é um a ext ensão do padrão x Base de com andos e funções, operador es, est rut uras de
cont r ole de fluxo e palavras reservadas, cont ando t am bém com funções e com andos
disponibilizados pela Microsiga que a t orna um a linguagem com plet a para a criação de
aplicações ERP pront as para a I nt ernet . Tam bém é um a linguagem orient ada a obj et os e
ev ent os, perm it indo ao program ador desenv olver aplicações visuais e criar suas próprias
classes de obj et os.
Quando com pilados, t odos os arquivos de código t ornam - se unidades de int eligência básicas,
cham ados APO´ s ( de Advanced Prot heus Obj ect s) . Tais APO´ s são m ant idos em um
reposit ório e car regados dinam icam ent e pelo PROTHEUS Ser ver para a execução. Com o não
exist e a linkedição, ou união física do código com pilado a um det erm inado m ódulo ou
aplicação, funções criadas em ADVPL podem ser ex ecut adas em qualquer pont o do am bient e
Advanced Pr ot heus.
O com pilador e o int erpret ador da linguagem ADVPL é o própr io ser vidor PROTHEUS
( PROTHEUS Ser ver) , e exist e um am bient e visual para desenvolvim ent o int egrado
( PROTHEUSI DE) onde o código pode ser criado, com pilado e depurado.
Os program as em ADVPL podem cont er com andos ou funções de int er face com o usuário. De
acordo com t al caract eríst ica, t ais program as são subdivididos nas seguint es cat egorias:
Nest a cat egoria ent ram os pr ogram as desenvolvidos para serem ex ecut ados at rav és do
t erm inal rem ot o do Prot heus, o Pr ot heus Rem ot e. O Pr ot heus Rem ot e é a aplicação
encar r egada da int erface e da int eração com o usuário, sendo que t odo o pr ocessam ent o do
código em ADVPL, o acesso ao banco de dados e o gerenciam ent o de conexões é efet uado no
Prot heus Ser ver. O Pr ot heus Rem ot e é o principal m eio de acesso a execução de r ot inas
escrit as em ADVPL no Prot heus Serv er, e por isso perm it e ex ecut ar qualquer t ipo de código,
t enha ele int erface com o usuário ou não. Por ém nest a cat egoria são considerados apenas os
program as que realizem algum t ipo de int erface r em ot a ut ilizando o prot ocolo de com unicação
do Prot heus.
Podem - se criar r ot inas para a cust om ização do sist em a ERP Micr osiga Prot heus, desde
processos adicionais at é m esm o relat órios. A grande v ant agem é apr ov eit ar t odo o am bient e
m ont ado pelos m ódulos do ERP Microsiga Prot heus. Por ém , com o ADVPL é possível at é
m esm o criar t oda um a aplicação, ou m ódulo, do com eço.
As rot inas criadas sem int erface são consideradas nest a cat egoria porque geralm ent e t êm um a
ut ilização m ais específica do que um processo adicional ou um relat ório nov o. Tais rot inas não
t êm int erface com o usuário at rav és do Pr ot heus Rem ot e, e qualquer t ent at iva nesse sent ido
- 24 -
De acordo com a ut ilização e com o m eio de conect ividade ut ilizado, est as rot inas são
subcat egorizadas assim :
Rot inas escrit as em ADVPL podem ser iniciadas com o pr ocessos individuais ( sem int erface) no
Prot heus Serv er at rav és de duas m aneiras: I niciadas por out ra r ot ina ADVPL at rav és da
cham ada de funções com o St art Job( ) ou CallProc( ) ou iniciadas aut om at icam ent e na
inicialização do Pr ot heus Serv er ( quando pr opriam ent e configurado) .
Pr ogr a m a çã o de RPC
At ravés de um a bibliot eca de funções disponível no Prot heus ( um a API de com unicação) ,
podem - se execut ar r ot inas escrit as em ADVPL diret am ent e no Prot heus Serv er, at r avés de
aplicações ext ernas escrit as em out ras linguagens. I st o é o que se cham a de RPC ( de Rem ot e
Procedure Call, ou Cham ada de Pr ocedim ent os Rem ot a) .
O servidor Prot heus t am bém pode ex ecut ar r ot inas em ADVPL em out ros servidores Pr ot heus
at ravés de conexão TCP/ I P dir et a ut ilizando o conceit o de RPC. Do m esm o m odo, aplicações
ext ernas podem r equisit ar a execução de r ot inas escrit as em ADVPL at rav és de conexão
TCP/ I P diret a.
Program ação Web
O Pr ot heus Ser ver pode t am bém ser ex ecut ado com o um servidor Web, r espondendo a
requisições HTTP. No m om ent o dest as r equisições, pode ex ecut ar r ot inas escrit as em ADVPL
com o pr ocessos individuais, enviando o result ado das funções com o ret orno das requisições
para o client e HTTP ( com o por exem plo, um Br owser de I nt ernet ) . Qualquer rot ina escrit a em
ADVPL que não cont enha com andos de int erface pode ser ex ecut ada at rav és de r equisições
HTTP. O Pr ot heus perm it e a com pilação de arquivos HTML cont endo código ADVPL em but ido.
São os cham ados arquivos ADVPL ASP, para a criação de páginas dinâm icas.
Pr ogr a m a çã o Te lN e t
TelNet é part e da gam a de pr ot ocolos TCP/ I P que perm it e a conexão a um com put ador rem ot o
at ravés de um a aplicação client e dest e pr ot ocolo. O PROTHEUS Ser ver pode em ular um
t erm inal TelNet , at ravés da execução de r ot inas escrit as em ADVPL. Ou sej a, pode- se escrever
rot inas ADVPL cuj a int erface final será um t erm inal TelNet ou um colet or de dados m óv el.
- 25 -
Um program a de com put ador nada m ais é do que um grupo de com andos logicam ent e
dispost os com o obj et ivo de ex ecut ar det erm inada t arefa. Esses com andos são gravados em
um arquivo t ext o que é t ransform ado em um a linguagem ex ecut ável por um com put ador
at ravés de um pr ocesso cham ado com pilação. A com pilação subst it ui os com andos de alt o
nível ( que os hum anos com pr eendem ) por inst ruções de baixo nível ( com preendida pelo
sist em a operacional em execução no com put ador) . No caso do ADVPL, não é o sist em a
operacional de um com put ador que irá execut ar o código com pilado, m as sim o Prot heus
Ser ver.
Dent r o de um program a, os com andos e funções ut ilizados devem seguir regras de sint axe da
linguagem ut ilizada, pois caso cont rário o pr ogram a será int errom pido por er ros. Os er ros
podem ser de com pilação ou de ex ecução.
Er ros de com pilação são aqueles encont rados na sint axe que não per m it em que o arquivo de
código do program a sej a com pilado. Podem ser com andos especificados de form a err ônea,
ut ilização inválida de operador es, et c.
Er ros de execução são aqueles que acont ecem depois da com pilação, quando o program a est á
sendo ex ecut ado. Podem ocor rer por inúm eras razões, m as geralm ent e se refer em as funções
não exist ent es, ou variáveis não criadas ou inicializadas, et c.
Lin h a s d e Pr ogr a m a
As linhas exist ent es dent ro de um arquivo t ex t o de código de program a podem ser linhas de
com ando, linhas de com ent ário ou linhas m ist as.
Lin h a s d e Com a n do
Linhas de com ando possuem os com andos ou inst ruções que serão ex ecut adas. Por ex em plo:
Local nCnt
Local nSom a : = 0
For nCnt : = 1 To 10
nSom a + = nCnt
Next nCnt
Lin h a s d e Com e n t á r io
Linhas de com ent ário possuem um t ext o qualquer, m as não são ex ecut adas. Serv em apenas
para docum ent ação e para t ornar m ais fácil o ent endim ent o do pr ogram a. Exist em t r ês form as
de se com ent ar linhas de t ext o. A prim eira delas é ut ilizar o sinal de * ( ast erisco) no com eço
da linha:
- 26 -
Out ra form a de docum ent ar t ext os é ut ilizar as barras t ransversais j unt am ent e com o
ast erisco, podendo- se com ent ar t odo um bloco de t ext o sem pr ecisar com ent ar linha a linha:
/*
Program a para cálculo do t ot al
Aut or: Micr osiga Soft ware S.A.
Dat a: 2 de out ubro de 2001
*/
Todo o t ext o encont rado ent r e a abert ura ( indicada pelos caract er es / * ) e o fecham ent o
( indicada pelos caract er es * / ) é considerado com o com ent ário.
Lin h a s M ist a s
O ADVPL t am bém per m it e que exist am linhas de com ando com com ent ário. I st o é possív el
adicionando- se as duas barras t ransv er sais ( / / ) ao final da linha de com ando e adicionando- se
o t ext o do com ent ário:
Local nCnt
Local nSom a : = 0 / / I nicializa a variável com zer o para a som a
For nCnt : = 1 To 10
nSom a + = nCnt
Next nCnt
Ta m a n h o d a Lin h a
Assim com o a linha física, delim it ada pela quant idade de caract er es que pode ser digit ado no
edit or de t ext os ut ilizado, exist e um a linha considerada linha lógica. A linha lógica, é aquela
considerada para a com pilação com o um a única linha de com ando.
A princípio, cada linha digit ada no arquivo t ext o é diferenciada após o pressionam ent o da t ecla
< Ent er> . Ou sej a, a linha lógica, é a linha física no arquivo. Por ém algum as vezes, por
lim it ação física do edit or de t ext o ou por est ét ica, pode- se " quebrar" a linha lógica em m ais de
um a linha física no arquivo t ext o. I st o é efet uado ut ilizando- se o sinal de pont o- e- vírgula ( ; ) .
Endif
- 27 -
3 .1 . Ár e a s de um Pr ogr a m a AD VPL
Apesar de não ser um a linguagem de padr ões rígidos com relação à est rut ura do program a, é
im port ant e ident ificar algum as de suas part es. Consider e o pr ogram a de ex em plo abaixo:
/*
+===========================================+
| Pr ogram a: Cálculo do Fat orial |
| Aut or : Micr osiga Soft ware S.A. |
| Dat a : 02 de out ubr o de 2001 |
+===========================================+
*/
Local nCnt
Local nResult ado : = 1 / / Result ado do fat orial
Local nFat or : = 5 / / Núm er o para o cálculo
A est rut ura de um pr ogr am a ADVPL é com post a pelas seguint es áreas:
Corpo do Program a
Preparação para o processam ent o
Processam ent o
- 28 -
Est a é um a área que não é obrigat ória e é dedicada a docum ent ação do program a. Quando
exist ent e, cont ém apenas com ent ários explicando a sua finalidade, dat a de criação, aut or , et c.,
e aparece no com eço do program a, ant es de qualquer linha de com ando.
O form at o para est a área não é definido. Pode- se colocar qualquer t ipo de inform ação
desej ada e escolher a form at ação apr opriada.
/*
+==========================================+
| Pr ogram a: Cálculo do Fat orial |
| Aut or : Micr osiga Soft ware S.A. |
| Dat a : 02 de out ubr o de 2001 |
+==========================================+
*/
Opcionalm ent e podem - se incluir definições de const ant es ut ilizadas no program a ou inclusão
de arquivos de cabeçalho nest a ár ea.
Ár e a de Aj u st e s I n icia is
Nest a área geralm ent e se fazem os aj ust es iniciais, im port ant es para o cor ret o funcionam ent o
do program a. Ent re os aj ust es se encont ram declarações de variáveis, inicializações, abert ura
de arquivos, et c. Apesar do ADVPL não ser um a linguagem rígida e as variáveis poderem ser
declaradas em qualquer lugar do program a, é aconselhável fazê- lo nest a área visando t ornar o
código m ais legível e facilit ar a ident ificação de variáveis não ut ilizadas.
Local nCnt
Local nResult ado : = 0 / / Result ado do fat orial
Local nFat or : = 10 / / Núm ero para o cálculo
Cor po do Pr ogr a m a
É nest a ár ea que se encont ram as linhas de código do pr ogram a. É onde se realiza a t arefa
necessária at rav és da organização lógica dest as linhas de com ando. Espera- se que as linhas de
com ando est ej am organizadas de t al m odo que no final dest a área o result ado esperado sej a
obt ido, sej a ele arm azenado em um arquivo ou em variáveis de m em ória, pront o par a ser
exibido ao usuário at rav és de um r elat ório ou na t ela.
- 29 -
Avaliando o processam ent o do cálculo do fat orial descrit o ant eriorm ent e, pode- se definir que a
validação inicial a ser r ealizada é o cont eúdo da variável nFat or, pois a m esm a det erm inará a
corr et a ex ecução do código.
I f nFat or < = 0
Alert ( “ I nform ação inválida” )
Ret urn
Endif
Ár e a de En ce r r a m e n t o
É nest a área onde as finalizações são efet uadas. É onde os arquivos abert os são fechados, e o
result ado da ex ecução do pr ogr am a é ut ilizado. Pode- se exibir o r esult ado arm azenado em
um a variável ou em um arquivo ou sim plesm ent e finalizar, caso a t arefa j á t enha sido t oda
com plet ada no corpo do program a. É nest a área que se encont r a o encerram ent o do
program a. Todo program a em ADVPL dev e sem pre t erm inar com a palavra chave r et urn.
- 30 -
4 .1 . Tipo de D a dos
O ADVPL não é um a linguagem de t ipos rígidos ( st rongly t yped) , o que significa que variáveis
de m em ória podem r eceber difer ent es t ipos de dados durant e a execução do program a.
As variáveis podem t am bém cont er obj et os, m as os t ipos prim ários da linguagem são:
N u m é r ico
O ADVPL não difer encia valores int eiros de v alores com pont o flut uant e, port ant o podem - se
criar variáveis num éricas com qualquer valor dent ro do int ervalo perm it ido. Os seguint es
elem ent os são do t ipo de dado num érico:
2
43.53
0.5
0.00001
1000000
Um a variável do t ipo de dado num érico pode cont er um núm er o de dezoit o dígit os incluindo o
pont o flut uant e, no int ervalo de 2.2250738585072014 E–308 at é 1.7976931348623158
E+ 308.
Lógico
Valores lógicos em ADVPL são ident ificados at r avés de .T. ou .Y. para verdadeiro e .F. ou .N.
para falso ( independent em ent e se os caract er es est iver em em m aiúsculo ou m inúsculo) .
Ca r a ct e r e
St rings ou cadeias de caract er es são ident ificadas em ADVPL por blocos de t ext o ent r e aspas
duplas ( " ) ou aspas sim ples ( ') :
Um a variável do t ipo caract er e pode cont er st rings com no m áxim o 1 MB, ou sej a, 1048576
caract eres.
Data
O ADVPL t em um t ipo de dados específico para dat as. I nt ernam ent e as variáveis dest e t ipo de
dado são arm azenadas com o um núm ero cor respondent e a d a t a Ju lia n a .
Variáveis do t ipo de dados Dat a não podem ser declaradas diret am ent e, e sim at rav és da
ut ilização de funções específicas com o por ex em plo CTOD( ) que convert e um a st ring para
dat a.
- 31 -
O Ar ray é um t ipo de dado especial. É a disposição de out r os elem ent os em colunas e linhas. O
ADVPL suport a ar ray s unidim ensionais ( vet or es) ou m ult idim ensionais ( m at rizes) . Os
elem ent os de um arr ay são acessados at r avés de índices num éricos iniciados em 1,
ident ificando a linha e coluna para quant as dim ensões exist irem .
Array s dev em ser ut ilizadas com caut ela, pois se forem m uit o grandes podem exaurir a
m em ória do servidor.
Bloco d e Código
O bloco de código é um t ipo de dado especial. É ut ilizado para arm azenar inst ruções escrit as
em ADVPL que poderão ser ex ecut adas post eriorm ent e.
4 .2 . D e cla r a çã o de va r iá ve is
Variáveis de m em ória são um dos r ecursos m ais im port ant es de um a linguagem . São ár eas de
m em ória criadas para arm azenar inform ações ut ilizadas por um progr am a para a execução de
t arefas. Por ex em plo, quando o usuário digit a um a inform ação qualquer , com o o nom e de um
produt o, em um a t ela de um program a est a inform ação é arm azenada em um a variável de
m em ória para post erior m ent e ser gravada ou im pressa.
A part ir do m om ent o que um a variável é criada, não é necessário m ais se r efer enciar ao seu
cont eúdo, e sim ao seu nom e.
Port ant o se forem criadas duas v ariáveis cuj os 10 prim eiros car act er es for em iguais, com o
nTot alGeralAnual e nTot alGeralMensal, as refer ências a qualquer um a delas no pr ogram a
result arão o m esm o, ou sej a, serão a m esm a v ariável:
Quando o cont eúdo da variável nTot alGeralMensal é exibido, o seu v alor será de 300. I sso
acont ece porque no m om ent o que esse valor foi at ribuído à variável nTot alGeralAnual, o
ADVPL consider ou apenas os 10 prim eiros caract er es ( assim com o o faz quando dev e exibir o
valor da variável nTot alGeralMensal) , ou sej a, consider ou- as com o a m esm a v ariável. Assim o
valor original de 100 foi subst it uído pelo de 300.
- 32 -
O ADVPL não é um a linguagem de t ipos rígidos para variáveis, ou sej a, não é necessário
inform ar o t ipo de dados que det erm inada variável irá cont er no m om ent o de sua declaração,
e o seu valor pode m udar durant e a ex ecução do pr ogram a.
Tam bém não há necessidade de declarar variáveis em um a seção específica do seu código
font e, em bora sej a aconselhável declarar t odas as variáveis necessárias no com eço, t ornando
a m anut enção m ais fácil e evit ando a declaração de variáveis desnecessárias.
Para declarar um a variável dev e- se ut ilizar um ident ificador de escopo. Um ident ificador de
escopo é um a palavra chave que indica a que cont ext o do pr ogram a a variável declarada
pert ence. O cont ext o de variáveis pode ser local ( visualizadas apenas dent r o do pr ogram a
at ual) , público ( visualizadas por qualquer out ro program a) , ent r e out r os.
O Con t e x t o d e Va r iá v e is de n t r o de u m Pr ogr a m a
As variáveis declaradas em um program a ou função, são visíveis de acordo com o escopo onde
são definidas. Com o t am bém do escopo depende o t em po de exist ência das variáveis. A
definição do escopo de um a variável é efet uada no m om ent o de sua declaração.
Est a linha de código declara um a variável cham ada nNum ero indicando que pert ence seu
escopo é local.
Local
St at ic
Privat e
Public
O ADVPL não é rígido em relação à declaração de variáveis no com eço do program a. A inclusão
de um ident ificador de escopo não é necessário para a declaração de um a variável, cont ant o
que um valor lhe sej a at ribuído.
nNum er o2 : = 15
Devido a essa caract eríst ica, quando se pret ende fazer um a at ribuição a um a variável
declarada pr eviam ent e m as escr ev e- se o nom e da variável de form a incorr et a, o ADVPL não
gerará nenhum err o de com pilação ou de ex ecução. Pois com pr eenderá o nom e da variável
escrit o de form a incorr et a com o se fosse a criação de um a nova variável. I st o alt erará a lógica
do pr ogram a, e é um er ro m uit as vezes difícil de ident ificar.
- 33 -
Variáveis de escopo local são pert encent es apenas ao escopo da função onde foram declaradas
e devem ser explicit am ent e declaradas com o ident ificador LOCAL, com o no exem plo:
Fu n ct ion Pa i( )
Local nVar : = 10, aMat r iz : = { 0,1,2,3}
.
< com andos>
.
Filha( )
.
< m ais com andos>
.
Ret urn( .T.)
Nest e ex em plo, a variável nVar foi declarada com o local e at ribuída com o valor 10. Quando a
função Filha é execut ada, nVar ainda exist e m as não pode ser acessada. Quando a execução
da função Pai t erm inar, a variável nVar é dest r uída. Qualquer variável com o m esm o nom e no
program a que cham ou a função Pai não é afet ada.
Variáveis de escopo local são criadas aut om at icam ent e cada vez que a função onde for em
declaradas for at ivada. Elas cont inuam a exist ir e m ant êm seu valor at é o fim da at ivação da
função ( ou sej a, at é que a função r et orne o cont role para o código que a execut ou) . Se um a
função é cham ada r ecursivam ent e ( por ex em plo, cham a a si m esm a) , cada cham ada em
recursão cria um nov o conj unt o de variáveis locais.
A visibilidade de variáv eis de escopo locais é idênt ica ao escopo de sua declaração, ou sej a, a
variável é visível em qualquer lugar do código font e em que foi declarada. Se um a função é
cham ada r ecursivam ent e, apenas as variáveis de escopo local criadas na m ais r ecent e at ivação
são visíveis.
Va r iá ve is de e scopo st a t ic
O escopo das variáveis st at ic depende de onde são declaradas. Se for em declaradas dent r o do
corpo de um a função ou procedim ent o, seu escopo será lim it ado àquela rot ina. Se forem
declaradas for a do corpo de qualquer rot ina, seu escopo afet a a t odas as funções declaradas
no font e.
- 34 -
Fu n ct ion Pa i( )
St at ic nVar : = 10
.
< com andos>
.
Filha( )
.
< m ais com andos>
.
Re t u r n ( .T.)
Quando a função Filha é ex ecut ada, nVar ainda exist e m as não pode ser acessada. Difer ent e
de variáveis declaradas com o LOCAL ou PRI VATE, nVar cont inua a exist ir e m ant êm seu valor
at ual quando a execução da função Pai t erm ina. Ent ret ant o, som ent e pode ser acessada por
ex ecuções subseqüent es da função Pai.
Va r iá ve is de e scopo p r iv a t e
A declaração é opcional para variáveis privadas. Mas podem ser declaradas explicit am ent e com
o ident ificador PRI VATE.
Adicionalm ent e, a at ribuição de valor a um a variável não criada ant eriorm ent e
aut om at icam ent e cria a variável com o privada. Um a vez criada, um a variável privada cont inua
a exist ir e m ant ém seu valor at é que o program a ou função onde foi criada t erm ine ( ou sej a,
at é que a função onde foi criada ret orne para o código que a execut ou) . Nest e m om ent o, é
aut om at icam ent e dest r uída.
É possível criar um a nova variável privada com o m esm o nom e de um a variável j á exist ent e.
Ent ret ant o, a nova ( duplicada) variável pode apenas ser criada em um nível de at ivação
inferior ao nível onde a variável foi declarada pela prim eira vez ( ou sej a, apenas em um a
função cham ada pela função onde a variável j á havia sido criada) . A nova variável privada irá
esconder qualquer out r a variável privada ou pública ( vej a a docum ent ação sobr e variáveis
públicas) com o m esm o nom e enquant o exist ir.
Um a vez criada, um a variável privada é visível em t odo o pr ogr am a enquant o não for
dest ruída aut om at icam ent e quando a rot ina que a criou t erm inar ou um a out ra variável
privada com o m esm o nom e for criada em um a subfunção cham ada ( nest e caso, a variável
exist ent e t orna- se inacessível at é que a nova variável privada sej a dest r uída) .
Em t erm os m ais sim ples, um a variável privada é visível dent ro da função de criação e t odas as
funções cham adas por est a, a m enos que um a função cham ada crie sua pr ópria variável
privada com o m esm o nom e.
- 35 -
Fu n ct ion Pa i( )
Privat e nVar : = 10
< com andos>
.
Filha( )
< m ais com andos>
.
Re t u r n ( .T.)
Nest e ex em plo, a variável nVar é criada com escopo privat e e inicializada com o valor 10.
Quando a função Filha é execut ada, nVar ainda exist e e, diferent e de um a variável de escopo
local, pode ser acessada pela função Filha. Quando a função Pai t erm inar, nVar será dest ruída
e qualquer declaração de nVar ant erior se t ornará acessível novam ent e.
Va r iá ve is de e scopo p u blic
Podem - se criar variáv eis de escopo public dinam icam ent e no código com o ident ificador
PUBLI C. As variáveis dest e escopo cont inuam a exist ir e m ant êm seu valor at é o fim da
ex ecução da t hread ( conexão) .
É possível criar um a variável de escopo privat e com o m esm o nom e de um a variável de escopo
public exist ent e, ent r et ant o, não é perm it ido criar um a variável de escopo public com o m esm o
nom e de um a variável de escopo privat e exist ent e.
Um a vez criada, um a variável de escopo public é visível em t odo o program a onde foi
declarada at é que sej a escondida por um a variável de escopo privat e criada com o m esm o
nom e. A nova variável de escopo privat e criada esconde a variável de escopo public exist ent e,
e est a se t ornará inacessível at é que a nova var iável privat e sej a dest ruída. Por ex em plo:
Fu n ct ion Pa i( )
Public nVar : = 10
< com andos>
.
Filha( )
< m ais com andos>
.
Re t u r n ( .T.)
- 36 -
Diferent em ent e dos out ros ident ificadores de escopo, quando um a var iável é declarada com o
pública sem ser inicializada, o valor assum ido é falso ( .F.) e não nulo ( nil) .
Se est a linha for ex ecut ada em um program a ADVPL, ocorr erá um err o de execução com a
m ensagem " variable does not exist : nPercent ual" , pois est a variável est á sendo ut ilizada em
um a expr essão de cálculo sem t er sido declarada. Para solucionar est e er ro, dev e- se declarar a
variável previam ent e:
Nest e exem plo, as variáveis são declaradas pr eviam ent e ut ilizando o ident ificador de escopo
local. Quando a linha de cálculo for execut ada, o er ro de variável não exist ent e, não m ais
ocor rerá. Por ém variáveis não inicializadas t êm sem pr e o valor default nulo ( Nil) e est e valor
não pode ser ut ilizado em um cálculo pois t am bém gerará err os de ex ecução ( nulo não pode
ser dividido por 100) . A resolução dest e pr oblem a é efet uada inicializando- se a variável
at ravés de um a das for m as:
ou
A diferença ent re o últ im o exem plo e os dois ant erior es é que a variável é inicializada no
m om ent o da declaração. Em am bos os ex em plos, a variável é prim eiro declarada e ent ão
inicializada em um a out ra linha de código.
- 37 -
4 .5 .1 . At r ibuiçã o de va r iá ve is
Um a vez que um valor lhe sej a at ribuído, o t ipo de dado de um a variável é igual ao t ipo de
dado do valor at ribuído. Ou sej a, um a variável passa a ser num érica se um núm er o lhe é
at ribuído, passa a ser caract ere se um a st ring de t ext o lhe for at ribuída, et c. Por ém m esm o
que um a variável sej a de det erm inado t ipo de dado, pode- se m udar o t ipo da variável
at ribuindo out ro t ipo a ela:
No program a de ex em plo ant erior, a variável xVariavel é ut ilizada para arm azenar diver sos
t ipos de dados. A let ra " x" em m inúsculo no com eço do nom e é ut ilizada para indicar um a
variável que pode cont er diversos t ipos de dados, segundo a Not ação Húngara ( consult e
docum ent ação específica para det alhes) . Est e program a t r oca os valores da variável e exibe
seu cont eúdo para o usuário at rav és da função ALERT( ) . Essa função r ecebe um parâm et r o
que dev e ser do t ipo st ring de caract ere, por isso dependendo do t ipo de dado da variáv el
xVariavel é necessário fazer um a conversão ant es.
Excet uando- se o caso do valor nulo, para os dem ais dev em ser ut ilizadas funções de
conv er são quando é necessário concat enar t ipos de dados difer ent es ( por ex em plo, nas linhas
07 e 17.
- 38 -
I f xVariavel
é o m esm o que
I f xVariavel = .T.
Na docum ent ação sobr e variáveis há um a breve dem onst ração de com o at ribuir valores a um a
variável da form a m ais sim ples. O ADVPL am plia significat ivam ent e a ut ilização de variáveis
at ravés do uso de expr essões e funções.
Um a expressão é um conj unt o de operadores e oper andos cuj o r esult ado pode ser at ribuído a
um a variável ou ent ão analisado para a t om ada de decisões. Por ex em plo:
Nest e ex em plo são ut ilizadas algum as expr essões para calcular o salário líquido após um
aum ent o. Os operandos de um a expr essão podem ser um a variável, um a const ant e, um
cam po de arquivo ou um a função.
+ Adição
- Subt ração
* Mult iplicação
/ Divisão
* * ou ^ Exponenciação
% Módulo ( Rest o da Divisão)
Ope r a dor e s de St r in g
- 39 -
.An d . E lógico
.Or . OU lógico
.N ot . ou ! NÃO lógico
O operador de at ribuição em linha é caract erizado por dois pont os e o sinal de igualdade. Tem
a m esm a função do sinal de igualdade sozinho, por ém aplica a at ribuição às variáveis. Com ele
pode- se at ribuir m ais de um a variável ao m esm o t em po.
- 40 -
Com o operador de at ribuição em linha, pode- se subst it uir as inicializações individuais de cada
variável por um a inicialização apenas:
O operador de at ribuição em linha t am bém pode ser ut ilizado para subst it uir valores de
cam pos em um banco de dados.
Ope r a dor e s de I n cr e m e n t o/ D e cr e m e n t o
A linguagem ADVPL possui operador es para r ealizar increm ent o ou decrem ent o de variáveis.
Ent ende- se por increm ent o aum ent ar o valor de um a variável num érica em 1 e ent ende- se por
decrem ent o dim inuir o valor da variável em 1. Os operador es são:
Os operador es de decr em ent o/ increm ent o podem ser colocados t ant o ant es ( pr é- fixado) com o
depois ( pós- fixado) do nom e da variável. Dent ro de um a expressão, a ordem do operador é
m uit o im port ant e, podendo alt erar o r esult ado da expr essão. Os oper ador es increm ent ais são
ex ecut ados da esquerda para a direit a dent ro de um a expressão.
Local nA : = 10
Local nB : = nA+ + + nA
O valor da variável nB r esult a em 21, pois a prim eira r efer ência a nA ( ant es do + + ) cont inha o
valor 10 que foi considerado e im ediat am ent e aum ent ado em 1. Na segunda refer ência a nA,
est e j á possuía o valor 11. O que foi efet uado foi a som a de 10 m ais 11, igual a 21. O
result ado final após a execução dest as duas linhas é a variável nB cont endo 21 e a variável nA
cont endo 11.
No ent ant o:
Local nA : = 10
Local nB : = + + nA + nA
- 41 -
Além dos operador es com uns, o ADVPL possui alguns out ros operador es ou ident ificadores.
Est as são suas finalidades:
Os parênt eses são ut ilizados para agrupar elem ent os em um a expr essão m udando a
ordem de precedência da avaliação da expressão ( segundo as r egras m at em át icas por
ex em plo) . Tam bém ser vem para env olver os argum ent os de um a função.
Os colchet es são ut ilizados para especificar um elem ent o específico de um a m at riz. Por
ex em plo, A[ 3,2] , refer e- se ao elem ent o da m at riz A na linha 3, coluna 2.
As chaves são ut ilizadas para a especificação de m at rizes lit erais ou blocos de código.
Por exem plo, A: = { 10,20,30} cria um a m at riz cham ada A com t r ês elem ent os.
O sím bolo - > ident ifica um cam po de um arquivo difer enciando- o de um a variável. Por
ex em plo, FUNC- > nom e refere- se ao cam po nom e do arquivo FUNC. Mesm o que exist a um a
variável cham ada nom e, é o cam po nom e que será acessado.
O sím bolo & ident ifica um a avaliação de expressão at rav és de m acro e é vist o em
det alhes na docum ent ação sobr e m a cr o sub st it u içã o .
O sím bolo @ é ut ilizado para indicar que durant e a passagem de um a variável para um a
função ou pr ocedim ent o ela sej a t om ada com o um a refer ência e não com o valor .
O sím bolo | | é ut ilizado para indicar que durant e a passagem de um a variável para
um a função ou pr ocedim ent o ela sej a t om ada com o um e valor não com o referência.
- 42 -
Em expr essões com plexas com diferent es t ipos de operador es, a avaliação seguirá essa
seqüência. Caso exist a m ais de um operador do m esm o t ipo ( ou sej a, de m esm o nível) , a
avaliação se dá da esquerda para direit a. Para os operador es m at em át icos ent r et ant o, há um a
precedência a seguir:
1. Exponenciação
2. Mult iplicação e Divisão
3. Adição e Subt ração
O r esult ado dest a expr essão é 30, pois prim eiram ent e é calculada a exponenciação 2^ 3( = 8) ,
ent ão são calculadas as m ult iplicações e divisões 10/ 2( = 5) e 5* 3( = 15) , e finalm ent e as
adições result ando em 2+ 5+ 15+ 8( = 30) .
Alt e r a çã o d a Pr e ce dê n cia
A ut ilização de parênt eses dent r o de um a expressão alt era a ordem de pr ecedência dos
operadores. Operandos ent re par ênt eses são analisados ant es dos que se encont ram fora dos
parênt eses. Se exist irem m ais de um conj unt o de parênt eses não- aninhados, o grupo m ais a
esquerda será avaliado prim eiro e assim sucessivam ent e.
No exem plo acim a prim eiro será calculada a exponenciação 2^ 3( = 8) . Em seguida 2+ 10( = 12)
será calculado, 2+ 5( = 7) calculado, e finalm ent e a divisão e a m ult iplicação serão efet uadas, o
que r esult a em 12/ 7* 3+ 8( = 13.14) .
Se exist irem vários par ênt eses aninhados, ou sej a, colocados um dent ro do out r o, a avaliação
ocor rerá do parênt eses m ais int ero em direção ao m ais ext erno.
- 43 -
O operador de m acr o subst it uição, sim bolizado pelo " e" com er cial ( &) , é ut ilizado para a
avaliação de expressões em t em po de ex ecução. Funciona com o se um a expressão
arm azenada fosse com pilada em t em po de ex ecução, ant es de ser de fat o execut ada.
01 X : = 10
02 Y : = " X + 1"
03 B : = &Y / / O cont eúdo de B será 11
A variável X é at ribuída com o valor 10, enquant o a variável Y é at ribuída com a st ring de
caract eres cont endo " X + 1" .
A t er ceira linha ut iliza o operador de m acro. Est a linha faz com que o núm er o 11 sej a at ribuído
à variável B. Pode- se per ceber que esse é o valor r esult ant e da ex pressão em form at o de
caract ere cont ida na variável Y.
Ut ilizando- se um a t écnica m at em át ica elem ent ar, a subst it uição, t em os que na segunda linha,
Y é definido com o " X + 1" , ent ão pode- se subst it uir Y na t erceira linha:
03 B : = &" X + 1"
O operador de m acr o cancela as aspas:
03 B : = X + 1
Pode- se per ceber que o operador de m acro r em ove as aspas, o que deixa um pedaço de
código para ser ex ecut ado. Deve- se t er em m ent e que t udo isso acont ece em t em po de
ex ecução, o que t orna t udo m uit o dinâm ico. Um a ut ilização int eressant e é criar um t ipo de
calculadora, ou avaliador de fórm ulas, que det erm ina o r esult ado de algo que o usuário digit a.
- 44 -
Além de at ribuir, cont r olar o escopo e m acro ex ecut ar o cont eúdo das variáveis é necessário
m anipular seu cont eúdo at rav és de funções específicas da linguagem para cada sit uação.
As operações de m anipulação de cont eúdo m ais com uns em pr ogram ação são:
Con ve r sõe s e n t r e t ip os d e v a r iá ve is
As funções m ais ut ilizadas nas operações ent r e conv er são ent r e t ipos de variáveis são:
CTOD ( )
CV ALTOCH AR( )
D TOC( )
D TOS( )
STOD ( )
STR( )
STRZERO( )
VAL( )
CTOD ( )
Sin t a x e CTOD ( cD a t a )
Realiza a conv er são de um a inform ação do t ipo caract er no form at o
D e scr içã o “ DD/ MM/ AAAA” para um a variável do t ipo dat a.
CV ALTOCH AR( )
- 45 -
Sin t a x e D TOC( dD a t a )
Realiza a conv er são de um a inform ação do t ipo dat a para em caract er, sendo
D e scr içã o o r esult ado no form at o “ DD/ MM/ AAAA” .
D TOS( )
Sin t a x e D TOS( dD a t a )
Realiza a conv er são de um a inform ação do t ipo dat a em um caract er, sendo
D e scr içã o o r esult ado no form at o “ AAAAMMDD” .
STOD ( )
Sin t a x e STOD ( sD a t a )
Realiza a conv er são de um a inform ação do t ipo caract er com cont eúdo no
D e scr içã o
for m at o “ AAAAMMDD” em dat a.
STR( )
STRZERO( )
VAL( )
D e scr içã o Realiza a conv er são de um a inform ação do t ipo caract er em num érica.
- 46 -
As funções m ais ut ilizadas nas operações de m anipulação do cont eúdo de st rings são:
ALLTRI M ( )
ASC( )
AT( )
CH R( )
CSTUFF( )
LEN ( )
RAT( )
SUBSTR( )
ALLTRI M ( )
ASC( )
AT( )
- 47 -
Sin t a x e CH R( n ASCI I )
Convert e um valor núm er o referent e a um a inform ação da t abela ASCI I no
D e scr içã o caract ere que est a infor m ação r epr esent a.
LEN ( )
LOW ER( )
RAT( )
STUFF( )
SUBSTR( )
- 48 -
M a n ipu la çã o de v a r iá ve is n u m é r ica s
As funções m ais ut ilizadas nas operações de m anipulação do cont eúdo de st rings são:
ABS( )
I N T( )
N OROUN D ( )
ROUN D ( )
ABS( )
I N T( )
Sin t a x e I N T( n V a lor )
D e scr içã o Ret orna a part e int eira de um valor especificado no parâm et r o.
N OROUN D ( )
ROUN D ( )
- 49 -
TYPE( )
VALTYPE( )
TYPE( )
VALTYPE( )
- 50 -
O ADVPL suport a v árias est rut uras de cont r ole que perm it em m udar a seqüência de fluxo de
ex ecução de um pr ogr am a. Est as est rut uras perm it em a ex ecução de código baseado em
condições lógica e a repet ição da ex ecução de pedaços de código qualquer núm er o de v ezes.
Em ADVPL, t odas as est rut uras de cont r ole podem ser " aninhadas" dent ro de t odas as dem ais
est rut uras cont ant o que est ej am aninhadas propriam ent e. Est rut ur as de cont role t êm um
ident ificador de início e um de fim , e qualquer est rut ura aninhada dev e se encont r ar ent r e
est es ident ificador es.
Tam bém exist em est rut uras de cont role para det erm inar que elem ent os, com andos, et c. em
um program a serão com pilados. Est as são as diret ivas do pré- pr ocessador # ifdef...# endif e
# ifndef...# endif. Consult e a docum ent ação sobr e o pr é- pr ocessador par a m aiores det alhes.
5 .1 . Est r ut ur a s de r e pe t içã o
Est rut uras de r epet ição são designadas para execut ar um a seção de código m ais de um a vez.
Por ex em plo, im aginando- se a exist ência de um a função para im prim ir um relat ório, pode- se
desej ar im prim i- lo quat ro v ezes. Claro, pode- se sim plesm ent e cham ar a função de im pressão
quat ro v ezes em seqüência, m as ist o se t ornaria pouco profissional e não resolveria o
problem a se o núm er o de r elat órios fosse variável.
Em ADVPL exist em dois com andos para a r epet ição de seções de código, que são os com andos
FOR...N EXT e o com ando W H I LE...EN D D O .
A est rut ura de cont r ole FOR...NEXT, ou sim plesm ent e o loop FOR, r epet e um a seção de código
em um núm ero det erm inado de vezes.
Sin t a x e
- 51 -
Os com andos ADVPL depois do FOR são execut ados at é que o NEXT
sej a alcançado. O cont ador ( Variavel) é ent ão increm ent ado ou
decrem ent ado com o v alor em nI ncr em ent o ( se a cláusula STEP for
om it ida, o cont ador é increm ent ado em 1) . Ent ão, o cont ador é
com parado com o valor em nValorFinal. Se for m enor ou igual ao valor
em nValorFinal, os com andos seguint es ao FOR são execut ados
novam ent e.
Se o valor for m aior que o cont ido em nValorFinal, a est rut ura
FOR...NEXT é t erm inada e o pr ogr am a cont inua a execução no
prim eiro com ando após o NEXT.
- 52 -
Local nCnt
Local nSom aPar : = 0
For nCnt : = 0 To 100 St ep 2
nSom aPar + = nCnt
Next
Alert ( " A som a dos 100 prim eiros núm eros par es é: " + ;
cValToChar( nSom aPar) )
Ret urn
Est e ex em plo im prim e a som a dos 100 prim eiros núm er os par es. A som a é obt ida at ravés da
repet ição do cálculo ut ilizando a própria variável de cont ador . Com o a cláusula STEP est á
sendo ut ilizada, a variável nCnt será sem pr e increm ent ada em 2. E com o o cont ador com eça
com 0, seu valor sem pr e será um núm ero par .
O Com a n d o W H I LE...EN D D O
A est rut ura de cont r ole WHI LE...ENDDO, ou sim plesm ent e o loop WHI LE, repet e um a seção de
código enquant o um a det erm inada expr essão r esult ar em verdadeiro ( .T.) .
Sin t a x e
Pa r â m e t r os
lEx pr e ssa o Especifica um a expressão lógica cuj o valor det erm ina quando os
com andos ent re o WHI LE e o ENDDO são ex ecut ados. Enquant o o
result ado de lExpr essao for avaliado com o verdadeiro ( .T.) , o
conj unt o de com andos são ex ecut ados.
Com a n dos Especifica um ou m ais inst ruções de com ando ADVPL que serão
ex ecut adas enquant o lExpressao for avaliado com o v erdadeiro ( .T.) .
EXI T Transfere o cont r ole de dent r o do com ando WHI LE...ENDDO par a o
com ando im ediat am ent e seguint e ao ENDDO, ou sej a, finaliza a
repet ição da seção de com andos im ediat am ent e. Pode- se colocar o
com ando EXI T em qualquer lugar ent r e o WHI LE e o ENDO.
LOOP Ret orna o cont r ole diret am ent e para a cláusula WHI LE sem ex ecut ar
o r est ant e dos com andos ent re o LOOP e o ENDDO. A expr essão em
lExpressao é r eavaliada para a decisão se os com andos cont inuarão
sendo execut ados.
- 53 -
A linguagem ADVPL perm it e a ut ilização de com andos que influem diret am ent e em um
processo de r epet ição, sendo eles:
LOOP
EXI T
LOOP
A inst rução LOOP é ut ilizada para for çar um desvio no fluxo do program a de v olt a a análise da
condição de repet ição. Dest a form a, t odas as operações que seriam realizadas dent ro da
est rut ura de r epet ição após o LOOP serão desconsideradas.
Ex e m plo:
aI t ens: = List aProdut os( ) / / função ilust rat iva que r et orna um array com dados dos pr odut os
nQuant idade : = Len( aI t ens)
nI t ens : = 0
nI t ens+ +
I F BLOQUEADO( aI t ens [ nI t ens] ) / / função ilust rat iva que verifica se o produt o est á
LOOP / / bloqueado.
ENDI F
I MPRI ME( ) / / função ilust rat iva que r ealiza a im pressão de um it em liberado par a uso
End
- 54 -
A inst rução EXI T é ut ilizada para for çar o t érm ino de um a est rut ura de repet ição. Dest a form a,
t odas as operações que seriam realizadas dent ro da est rut ura de r epet ição após o EXI T serão
desconsideradas, e o program a irá cont inuar a ex ecução a part ir da próxim a inst rução
post erior ao t érm ino da est rut ura ( END ou NEXT) .
Ex e m plo:
While .T.
- 55 -
Est rut uras de desvio são designadas para ex ecut ar um a seção de código se det erm inada
condição lógica result ar em v erdadeiro ( .T.) .
Em ADVPL exist em dois com andos para ex ecução de seções de código de acordo com
avaliações lógicas, que são os com andos I F...ELSE...EN D I F e o com ando D O
CASE...EN D CASE .
O Com a n d o I F...ELSE...EN D I F
Ex ecut a um conj unt o de com andos baseado no valor de um a expr essão lógica.
Sin t a x e
I F lExpressao
Com andos
[ ELSE
Com andos...]
ENDI F
Pa r â m e t r os
Ex e m plo:
Local dVenct o : = CTOD( " 31/ 12/ 01" )
I f Dat e( ) > dVenct o
Alert ( " Vencim ent o ult rapassado! " )
Endif
Ret urn
- 56 -
Ex ecut a o prim eiro conj unt o de com andos cuj a expr essão condicional result a em verdadeiro
( .T.) .
Sin t a x e
I F lExpressao1
Com andos
[ ELSEI F lExpr essaoX
Com andos]
[ ELSE
Com andos...]
ENDI F
Pa r â m e t r os
- 57 -
Ex ecut a o prim eiro conj unt o de com andos cuj a expr essão condicional result a em verdadeiro
( .T.) .
Sin t a x e
DO CASE
CASE lExpr essao1
Com andos
[ CASE lExpr essao2
Com andos
...
CASE lExpr essaoN
Com andos]
[ OTHERWI SE
Com andos]
ENDCASE
Pa r â m e t r os
CASE Quando a prim eira expressão CASE result ant e em verdadeiro ( .T.)
lEx pr e ssa o1 for encont rada, o conj unt o de com andos seguint e é ex ecut ado. A
Com a n dos... ex ecução do conj unt o de com andos cont inua at é que a próxim a
cláusula CASE, OTHERWI SE ou ENDCASE sej a encont rada. Ao
t erm inar de execut ar esse conj unt o de com andos, a ex ecução
cont inua com o prim eiro com ando seguint e ao ENDCASE.
Se um a expr essão CASE r esult ar em falso ( .F.) , o conj unt o de
com andos seguint e a est a at é a próxim a cláusula é ignorado.
Apenas um conj unt o de com andos é execut ado. Est es são os
prim eiros com andos cuj a expressão CASE é avaliada com o
verdadeiro ( .T.) . Após a ex ecução, qualquer out ra expressão CASE
post erior é ignorada ( m esm o que sua avaliação result asse em
verdadeiro) .
OTH ERW I SE Se t odas as expr essões CASE for em avaliadas com o falso ( .F.) , a
Com a n dos cláusula OTHERWI SE det erm ina se um conj unt o adicional de
com andos dev e ser ex ecut ado. Se essa cláusula for incluída, os
com andos seguint es serão execut ados e ent ão o program a
cont inuará com o prim eiro com ando seguint e ao ENDCASE. Se a
cláusula OTHERWI SE for om it ida, a ex ecução cont inuará
norm alm ent e após a cláusula ENDCASE.
- 58 -
Ex e m plo:
DO CASE
CASE nMes < = 3
cPeriodo : = " Prim eiro Tr im est re"
CASE nMes > = 4 .And. nMes < = 6
cPeriodo : = " Segundo Trim est r e"
CASE nMes > = 7 .And. nMes < = 9
cPeriodo : = " Ter ceiro Tr im est re"
OTHERWI SE
cPeriodo : = " Quart o Trim est re"
ENDCASE
Ret urn
- 59 -
6 .1 . Ar r a ys
Array s ou m at rizes, são coleções de valores, sem elhant es a um a list a. Um a m at riz pode ser
criada at rav és de diferent es m aneiras.
Cada it em em um arr ay é r eferenciado pela indicação de sua posição num érica na list a,
iniciando pelo núm er o 1.
O ex em plo a seguir declara um a variável, at ribui um array de t rês elem ent os a ela, e ent ão
exibe um dos elem ent os e o t am anho do arr ay:
O ADVPL perm it e a m anipulação de arrays facilm ent e. Enquant o que em out ras linguagens
com o C ou Pascal é necessário alocar m em ória para cada elem ent o de um ar ray ( o que
t ornaria a ut ilização de " pont eiros" necessária) , o ADVPL se encar rega de gerenciar a m em ória
e t orna sim ples adicionar elem ent os a um array, ut ilizando a função AADD( ) :
AADD( aLet ras," D" ) / / Adiciona o quart o elem ent o ao final do ar ray
Alert ( aLet ras[ 4] ) / / Exibe o quart o elem ent o
Alert ( aLet ras[ 5] ) / / Er r o! Não há um quint o elem ent o no ar ray
Ar r a y s com o Est r u t ur a s
Um a caract eríst ica int eressant e do ADVPL é que um array pode cont er qualquer t ipo de dado:
núm eros, dat as, lógicos, caract er es, obj et os, et c., e ao m esm o t em po. Em out r as palavras, os
elem ent os de um array não pr ecisam ser necessariam ent e do m esm o t ipo de dado, em
cont rast e com out r as linguagens com o C e Pascal.
Est e ar ray cont em um a st ring, um núm ero e um valor lógico. Em out r as linguagens com o C ou
Pascal, est e " pacot e" de inform ações pode ser cham ado com o um " st ruct " ( est rut ura em C, por
ex em plo) ou um " r ecor d" ( regist r o em Pascal, por ex em plo) . Com o se fosse na verdade um
regist ro de um banco de dados, um pacot e de inform ações const ruído com diversos cam pos.
Cada cam po t endo um pedaço difer ent e de dado.
Suponha que no ex em plo ant erior, o ar ray aFunct 1 cont enha infor m ações sobre o nom e de
um a pessoa, sua idade e sua sit uação m at rim onial. Os seguint es # defines podem ser criados
para indicar cada posição dos valor es dent ro de um array:
# define FUNCT_NOME 1
# define FUNCT_I DADE 2
# define FUNCT_CASADO 3
- 60 -
Agora, ao invés de t rabalhar com variáveis individuais, pode- se agrupá- las em um out ro array,
do m esm o m odo que m uit os r egist ros são agrupados em um a t abela de banco de dados:
aFunct s é um array com 3 linhas por 3 colunas. Um a vez que as variáveis separadas foram
com binadas em um ar ray, os nom es podem ser exibidos assim :
Local nCount
For nCount : = 1 To Len( aFunct s)
Alert ( aFunct s[ nCount , FUNCT_NOME] )
/ / O acesso a elem ent os de um arr ay m ult idim ensional
/ / pode ser r ealizado t am bém dest a form a:
/ / aFunct s[ nCount ] [ FUNCT_NOME]
Next nCount
A variável nCount seleciona que funcionário ( ou que linha) é de int er esse. Ent ão a const ant e
FUNCT_NOME seleciona a prim eira coluna daquela linha.
Cu id a d os com Ar r a ys
Array s são list as de elem ent os, port ant o m em ória é necessária para arm azenar est as
inform ações. Com o est es arrays podem ser m ult idim ensionais, a m em ória necessária será a
m ult iplicação do núm er o de it ens em cada dim ensão do array, considerando- se o t am anho do
cont eúdo de cada elem ent o cont ido nest a. Port ant o o t am anho de um array pode variar m uit o.
A facilidade da ut ilização de ar rays, m esm o que para arm azenar infor m ações em pacot es com o
descrit o ant eriorm ent e, não é com pensada pela ut ilização em m em ória quando o núm er o de
it ens em um array for m uit o grande. Quando o núm ero de elem ent os for m uit o grande deve- se
procurar out ras soluções, com o a ut ilização de um arquivo de banco de dados t em porário.
- 61 -
Algum as vezes o t am anho da m at riz é conhecido previam ent e. Out r as vezes o t am anho do
array som ent e será conhecido em t em po de ex ecução.
Se o t a m a n h o do a r r a y é con h e cido
01 Local nCnt
02 Local aX[ 10]
03 Local aY : = Ar ray( 10)
04 Local aZ : = { 0,0,0,0,0,0,0,0,0,0}
05
06 For nCnt : = 1 To 10
07 aX[ nCnt ] : = nCnt * nCnt
08 Next nCnt
Est e código preenche o array com um a t abela de quadrados. Os valores serão 1, 4, 9, 16 ...
81, 100. Not e que a linha 07 se refere à variáv el aX, m as poderia t am bém t r abalhar com aY ou
aZ.
O obj et ivo dest e exem plo é dem onst rar t rês m odos de criar um array de t am anho conhecido
no m om ent o da criação do código.
1. Na linha 02 o array é criada usando aX[ 10] . I st o indica ao ADVPL para alocar espaço
para 10 elem ent os no array. Os colchet es [ e ] são ut ilizados para indicar o t am anho
necessário.
3. O t erceiro m ét odo difer e dos ant erior es por que inicializa a m at riz com os valores
definit ivos. Nos dois prim eiros m ét odos, cada posição da m at riz cont ém um valor nulo ( Nil) e
dev e ser inicializado post eriorm ent e.
4. A linha 07 dem onst ra com o um v alor pode ser at ribuído para um a posição exist ent e em
um a m at riz especificando o índice ent r e colchet es.
- 62 -
01 Local nCnt
02 Local aX[ 0]
03 Local aY : = Ar ray( 0)
04 Local aZ : = { }
05
06 For nCnt : = 1 To nSize
07 AADD( aX, nCnt * nCnt )
08 Next nCnt
1. A linha 02 ut iliza os colchet es para criar um array vazio. Apesar de não t er nenhum
elem ent o, seu t ipo de dado é ar ray .
2. Na linha 03 a cham ada da função ar ray cria um a m at riz sem nenhum elem ent o.
3. Na linha 04 est á declarada a r epr esent ação de um array vazio em ADVPL. Mais um a
vez, est ão sendo ut ilizadas as chaves para indicar que o t ipo de dados da variável é array .
Not e que { } é um array vazio ( t em o t am anho 0) , enquant o { Nil} é um array com um único
elem ent o nulo ( t em t am anho 1) .
Porque cada um a dest es arrays não cont ém elem ent os, a linha 07 ut iliza a função AADD( ) para
adicionar elem ent os sucessivam ent e at é o t am anho necessário ( especificado por exem plo na
variável nSize) .
6 .1 .2 . Funçõe s de m a n ipula çã o de a r r a ys
A linguagem ADVPL possui diversas funções que auxiliam na m anipulação de ar ray s, dent r e as
quais podem os cit ar as m ais ut ilizadas:
ARRAY( )
AAD D ( )
ACLON E( )
AD EL( )
ASI ZE( )
AI N S( )
ASORT( )
ASCAN ( )
- 63 -
AAD D ( )
Sin t a x e AAD D ( a Ar r a y, x I t e m )
A função AADD( ) per m it e a inserção de um it em em um array j á exist ent e,
D e scr içã o sendo que est e it em podem ser um elem ent o sim ples, um obj et o ou out ro
array.
ACLON E( )
Sin t a x e AAD D ( a Ar r a y)
A função ACLONE( ) r ealiza a cópia dos elem ent os de um array par a out r o
D e scr içã o
array int egralm ent e.
AD EL( )
ASI ZE( )
ASORT( )
- 64 -
AI N S( )
Sin t a x e AI N S( a Ar r a y , n Posica o)
A função AI NS( ) perm it e a inserção de um elem ent o no ar ray especificado
em qualquer pont o da est rut ura do m esm o, diferindo dest a form a da função
D e scr içã o AADD( ) a qual sem pr e insere um nov o elem ent o ao final da est rut ura j á
exist ent e.
6 .1 .3 . Cópia de a r r a ys
Conform e com ent ado ant eriorm ent e, um array é um a área na m em ória, o qual possui um a
est rut ura perm it e que as inform ações sej am arm azenadas e organizadas das m ais diversas
for m as.
Com base nesse conceit o, o ar ray pode ser considerado apenas com o um “ m apa” ou um “ guia”
de com o as inform ações est ão organizadas e de com o elas podem ser arm azenadas ou
consult adas. Para se copiar um array dev e- se levar est e conceit o em consideração, pois caso
cont rário o r esult ado esperado não será o obt ido na ex ecução da “ cópia” .
nPessoas : = 10
nAlunos : = nPessoas
Ao ex ecut ar a at ribuição de nAlunos com o cont eúdo de nPessoas, o cont eúdo de nPessoas é
at ribuído a variável nAlunos, causando o efeit o de cópia do cont eúdo de um a variável para
out ra.
I st o porque o com ando de at ribuição copia o cont eúdo da ár ea de m em ória represent ada pelo
nom e “ nPessoas” para a área de m em ória represent ada pelo nom e “ nAlunos” . Mas ao ut ilizar o
operador de at ribuição “ : = ” da m esm a form a que ut ilizado em variáveis sim ples para se copiar
um array o efeit o é diferent e:
- 65 -
Dest a form a ao at ribuir o cont eúdo r epresent ado pela variável aPessoas a variável aAlunos não
est á se “ copiando” as infor m ações e sim o “ m apa” das áreas de m em ória onde as inform ações
est ão r ealm ent e arm azenadas.
Com o foi copiado o “ m apa” e não as inform ações, qualquer ação ut ilizando o rót ulo aAlunos irá
afet ar as inform ações do r ót ulo aPessoas. Com isso ao invés de se obt er dois array s dist int os,
t em - se o m esm o ar ray com duas form as de acesso ( rót ulos) difer ent es.
Por est a razão deve ser ut ilizado o com ando ACLONE( ) quando desej a- se obt er um ar ray com
a m esm a est rut ura e inform ações que com põe out ro ar ray j á exist ent e.
- 66 -
Blocos de código são um conceit o exist ent e há m uit o t em po em linguagens xBase. Não com o
algo que apareceu da noit e para o dia, e sim um a evolução progressiva ut ilizando a
com binação de m uit os conceit os da linguagem para a sua im plem ent ação.
Pr im e ir a pr e m issa
Assim , a o in v é s de e scr e ve r :
Pode - se e scr e ve r :
A expr essão x: = 10 é av aliada prim eiro, e ent ão seu r esult ado ( o valor de X, que agora é 10) é
passada para a função cvalt ochar para a conversão para caract er e, e em seguida para a
função alert para a exibição. Por causa dest a regra de pr ecedência é possível at ribuir um valor
a m ais de um a variável ao m esm o t em po:
Z := Y := X := 0
Por causa dessa r egra, essa expr essão é avaliada com o se fosse escrit a assim :
Z : = ( Y : = ( X : = 0) )
Apesar de o ADVPL avaliar expr essões da esquerda para a direit a, no caso de at ribuições isso
acont ece ao cont rário, da direit a para a esquerda. O valor é at ribuído à variável X, que r et orna
- 67 -
Se gu n d a p r e m issa
Em ADVPL pode- se j unt ar diversas linhas de código em um a única linha física de com ando. Por
ex em plo, o código:
I f lAchou
Alert ( " Client e encont rado! " )
Endif
pode ser escrit o assim :
I f lAchou ; Alert ( " Client e encont r ado! " ) ;
Endif
O pont o- e- vírgula indica ao ADVPL que a nov a linha de código est á para com eçar. Pode- se
ent ão colocar diver sas linhas lógicas de código na m esm a linha física at rav és do edit or de t ext o
ut ilizado.
Apesar da possibilidade de se escr ev er t odo o program a assim , em um a única linha física, ist o
não é r ecom endado pois dificult a a legibilidade do pr ogram a e, conseqüent em ent e, a
m anut enção.
6 .2 .2 . List a de e x pr e ssõe s
A ev olução dos blocos de código com eça com as list as de expr essões. Nos ex em plos a seguir,
o sím bolo = = > indicará o ret orno da expr essão após sua avaliação ( sej a para at ribuir em um a
variável, exibir para o usuário ou im prim ir em um r elat ório) , que será im presso em um
relat ório por ex em plo.
D u a s Lin h a s d e Códig o
Cada um a das linhas t erá a expr essão avaliada, e o valor da variável ser á ent ão im presso.
Est e é o m esm o código que o ant erior , apenas escrit o em um a única linha:
Apesar desse código se encont rar em um a única linha física, exist em duas linhas lógicas
separadas pelo pont o e vírgula. Ou sej a, esse código é equivalent e a:
Alert ( cValToChar( x : = 10 ) )
y : = 20
Port ant o apenas o valor 10 da variável x será passado par a as funções cvalt ochar e alert para
ser exibido. E o valor 20 apenas será at ribuído à variável y.
- 68 -
Quando par ênt eses são colocados ao r edor do código e o sinal de pont o- e- vírgula subst it uído
por um a vírgula apenas, o código t orna- se um a list a de expressões:
O valor de r et orno r esult ant e de um a list a de expressões é o valor result ant e da últ im a
expr essão ou elem ent o da list a. Funciona com o se fosse um pequeno program a ou função, que
ret orna o result ado de sua últ im a avaliação ( efet uadas da esquerda par a a direit a) .
Nest e exem plo, a expr essão x : = 10 é avaliada, e ent ão a expr essão y : = 20, cuj o valor
result ant e é passado para a função alert e cv alt ochar, e ent ão exibido. Depois que essa linha
de código é ex ecut ada, o valor de X é igual a 10 e o de y igual a 20, e 20 será exibido.
Teoricam ent e, não há lim it ação para o núm ero de expressões que podem ser com binadas em
um a list a de expressões. Na prát ica, o núm er o m áxim o é por volt a de 500 sím bolos.
Debugar list as de expr essões é difícil porque as expr essões não est ão divididas em linhas de
código font e, o que t or na t odas as expressões associadas a um a m esm a linha de código. I st o
pode t ornar m uit o difícil det erm inar onde um er ro ocorr eu.
X : = 10 ; Y : = 20
If X > Y
Alert ( " X" )
Z := 1
Else
Alert ( " Y" )
Z : = -1
Endif
X : = 10 ; Y : = 20
iif( X > Y , ;
( Alert ( " X" ) , Z : = 1 ) , ;
( Alert ( " Y" ) , Z : = - 1 ) )
O ADVPL per m it e criar funções, que são pequenos pedaços de código, com o se fosse um
pequeno pr ogram a, ut ilizados para dim inuir part es de t ar efas m ais com plexas e r eapr ov eit ar
código em m ais de um lugar num program a. Para m aiores det alhes consult e a docum ent ação
sobr e a criação de funções em ADVPL. Por ém , a idéia nest e m om ent o é que a list a de
expr essões ut ilizada na linha ant erior pode ser criada com o um a função:
- 69 -
E a linha de ex em plo com a list a de expr essões pode ser subst it uída, t endo o m esm o
result ado, por:
Com o m encionado ant eriorm ent e, um a list a de expr essões é com o um pequeno pr ogram a ou
função. Com poucas m udanças, um a list a de ex pressões pode se t ornar um bloco de código:
/ / I st o é um a m at riz de dados
A : = { 10, 20, 30}
/ / I st o é um bloco de código, por ém funciona com o
/ / se fosse um a m at riz de com andos
B : = { | | x : = 10, y : = 20}
6 .2 .3 . Blocos de Código
Diferent em ent e de um a m at riz, não se pode acessar elem ent os de um bloco de código at ravés
de um índice num érico. Por ém blocos de código são sem elhant es a um a list a de expr essões, e
a um a pequena função.
Ou sej a, podem ser execut ados. Para a ex ecução, ou avaliação, de um bloco de código, dev e-
se ut ilizar a função Eval( ) :
Essa função recebe com o parâm et r o um bloco de código e av alias t odas as expressões
cont idas nest e bloco de código, r et ornando o r esult ado da últ im a expr essão avaliada.
Pa ssa n do Pa r â m e t r os
Já que blocos de código são com o pequenas funções, t am bém é possível a passagem de
parâm et ros para um bloco de código. Os parâm et r os devem ser infor m ados ent re as bar ras
vert icais ( | | ) separados por vírgulas, assim com o em um a função.
B : = { | N | X : = 10, Y : = 20 + N}
Por ém dev e- se not ar que j á que o bloco de código recebe um parâm et r o, um valor dev e ser
passado quando o bloco de código for avaliado.
C : = Eval( B, 1) = = > 21
- 70 -
Blocos de código podem ser ut ilizados em diver sas sit uações. Geralm ent e são ut ilizados par a
ex ecut ar t ar efas quando ev ent os de obj et os são acionados ou para m odificar o com port am ent o
padrão de algum as funções.
Est a m at riz pode ser ordenada pelo prim eiro nom e, ut ilizando- se a cham ada da função
asort ( A) , r esult ado na m at riz com os elem ent os ordenados dessa form a:
A ordem padrão para a função asort é ascendent e. Est e com port am ent o pode ser m odificado
at ravés da inform ação de um bloco de código que ordena a m at riz de form a descendent e:
B : = { | X, Y| X > Y }
aSort ( A, B)
O bloco de código ( de acordo com a docum ent ação da função asort ) dev e ser escrit o para
aceit ar dois parâm et r os que são os dois elem ent os da m at riz para com paração. Not e que o
bloco de código não conhece que elem ent os est á com parando - a função asort seleciona os
elem ent os ( t alvez ut ilizando o algorit m o QuickSort ) e passa- os para o bloco de código. O bloco
de código com para- os e ret orna v erdadeiro ( .T.) se encont ram na ordem corr et a, ou falso ( .F.)
se não. Se o valor de r et orno for falso, a função asort irá ent ão t rocar os valores de lugar e
seguir com parando o pr óxim o par de valores.
Ent ão, no bloco de código ant erior, a com paração X > Y é verdadeira se os elem ent os est ão
em ordem descendent e, o que significa que o pr im eiro valor é m aior que o segundo.
Para ordenar a m esm a m at riz pelo últ im o nom e, t am bém em ordem descendent e, pode- se
ut ilizar o seguint e bloco de código:
Not e que est e bloco de código pr ocura e com para as part es dos caract er es im ediat am ent e
seguint e a um espaço em branco. Depois de ut ilizar esse bloco de código para a função asort ,
a m at riz cont erá:
Finalm ent e, para ordenar um sub- elem ent o ( coluna) de um a m at riz por ex em plo, pode- se
ut ilizar o seguint e bloco de código:
B : = { | X, Y| X[ 1] > Y[ 1] }
- 71 -
A linguagem ADVPL possui diversas funções que auxiliam na m anipulação de blocos de código,
dent re as quais podem os cit ar as m ais ut ilizadas:
EVAL( )
D BEV AL( )
AEV AL( )
EVAL( )
D BEV AL( )
AEV AL( )
- 72 -
A m aior part e das rot inas que quer em os escrever em program as são com post as de um
conj unt o de com andos, rot inas est as que se r epet em ao longo de t odo o
desenvolvim ent o. Um a função nada m ais é do que um conj unt o de com andos que para ser
ut ilizada bast a cham á- la pelo seu nom e.
Para t ornar um a função m ais flexível, ao cham á- la pode- se passar parâm et r os, o quais cont ém
os dados e inform ações que definem o pr ocessam ent o da função.
Os parâm et r os das funções descrit as ut ilizando a linguagem ADVPL são posicionais, ou sej a, na
sua passagem não im port a o nom e da variável e sim a sua posição dent r o da list a de
parâm et ros, o que perm it e execut ar um a função escr ev endo:
E a fu n çã o e st a r e scr it a :
Re t u r n ( ca m po)
No DEM ( Docum ent ação Elet r ônica Microsiga) m ais de 500 est ão docum ent adas, e est e
núm ero t ende a aum ent ar exponencialm ent e com os novos pr ocessos de docum ent ação que
est ão em im plant ação na Tecnologia e I nt eligência Prot heus.
O obj et ivo do cur so é apresent ar, dem onst r ar e fixar a ut ilização das principais funções,
sint axes e est rut uras ut ilizadas em ADVPL.
No ADVPL, at é os pr ogram as cham ados do m enu são funções, sendo que em um reposit ório
não podem hav er funções com o m esm o nom e, e para perm it ir que os usuários e analist as
- 73 -
Nos t ópicos a seguir serão det alhados os t ipos de funções disponíveis na linguagem ADVPL,
suas form as de ut ilização e r espect ivas diferenças.
Fu n ct ion ( )
Use r Fu n ct ion ( )
St a t ic Fu n ct ion ( )
M a in Fu n ct ion ( )
Fu n ct ion ( )
Funções ADVPL convencionais, rest rit as ao desenv olvim ent o da área de I nt eligência Prot heus
da Microsiga.
O int erpr et ador ADVPL dist ingue nom es de funções do t ipo Funct ion( ) com at é dez caract eres.
A part ir do décim o car act er, apesar do com pilador não indicar quaisquer t ipos de er ros, o
int erpr et ador ignorará os dem ais caract eres.
Ex e m plo:
1. Funções do t ipo Funct ion( ) som ent e podem ser ex ecut adas at ravés
dos m ódulos do ERP.
2. Som ent e poder ão ser com piladas funções do t ipo Funct ion( ) se o MP-
I DE possuir um a aut orização especial fornecida pela Microsiga.
- 74 -
As “ User Defined Funct ions” ou funções definidas pelos usuários, são t ipos especiais de funções
im plem ent ados pelo ADVPL para garant ir que desenvolvim ent os específicos não r ealizados pela
I nt eligência Prot heus da Microsiga sobr eponham as funções padrões desenvolvidas para o ERP.
O int erpr et ador ADVPL considera que o nom e de um a User Funct ion é com post o pelo nom e
definido para a função precedido dos caract er es “ U_” . Dest a form a a User Funct ion XMAT100I
será t rat ada pelo int erpret ador com o “ U_XMAT100I ” .
2. Funções do t ipo User Funct ion são acessíveis por quaisquer out ras
funções em uso pela aplicação, desde que em sua cham ada sej am
ut ilizados os caract er es “ U_” em conj unt o com o nom e da função.
As User Funct ions podem ser execut adas a par t ir da t ela inicial do client do
ERP ( Microsiga Prot heus Rem ot e) , m as as aplicações que pret endem
disponibilizar est a opção devem possuir um pr eparo adicional de am bient e.
St a t ic Fu n ct ion ( )
Funções ADVPL t radicionais, cuj a visibilidade est á rest rit a as funções descrit as no m esm o
arquivo de código font e no qual est ão definidas.
Ex e m plo:
/ / Font e FI NA010.PRW
CriaSx1( “ FI N010” )
Ret urn
CriaSx1( “ FI N020” )
Ret urn
- 75 -
A função FI NA010( ) t erá visibilidade apenas da função CRI ASX1( ) definida no arquivo de
código font e FI NA010.PRW, sendo que o m esm o ocor re com a função FI NA020( ) .
Est e r ecur so perm it e isolar funções de uso exclusivo de um arquivo de código font e, evit ando a
sobr eposição ou duplicação de funções na aplicação.
1. Padronizar o nom e de um a det erm inada função, que possui a m esm a finalidade, m as
que sua im plem ent ação pode variar de acordo com a necessidade de função principal /
aplicação.
3. Prot eger funções de uso específico de um arquivo de código font e / função principal.
O am bient e de desenv olvim ent o ut ilizado na aplicação ERP ( MP- I DE) valida
se exist em Funct ions( ) , Main Funct ions( ) ou User Funct ions( ) com o m esm o
nom e m as em arquivos de código font es dist int os, evit ando a duplicidade ou
sobr eposição de funções.
M a in Fu n ct ion ( )
Main Funct ion( ) é out ro t ipo de função especial do ADVPL incorporado para perm it ir
t rat am ent os difer enciados na aplicação ERP.
Um a Main Funct ion( ) t em a car act eríst ica de poder ser ex ecut ada at rav és da t ela inicial de
parâm et ros do client do ERP ( Micr osiga Pr ot heus Rem ot e) , da m esm a form a que um a User
Funct ion, com a diferença que as Main Funct ions som ent e podem ser desenvolvidas com o uso
da aut orização de com pilação, t ornando sua ut ilização r est rit a a I nt eligência Prot heus da
Microsiga.
Na aplicação ERP é com um o uso das Main Funct ions( ) nas seguint es sit uações:
- 76 -
Com o m encionado ant eriorm ent e os parâm et r os das funções descrit as ut ilizando a linguagem
ADVPL são posicionais, ou sej a, na sua passagem não im port a o nom e da variável e sim a
sua posição dent r o da list a de parâm et ros.
Com plem ent ando est a definição, podem ser ut ilizadas duas form as dist int as de passagens de
parâm et ros para funções descrit as na linguagem ADVPL:
A passagem de parâm et ros por cont eúdo é a form a convencional de definição dos parâm et ros
recebidos pela função cham ada, na qual a função recebe os cont eúdos passados pela função
cham adora, na ordem com os quais são inform ados.
Local nCnt
Local nResult ado : = 0
Ret urn
Avaliando a função CalcFat or( ) descrit a ant eriorm ent e podem os verificar que a m esm a r ecebe
com o par âm et ro para sua ex ecução a variável nFat or.
Com base nest a função podem os descr ev er duas form a de passagem de parâm et r os por
cont eúdo:
Pa ssa ge m de con t e ú d os d ir e t os
Pa ssa ge m de v a r iá v e is com o con t e ú dos
- 77 -
Com o a linguagem ADVPL t r at a os parâm et r os de for m a posicional, o cont eúdo 5 será at ribuído
diret am ent e a variável definida com o prim eiro parâm et ro da função cham ado, no nosso caso
nFat or.
Por ser um a at ribuição de par âm et ros por cont eúdo, o int erpret ador da linguagem basicam ent e
ex ecut a um a operação de at ribuição norm al, ou sej a, nFat or : = 5.
Dest a form a os m esm os não dev em ser definidos novam ent e com o LOCAL na
área de definição e inicialização de variáveis, pois caso ist o ocor ra haverá a
perda dos valor es r ecebidos pela redefinição das variáveis na função.
Caso sej a necessário garant ir um cont eúdo padrão para um det er m inado
parâm et ro dev erá ser ut ilizado o ident ificador DEFAULT conform e det alhado
no t ópico “ Trat am ent o de valor es padr ões para parâm et ros de funções” .
nFat orUser : = Get Fat or ( ) / / Função ilust rat iva na qual o usuário inform a o fat or a ser ut ilizado.
A passagem de cont eúdos com o variáveis im plica na ut ilização de variáveis de apoio par a
ex ecut ar a cham ada de um a função. Nest e caso foi inform ada a variável nFat orUser, a qual
será definida pelo usuário at ravés da função ilust rat iva Get Fat or( ) . O uso de variáveis de apoio
flexibiliza a cham ada de out ras funções, pois elas serão param et rizadas de acordo com as
necessidades daquele processam ent o específico no qual se encont ra a função cham adora.
- 78 -
Por ser um a at ribuição de par âm et ros por cont eúdo, o int erpret ador da linguagem basicam ent e
ex ecut a um a operação de at ribuição norm al, ou sej a, nFat or : = nFat or User.
...
A passagem de parâm et ros por referência ut iliza o conceit o de que um a variável é um a área
de m em ória e port ant o passar um parâm et ro por referência nada m ais é do que ao invés de
passar o cont eúdo par a a função cham ada, passar qual a área de m em ória ut ilizada pela
variável passada.
- 79 -
- 80 -
O t rat am ent o de cont eúdos padrões para parâm et r os de funções é m uit o ut ilizado nas funções
padrões da aplicação ERP, de for m a a garant ir a corr et a ex ecução dest as funções por qualquer
função cham adora, evit ando sit uações de ocor rências de err os pela falt a da definição de
parâm et ros necessários a cor ret a ut ilização da função.
Dest a form a o uso do ident ificador DEFAULT perm it e ao desenvolvedor garant ir que na
ut ilização da função det erm inados parâm et ros t erão o valor com um t ipo adequado a função.
Ex e m plo:
Local nCnt
Local nResult ado : = 0
Default nFat or : = 1
No ex em plo descrit o, caso o parâm et r o nFat or não sej a inform ado na função cham adora, o
m esm o t erá seu cont eúdo definido com o 1.
- 81 -
Ex e m plo:
Local nCnt
Local nResult ado : = 0
For nCnt : = nFat or To 1 St ep - 1 / / nFat or est á com o Nulo, port ando nCnt é nulo
nResult ado * = nCnt
Next nCnt / / Ao efet uar o Next , o int erpret ador realiza a ação nCnt + = 1.
Com o o int erpret ador realizará a ação nCnt + = 1, e o cont eúdo da variável nCnt é nulo
ocor rerá o er ro de “ t y pe m ism at h on + = , expect ed N U” pois os t ipos das variáveis
envolvidos na operação são diferent es: nCnt nulo ( U) e 1 num érico ( N) .
- 82 -
O com pilador ADVPL possui um a funcionalidade denom inada pré- pr ocessador, o qual nada
m ais é do que um program a que exam ina o program a font e escrit o em ADVPL e execut a cert as
m odificações nele, baseadas nas Dir et ivas de Com pilação.
As diret ivas de com pilação são com andos que não são com pilados, sendo dirigidos ao pr é-
processador, o qual é ex ecut ado pelo com pilador ant es da ex ecução do processo de
com pilação propriam ent e dit o.
Port ant o, o pr é- pr ocessador m odifica o program a font e, ent regando para o com pilador um
program a m odificado de acordo com as diret ivas de com pilação, as são iniciadas pelo caract er e
“# ”.
As diret ivas podem ser colocadas em qualquer part e do program a, sendo que as
im plem ent adas pela linguagem ADVPL são:
# I N CLUD E
# D EFI N E
# I FD EF
# I FN D EF
# ELSE
# EN D I F
# COM M AN D
As diret ivas de com pilação t am bém são conhecidas com o UDC – User Defined
Com m ands.
Le m br e - se
D ir e t iv a : # I N CLUD E
A diret iva # I N CLUD E indica em que arquivo de ext ensão “ CH” ( padrão ADVPL) est ão os UDCs
a ser em ut ilizados pelo pré- pr ocessador.
A aplicação ERP possui diversos includes, os quais devem ser ut ilizados segundo a aplicação
que será desenv olvida, o que perm it irá a ut ilização de r ecursos adicionais definidos para a
linguagem , im plem ent ados pela área de Tecnologia da Microsiga.
Os includes m ais ut ilizados nas aplicações ADVPL desenvolvidas para o ERP são:
PROTH EUS.CH : diret ivas de com pilação padrões par a a linguagem . Cont ém a
especificação da m aior ia das sint axes ut ilizadas nos font es, inclusive perm it indo a
com pat ibilidade da sint axe t radicional do Clipper para os nov os r ecur sos im plem ent ados
no ADVPL.
- 83 -
o D I ALOG.CH
o FON T.CH
o I N I .CH
o PTM EN U.CH
o PRI N T.CH
AP5 M AI L.CH : Perm it e a ut ilização da sint axe t radicional na definição das seguint es
funções de envio e r ecebim ent o de e- m ail:
TOPCON N .CH : Perm it e a ut ilização da sint axe t radicional na definição das seguint es
funções de int egração com a ferram ent a TOPCONNECT ( MP10 – DbAcess) :
o TCQUERY
TBI CON N .CH : Perm it e a ut ilização da sint axe t radicional na definição de conex ões com
a aplicação Serv er do am bient e ERP, at rav és da seguint es sint axes:
o CREATE RPCCONN
o CLOSE RPCCONN
o PREPARE ENVI RONMENT
o RESET ENVI RONMENT
o OPEN REMOTE TRANSACTI ON
o CLOSE REMOTE TRANSACTI ON
o CALLPROC I N
o OPEN REMOTE TABLES
o CREATE XMLSTRI NG
o CREATE XMLFI LE
o SAVE XMLSTRI NG
o SAVE XMLFI LE
- 84 -
Caso o diret ório de includes não est ej a inform ado, ou est ej a infor m ado
incorret am ent e será exibida um a m ensagem de err o inform ando:
D ir e t iv a : # D EFI N E
A diret iva # DEFI NE per m it e que o desenv olvedor crie novos t erm os para ser em ut ilizadas no
código font e. Est e t er m o t em o efeit o de um a variável de escopo PUBLI C, m as que afet a
som ent e o font e na qual o # DEFI NE est á definido, com a caract er íst ica de não perm it ir a
alt eração de seu cont eúdo.
Dest a form a um t er m o definido at rav és da diret iva # DEFI NE pode ser considerado com o um a
const ant e.
Por est a razão a aplicação ERP possui t rês reposit órios dist int os para cada
um a das bases de dados hom ologadas pela Microsiga, pois cada com pilação
ut iliza um a diret iva referent e ao seu idiom a.
- 85 -
As diret ivas # I FDEF, # I FNDEF, # ELSE e # ENDI F perm it em ao desenvolvedor criar font es
flexíveis e sensíveis a det erm inadas configurações da aplicação ERP.
At ravés dest as diret ivas, podem ser verificados parâm et r os do sist em a, t ais com o o idiom a
com o qual est á param et rizado e a base de dados ut ilizada para arm azenar e ger enciar as
inform ações do ERP.
Dest a form a, ao invés de escr ev er dois ou m ais códigos font es que r ealizam a m esm a função,
m as ut ilizando recursos dist int os para cada base de dados ou exibindo m ensagem para cada
um dos idiom as t rat ados pela aplicação, o desenvolvedor pode pr eparar seu código font e para
ser avaliado pelo pré- processador, o qual irá gerar um código com pilado de acordo com a
análise dos parâm et ros de am bient e.
Est as diret ivas de com pilação est ão norm alm ent e associadas as seguint es verificações de
am bient e:
# I FDEF SPANI SH
# DEFI NE STR0001 “ Hola ! ! ! ”
# ELSE
# I FDEF ENGLI SH
# DEFI NE STR0001 “ Hello ! ! ! ”
# ELSE
# DEFI NE STR0001 “ Olá ! ! ! ”
# ENDI F
# ENDI F
Apesar da est rut ura sem elhant e ao I F- ELSE- ELSEI F- ENDI F, não exist e
a diret iva de com pilação # ELSEI F, o que t or na necessário o uso de
diversos # I FDEFs par a a m ont agem de um a est rut ura que seria
facilm ent e solucionada com I F- ELSE- ELSEI F- ENDI F.
“ PORTUGUESE”
“ SPANI SH”
“ ENGLI SH”
- 86 -
# I FDEF TOP
# ELSE
DbSelect Ar ea( “ SA1” )
# ENDI F
Para est es bancos deve ser ut ilizada a sint axe ADVPL t radicional.
D ir e t iv a : # COM M AN D
A diret iva # COMMAND é ut ilizada principalm ent e nos includes da linguagem ADVPL para
efet uar a t radução de com andos em sint axe CLI PPER para as funções im plem ent adas pela
Tecnologia Microsiga.
Est a diret iva perm it e que o desenv olvedor defina para o com pilador com o um a expressão
dev erá ser int erpret ada.
# xcom m and @ < nRow > , < nCol> SAY [ < oSay> < label: PROMPT,VAR > ] < cText > ;
[ PI CTURE < cPict > ] ; [ < dlg: OF,WI NDOW,DI ALOG > < oWnd> ] ;
[ FONT < oFont > ] ; [ < lCent er: CENTERED, CENTER > ] ;
[ < lRight : RI GHT > ] ; [ < lBorder: BORDER > ] ;
[ < lPixel: PI XEL, PI XELS > ] ; [ < color: COLOR,COLORS > < nClrTex t > [ ,< nClrBack> ] ] ;
[ SI ZE < nWidt h> , < nHeight > ] ; [ < design: DESI GN > ] ;
[ < updat e: UPDATE > ] ; [ < lShaded: SHADED, SHADOW > ] ;
[ < lBox: BOX > ] ; [ < lRaised: RAI SED > ] ;
=> ;
[ < oSay> : = ] TSa y( ) :N e w ( < nRow> , < nCol> , < { cText } > ,;
[ < oWnd> ] , [ < cPict > ] , < oFont > , < .lCent er.> , < .lRight .> , < .lBorder.> ,;
< .lPixel.> , < nClrTex t > , < nClrBack> , < nWidt h> , < nHeight > ,;
< .design.> , < .updat e.> , < .lShaded.> , < .lBox.> , < .lRaised.> )
At ravés da diret iva # COMMAND, o desenv olvedor det erm inou as regras para que a sint axe
t radicional da linguagem CLI PPER para o com ando SAY fosse conver t ida na especificação de
um obj et o TSAY( ) do ADVPL.
- 87 -
O PROTHEUS, por out r o lado, é um a plat afor m a t ecnológica que engloba um Servidor de
Aplicação, um Dicionário de Dados e as I nt erfaces para conex ão com o usuário. É o Prot heus
que execut a o código ADVPL e o devido acesso à base da dados.
O Pr ot heus é com post o pelo ERP ( que engloba, além das funcionalidades descrit as nos
capít ulos ant eriores, m ais de t rint a vert icais aplicadas a áreas específicas de negócios) e
pelo Configurador ( program a que perm it e cust om izar o sist em a às necessidades do usuário
de form a fácil) .
9 .1 . O Am bie nt e Pr ot he us
O Pr ot heus é const it uído de um conj unt o de Soft war es que com põem as cam adas de
funcionalidades básicas aos serviços de aplicação, int erface, banco de dados e reposit ório,
conform e o diagram a da figura abaixo:
Para ex ecut ar um progr am a desenv olvido em ADVPL, é pr eciso ant es de m ais nada escr ev ê- lo
e com pilá- lo. Est e procedim ent o é feit o at ravés da ferram ent a TOTVS DevSt udio do
Prot heus ( Tot vs Dev elopm ent St udio) .
O obj et ivo do TOTVS DevSt udio é facilit ar a t arefa de escr ev er program as: at rav és de cor es,
indica se a palavra escrit a é um a inst rução, um a variável ou um com ent ário; organiza a
bibliot eca de program as em pr oj et os e adm inist ra o reposit ório de obj et os; apont a er ros de
- 88 -
Figu r a : M a n u t e n çã o n o r e posit ór io de ob j e t os
Após com pilar o program a, o result ado é um obj et o, o qual é carregado na m em ória ficando
disponível para sua execução at rav és da aplicação PROTHEUS.
O obj et o não é um ex ecut áv el, ou sej a, não est á convert ido para a linguagem nat iva do
equipam ent o. Quem faz esse t rabalho é o Prot heus Serv er em t em po de execução. Por isso, o
Prot heus Ser ver est á sem pre pr esent e na m em ória em t em po de execução, perm it indo:
Prot eger o pr ogram a font e, evit ando que sej a alt erado indevidam ent e, pois som ent e os
obj et os são dist ribuídos com um a ex ecução m ais rápida em função da com pilação no
DEV- St udio;
Que o sist em a cresça de form a ilim it ada, pois os obj et os ficam fora do ex ecut áv el;
O uso de m acr o subst it uições, ou sej a, o uso de r ot inas ext eriores ao sist em a
arm azenadas em arquivos e que podem facilm ent e alt eradas pelo usuár io, pois o Ser ver
t am bém int erpr et a o código font e em t em po de ex ecução.
- 89 -
O Reposit ório de Obj et os é a bibliot eca de obj et os de t odo o am bient e Pr ot heus, incluindo
t ant o os obj et os im plem ent ados par a as funcionalidades básicas do ERP com o aqueles gerados
pelos usuários. A figura abaixo dem onst ra a est rut ura e a int erconexão ent re as várias
cam adas.
- 90 -
Um a vez t erm inado o processam ent o do obj et o cham ado, o ele é descart ado da m em ória, ou
sej a, o Prot heus é um sist em a que pode cr escer de form a ilim it ada pois os obj et os,
arm azenados em um reposit ório prat icam ent e não ocupam espaço no HD ( Hard Disk) .
O Pr ot heus é um a plat afor m a m ult icam ada. Ent re as diversas cam adas, t em os a int erface de
apresent ação ao usuário ( Rem ot e) , o t rat am ent o dado para as r egras de negócio
im plem ent adas ( Serv er) , o acesso aos obj et os do reposit ório ( Ser ver) , o acesso aos
dados disponíveis no Banco de Dados ( Ser ver ou TOPCONNECT / DBACCESS ) e ao
ger enciam ent o de ser viços WEB ( Ser ver) . Nest e processo, o Prot heus possui, basicam ent e,
quat ro aplicat ivos ut ilizados com difer ent es finalidades:
TopCon n e ct / D b Acce ss: Responsável pela conversão dos com andos de banco de
dados, adequando- os ao SQL ut ilizado.
Alguns nom es r efer em - se a um conj unt o de pr ogram as para facilit ar a sua ident ificação:
RPO: É o arquivo binário do APO ( Advanced Prot heus Obj ect s) , ou sej a, os obj et os.
Upd a t e : Pacot e de at ualização para o r eposit ório ( RPO) liberado periodicam ent e
cont endo t odas as adequações e m elhorias disponibilizadas para o sist em a em um
det erm inado período, sendo não cum ulat ivo, aplicadas por m eio do DEV- St udio.
A int erface de apr esent ação é r ealizada pelo Sm art Client que pr ocessa a part e da est ação,
basicam ent e, t ela e t eclado. Pode est ar gravado no Serv er e ser car regado via rede para a
m em ória da est ação. Ou, de pr eferência, deve ficar ar m azenado no HD da est ação. Pode
t am bém ser carr egado pelo I nt ernet Explorer, rodando dent r o do próprio brow ser com o
Sm art Client Act iveX e perm it indo o acesso ao Prot heus Serv er pela I nt ernet , com as m esm as
funcionalidades do Sm art Client , sendo que o brow ser precisa supor t ar o uso da t ecnologia
Act iveX.
Caso exist a algum Firewall ou Proxy ent r e o WEB Serv er e o Br owser que vai acessar o
Sm art Client Act iveX, eles deverão ser configurados para perm it ir o seu download.
- 91 -
- 92 -
Apesar da est rut ura ilust rada ant eriorm ent e indicar que as past as est ão subordinadas à past a
PROTHEUS, é possível que algum as delas possam est ar em m áquinas diferent es ou at é m esm o
em am bient es com put acionais diferent es.
Figu r a : For m a s d e in st a la çã o e u so do Pr ot h e u s
- 93 -
Para que o TOTVS AppServ er e o TOTVS Sm art Client sej am execut ados, os arquivos
TOTVSAPPSERVER.I NI e TOTVSSMARTCLI ENT.I NI dev em est ar disponíveis nas respect ivas
past as APPSERVER e SMARTCLI ENT pois são eles que indicam o endereço das dem ais past as
conform e a ilust ração da figura ant erior.
O det alhe de pr eenchim ent o das pr opriedades dos r espect ivos at alhos TOTVS AppServ er e o
TOTVS Sm art Client é dem onst rado a seguir. No at alho do TOTV SAppSer ver, é necessário que
sej a inform ado o parâm et r o “ - debug” ou “ - console” .
- 94 -
D e st in o:
- console
- Con sole ou - D e bu g
Ex ecut ado com o um a JanelaConsole, as infor m ações r ecebidas das conexões com o TOTVS
Applicat ion Server conect ados são exibidas diret am ent e na t ela do console do TOTVS
Applicat ion Serv er, bem com o inform ações de Não Conform idades.
- I n st a ll
Se o TOTVS Applicat ion Serv er, não for inst alado com o um Ser viço do NT, durant e a
I nst alação, ist o pode ser r ealizado, execut ando- o com a opção de Linha de Com ando.
- Re m ove
Para r em ov ê- lo da List a de Serviços do NT, pode- se execut á- lo com a opção de Linha de
Com ando.
D e st in o:
–M
- Q ( Qu ie t )
I ndica que o TOTVS Sm art Client , não deverá m ost r ar o Splash ( I m agem de Apresent ação) e a
t ela de ident ificação de Parâm et r os I niciais, necessit a ser acom panhada da ( Cláusula –P) .
- P ( M a in Pr ogr a m )
- E ( En v ir on m e n t )
Nom e da Seção de Environm ent , no ( I ni do Ser ver) , que será ut ilizada, para definições gerais.
- C ( Con n e ct ion )
Nom e da Seção de Conexão, que ser á ut ilizada, para a conexão ao TOTVS Applicat ion Serv er.
Per m it e m últ iplas inst âncias ( Cópias) do TOTVS Sm art Client , na m esm a m áquina, o que por
Default não é perm it ido.
- 95 -
Sou r ce Pa t h: I ndica o local de origem dos obj et os. É o ender eço do Reposit ório de
Obj et os ( Ex em plo: SourcePat h= C: \ PROTHEUS\ APO)
Root Pa t h: Apont a para a past a raiz ( inicial) , a part ir da qual ser ão localizados os dados
( no caso de I SAM) , bem com o o próprio Dicionário de Dados ( Ex em plo:
Root Pat h= C: \ PROTHEUS\ PROTHEUS_DATA)
[ EN V I RON M EN T]
SOURCEPATHC: \ PROTHEUS\ APO
ROOTPATH= C: \ MP811\ PROTHEUS_DATA
STARTPATH= \ PROTHEUS\
RPODB= TOP
RPOLANGUAGE= PORTUGUESE
RPOVERSI ON= 101
LOCALFI LES= ADS
TRACE= 0
LOCALDBEXTENSI ON= .DBF
PI CTFORMAT= DEFAULT
DATEFORMAT= DEFAULT
[ D RI VERS]
ACTI VE= TCP
[ TCP]
TYPE= TCPI P
PORT= 1234
No exem plo da figura ant erior, o r ót ulo [ environm ent ] descreve um conj unt o de parâm et r os
que serão inicializados no sist em a. Os rót ulos [ Driver s] e [ TCP] ident ificam a com unicação que
pode ser est abelecida ent re o Pr ot heus Serv er e o Pr ot heus Rem ot e. Out ros am bient es podem
ser configurados no m esm o arquivo ( TOTVSAPPSERVER.I NI ) .
Já o arquivo de parâm et ros do Prot heus Rem ot e ( TOTVSSMARTCLI ENT.I NI ) cont ém apenas as
configurações locais, basicam ent e as infor m ações necessárias para a inicialização e a
com unicação com o Pr ot heus Serv er , conform e o exem plo da figura a seguir.
- 96 -
[ D RI VERS]
ACTI VE= TCP
[ TCP]
SERVER= 172.16.72.41
PORT= 1234
Por t : I ndica o núm ero da port a a ser ut ilizada para a com unicação ent re o Prot heus
Ser ver e o Prot heus Rem ot e. É necessário que a port a ut ilizada na com unicação sej a a
m esm a em am bos ( no TOTVSAPPSERVER.I NI e no TOTVSSMARTCLI ENT.I NI ) . Vale
ressalt ar que a port a 80 é r eservada para a I nt ernet e pode causar conflit os caso sej a
ut ilizada na com unicação do Prot heus.
Se r ve r : Apont a para o ender eço do servidor que pode ser a própria m áquina
( localhost ) ou o nom e da m áquina ( Server= Ser vidor_01) ou m esm o um ender eço I P
( exem plo Ser ver= 172.16.72.41) .
Ex e m plo:
O parâm et ro Serv er= 172.16.72.41 no arquivo TOTVSSMARTCLI ENT.I NI indica ao Prot heus
Rem ot e o ender eço da m áquina na qual est á funcionando o Prot heus Ser ver.
- 97 -
O obj et ivo dest e t ópico não é abranger t odo a est rut ura e recursos do m ódulo Configurador da
aplicação ERP, m as perm it ir a realização de t arefas de configuração sim ples que serão
necessárias no desenvolvim ent o de pequenas cust om izações.
Com foco nest e obj et ivo serão det alhadas as seguint es operações
Para cont ext ualizar a est rut ura da aplicação ERP, no t ópico a seguir é det alhada a form a com o
as t abelas de dados do sist em a est ão divididas ent re os diversos m ódulos que com põe o
PROTHEUS.
Ar q u iv os de con f ig u r a çã o d o sist e m a
Ar q u iv o D e scr içã o
SI GAMAT Cadast r o de em pr esas e filiais do sist em a
SI GAPSS Arquivo de usuários, gr upos e senhas do sist em a
SI X Í ndices dos arquivos
SX1 Pergunt as e r espost as
SX2 Mapeam ent o de t abelas
SX3 Dicionário de Dados
SX4 Agenda do Schedule de processos
SX5 Tabelas
SX6 Parâm et r os
SX7 Gat ilhos de I nt erface
SX8 Fora de uso
SX9 Relacionam ent os ent re t abelas
SXA Past as cadast rais apont adas no SX3
SXB Consult a por m eio da t ecla F3 ( Consult a Padrão)
SXD Cont role do Schedule de pr ocessos
SXE Seqüência de docum ent os ( + 1)
SXF Seqüência de docum ent os ( Pr óxim o)
SXG Tam anho padrão para cam pos apont ado pelo SX3
SXK Respost a de Pergunt as ( SX1) por usuários
SXO Cont role de LOGs por t abela
SXP Hist órico de Logs cadast rados no SXO
Cadast r o de filt ros int eligent es da m br ow se ( cont ém as
SXQ inform ações necessárias para a criação do filt ro) .
Cadast r o de r elacionam ent o ent r e pr ogram a x filt ro
SXR ( ut ilizada int ernam ent e pelo Pr ot heus para verificar em
quais program as os filt ros poderão ser ut ilizados) .
- 98 -
Am b ie n t e s e t a be la s
Na aplicação PROTHEUS as t abelas de dados podem t er um a est rut ura m ais sim ples e
econôm ica, com t abelas em DBF/ ADS, do fabricant e Ext ended Syst em ou CTREE do fabricant e
FAI RCOM ou um a est rut ura m ais robust a e com plexa, em bases SQL ( SQLSERVER da
Microsoft , ORACLE, DB I I da I BM, SYBASE, MYSQL, POSTGREE, et c.) .
Para perm it ir um a ut ilização adequada das t abelas de dados do sist em a por cada um dos
am bient es da aplicação ERP, as t abelas foram divididas em grupos denom inados “ fam ílias” .
Cada m ódulo pode ut ilizar um a ou m ais fam ílias de t abelas especificas para suas at ividades, e
ainda com part ilhar inform ações com out r os m ódulos at ravés de fam ílias com uns a t odas as
operações realizadas no sist em a.
A t abela a seguir dem onst ra alguns dos m ódulos que com põe a aplicação ERP PROTHEUS
at ualm ent e:
Am b ie n t e I de n t if ica çã o
SI GAATF ATI VO FI XO
SI GACOM COMPRAS
SI GACON CONTABI LI DADE
SI GAEST ESTOQUE E CUSTOS
SI GAFAT FATURAMENTO
SI GAFI N FI NANCEI RO
SI GAFI S LI VROS FI SCAI S
SI GAPCP PLANEJAMENTO E CONTROLE DA PRODUÇÃO
SI GAGPE GESTÃO DE PESSOAL
SI GAFAS FATURAMENTO DE SERVI ÇOS
SI GAVEI VEÍ CULOS
SI GALOJ CONTROLE DE LOJAS/ AUTOMAÇÃO COMERCI AL
SI GATM K CALL CENTER
SI GAOFI OFI CI NAS
SI GAPON PONTO ELETRÔNI CO
SI GAEI C EASY I MPORT CONTROL
SI GATCF TERMI NAL
SI GAM N T MANUTENÇÃO DE ATI VOS
SI GARSP RECRUTAMENTO E SELEÇÃO DE PESSOAL
SI GAQI E I NSPEÇÃO DE ENTRADA – QUALI DADE
SI GAQM T METODOLOGI A – QUALI DADE
O nom e de cada t abela no Pr ot heus é const it uído de seis dígit os, os quais são ut ilizados para
for m ar a seguint e represent ação:
F X X E E 0
- 99 -
A t abela a seguir dem onst ra algum as das principais fam ílias de t abelas ut ilizadas pela
aplicação ERP Prot heus:
- 100 -
Cada t abela do sist em a possui seus índices definidos no arquivo de configuração SI X, o qual
pode ser at ualizado at ravés do m ódulo Configurador.
Os arquivos de índices das t abelas de sist em a serão criados de acordo com o banco de dados
ut ilizado ( I SAM ou conexão via TOPCONNECT) .
Para bancos de dados I SAM, será gerados arquivos com a m esm a nom enclat ura da t abela de
dados, m as com um a ext ensão difer enciada ( at ualm ent e .CDX) . No caso da ut ilização de um
banco de dados, cada índice será um a num er ação seqüencial em função do nom e da t abela
original.
As especificações das chaves de índices de cada um das t abelas est á disponível no arquivo de
sist em a SI X, e a chave única da t abela ut ilizada para banco de dados est á descrit a na t abela
SX2.
Menus
Cada m ódulo da aplicação ERP possui um m enu padrão com t odas as funcionalidades
disponíveis para o am bient e, m enu est e definido at ravés de sint axe XML ( arquivos .XNU) .
Os m enus possuem um a est rut ura padrão que perm it e ao usuário localizar e ident ificar
facilm ent e cada um a das funcionalidades ofer ecidas pelo am bient e.
Para ex ecut ar o m ódulo Configurador é necessário que a aplicação Pr ot heus Serv er est ej a em
ex ecução e at rav és da aplicação Prot heus Rem ot e deverá ser inform ada com o program a inicial
a opção SI GACFG.
- 101 -
- 102 -
- 103 -
A flexibilidade de um sist em a, ou sej a, sua capacidade de adapt ar- se ( polim orfism o, aquele
que assum e várias form as) é um a das m ais im port ant es caract eríst icas de um a solução ERP.
O Configurador é o program a básico para o pr ocesso de cust om ização do Prot heus at ravés da
alt eração das t abelas da fam ília SX. Neles, o usuário ou o analist a de suport e r esponsável pela
im plant ação configura as inform ações que ser ão ut ilizadas pelos dem ais am bient es do sist em a.
Essas inform ações vão de sim ples parâm et ros at é com plexas expr essões e com andos que são
int erpr et adas em t em po de ex ecução.
- 104 -
A idéia do Dicionário de Dados é perm it ir que o usuário possa incluir ou inibir cam pos, ou
m esm o alt erar as pr opriedades dos cam pos exist ent es. Pode, ainda, criar novas t abelas. Ou
sej a, os pr ogram as ao invés de t erem os cam pos definidos em seu código original, lêem o
Dicionário em t em po de ex ecução, m ont ando ar rays com as pr opriedades de cada um . A part ir
daí, sua ut ilização é norm al, at ravés do uso de funções do ADVPL que t ornam o t rabalho do
desenvolvedor t ranspar ent e a est a arquit et ura.
O obj et ivo do Dicionário de Dados é perm it ir que o pr óprio usuário crie novas t abelas ou alt ere
os cam pos nas t abelas exist ent es quant o ao seu uso, sua ordem de apresent ação, legenda
( nos t r ês idiom as) , validação, help, obrigat oriedade de pr eenchim ent o, inicialização et c.
Pr oce d im e n t o
2. Após a seleção da opção Dicionário de Dados serão exibidas as t abelas j á cadast r adas
no arquivo de sist em a SX2.
- 105 -
3. Após a visualização das t abelas j á cadast radas no SX2 da em presa selecionada, ut ilize o
bot ão I ncluir ( ) . Ao ut ilizar est a opção será exibida a t ela para definição dos dados
referent es à nova t abela que será criada:
- 106 -
4. Realize o preenchim ent o das inform ações solicit adas de acordo com as orient ações a
seguir, e ao t érm ino confirm e o cadast ram ent o da nova t abela com o bot ão Confirm ar
( ).
Or ie n t a çõe s p a r a o ca da st r a m e n t o d e u m a n ova t a be la
O dom ínio SZ1 at é SZZ ( considerando t odos os núm er o e t odas as let ras no últ im o
byt e) é r eser vado par a dados ex clusivos do usuário pois esse int er valo não será
ut ilizado pelo sist em a. Caso sej a necessário o dom ínio Z00 a ZZZ t am bém pode ser
em pr egado para desenv olvim ent os específicos do client e.
O nom e da t abela é pr eenchido aut om at icam ent e, adicionando 990. Esse dado r efer e-
se à em pr esa 99 ( Test e Mat riz) a qual est á sendo adicionado à t abela.
O Pat h refer e- se à past a que cont erá efet ivam ent e os dados das t abelas, quando I SAM,
nas versões com banco de dados r elacional não são ut ilizadas. Essa past a será criada
dent ro da past a indicada na configuração do sist em a com o ROOTTPATH.
O m odo de acesso com part ilhado indica que o sist em a possibilit ará o uso sim ult âneo da
t abela por duas ou m ais filiais. Se for com part ilhado o cam po Filial fica em branco. Se
for exclusivo, grava- se o código da filial at iva e som ent e ela t em acesso ao r egist ro.
Após a confirm ação, a t abela criada passa a fazer part e do cadast r o do Dicionário de
Dados, cont endo som ent e o cam po FI LI AL, o qual é criado com o padrão pela
- 107 -
Pr oce d im e n t o
2. Após a seleção da opção Dicionário de Dados serão exibidas as t abelas j á cadast r adas
no arquivo de sist em a SX2.
Figu r a : Con j u n t o de t a be la s j á ca d a st r a da s n o SX 2
3. Após a visualização das t abelas j á cadast radas no SX2 da em presa selecionada, localize
e selecione a t abela que será at ualizada, e ut ilize o bot ão Edit ar ( ) . Ao ut ilizar est a
opção ser á exibida a t ela de m anut enção de cam pos da t abela selecionada:
- 108 -
4. Selecione a opção Cam pos ( ) , para que sej am exibidos os cam pos
disponíveis para a t abela no arquivo de sist em a SX3.
- 109 -
opção I ncluir ( ) . Ao ut ilizar est a opção será exibida a t ela para definição dos dados
referent es ao novo cam po que será criado:
5. Realize o preenchim ent o das inform ações solicit adas de acordo com as orient ações a
seguir, e ao t érm ino confirm e o cadast ram ent o do nov o cam po par a a t abela com o
bot ão Confirm ar ( ).
- 110 -
Tipo do ca m po: I ndica se é caract er e, num érico, lógico, dat a ou m em o. É claro que a
m udança do t ipo de cam po deve ser feit a com m uit o cuidado, pois, se t iverm os um
cam po num érico usado em cálculos e ele for alt erado para caract er e, cert am ent e
t er em os um er r o.
Ta m a n h o do ca m po: Tam bém aqui é necessário cert o cuidado ao alt erá- lo, pois
poderem os t er t runcam ent os em relat órios e consult as em que há espaço para
cont eúdos m aior es que o original.
For m a t o de e d içã o: Define com o o cam po aparece nas t elas e nos relat órios.
Con t e x t o: Pode ser r eal ou virt ual. O cont ext o virt ual cria o cam po som ent e na
m em ória e não na t abela arm azenada no disco. I sso é necessário porque os
program as de cadast ram ent o e de consult a genérica apresent am som ent e um a t abela
de cada vez. Assim , se quiserm os apresent ar um cam po de um a out ra t abela, ou
m esm o o result ado de um cálculo, sem que t al inform ação ocupe espaço físico no HD,
ut ilizam os o cont ext o virt ual. Cam pos virt uais norm alm ent e são alim ent ados por
gat ilhos.
Pr opr ie da d e : I ndica se um cam po pode ou não ser alt erado pelo usuário. Ex em plo:
saldos nor m alm ent e não podem , pois quem cuida dessa t ar efa são os program as.
2. Dem ais caract eríst icas que devem ser observadas na configuração do cam po:
Gu ia : Ca m po
O cam po Decim al será solicit ado som ent e para os cam pos de t ipo num érico.
O form at o “ ! ” indica que o caract ere será sem pre m aiúsculo, independent e da ação
do usuário. O form at o “ @! ” indica que essa caract eríst ica est ende- se por t odo 2
o0
cam po.
O cont ext o r eal indica que o cam po exist irá efet ivam ent e no banco de dados e o
cont ext o virt ual significa que o cam po exist irá apenas no dicionário de dados e não
fisicam ent e.
A propriedade alt erar indica que o cam po pode ser alt erado.
Nest a j anela, os dados est ão classificados em seis past as com obj et ivos de
preenchim ent o bem específicos:
- 111 -
Tít u lo: É a legenda que apar ece nas t elas/ relat órios. Há inclusive t r ês cam pos para
est a finalidade: em port uguês, espanhol e inglês. Est a pr opriedade pode ser alt erada à
vont ade, pois não int erfer e em nenhum processam ent o.
D e scr içã o e H e lp : São propriedades que obj et ivam docum ent ar o cam po.
Gu ia : Opçõe s
Gu ia : Va lida çõe s
Todas as validações inform adas serão ex ecut adas no m om ent o do pr eenchim ent o do
próprio cam po. Um a validação pode ser um a expressão lógica ou um a função de
usuário que r et orna um valor lógico Verdadeiro ou Falso. O sist em a só perm it irá o
avanço para o pr óxim o cam po quando o respect ivo preenchim ent o r esult ar Verdadeiro
sej a na expressão ou no r et orno da função.
Gu ia : Uso
Gu ia : M ódulos
- 112 -
Conform e m encionado ant eriorm ent e, no am bient e Prot heus um a t abela pode t er vários
índices, os quais serão gerados de acordo com o banco de dados configurado para o sist em a.
Os índices do sist em a auxiliam na seleção e obt enção de inform ações da base de dados além
de det er m inar a ordem de apr esent ação dos r egist ros de um a t abela em consult as e r elat órios.
Pr oce d im e n t o
2. Após a seleção da opção Dicionário de Dados serão exibidas as t abelas j á cadast r adas
no arquivo de sist em a SX2.
Figu r a : Con j u n t o de t a be la s j á ca d a st r a da s n o SX 2
3. Após a visualização das t abelas j á cadast radas no SX2 da em presa selecionada, localize
e selecione a t abela que será at ualizada, e ut ilize o bot ão Edit ar ( ) . Ao ut ilizar est a
opção ser á exibida a t ela de m anut enção de cam pos da t abela selecionada:
- 113 -
5. Após a visualização dos índices j á cadast rados no SI X para a t abela selecionada, ut ilize
a opção I ncluir ( ) . Ao ut ilizar est a opção será exibida a t ela para definição dos
dados refer ent es ao nov o índice que será criado:
- 114 -
6. Realize o preenchim ent o das inform ações solicit adas de acordo com as orient ações a
seguir, e ao t érm ino confirm e o cadast ram ent o do novo índice para a t abela com o bot ão
Confirm ar ( ).
- 115 -
O N ick n a m e é um a ident ificação com plem ent ar do índice o qual pode ser ut ilizada para
auxiliar o desenv olvedor na ut ilização dest a or dem em um a aplicação, a qual pode ser
padrão do sist em a ou específica de um client e.
Para selecionar os cam pos j á cadast rados na t abela, pode ser ut ilizado o bot ão Cam pos
O cam po r elat ivo à filial sem pre faz part e dos índices, com ex ceção do SM2, para que
os r egist ros nas t abelas est ej am agrupados por filiais, independent e dest a t abela ser
com part ilhada ent re as filiais.
Pr oce d im e n t o
2. Após a seleção da opção Gat ilhos serão exibidos os it ens j á cadast radas no arquivo de
sist em a SX7.
- 116 -
4. Realize o preenchim ent o das inform ações solicit adas de acordo com as orient ações a
seguir, e ao t érm ino confirm e o cadast ram ent o do nov o gat ilho de sit em a com o bot ão
Confirm ar ( ).
Pode hav er vários gat ilhos para o m esm o cam po. A ordem de ex ecução é det erm inada
pelo cam po Seqüência.
Os t ipos do Gat ilho Prim ário, Est rangeiro e de Posicionam ent o definem se o Cont ra
Dom ínio é um cam po da m esm a t abela, de out ra t abela ou se o gat ilho deve realizar
um posicionam ent o, respect ivam ent e.
A regra pode ser um a expr essão que r esult a em um v alor a ser preenchido no Cont ra
Dom ínio.
O posicionam ent o igual a Sim indica que será execut ado um com ando de busca do
regist ro de acordo com a chav e indicada.
O Alias, a Ordem e a Chave descr ev em a t abela envolvida no gat ilho, seu índice e a
chave para que a funcionalidade se posicione no r egist ro adequado.
- 117 -
Pr oce d im e n t o
1. Para adicionar um a t abela genérica, selecione os m enus Am bient e, Cadast ros, Tabelas.
2. Após a seleção da opção Tabelas serão exibidos os it ens j á cadast r adas no arquivo de
sist em a SX5.
3. Após a visualização das t abelas j á cadast rados no SX5 da em presa selecionada, ut ilize o
- 118 -
Confirm ar ( ).
9 .4 .7 . Cr ia çã o de Pa r â m e t r os
Pr oce d im e n t o
1. Para adicionar um Parâm et r o, selecione os m enus Am bient e, Cadast ros, Parâm et r os.
2. Após a seleção da opção Tabelas serão exibidos os it ens j á cadast r adas no arquivo de
sist em a SX6.
- 119 -
4. Realize o preenchim ent o das inform ações solicit adas de acordo com as orient ações a
seguir, e ao t érm ino confirm e o cadast ram ent o do nov o Parâm et ro do sist em a com o
bot ão Confirm ar ( ).
- 120 -
A fer ram ent a TOTVS Developm ent St udio é um program a que faz part e do Prot heus e perm it e
o t rabalho de edição, com pilação e depuração de pr ogram as escrit os em ADVPL.
Pr oj e t o
Um program a para ser com pilado deve ser vinculado a um proj et o. Norm alm ent e, pr ogr am as
que fazem part e de um det erm inado m ódulo ou am bient e est ão em um m esm o proj et o.
A vinculação dos progr am as a um pr oj et o é feit a por m eio dos arquivos do t ipo PRW. Na
verdade, um proj et o pode ser const it uído de um ou m ais arquivos dest e t ipo, que por sua vez,
podem t er um a ou m ais funções, conform e ilust ra o diagram a a seguir:
Figu r a : Re p r e se n t a çã o d a e st r u t u r a de u m pr oj e t o n o D EV- St u d io
- 121 -
Um a vez adicionado a um proj et o e com pilado sem incidências de err os de código, o obj et o
result ant e será cadast rado no RPO ( Reposit ório de Obj et os) e poderá ser ut ilizado pela
aplicação ERP.
A com pilação dos it ens de um pr oj et o pode ser realizada individualm ent e, por grupo de font es
( past as) ou ainda selecionando- o int eiram ent e. Cada um a dos font es será pr ocessado e
com pilado separadam ent e, perm it indo a visualização do pr ogr esso da operação e das
m ensagens de aviso ( w arnings) ou er ros ( crit ical err or s) na guia Mensagens.
Ex e cuçã o
Para que os obj et os com pilados e disponíveis n RPO sej am ut ilizados, dev em ser obser vadas as
seguint es r egras:
Se o pr ogram a não m anipula arquivos, pode- se cham á- lo diret am ent e do DEV- St udio
( nom e no lado direit o da barr a de fer ram ent as) ;
Não se pode com pilar um program a com o Rem ot e e o Monit or abert os, t enha est e
finalizado ou não por er ro.
An á lise e de pu r a çã o de e r r os
Para ident ificar as causas de err os, a ferram ent a DEV- St udio possui diversos r ecursos que
auxiliam o DEBUG.
A ação de DEBUG necessit a que o program a sej a execut ado a part ir do DEV- St udio, sendo
necessário observar as seguint es r egras:
Ex ecut ar a r ot ina at ravés do DEV- St udio, selecionando seu nom e dir et am ent e, ou o
m ódulo que cont ém a opção ou a ação que irá ex ecut á- la;
A part ir do m om ent o em que o DEV- St udio pausar o processam ent o em um dos pont os
de parada especificados previam ent e podem ser ut ilizadas as j anelas de visualização
disponíveis no DEV- St udio, que são:
Variáveis Locais
Variáveis Privat es
Variáveis Public’s
Variáveis St at ic’s
Janela da Wat ch’s
Janela de Tabelas e Cam pos
Pilha de Cham adas
At ravés da Janela de Wat ch’s é possível det erm inar quais variáveis dev em ser exibidas;
- 122 -
Ao parar pode- se ou cont inuar o program a at é o próxim o pont o de parada, caso haj a
um out ro definido, ou execut ar linha a linha da rot ina.
I n t e r fa ce da a plica çã o
Por ser um am bient e int egrado de desenv olvim ent o, o DEV- St udio propor ciona t odas essas
facilidades, por m eio de int erface única com o ilust ra a figura a seguir:
O DEV- St udio apresent a, no t opo da t ela, um conj unt o de opções de m enu e um a série
de bot ões que facilit am a sua m anipulação.
Na t ela cent r al, é apr esent ado o código das funções em ADVPL. Na part e inferior são
exibidas algum as past as que facilit am a ex ecução de com andos, exibição de cont eúdos
de variáveis e m ensagens, bem com o dados sobre o proj et o.
- 123 -
Com o a linguagem ADVPL é ut ilizada no desenvolvim ent o de aplicação para o sist em a ERP
Prot heus, ela dev e possuir recursos que per m it am o acesso e a m anipulação de inform ações
independent em ent e da base de dados para o qual o sist em a foi configurado.
Dest a form a a linguagem possui dois grupos de funções dist int os para at uar com os bancos de
dados:
As funções de m anipulação de dados dit as com o genéricas per m it em que um a aplicação ADVPL
sej a escrit a da m esm a for m a, independent e se a base de dados configurada para o sist em a
ERP for do t ipo I SAM ou padrão SQL.
Muit as dest as funções foram inicialm ent e herdadas da linguagem CLI PPER, e m ediant e novas
im plem ent ações da ár ea de Tecnologia da Microsiga foram m elhoradas e adequadas às
necessidades do ERP. Por est a razão é possível encont rar em docum ent ações da linguagem
CLI PPER inform ações sobre funções de m anipulação de dados ut ilizadas na fer ram ent a ERP.
Dent r e as m elhorias im plem ent adas pela área de Tecnologia da Microsiga, podem os m encionar
o desenv olvim ent o de novas funções com o por ex em plo a função MsSeek( ) - versão da
Microsiga para a função DbSeek( ) , e a int egração ent re a sint axe ADVPL convencional e a
ferram ent a de acesso a bancos de dados no padrão SQL – TOPCONNECT ( DbAcess) .
A int egração ent r e a aplicação ERP e a ferram ent a TOPCONNECT perm it e que as funções de
acesso e m anipulação de dados escrit as em ADVPL sej am int erpret adas e conv ert idas par a
um a sint axe com pat ível com o padrão SQL ANSI e dest a form a aplicadas aos SGDBs ( Sist em as
Gerenciadores de Bancos de Dados) com sua sint axe nat iva.
Para im plem ent ar um acesso m ais ot im izado e disponibilizar no am bient e ERP funcionalidades
que ut ilizem de form a m ais adequada os recursos dos SGDBs hom ologados para o sist em a,
foram im plem ent adas funções de acesso e m anipulação de dados específicas para am bient es
TOPCONNECT/ DBACCESS.
Est as funções perm it em que o desenv olvedor ADVPL ex ecut e com andos em sint axe SQL
diret am ent e de um código font e da aplicação, disponibilizando recursos com o ex ecução de
queries de consult a, cham adas de pr ocedur es e com unicação com out ros bancos de dados
at ravés de ODBCs.
- 124 -
Com o a aplicação ERP pode ser configurada para ut ilizar diferent es t ipos de bases de dados é
im port ant e m encionar as principais diferenças ent re est es r ecursos, o que pode det erm inar a
for m a com o o desenv olvedor irá opt ar por escr ev er sua aplicação.
No acesso a inform ações em bases de dados do padrão I SAM são sem pre lidos os regist r os
int eiros, enquant o no SQL pode- se ler apenas os cam pos necessários naquele processam ent o.
O acesso diret o é feit o at ravés de índices que são t abelas paralelas às t abelas de dados e que
cont êm a chav e e o ender eço do r egist ro, de form a análoga ao índice de um livro. Para cada
chave, é criado um índice próprio.
Nas bases de dados padrão I SAM os índices são arm azenados em um único arquivo do t ipo
CDX, j á nos bancos de dados padrão SQL cada índice é criado com um a num eração seqüencial
t endo com o base o nom e da t abela ao qual ele est á relacionado.
A cada inclusão ou alt eração de um r egist r o t odos os índices são at ualizados, t ornando
necessário planej ar adequadam ent e quais e quant os índices serão definidos para um a t abela,
pois um a quant idade ex cessiva pode com pr om et er o desem penho dest as operações.
Nas bases de dados padrão I SAM, cada r egist ro possui um ident ificador nat ivo ou I D
seqüencial e ascendent e que funciona com o o endereço base daquela inform ação.
I st o ocorr e nas bases de dados I SAM devido ao conceit o de exclusão lógica de regist ros que as
m esm as possuem . Já os bancos de dados padr ão SQL nat ivam ent e ut ilizam apenas o conceit o
de exclusão física de r egist ros, o que para out ras aplicações seria t ransparent e, m as não é o
caso do ERP Prot heus.
Para m ant er a com pat ibilidade das aplicações desenv olvidas para bases de dados padrão
I SAM, a área de Tecnologia e Banco de Dados da Microsiga im plem ent ou nos bancos de dados
padrão SQL o conceit o de exclusão lógica de regist ros exist ent e nas bases de dados I SAM
at ravés da criação de cam pos de cont r ole específicos: R_E_C_N_O_, D_E_L_E_T_ e
R_E_C_D_E_L.
Est es cam pos perm it em que a aplicação ERP ger encie as inform ações do banco de dados da
m esm a form a que as inform ações em bases de dados I SAM.
- 125 -
Para a aplicação ERP Prot heus o cam po de cont r ole R_E_C_N_O_ é definido em t odas as
t abelas com o sendo sua chave prim ária, o que t ransfere o cont r ole de sua num eração
seqüencial ao banco de dados.
O cam po D_E_L_E_T_ é t rat ado int ernam ent e pela aplicação ERP com o um “ flag” ou m arca de
exclusão. Dest a form a os r egist ros que est iver em com est e cam po m arcado serão
considerados com o ex cluídos logicam ent e. A execução do com ando PACK em um a t abela de
um banco de dados padrão SQL visa excluir fisicam ent e os regist r os com o cam po D_E_L_E_T_
m arcado, m as não causará o efeit o de r enum eração de RECNO ( no caso R_E_C_N_O_) que
ocor re nas t abela de bases de dados I SAM.
Dent r e as funções ADVPL disponíveis para acesso e m anipulação de inform ações, est e m at erial
irá det alhar as seguint es opções:
SELECT( )
D BSELECTAREA( )
D BSETORD ER( )
D BSEEK( ) E M SSEEK( )
D BSKI P( )
D BGOTO( )
D BGOTOP( )
D BGOBOTTON ( )
D BSETFI LTER( )
RECLOCK( )
SOFTLOCK( )
M SUN LOCK( )
D BD ELETE( )
D BUSEAREA( )
D BCLOSEAREA( )
- 126 -
D BCLOSEAREA( )
Sin t a x e D bClose Ar e a ( )
Per m it e que um alias present e na conexão sej a fechado, o que viabiliza seu
reuso em out r o operação. Est e com ando t em efeit o apenas no alias at ivo na
D e scr içã o
conexão, sendo necessária sua ut ilização em conj unt o com o com ando
DbSelect Ar ea( ) .
D BCOM M I T( )
Sin t a x e D BCOM M I T( )
D BCOM M I TALL( )
D BD ELETE( )
Sin t a x e D bD e le t e ( )
Efet ua a exclusão lógica do regist ro posicionado na ár ea de t rabalho at iva,
D e scr içã o sendo necessária sua ut ilização em conj unt o com as funções RecLock( ) e
MsUnLock( ) .
D BGOTO( )
Sin t a x e D bGot o( n Re cn o)
Mov e o cursor da ár ea de t rabalho at iva para o record num ber ( r ecno)
D e scr içã o especificado, r ealizando um posicionam ent o diret o, sem a necessidade um a
busca ( seek) pr évio.
- 127 -
Sin t a x e D bGoTop( )
D e scr içã o Mov e o cursor da ár ea de t rabalho at iva para o prim eiro r egist ro lógico.
D BGOBOTTON ( )
Sin t a x e D bGoBot t on ( )
D e scr içã o Mov e o cursor da ár ea de t rabalho at iva para o últ im o regist r o lógico.
D BRLOCKLI ST( )
D BSEEK( ) E M SSEEK( )
D BSKI P( )
D BSELECTAREA( )
- 128 -
D BSETORD ER( )
Sin t a x e D bSe t Or de r ( n Or d e m )
Define qual índice será ut ilizada pela área de t rabalho at iva, ou sej a, pela
área pr eviam ent e selecionada at rav és do com ando DbSelect Ar ea( ) . As
D e scr içã o
ordens disponíveis no am bient e Prot heus são aquelas definidas no SI NDEX
/ SI X, ou as ordens disponibilizadas por m eio de índices t em porários.
D BUN LOCK( )
D BUN LOCKALL( )
D BUSEAREA( )
M SUN LOCK( )
- 129 -
RLOCK( )
D e scr içã o Efet ua o t ravam ent o do regist ro posicionado na área de t rabalho at iva.
SELECT( )
Sin t a x e Se le ct ( cAr e a )
Det erm ina o núm er o de referência de um det erm inado alias em um
am bient e de t r abalho. Caso o alias especificado não est ej a em uso no
D e scr içã o
am bient e, será r et ornado o valor 0 ( zero) .
SOFTLOCK( )
UN LOCK( )
Sin t a x e UN LOCK( )
Libera o t ravam ent o do regist ro posicionado na área de t rabalho at iva e
D e scr içã o
confirm a as at ualizações efet uadas naquele r egist ro.
- 130 -
Para especificar qual dev e ser o elem ent o referenciado, deve- se ut ilizar o operador de
ident ificação de apelido ( - > ) e um dos dois ident ificadores de r efer ência, MEMVAR ou FI ELD.
Est a linha de com ando ident ifica que o valor at ribuído à variável cRes dev e ser o valor da
variável de m em ória cham ada NOME.
Nest e caso, o valor at ribuído à variável cRes será o valor do cam po NOME exist ent e no arquivo
ou t abela abert o na ár ea at ual.
O ident ificador FI ELD pode ser subst it uído pelo apelido de um arquivo ou t abela abert o, par a
evit ar a necessidade de selecionar a ár ea ant es de acessar o cont eúdo de t erm inado cam po.
As t abelas de dados ut ilizadas pela aplicação ERP recebem aut om at icam ent e do sist em a o
apelido ou ALI AS especificado para as m esm as no arquivo de sist em a SX2. Assim se o cam po
NOME pert ence a um a t abela da aplicação PROTHEUS, o m esm o poder á ser r efer enciado com a
indicação do ALI AS pr é- definido dest a t abela.
Para m aiores det alhes sobr e abert ura de arquivos com at ribuição de apelidos,
consult e a docum ent ação sobre acesso a banco de dados ou a docum ent ação
da função dbUseAr ea( ) .
Os alias das t abelas da aplicação ERP são padronizados em t r ês let ras, que
corr espondem as iniciais da t abela. As configurações de cada ALI AS ut ilizado
pelo sist em a podem ser visualizadas at ravés do m ódulo Configurador - >
Bases de Dados - > Dicionários - > Bases de Dados.
- 131 -
Alguns cam pos de num eração do Pr ot heus são fornecidos pelo sist em a em ordem ascendent e.
É o caso, por exem plo, do núm ero do pedido de venda e out ros que serv em com o ident ificador
das inform ações das t abelas. É pr eciso t er um cont r ole do fornecim ent o desses núm er os, em
especial quando vários usuários est ão t rabalhando sim ult aneam ent e.
Os cam pos que r ecebem o t rat am ent o de num eração seqüencial pela
aplicação ERP não devem ser considerados com o chav e prim ária das t abelas
aos quais est ão vinculados.
Se m á for os
Para definir o conceit o do que é um sem áforo de num eração dev e- se avaliar a seguint e
seqüência de event os no sist em a:
Com isso, m esm o que t enham os vários pr ocessos solicit ando num erações seqüenciais para
um a m esm a t abela, com o por ex em plo inclusões sim ult âneas de pedidos de vendas, t er em os
para cada pedido um núm er o ex clusivos e sem o int ervalos e num erações não ut ilizadas.
A linguagem ADVPL per m it e a ut ilização das seguint es funções para o cont r ole das num erações
seqüenciais ut ilizadas nas t abelas da aplicação ERP:
GETSXEN UM ( )
CON FI RM SXE( )
ROLLBACKSXE( )
GETSXEN UM ( )
- 132 -
D e scr içã o Confirm a o núm er o alocado at ravés do últ im o com ando GETSXENUM( ) .
ROLLBACKSXE( )
Sin t a x e ROLLBACKSXE( )
Descart a o núm er o fornecido pelo últ im o com ando GETSXENUM( ) ,
D e scr içã o
ret ornando a num eração disponível para out ras conex ões.
Nest e t ópico serão abordas as for m as pelas quais a aplicação ERP Pr ot heus pode ser
cust om izada com a ut ilização da linguagem ADVPL.
- 133 -
As funções de validação t êm com o caract eríst ica fundam ent al um ret orno do t ipo lógico, ou
sej a, um cont eúdo .T. – Verdadeiro ou .F. – Falso.
Com base nest a pr em issa, a ut ilização de validações no Dicionário de Dados ( SX3) ou nas
Pergunt as de Pr ocessos e Relat órios ( SX1) deverá focar sem pre na ut ilização de funções ou
expr essões que r esult em em um r et orno lógico.
Dent r e as funções que a linguagem ADVPL em conj unt o com os r ecur sos desenv olvidos pela
aplicação ERP para validação de cam pos e pergunt as serão det alhadas:
VAZI O( )
N AOVAZI O( )
EXI STCPO( )
EXI STCH AV( )
PERTEN CE( )
POSI TI VO( )
N EGATI VO( )
TEXTO( )
- 134 -
N AOVAZI O( )
Sin t a x e N a oV a z io( )
Ret orna .T. ou .F. se o cont eúdo do cam po posicionado no m om ent o não
D e scr içã o
est á vazio.
N EGATI VO( )
Sin t a x e N e ga t iv o( )
D e scr içã o Ret orna .T. ou .F. se o cont eúdo digit ado para o cam po é negat ivo.
PERTEN CE( )
Sin t a x e Pe r t e n ce ( cSt r in g)
Ret orna .T. ou .F. se o cont eúdo digit ado para o cam po est á cont ido na
st ring definida com o parâm et ro da função. Nor m alm ent e ut ilizada em
D e scr içã o
cam pos com a opção de com bo, pois caso cont rário seria ut ilizada a função
Exist Cpo( ) .
POSI TI VO( )
D e scr içã o Ret orna .T. ou .F. se o cont eúdo digit ado para o cam po é posit ivo.
TEXTO( )
Sin t a x e Te x t o( )
Ret orna .T. ou .F. se o cont eúdo digit ado para o cam po cont ém apenas
D e scr içã o
núm eros ou alfanum éricos.
VAZI O( )
Sin t a x e Va z io( )
Ret orna .T. ou .F. se o cont eúdo do cam po posicionado no m om ent o est á
D e scr içã o
vazio.
- 135 -
Com base na docum ent ação disponível no DEM – Docum ent ação Elet r ônica Microsiga, a
linguagem ADVPL e a aplicação ERP Prot heus adm it em as seguint es pict ures:
Fu n çõe s
Con t e ú do Fu n cion a lid a de
A Per m it e apenas caract er es alfabét icos.
C Exibe CR depois de núm er os posit ivos.
E Exibe num érico com o pont o e vírgula invert idos ( form at o Eur opeu) .
R I nser e caract eres diferent es dos caract er es de t em plat e na exibição, m as não os
insere na variável do GET.
S< n > Per m it e rolam ent o horizont al do t ext o dent ro do GET, < n> é um núm er o int eiro
que ident ifica o t am anho da região.
X Exibe DB depois de núm er os negat ivos.
Z Exibe zeros com o br ancos.
( Exibe núm eros negat ivos ent re par ênt eses com os espaços em branco iniciais.
) Exibe núm eros negat ivos ent re par ênt eses sem os espaços em branco iniciais.
! Convert e caract er es alfabét icos para m aiúsculo.
Te m pla t e s
Con t e ú do Fu n cion a lid a de
X Per m it e qualquer caract er e.
9 Per m it e apenas dígit os para qualquer t ipo de dado, incluindo o sinal para
num éricos.
# Per m it e dígit os, sinais e espaços em branco par a qualquer t ipo de dado.
! Convert e caract er es alfabét icos para m aiúsculo.
* Exibe um ast erisco no lugar dos espaços em br anco iniciais em núm er os.
. Exibe o pont o decim al.
, Exibe a posição do m ilhar.
A1_NOME – Caract er - 40
Pict ure: @!
- 136 -
Fu n çõe s
Con t e ú do Fu n cion a lid a de
C Exibe CR depois de núm er os posit ivos
E Exibe num érico com o pont o e a vírgula invert idos ( form at o Eur opeu)
R I nser e caract er es diferent es dos caract eres de t em plat e
X Exibe DB depois de núm er os negat ivos
Z Exibe zeros com o br ancos
( Envolve núm er os negat ivos ent r e par ênt eses
! Convert e t odos os caract er es alfabét icos para m aiúsculo
Te m pla t e s
Con t e ú do Fu n cion a lid a de
X Exibe dígit os para qualquer t ipo de dado
9 Exibe dígit os para qualquer t ipo de dado
# Exibe dígit os para qualquer t ipo de dado
! Convert e caract er es alfabét icos para m aiúsculo
* Exibe ast erisco no lugar de espaços em branco inicias em núm er os
. Exibe a posição do pont o decim al
, Exibe a posição do m ilhar
- 137 -
A aplicação ERP ut iliza o r ecur so de gat ilhos em cam po com a finalidade de auxiliar o usuário
no pr eenchim ent o de infor m ações durant e a digit ação de inform ações. As funções que podem
ser ut ilizadas no gat ilho est ão diret am ent e r elacionadas a definição da expr essão de ret orno
que será execut ada na avaliação do gat ilho do cam po.
As regras que dev em ser obser vadas na m ont agem de um gat ilho e configuração de seu
ret orno são:
Na definição da chave de busca do gat ilho dev e ser avaliada qual filial deverá ser
ut ilizada com o part e da chave: a filial da t abela de origem do gat ilho ou a filial da
t abela que será consult ada. O que norm alm ent e det erm ina a filial que será ut ilizada
com o part e da chav e é j ust am ent e a inform ação que será consult ada, aonde:
o Consult as de inform ações ent r e t abelas com est rut ura de cabeçalho e it ens
dev em ut ilizar a filial da t abela de origem , pois am bas as t abelas dev em possuir
o m esm o t rat am ent o de filial ( com part ilhado ou ex clusivo) .
Ex e m plos:
Ex e m plos:
Ex e m plos:
Na definição da regra de r et orno dev e ser considerado o t ipo do cam po que será
at ualizado, pois é est e cam po que det erm ina qual t ipo do r et orno será considerado
válido para o gat ilho.
- 138 -
I nt erpr et ação do cont eúdo do parâm et r o: diver sos parâm et r os do sist em a t êm seu
cont eúdo m acr o ex ecut ado durant e a execução de um a r ot ina do ERP. Est es
parâm et ros m acr o ex ecut áveis t em com o única caract eríst ica em com um seu t ipo:
caract ere, m as não exist e nenhum ident ificador explicit o que perm it e a fácil
visualização de quais parâm et ros possuem um ret orno sim ples e de quais parâm et ros
t erão seu cont eúdo m acro ex ecut ado par a det er m inar o r et orno “ r eal” .
A única form a eficaz de avaliar com o um parâm et ro é t rat ado ( sim ples ret orno ou
m acr o ex ecução) é at r avés do código font e da rot ina, no qual deverá ser avaliado com o
é t rat ado o ret orno de um a dest as funções:
o GETM V( )
o SUPERGETM V( )
o GETN EW PAR( )
Um r et orno m acr o ex ecut ado é det erm inado at rav és do uso do operador “ &” ou de um a
das funções de execução de blocos de código em conj unt o com um a das funções cit adas
ant eriorm ent e.
1 2 .3 .1 . Funçõe s pa r a m a nipula çã o de pa r â m e t r os
A aplicação ERP disponibiliza as seguint es funções par a consult a e at ualização de parâm et ros:
GETM V( )
SUPERGETM V( )
GETN EW PAR( )
PUTM V( )
GETM V( )
- 139 -
PUTM V( )
SUPERGETM V( )
Apesar de hav er par âm et r os que perm it am a configuração de expr essões, e por conseqüência
a ut ilização de funções para definir o ret orno que será obt ido com a consult a dest e parâm et ro,
é e x pr e ssa m e n t e p r oib ido o u so de fu n çõe s e m pa r â m e t r os pa r a m a n ip u la r
in for m a çõe s d a ba se de d a dos do sist e m a .
Caso haj a a necessidade de ser im plem ent ado um t rat am ent o adicional a um processo padrão
do sist em a, o m esm o dev erá ut ilizar o r ecur so de pont o de ent r ada.
As r ot inas da aplicação ERP não prot egem a consult a de cont eúdos de parâm et r os
quant o a gravações r ealizadas dent ro ou fora de um a t ransação.
Dest a form a, quaisquer alt eração na base r ealizada por um a r ot ina configurada em um
parâm et ro pode ocasionar a perda da int egridade das inform ações do sist em a.
- 140 -
Con ce it os
Um pont o de ent rada é um a User Funct ion desenvolvida com a finalidade de int eragir com um a
rot ina padrão da aplicação ERP.
A User Funct ion deverá t er um nom e pr é- est abelecido no desenv olvim ent o da rot ina padrão do
ERP, e de acordo est a pré- disposição e o m om ent o no qual o pont o de ent rada é ex ecut ado
durant e um pr ocessam ent o, ele poderá:
Com plem ent ar as at ualizações realizadas pelo processam ent o em t abelas padrões do
ERP;
Subst it uir um processam ent o padrão do sist em a por um a regra específica do client e no
qual o m esm o ser á im plem ent ado.
Pr e m issa s e Re gr a s
Um pont o de ent rada não dev e ser ut ilizado para out ras finalidades senão para as quais
o m esm o foi pré- definido, sob pena de causar a perda da int egridade das inform ações
da base de dados ou pr ovocar event os de er r o durant e a ex ecução da r ot ina padrão.
Um pont o de ent rada dev e ser t ranspar ent e para o pr ocesso padrão, de form a que
t odas as t abelas acessadas pelo pont o de ent rada e que sej am ut ilizadas pela rot ina
padrão, deverão t er sua sit uação im ediat am ent e ant erior à execução do pont o
rest aurada ao t érm ino do m esm o, e para ist o r ecom enda- se o uso das funções
GETAREA( ) e RESTAREA( ) .
Com o um pont o de ent rada não é execut ado da form a t radicional, ou sej a, ele não é
cham ado com o um a função, ele não recebe parâm et ros. A aplicação ERP disponibiliza
um a variável de sist em a denom inada PARAMI XB, a qual recebe os parâm et r os da
função cham adora e os disponibiliza para serem ut ilizados pela rot ina cust om izada.
- 141 -
A linguagem ADVPL possui duas for m as dist int as para definição de int erfaces visuais no
am bient e ERP: sint axe conv encional, nos padr ões da linguagem CLI PPER e a sint axe orient ada
a obj et os.
Além das diferent es sint axes disponíveis para definição das int erfaces visuais o ERP Prot heus
possui funcionalidades pré- definidas, as quais j á cont êm t odos os t rat am ent os necessários a
at ender as necessidades básicas de acesso e m anut enção das inform ações do sist em a.
Nest e t ópico serão abordadas as sint axes convencionais para definição das int erfaces visuais
da linguagem ADVPL e as int erfaces de m anut enção disponíveis no am bient e ERP Pr ot heus.
A sint axe conv encional para definição de com ponent es visuais da linguagem ADVPL depende
diret am ent e no include especificado no cabeçalho do font e. Os dois includes disponíveis para o
am bient e ADVPL Pr ot heus são:
RWMAKE.CH: perm it e a ut ilização da sint axe CLI PPER na definição dos com ponent es
visuais.
Para ilust rar a diferença na ut ilização dest es dois includes, segue abaixo as diferent es
definições para o com ponent es Dialog e MsDialog:
@ 0,0 TO 400,600 DI ALOG oDlg TI TLE " Janela em sint axe Clipper"
ACTI VATE DI ALOG oDlg CENTERED
DEFI NE MSDI ALOG oDlg TI TLE " Janela em sint axe ADVPL " FROM 000,000 TO 400,600 PI XEL
ACTI VATE MSDI ALOG oDlg CENTERED
- 142 -
M SD I ALOG( )
M SGET( )
SAY( )
BUTTON ( )
SBUTTON ( )
BUTTON ( )
M SD I ALOG( )
M SGET( )
SAY( )
SBUTTON ( )
- 143 -
Abaixo segue um código com plet o de int erface, ut ilizado t odos os elem ent os da int erface visual
descrit os ant eriorm ent e:
DEFI NE MSDI ALOG oDlg TI TLE cTit ulo FROM 000,000 TO 080,300 PI XEL
@ 010,050 MSGET cCGC SI ZE 55, 11 OF oDlg PI XEL PI CTURE " @R 99.999.999/ 9999- 99" ;
VALI D ! Vazio( )
DEFI NE SBUTTON FROM 010, 120 TYPE 1 ACTI ON ( nOpca : = 1,oDlg: End( ) ) ;
ENABLE OF oDlg
DEFI NE SBUTTON FROM 020, 120 TYPE 2 ACTI ON ( nOpca : = 2,oDlg: End( ) ) ;
ENABLE OF oDlg
O código dem onst rado ant eriorm ent e é ut ilizados nos ex er cícios de fixação
dest e m at erial e dev erá produzir a seguint e int er face:
- 144 -
Os pr ogram as de at ualização de cadast ros e digit ação de m ovim ent os seguem um padrão que
se apóia no Dicionário de Dados.
Basicam ent e são duas as int erfaces quer perm it em a visualização das inform ações e a
m anipulação dos dados do sist em a.
Ax Ca da st r o
M br ow se
Am bos os m odelos ut ilizam com o pr em issa que a est rut ura da t abela a ser ut ilizada est ej a
definida no dicionário de dados do sist em a ( SX3) .
1 3 .2 .1 . Ax Ca da st r o( )
Brow se padrão para visualização das inform ações da base de dados, de acordo com as
configurações do SX3 – Dicionário de Dados ( cam po br ow se) .
Funções de pesquisa, visualização, inclusão, alt eração e exclusão padr ões para
visualização de regist r os sim ples, sem a opção de cabeçalho e it ens.
Pa r â m e t r os
Ex e m plo:
- 145 -
Brow se padrão para visualização das inform ações da base de dados, de acordo com as
configurações do SX3 – Dicionário de Dados ( cam po br ow se) .
Recur sos adicionais com o ident ificador es de st at us de regist ros, legendas e filt ros para
as inform ações.
Pa r â m e t r os
n Lin 1 , n Col1 , Coordenadas dos cant os aonde o browse será exibido. Para seguir o
n Lin 2 , n Col2 padrão da AXCADASTRO( ) use 6,1,22,75 .
Alias padrão do sist em a para ut ilização, o qual dev e est ar definido no
cAlia s
dicionário de dados – SX3.
- 146 -
Array cont endo as funções que serão execut adas pela Mbr owse.
Est e array pode ser par am et rizados com as funções básicas da
AxCadast r o conform e abaixo:
Ex e m plo:
- 147 -
1 – Pesquisar
2 – Visualizar
3 – I ncluir
4 – Alt erar
5 – Excluir
6 – Livre
- 148 -
RETURN
- 149 -
Conform e m encionado nos t ópicos sobre as int erfaces padrões AxCadast ro( ) e Mbr ow se( ) ,
exist em funções padr ões da aplicação ERP que perm it em a visualização, inclusão, alt eração e
exclusão de dados em form at o sim ples.
Est as funções são padrões na definição da int erface AxCadast ro( ) e podem ser ut ilizadas
t am bém da const rução no array aRot ina ut ilizado pela Mbr ow se( ) , as quais est ão list adas a
seguir:
AXPESQUI ( )
AX VI SUAL( )
AX I N CLUI ( )
AX ALTERA( )
AX D ELETA( )
AX ALTERA( )
AX D ELETA( )
AX I N CLUI ( )
AXPESQUI ( )
Sin t a x e AXPESQUI ( )
Função de pesquisa padrão em r egist ros exibidos pelos br owses do sist em a,
a qual posiciona o br ow se no regist ro pesquisado. Exibe um a t ela que
D e scr içã o
perm it e a seleção do índice a ser ut ilizado na pesquisa e a digit ação das
inform ações que com põe a chave de busca.
- 150 -
- 151 -
É obrigat ória a ut ilização da ident ação, pois t orna o código m uit o m ais legível. Vej a os
ex em plos abaixo:
A ut ilização da ident ação seguindo as est rut uras de cont role de fluxo ( while, if, caso et c) t orna
a com pr eensão do código m uit o m ais fácil:
Para ident ar o código ut ilize a t ecla < TAB> e na ferram ent a DEV- St udio, a qual pode ser
configurada at rav és da opção “ Pr efer ências” :
- 152 -
Um a conv enção am plam ent e ut ilizada é a de capit ular as palavras chaves, funções, variáveis e
cam pos ut ilizando um a com binação de caract er es em m aiúsculo e m inúsculo, visando facilit ar
a leit ura do código font e. O código a seguir:
Para funções de m anipulação de dados que com ecem por “ db” , a capit ulação
só será efet uada após o “ db” :
dbSe e k ( )
dbSe le ct Ar e a ( )
- 153 -
Con st a nt e s:
# define NUMLI NES 60 # define NUMPAGES 1000
Va r iá ve is de m e m ór ia :
M- > CT2_CRCONV M- > CT2_MCONVER : = CriaVar( " CT2_CONVER" )
Ca m p os:
SC6- > C6_NUMPED
Qu e r y s:
SELECT * FROM...
A not ação húngara consist e em adicionar os prefixos aos nom es de variáveis, de m odo a
facilm ent e se ident ificar seu t ipo. I st o facilit a na criação de códigos- font e ext ensos, pois
usando a Not ação Húngara, v ocê não pr ecisa ficar o t em po t odo volt ando à definição de um a
variável para se lem brar qual é o t ipo de dados que dev e ser colocado nela. Variáveis devem
t er um pr efixo de Not ação Húngara em m inúsculas, seguido de um nom e que ident ifique a
função da variável, sendo que a inicial de cada palavra dev e ser m aiúscula.
É obrigat ória a ut ilização dest a not ação para nom ear variáveis.
N ot a çã o Tipo de da do Ex e m plo
a Array aValores
b Bloco de código bSeek
c Caract er cNom e
d Dat a dDat aBase
l Lógico lCont inua
n Num érico nValor
o Obj et o oMainWindow
x I ndefinido xCont eudo
- 154 -
Funções r eserv adas são pert encent es ao com pilador e não podem ser
redefinidas por um a aplicação;
Todos os ident ificadores que com eçarem com dois ou m ais caract eres
“ _” são ut ilizados com o ident ificadores int ernos e são r eserv ados.
- 155 -
- 156 -
Desenv olver um pr ogram a que im plem ent e o algorit m o de descascar bat at as,
01
ut ilizando a est rut ura de r epet ição While, dem onst rando quant as bat at as
foram descascadas:
Desenv olver um pr ogram a que im plem ent e o algorit m o de descascar bat at as,
02
ut ilizando a est rut ura de repet ição FOR, dem onst rando quant as bat at as foram
descascadas:
Desenv olver um pr ogram a que im plem ent e o algorit m o de descascar bat at as,
03
ut ilizando a est rut ura de r epet ição FOR, dem onst rando quant as bat at as falt am
para serem descascadas:
- 157 -
Ut ilizando a int erface visual desenv olvida para o ex er cício ant erior,
07 desenvolver a função genérica Get Text o( ) , par a ser ut ilizada nas aplicações do
Jogo da Velha e Jogo da For ca.
- 158 -
Desenv olver um a r ot ina que capt ure vários CNPJs de client es inform ados pelo
usuário, e verifique para cada um deles se o m esm o exist e ou não na base de
09
dados. Ao final inform ar quais CNPJs for am infor m ados, e de acordo com a
seleção do usuário, exibir os dados principais de um dest es client es.
Desenv olver um a rot ina que, at ravés do uso de um bloco de código, convert a
11 a est rut ura da t abela SA1 obt ida com a função DBSTRUCT( ) em um a st ring
denom inada cCam po.
- 159 -
Desenv olver um a validação para um cam po específico do t ipo caract ere, cuj o
01 cont eúdo est ej a relacionado a out ra t abela, e que exiba um a m ensagem de
aviso caso o código inform ado não exist a nest a t abela relacionada.
Desenv olver um a validação para um cam po car act ere exist ent e na base, para
02 que sej a avaliado se aquele código j á exist e cadast rado, e caso posit ivo exiba
um a m ensagem de aviso alert ando dest a ocorr ência.
Desenv olver um gat ilho que r et orne um a descrição com plem ent ar para um
03 cam po vinculado ao cam po código ut ilizado nos exercícios ant eriores.
- 160 -
Prot eger a r ot ina desenvolvida no exer cício ant erior , de form a a garant ir que
na ut ilização da filial com o pr efixo do t ít ulo não irá ocorr er duplicidade de
05
dados no cont as a pagar do financeiro.
- 161 -
O ADVPL é um a ext ensão do padrão x Base de com andos e funções, operador es, est rut uras de
cont r ole de fluxo e palavras reservadas, cont ando t am bém com funções e com andos
disponibilizados pela Microsiga que a t orna um a linguagem com plet a para a criação de
aplicações ERP pront as para a I nt ernet . Tam bém é um a linguagem orient ada a obj et os e
ev ent os, perm it indo ao program ador desenv olver aplicações visuais e criar suas próprias
classes de obj et os.
Quando com pilados, t odos os arquivos de código t ornam - se unidades de int eligência básicas,
cham ados APO´ s ( de Advanced Prot heus Obj ect s) . Tais APO´ s são m ant idos em um
reposit ório e car regados dinam icam ent e pelo PROTHEUS Ser ver para a execução. Com o não
exist e a linkedição, ou união física do código com pilado a um det erm inado m ódulo ou
aplicação, funções criadas em ADVPL podem ser ex ecut adas em qualquer pont o do am bient e
Advanced Pr ot heus.
O com pilador e o int erpret ador da linguagem ADVPL é o própr io ser vidor PROTHEUS
( PROTHEUS Ser ver) , e exist e um am bient e visual para desenvolvim ent o int egrado
( PROTHEUSI DE) onde o código pode ser criado, com pilado e depurado.
Os program as em ADVPL podem cont er com andos ou funções de int er face com o usuário. De
acordo com t al caract eríst ica, t ais program as são subdivididos nas seguint es cat egorias:
Nest a cat egoria ent ram os pr ogram as desenvolvidos para serem ex ecut ados at rav és do
t erm inal rem ot o do Prot heus, o Pr ot heus Rem ot e. O Pr ot heus Rem ot e é a aplicação
encar r egada da int erface e da int eração com o usuário, sendo que t odo o pr ocessam ent o do
código em ADVPL, o acesso ao banco de dados e o gerenciam ent o de conexões é efet uado no
Prot heus Ser ver. O Pr ot heus Rem ot e é o principal m eio de acesso a execução de r ot inas
escrit as em ADVPL no Prot heus Serv er, e por isso perm it e ex ecut ar qualquer t ipo de código,
t enha ele int erface com o usuário ou não. Por ém nest a cat egoria são considerados apenas os
program as que realizem algum t ipo de int erface r em ot a ut ilizando o prot ocolo de com unicação
do Prot heus.
Podem - se criar r ot inas para a cust om ização do sist em a ERP Micr osiga Prot heus, desde
processos adicionais at é m esm o relat órios. A grande v ant agem é apr ov eit ar t odo o am bient e
m ont ado pelos m ódulos do ERP Microsiga Prot heus. Por ém , com o ADVPL é possível at é
m esm o criar t oda um a aplicação, ou m ódulo, do com eço.
- 162 -
As rot inas criadas sem int erface são consideradas nest a cat egoria porque geralm ent e t êm um a
ut ilização m ais específica do que um processo adicional ou um relat ório nov o. Tais rot inas não
t êm int erface com o usuário at rav és do Pr ot heus Rem ot e, e qualquer t ent at iva nesse sent ido
( com o a criação de um a j anela padrão) ocasionará um a exceção em t em po de execução. Est as
rot inas são apenas processos, ou Jobs, execut ados no Pr ot heus Ser ver. Algum as vezes, a
int erface dest as rot inas fica a cargo de aplicações ext ernas, desenvolvidas em out ras
linguagens, que são responsáv eis por iniciar os pr ocessos no ser vidor Pr ot heus at ravés dos
m eios disponíveis de int egração e conect ividade no Prot heus.
De acordo com a ut ilização e com o m eio de conect ividade ut ilizado, est as rot inas são
subcat egorizadas assim :
Rot inas escrit as em ADVPL podem ser iniciadas com o pr ocessos individuais ( sem int erface) no
Prot heus Serv er at rav és de duas m aneiras: I niciadas por out ra r ot ina ADVPL at rav és da
cham ada de funções com o St art Job( ) ou CallProc( ) ou iniciadas aut om at icam ent e na
inicialização do Pr ot heus Serv er ( quando pr opriam ent e configurado) .
Pr ogr a m a çã o de RPC
At ravés de um a bibliot eca de funções disponível no Prot heus ( um a API de com unicação) ,
podem - se execut ar r ot inas escrit as em ADVPL diret am ent e no Prot heus Serv er, at r avés de
aplicações ext ernas escrit as em out ras linguagens. I st o é o que se cham a de RPC ( de Rem ot e
Procedure Call, ou Cham ada de Pr ocedim ent os Rem ot a) .
O servidor Prot heus t am bém pode ex ecut ar r ot inas em ADVPL em out ros servidores Pr ot heus
at ravés de conexão TCP/ I P dir et a ut ilizando o conceit o de RPC. Do m esm o m odo, aplicações
ext ernas podem r equisit ar a execução de r ot inas escrit as em ADVPL at rav és de conexão
TCP/ I P diret a.
Program ação Web
O Pr ot heus Ser ver pode t am bém ser ex ecut ado com o um servidor Web, r espondendo a
requisições HTTP. No m om ent o dest as r equisições, pode ex ecut ar r ot inas escrit as em ADVPL
com o pr ocessos individuais, enviando o result ado das funções com o ret orno das requisições
para o client e HTTP ( com o por exem plo, um Br owser de I nt ernet ) . Qualquer rot ina escrit a em
ADVPL que não cont enha com andos de int erface pode ser ex ecut ada at rav és de r equisições
HTTP. O Pr ot heus perm it e a com pilação de arquivos HTML cont endo código ADVPL em but ido.
São os cham ados arquivos ADVPL ASP, para a criação de páginas dinâm icas.
Pr ogr a m a çã o Te lN e t
TelNet é part e da gam a de pr ot ocolos TCP/ I P que perm it e a conexão a um com put ador rem ot o
at ravés de um a aplicação client e dest e pr ot ocolo. O PROTHEUS Ser ver pode em ular um
t erm inal TelNet , at ravés da execução de r ot inas escrit as em ADVPL. Ou sej a, pode- se escrever
rot inas ADVPL cuj a int erface final será um t erm inal TelNet ou um colet or de dados m óv el.
- 163 -
Um program a de com put ador nada m ais é do que um grupo de com andos logicam ent e
dispost os com o obj et ivo de ex ecut ar det erm inada t arefa. Esses com andos são gravados em
um arquivo t ext o que é t ransform ado em um a linguagem ex ecut ável por um com put ador
at ravés de um pr ocesso cham ado com pilação. A com pilação subst it ui os com andos de alt o
nível ( que os hum anos com pr eendem ) por inst ruções de baixo nível ( com preendida pelo
sist em a operacional em execução no com put ador) . No caso do ADVPL, não é o sist em a
operacional de um com put ador que irá execut ar o código com pilado, m as sim o Prot heus
Ser ver.
Dent r o de um program a, os com andos e funções ut ilizados devem seguir regras de sint axe da
linguagem ut ilizada, pois caso cont rário o pr ogram a será int errom pido por er ros. Os er ros
podem ser de com pilação ou de ex ecução.
Er ros de com pilação são aqueles encont rados na sint axe que não per m it em que o arquivo de
código do program a sej a com pilado. Podem ser com andos especificados de form a err ônea,
ut ilização inválida de operador es, et c.
Er ros de execução são aqueles que acont ecem depois da com pilação, quando o program a est á
sendo ex ecut ado. Podem ocor rer por inúm eras razões, m as geralm ent e se refer em as funções
não exist ent es, ou variáveis não criadas ou inicializadas, et c.
Lin h a s d e Pr ogr a m a
As linhas exist ent es dent ro de um arquivo t ex t o de código de program a podem ser linhas de
com ando, linhas de com ent ário ou linhas m ist as.
Lin h a s d e Com a n do
Linhas de com ando possuem os com andos ou inst ruções que serão ex ecut adas. Por ex em plo:
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Lin h a s d e Com e n t á r io
Linhas de com ent ário possuem um t ext o qualquer, m as não são ex ecut adas. Serv em apenas
para docum ent ação e para t ornar m ais fácil o ent endim ent o do pr ogram a. Exist em t r ês form as
de se com ent ar linhas de t ext o. A prim eira delas é ut ilizar o sinal de * ( ast erisco) no com eço
da linha:
- 164 -
Out ra form a de docum ent ar t ext os é ut ilizar as barras t ransversais j unt am ent e com o
ast erisco, podendo- se com ent ar t odo um bloco de t ext o sem pr ecisar com ent ar linha a linha:
/*
Programa para cálculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o t ext o encont rado ent r e a abert ura ( indicada pelos caract er es / * ) e o fecham ent o
( indicada pelos caract er es * / ) é considerado com o com ent ário.
Lin h a s M ist a s
O ADVPL t am bém per m it e que exist am linhas de com ando com com ent ário. I st o é possív el
adicionando- se as duas barras t ransv er sais ( / / ) ao final da linha de com ando e adicionando- se
o t ext o do com ent ário:
Local nCnt
Local nSoma := 0 // Inicializa a variável com zero para a soma
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Ta m a n h o d a Lin h a
Assim com o a linha física, delim it ada pela quant idade de caract er es que pode ser digit ado no
edit or de t ext os ut ilizado, exist e um a linha considerada linha lógica. A linha lógica, é aquela
considerada para a com pilação com o um a única linha de com ando.
A princípio, cada linha digit ada no arquivo t ext o é diferenciada após o pressionam ent o da t ecla
< Ent er> . Ou sej a, a linha lógica, é a linha física no arquivo. Por ém algum as vezes, por
lim it ação física do edit or de t ext o ou por est ét ica, pode- se " quebrar" a linha lógica em m ais de
um a linha física no arquivo t ext o. I st o é efet uado ut ilizando- se o sinal de pont o- e- vírgula ( ; ) .
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Nest e exem plo exist e um a linha de com ando para a checagem das v ar iáveis ut ilizadas. Com o a
linha t orna- se m uit o grande, pode- se dividi- la em m ais de um a linha física ut ilizando o sinal de
- 165 -
1 9 .1 . Ár e a s de um Pr ogr a m a AD VPL
Apesar de não ser um a linguagem de padr ões rígidos com relação à est rut ura do program a, é
im port ant e ident ificar algum as de suas part es. Consider e o pr ogram a de ex em plo abaixo:
#include protheus.ch
/*
+===========================================+
| Programa: Cálculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+===========================================+
*/
Local nCnt
Local nResultado := 1 // Resultado do fatorial
Local nFator := 5 // Número para o cálculo
// Cálculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
// Termina o programa
Return
A est rut ura de um pr ogr am a ADVPL é com post a pelas seguint es áreas:
Corpo do Program a
Preparação para o processam ent o
Processam ent o
- 166 -
Est a é um a área que não é obrigat ória e é dedicada a docum ent ação do program a. Quando
exist ent e, cont ém apenas com ent ários explicando a sua finalidade, dat a de criação, aut or , et c.,
e aparece no com eço do program a, ant es de qualquer linha de com ando.
O form at o para est a área não é definido. Pode- se colocar qualquer t ipo de inform ação
desej ada e escolher a form at ação apr opriada.
#include “protheus.ch”
/*
+==========================================+
| Programa: Cálculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+==========================================+
*/
Opcionalm ent e podem - se incluir definições de const ant es ut ilizadas no program a ou inclusão
de arquivos de cabeçalho nest a ár ea.
Ár e a de Aj u st e s I n icia is
Nest a área geralm ent e se fazem os aj ust es iniciais, im port ant es para o cor ret o funcionam ent o
do program a. Ent re os aj ust es se encont ram declarações de variáveis, inicializações, abert ura
de arquivos, et c. Apesar do ADVPL não ser um a linguagem rígida e as variáveis poderem ser
declaradas em qualquer lugar do program a, é aconselhável fazê- lo nest a área visando t ornar o
código m ais legível e facilit ar a ident ificação de variáveis não ut ilizadas.
Local nCnt
Local nResultado := 0 // Resultado do fatorial
Local nFator := 10 // Número para o cálculo
Cor po do Pr ogr a m a
É nest a ár ea que se encont ram as linhas de código do pr ogram a. É onde se realiza a t arefa
necessária at rav és da organização lógica dest as linhas de com ando. Espera- se que as linhas de
com ando est ej am organizadas de t al m odo que no final dest a área o result ado esperado sej a
obt ido, sej a ele arm azenado em um arquivo ou em variáveis de m em ória, pront o par a ser
exibido ao usuário at rav és de um r elat ório ou na t ela.
// Cálculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
- 167 -
Avaliando o processam ent o do cálculo do fat orial descrit o ant eriorm ent e, pode- se definir que a
validação inicial a ser r ealizada é o cont eúdo da variável nFat or, pois a m esm a det erm inará a
corr et a ex ecução do código.
// Cálculo do fatorial
nFator := GetFator()
// GetFator – função ilustrativa na qual a variável recebe a informação do
usuário.
If nFator <= 0
Alert(“Informação inválida”)
Return
Endif
Ár e a de En ce r r a m e n t o
É nest a área onde as finalizações são efet uadas. É onde os arquivos abert os são fechados, e o
result ado da ex ecução do pr ogr am a é ut ilizado. Pode- se exibir o r esult ado arm azenado em
um a variável ou em um arquivo ou sim plesm ent e finalizar, caso a t arefa j á t enha sido t oda
com plet ada no corpo do program a. É nest a área que se encont r a o encerram ent o do
program a. Todo program a em ADVPL dev e sem pre t erm inar com a palavra chave r et urn.
// Termina o programa
Return
- 168 -
2 0 .1 . Tipo de D a dos
O ADVPL não é um a linguagem de t ipos rígidos ( st rongly t yped) , o que significa que variáveis
de m em ória podem r eceber difer ent es t ipos de dados durant e a execução do program a.
As variáveis podem t am bém cont er obj et os, m as os t ipos prim ários da linguagem são:
N u m é r ico
O ADVPL não difer encia valores int eiros de v alores com pont o flut uant e, port ant o podem - se
criar variáveis num éricas com qualquer valor dent ro do int ervalo perm it ido. Os seguint es
elem ent os são do t ipo de dado num érico:
2
43.53
0.5
0.00001
1000000
Um a variável do t ipo de dado num érico pode cont er um núm er o de dezoit o dígit os incluindo o
pont o flut uant e, no int ervalo de 2.2250738585072014 E–308 at é 1.7976931348623158
E+ 308.
Lógico
Valores lógicos em ADVPL são ident ificados at r avés de .T. ou .Y. para verdadeiro e .F. ou .N.
para falso ( independent em ent e se os caract er es est iver em em m aiúsculo ou m inúsculo) .
Ca r a ct e r e
St rings ou cadeias de caract er es são ident ificadas em ADVPL por blocos de t ext o ent r e aspas
duplas ( " ) ou aspas sim ples ( ') :
"Olá mundo!"
'Esta é uma string'
"Esta é 'outra' string"
Um a variável do t ipo caract er e pode cont er st rings com no m áxim o 1 MB, ou sej a, 1048576
caract eres.
Data
O ADVPL t em um t ipo de dados específico para dat as. I nt ernam ent e as variáveis dest e t ipo de
dado são arm azenadas com o um núm ero cor respondent e a d a t a Ju lia n a .
Variáveis do t ipo de dados Dat a não podem ser declaradas diret am ent e, e sim at rav és da
ut ilização de funções específicas com o por ex em plo CTOD( ) que convert e um a st ring para
dat a.
- 169 -
O Ar ray é um t ipo de dado especial. É a disposição de out r os elem ent os em colunas e linhas. O
ADVPL suport a ar ray s unidim ensionais ( vet or es) ou m ult idim ensionais ( m at rizes) . Os
elem ent os de um arr ay são acessados at r avés de índices num éricos iniciados em 1,
ident ificando a linha e coluna para quant as dim ensões exist irem .
Array s dev em ser ut ilizadas com caut ela, pois se forem m uit o grandes podem exaurir a
m em ória do servidor.
Bloco d e Código
O bloco de código é um t ipo de dado especial. É ut ilizado para arm azenar inst ruções escrit as
em ADVPL que poderão ser ex ecut adas post eriorm ent e.
2 0 .2 . D e cla r a çã o de va r iá ve is
Variáveis de m em ória são um dos r ecursos m ais im port ant es de um a linguagem . São ár eas de
m em ória criadas para arm azenar inform ações ut ilizadas por um progr am a para a execução de
t arefas. Por ex em plo, quando o usuário digit a um a inform ação qualquer , com o o nom e de um
produt o, em um a t ela de um program a est a inform ação é arm azenada em um a variável de
m em ória para post erior m ent e ser gravada ou im pressa.
A part ir do m om ent o que um a variável é criada, não é necessário m ais se r efer enciar ao seu
cont eúdo, e sim ao seu nom e.
Port ant o se forem criadas duas v ariáveis cuj os 10 prim eiros car act er es for em iguais, com o
nTot alGeralAnual e nTot alGeralMensal, as refer ências a qualquer um a delas no pr ogram a
result arão o m esm o, ou sej a, serão a m esm a v ariável:
nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))
Quando o cont eúdo da variável nTot alGeralMensal é exibido, o seu v alor será de 300. I sso
acont ece porque no m om ent o que esse valor foi at ribuído à variável nTot alGeralAnual, o
ADVPL consider ou apenas os 10 prim eiros caract er es ( assim com o o faz quando dev e exibir o
valor da variável nTot alGeralMensal) , ou sej a, consider ou- as com o a m esm a v ariável. Assim o
valor original de 100 foi subst it uído pelo de 300.
- 170 -
O ADVPL não é um a linguagem de t ipos rígidos para variáveis, ou sej a, não é necessário
inform ar o t ipo de dados que det erm inada variável irá cont er no m om ent o de sua declaração,
e o seu valor pode m udar durant e a ex ecução do pr ogram a.
Tam bém não há necessidade de declarar variáveis em um a seção específica do seu código
font e, em bora sej a aconselhável declarar t odas as variáveis necessárias no com eço, t ornando
a m anut enção m ais fácil e evit ando a declaração de variáveis desnecessárias.
Para declarar um a variável dev e- se ut ilizar um ident ificador de escopo. Um ident ificador de
escopo é um a palavra chave que indica a que cont ext o do pr ogram a a variável declarada
pert ence. O cont ext o de variáveis pode ser local ( visualizadas apenas dent r o do pr ogram a
at ual) , público ( visualizadas por qualquer out ro program a) , ent r e out r os.
O Con t e x t o d e Va r iá v e is de n t r o de u m Pr ogr a m a
As variáveis declaradas em um program a ou função, são visíveis de acordo com o escopo onde
são definidas. Com o t am bém do escopo depende o t em po de exist ência das variáveis. A
definição do escopo de um a variável é efet uada no m om ent o de sua declaração.
Est a linha de código declara um a variável cham ada nNum ero indicando que pert ence seu
escopo é local.
Local
St at ic
Privat e
Public
O ADVPL não é rígido em relação à declaração de variáveis no com eço do program a. A inclusão
de um ident ificador de escopo não é necessário para a declaração de um a variável, cont ant o
que um valor lhe sej a at ribuído.
nNumero2 := 15
Devido a essa caract eríst ica, quando se pret ende fazer um a at ribuição a um a variável
declarada pr eviam ent e m as escr ev e- se o nom e da variável de form a incorr et a, o ADVPL não
gerará nenhum err o de com pilação ou de ex ecução. Pois com pr eenderá o nom e da variável
escrit o de form a incorr et a com o se fosse a criação de um a nova variável. I st o alt erará a lógica
do pr ogram a, e é um er ro m uit as vezes difícil de ident ificar.
- 171 -
Variáveis de escopo local são pert encent es apenas ao escopo da função onde foram declaradas
e devem ser explicit am ent e declaradas com o ident ificador LOCAL, com o no exem plo:
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Nest e ex em plo, a variável nVar foi declarada com o local e at ribuída com o valor 10. Quando a
função Filha é execut ada, nVar ainda exist e m as não pode ser acessada. Quando a execução
da função Pai t erm inar, a variável nVar é dest r uída. Qualquer variável com o m esm o nom e no
program a que cham ou a função Pai não é afet ada.
Variáveis de escopo local são criadas aut om at icam ent e cada vez que a função onde for em
declaradas for at ivada. Elas cont inuam a exist ir e m ant êm seu valor at é o fim da at ivação da
função ( ou sej a, at é que a função r et orne o cont role para o código que a execut ou) . Se um a
função é cham ada r ecursivam ent e ( por ex em plo, cham a a si m esm a) , cada cham ada em
recursão cria um nov o conj unt o de variáveis locais.
A visibilidade de variáv eis de escopo locais é idênt ica ao escopo de sua declaração, ou sej a, a
variável é visível em qualquer lugar do código font e em que foi declarada. Se um a função é
cham ada r ecursivam ent e, apenas as variáveis de escopo local criadas na m ais r ecent e at ivação
são visíveis.
Va r iá ve is de e scopo st a t ic
O escopo das variáveis st at ic depende de onde são declaradas. Se for em declaradas dent r o do
corpo de um a função ou procedim ent o, seu escopo será lim it ado àquela rot ina. Se forem
declaradas for a do corpo de qualquer rot ina, seu escopo afet a a t odas as funções declaradas
no font e. Nest e ex em plo, a variável nVar é declarada com o st at ic e inicializada com o v alor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
- 172 -
Va r iá ve is de e scopo p r iv a t e
A declaração é opcional para variáveis privadas. Mas podem ser declaradas explicit am ent e com
o ident ificador PRI VATE.
Adicionalm ent e, a at ribuição de valor a um a variável não criada ant eriorm ent e
aut om at icam ent e cria a variável com o privada. Um a vez criada, um a variável privada cont inua
a exist ir e m ant ém seu valor at é que o program a ou função onde foi criada t erm ine ( ou sej a,
at é que a função onde foi criada ret orne para o código que a execut ou) . Nest e m om ent o, é
aut om at icam ent e dest r uída.
É possível criar um a nova variável privada com o m esm o nom e de um a variável j á exist ent e.
Ent ret ant o, a nova ( duplicada) variável pode apenas ser criada em um nível de at ivação
inferior ao nível onde a variável foi declarada pela prim eira vez ( ou sej a, apenas em um a
função cham ada pela função onde a variável j á havia sido criada) . A nova variável privada irá
esconder qualquer out r a variável privada ou pública ( vej a a docum ent ação sobr e variáveis
públicas) com o m esm o nom e enquant o exist ir.
Um a vez criada, um a variável privada é visível em t odo o pr ogr am a enquant o não for
dest ruída aut om at icam ent e quando a rot ina que a criou t erm inar ou um a out ra variável
privada com o m esm o nom e for criada em um a subfunção cham ada ( nest e caso, a variável
exist ent e t orna- se inacessível at é que a nova variável privada sej a dest r uída) .
Em t erm os m ais sim ples, um a variável privada é visível dent ro da função de criação e t odas as
funções cham adas por est a, a m enos que um a função cham ada crie sua pr ópria variável
privada com o m esm o nom e.
Por e x e m p lo:
Function Pai()
Private nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Nest e ex em plo, a variável nVar é criada com escopo privat e e inicializada com o valor 10.
Quando a função Filha é execut ada, nVar ainda exist e e, diferent e de um a variável de escopo
local, pode ser acessada pela função Filha. Quando a função Pai t erm inar, nVar será dest ruída
e qualquer declaração de nVar ant erior se t ornará acessível novam ent e.
- 173 -
Podem - se criar variáv eis de escopo public dinam icam ent e no código com o ident ificador
PUBLI C. As variáveis dest e escopo cont inuam a exist ir e m ant êm seu valor at é o fim da
ex ecução da t hread ( conexão) .
É possível criar um a variável de escopo privat e com o m esm o nom e de um a variável de escopo
public exist ent e, ent r et ant o, não é perm it ido criar um a variável de escopo public com o m esm o
nom e de um a variável de escopo privat e exist ent e.
Um a vez criada, um a variável de escopo public é visível em t odo o program a onde foi
declarada at é que sej a escondida por um a variável de escopo privat e criada com o m esm o
nom e. A nova variável de escopo privat e criada esconde a variável de escopo public exist ent e,
e est a se t ornará inacessível at é que a nova var iável privat e sej a dest ruída. Por ex em plo:
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Nest e ex em plo, nVar é criada com o public e inicializada com o valor 10. Quando a função Filha
é execut ada, nVar ainda exist e e pode ser acessada. Difer ent e de variáveis locais ou privat es,
nVar ainda exist e após o t érm ino da a ex ecução da função Pai.
Diferent em ent e dos out ros ident ificadores de escopo, quando um a var iável é declarada com o
pública sem ser inicializada, o valor assum ido é falso ( .F.) e não nulo ( nil) .
- 174 -
Se est a linha for ex ecut ada em um program a ADVPL, ocorr erá um err o de execução com a
m ensagem " variable does not exist : nPercent ual" , pois est a variável est á sendo ut ilizada em
um a expr essão de cálculo sem t er sido declarada. Para solucionar est e er ro, dev e- se declarar a
variável previam ent e:
Nest e exem plo, as variáveis são declaradas pr eviam ent e ut ilizando o ident ificador de escopo
local. Quando a linha de cálculo for execut ada, o er ro de variável não exist ent e, não m ais
ocor rerá. Por ém variáveis não inicializadas t êm sem pr e o valor default nulo ( Nil) e est e valor
não pode ser ut ilizado em um cálculo pois t am bém gerará err os de ex ecução ( nulo não pode
ser dividido por 100) . A resolução dest e pr oblem a é efet uada inicializando- se a variável
at ravés de um a das for m as:
ou
A diferença ent re o últ im o exem plo e os dois ant erior es é que a variável é inicializada no
m om ent o da declaração. Em am bos os ex em plos, a variável é prim eiro declarada e ent ão
inicializada em um a out ra linha de código.
É aconselhável opt ar pelo operador de at ribuição com post o de dois pont os e sinal de igual, pois
o operador de at ribuição ut ilizando som ent e o sinal de igual pode ser facilm ent e confundido
com o operador r elacional ( para com paração) durant e a criação do program a.
- 175 -
2 1 .1 . Pa la vr a s r e se r va da s
Funções r eserv adas são pert encent es ao com pilador e não podem ser
redefinidas por um a aplicação;
Todos os ident ificadores que com eçarem com dois ou m ais caract eres
“ _” são ut ilizados com o ident ificadores int ernos e são r eserv ados.
- 176 -
Com base na docum ent ação disponível no DEM – Docum ent ação Elet r ônica Microsiga, a
linguagem ADVPL e a aplicação ERP Prot heus adm it em as seguint es pict ures:
Fu n çõe s
Con t e ú do Fu n cion a lid a de
A Per m it e apenas caract er es alfabét icos.
C Exibe CR depois de núm er os posit ivos.
E Exibe num érico com o pont o e vírgula invert idos ( form at o Eur opeu) .
R I nser e caract eres diferent es dos caract er es de t em plat e na exibição, m as não os
insere na variável do GET.
S< n > Per m it e rolam ent o horizont al do t ext o dent ro do GET, < n> é um núm er o int eiro
que ident ifica o t am anho da região.
X Exibe DB depois de núm er os negat ivos.
Z Exibe zeros com o br ancos.
( Exibe núm eros negat ivos ent re par ênt eses com os espaços em branco iniciais.
) Exibe núm eros negat ivos ent re par ênt eses sem os espaços em branco iniciais.
! Convert e caract er es alfabét icos para m aiúsculo.
Te m pla t e s
Con t e ú do Fu n cion a lid a de
X Per m it e qualquer caract er e.
9 Per m it e apenas dígit os para qualquer t ipo de dado, incluindo o sinal para
num éricos.
# Per m it e dígit os, sinais e espaços em branco par a qualquer t ipo de dado.
! Convert e caract er es alfabét icos para m aiúsculo.
* Exibe um ast erisco no lugar dos espaços em br anco iniciais em núm er os.
. Exibe o pont o decim al.
, Exibe a posição do m ilhar.
A1_NOME – Caracter - 40
Picture: @!
- 177 -
Os pr ogram as de at ualização de cadast ros e digit ação de m ovim ent os seguem um padrão que
se apóia no Dicionário de Dados.
Todos os m odelos são genéricos, ou sej a, o program a independe da t abela a ser t rat ada,
bast ando prat icam ent e que se inform e apenas o seu Alias. O rest o é obt ido do
Dicionário de Dados ( SX3) .
- 178 -
Brow se padrão para visualização das inform ações da base de dados, de acordo com as
configurações do SX3 – Dicionário de Dados ( cam po br ow se) .
Funções de pesquisa, visualização, inclusão, alt eração e exclusão padr ões para
visualização de regist r os sim ples, sem a opção de cabeçalho e it ens.
Pa r â m e t r os:
Ex e m plo: Fu n çã o Ax Ca da st r o( )
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | XCADSA2 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrição | Exemplo de utilização da função AXCADASTRO() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return Nil
- 179 -
/*/
+------------------------------------------------------------------------------
| Função | VLDALT | Autor | ARNALDO RAYMUNDO JR. | Data | |
+------------------------------------------------------------------------------
| Descrição | Função de validação de alteração para a AXCADASTRO() |
+------------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------------
/*/
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(“Ateração concluída com sucesso!”)
Endif
RestArea(aArea)
Return lRet
/*/
+------------------------------------------------------------------------------
| Função | VLDEXC | Autor | ARNALDO RAYMUNDO JR. | Data | |
+------------------------------------------------------------------------------
| Descrição | Função de validação de exclusão para a AXCADASTRO() |
+------------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------------
/*/
nOpcao := AxExclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(“Exclusão concluída com sucesso!”)
Endif
RestArea(aArea)
Return lRet
- 180 -
O nom e Modelo 2 foi conceit uado pela Microsiga por se t r at ar de um prot ót ipo de t ela para
ent rada de dados. I nicialm ent e vam os desm ist ificar dois pont os:
Obj e t o M sD ia log ( )
Dev e ser ut ilizada com o j anela padrão para ent rada de dados, é um t ipo de obj et o m odal, ou
sej a, não perm it e que out ra j anela at iva receba dados enquant o est a est iver at iva.
- 181 -
DEFINE MSDIALOG oDlg TITLE "Protótipo Modelo 2" FROM 0,0 TO 280,552 OF;
oMainWnd PIXEL
Repar em que o com ando DEFI NE MSDI ALOG inst anciou e o com ando ACTI VATE MSDI ALOG
at iva t odos os obj et os, ou sej a, t odo ou qualquer out ro obj et o que precisar colocar nest a
j anela será preciso infor m ar em qual obj et o, para est e caso sem pr e ser á ut ilizada a variável de
obj et o export ável oD lg.
Fu n çã o En ch oice Ba r ( )
Função que cria um a barra de bot ões padrão de Ok e Cancelar, per m it indo a im plem ent ação
de bot ões adicionais.
Pa r â m e t r os:
- 182 -
Obj e t o TPa n e l( )
Repar e que para facilit ar o desenv olvim ent o foi ut ilizado o obj et o TPanel para aj udar o
alinham ent o dos obj et os TSay e TGet , ou sej a, a ut ilização dest e recur so per m it e que o
program ador não se pr eocupe com coordenadas com plexas para deixar a união dos obj et os
sim ét ricos.
Ut ilize o obj et o TPanel quando desej ar criar um painel est át ico, onde podem ser criados out r os
cont r oles com o obj et ivo de organizar ou agrupar com ponent es visuais.
Pa r â m e t r os:
- 183 -
O com ando SAY ou obj et o TSay exibe o cont eúdo de t ext o est át ico sobr e um a j anela.
Sin t a x e SAY:
Pa r â m e t r os:
- 184 -
O com ando MsGet ou o obj et o TGet é ut ilizado para criar um cont role que arm azene ou alt ere
o cont eúdo de um a variável at ravés de digit ação. O cont eúdo da variável só é m odificado
quando o cont r ole perde o foco de edição para out ro cont role.
Sin t a x e M SGET:
Pa r â m e t r os:
- 185 -
Obj et o t ipo list a com um a ou m ais colunas para cadast ram ent o de dados baseado em um
vet or. Sua ut ilização ex ige que sej a ut ilizado t rês variáveis com seu escopo Privat e, são elas:
aRot ina, aHeader e aCOLS.
- 186 -
Pa r â m e t r os:
Va r iá ve l Pr iva t e a Rot in a
Array com as rot inas que serão execut adas na MBr owse e que definirá o t ipo de operação que
est á sendo execut ada, por ex em plo: Pesquisar, Visualizar, I ncluir, Alt erar, Ex cluir e out ros.
Ele m e n t o Con t e ú do
1 Tít ulo da opção.
2 Nom e da rot ina ( Funct ion) .
3 Reser vado.
4 Operação ( 1- Pesquisar; 2- Visualizar; 3- I ncluir; 4- Alt erar; 5- Ex clusão) .
Acesso r elacionado a r ot ina, se est á opção não for inform ada nenhum
5
acesso ser á validado.
- 187 -
Array com inform ações das colunas, ou sej a, com as caract eríst icas dos cam pos que est ão
cont idas no dicionário de dados ( SX3) , est e vet or pr ecisa est ar no form at o abaixo:
Ele m e n t o Con t e ú do
1 Tít ulo do cam po
2 Nom e do cam po
3 Máscara do cam po
4 Tam anho do cam po
5 Decim al do cam po
6 Validação de usuário do cam po
7 Uso do cam po
8 Tipo do cam po ( caract er e, num érico, dat a e et c.)
9 Prefixo da t abela
10 Cont ext o do cam po ( real ou virt ual)
Va r iá ve l Pr iva t e a Cols
Vet or com as linhas a serem edit adas. As colunas dev em ser const r uídas com base no vet or
aHeader e m ais um a últ im a coluna com o valor lógico que det erm ina se a linha foi excluída,
inicialm ent e est a dev er á t er o seu cont eúdo igual a falso ( .F.) .
- 188 -
O ex em plo abaixo dem onst ra a m ont agem de um program a para a ut ilização do prot ót ipo
Modelo 2. Ant es de iniciarm os o exem plo vam os est rut urar o pr ogram a.
Est r u t u r a d o p r og r a m a
Linh a s Pr ogr a m a
1 Fun çã o pr in cipa l;
2 Declar ação e at ribuição de variáveis;
3 Acesso a t abela pr incipal e sua or dem ;
4 Cham ada da função MBrowse;
5 Fim da fu n çã o prin cipa l.
6
7 Fun çã o de visua liza çã o, a lt e r a çã o e e x clusã o;
8 Declar ação e at ribuição de variáveis;
9 Acesso ao pr im eiro r egistr o da chave em que est á posicionado na MBrowse;
10 Mont agem das var iáveis est át icas em t ela;
11 Mont agem do vet or aHeader por m eio do dicionár io de dados;
Mont agem do vetor aCOLS de t odos os regist ros r efer ent e a chave pr incipal em que est á
12
posicionado na MBr owse;
13 I nst ância da MsDialog;
14 I nst ância dos obj et os TSay e TGet ;
15 I nst ância do obj et o MsGetDados;
16 At ivar o obj et o pr incipal que é o obj et o da j anela;
17 Se for oper ação difer ent e de visualização e clicou no bot ão OK;
18 A oper ação e de Alt er ação?
19 Cham ar a função par a alt er ar os dados;
20 Caso cont rár io
21 Cham ar a função par a excluir os dados;
22 Fim da fu n çã o de v isua liza çã o, a lt e r a çã o e e x clusã o.
23
24 Fun çã o de in clu sã o;
25 Declar ação e at ribuição de variáveis;
26 Mont agem das var iáveis est át icas em t ela;
27 Mont agem do vet or aHeader por m eio do dicionár io de dados;
Mont agem do vet or aCOLS com o seu cont eúdo confor m e o inicializador padr ão do cam po ou
28
vazio, pois t rat a- se de um a inclusão;
29 I nst ância da MsDialog;
30 I nst ância dos obj et os TSay e TGet ;
31 I nst ância do obj et o MsGetDados;
32 At ivar o obj et o pr incipal que é o obj et o da j anela;
33 Se clicou no bot ão OK;
34 Cham ar a função par a incluir os dados;
35 Fim da fu n çã o de in clu sã o.
- 189 -
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | xModelo2 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Função exemplo do protótipo Modelo2. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
User Function xModelo2()
Private cCadastro := "Protótipo Modelo 2"
Private aRotina := {}
dbSelectArea("ZA3")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA3")
Return
Rot in a de in clu sã o
//+--------------------------------------------------------------------+
//| Rotina | Mod2Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
Private aHeader := {}
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
- 190 -
oTPanel1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel1:Align := CONTROL_ALIGN_TOP
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
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
Local oDlg
Local oGet
Local oTPanel1
Local oTPAnel2
Private aHeader := {}
- 191 -
dbSelectArea( cAlias )
dbGoTo( nReg )
cCodigo := ZA3->ZA3_CODIGO
cNome := ZA3->ZA3_NOME
cData := ZA3->ZA3_DATA
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
oTPane1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPane1:Align := CONTROL_ALIGN_TOP
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
- 192 -
//+--------------------------------------------------------------------+
//| Rotina | Mod2aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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
M on t a g e m do a r r a y a Cols
//+--------------------------------------------------------------------+
//| Rotina | Mod2aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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 -
Efe t iv a çã o d a in clu sã o
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvI | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na inclusão. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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
- 194 -
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvA | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na alteração. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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
- 195 -
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvE | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para excluir os registros. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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
//+--------------------------------------------------------------------+
//| Rotina | Mod2Vend | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar o código do vendedor. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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 | Mod2LOk | Autor | Robson Luiz (rleg) | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar a linha de dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
User Function Mod2LOk()
Local lRet := .T.
Local cMensagem := "Não será permitido linhas sem o centro de custo."
If !aCOLS[n, Len(aHeader)+1]
If Empty(aCOLS[n,GdFieldPos("ZA3_CCUSTO")])
MsgAlert(cMensagem,cCadastro)
lRet := .F.
Endif
Endif
Return( lRet )
- 196 -
//+--------------------------------------------------------------------+
//| Rotina | Mod2TOk | Autor | Robson Luiz (rleg) | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar toda as linhas de dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
A função Modelo2( ) é um a int erface pr é- definida pela Microsiga que im plem ent a de form a
padronizada os com pont es necessários a m anipulação de est rut uras de dados nas quais o
cabeçalho e os it ens da inform ação com part ilham o m esm o r egist ro físico.
Seu obj et ivo é at uar com o um facilit ador de codificação, per m it indo a ut ilização dos r ecursos
básicos dos seguint es com ponent es visuais:
M sD ia log( )
TGe t ( )
TSa y( )
M sN e w Ge t D a dos( )
En ch oice Ba r ( )
Da m esm a form a, o Browse dev e ser t rat ado por est a rot ina, sendo
com um a Modelo2( ) est ar vinculada ao uso de um a MBr owse( ) .
- 197 -
Pa r â m e t r os:
a Rod a Array cont endo as inform ações que serão exibidas no cabeçalho na for m a de
Enchoice( ) , no m esm o form at o que o aCab.
a Gr id Array cont endo as coordenadas da Get Dados( ) na t ela. Padrão : =
{ 44,5,118,315}
n Opc Opção selecionada na MBr owse, ou que desej e ser passada para cont role da
Modelo2, aonde:
2 – Visualizar
3 - I ncluir
4 - Alt erar
5 - Excluir
cLin h a Ok Função para validação da linha na Get Dados( )
cTu doOk Função para validação na confirm ação da t ela de int erface da Modelo2( ) .
Re t or n o:
Lógico I ndica se a t ela da int er face Modelo2( ) foi confirm ada ou cancelada pelo
usuário.
- 198 -
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRW2SX5| Autor | ARNALDO RAYMUNDO JR. | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | UTILIZACAO DA MODELO2() PARA VISUALIZAÇÃO DO SX5. |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
//Local nUsado := 0
Local cTitulo := "Inclusao de itens - Arquivo de Tabelas"
Local aCab := {} // Array com descricao dos campos do Cabecalho do Modelo
2
Local aRoda := {} // Array com descricao dos campos do Rodape do Modelo 2
Local aGrid := {80,005,050,300} //Array com coordenadas da GetDados no
modelo2 - Padrao: {44,5,118,315}
// Linha Inicial - Coluna Inicial - +Qts Linhas - +Qts
Colunas : {080,005,050,300}
Local cLinhaOk := "AllwaysTrue()" // Validacoes na linha da GetDados da
Modelo 2
Local cTudoOk := "AllwaysTrue()" // Validacao geral da GetDados da Modelo 2
Local lRetMod2 := .F. // Retorno da função Modelo2 - .T. Confirmou / .F.
Cancelou
Local nColuna := 0
- 199 -
// 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)
// Inicialização 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
IF lRetMod2
//MsgInfo("Você confirmou a operação","MBRW2SX5")
For nLinha := 1 to len(aCols)
// Campos de Cabeçalho
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 operação","MBRW2SX5")
ENDIF
Return
- 200 -
O nom e Modelo 3, assim com o a Modelo 2 foi conceit uado pela Microsiga por se t rat ar de um
prot ót ipo de t ela para ent rada de dados. I nicialm ent e vam os desm ist ifica dois pont os:
Para ganharm os t em po não ser á apr esent ado aqui t oda a explicação e m ont agens para a
função En ch oice Ba r , com ando M sD ia log, Sa y e M sGe t e para os v et ores a H e a de r e
a COLS, ent r et ant o t odos est es est arão na codificação do código font e. A figura abaixo m ost ra
exat am ent e o que é a t ela prot ót ipo Modelo 3:
Figu r a : Pr ot ót ipo M od e lo 3
- 201 -
Diant e dos expost os at é o m om ent o houve um novo nom e para nós, é ele a função Enchoice, o
que é?
Fu n çã o En ch oice ( ) – Obj e t o M sM Ge t ( )
A função Enchoice ou o obj et o MsMGet são r ecur sos baseados no dicionário de dados para
verificar cam pos obrigatórios, validações, gat ilhos, consult a padrão e et c. Assim t am bém par a
criar past as de cadast r os. Est es podem ser usados t ant o com variáv eis de m em órias com o
escopo Privat e com o diret am ent e os cam pos da t abela que se r efer e. A diferença entre a função
Enchoice e o obj et o MsMGet é que a função não ret orna o nom e da variável de obj et o
export áv el criado.
A est rut ura par a m ont ar um pr ogram a com o prot ót ipo m odelo 3 é sem elhant e ao pr ot ót ipo
m odelo 2, porém a diferença real é a ut ilização da função Enchoice ou o obj et o MsMGet , para
est e docum ent o irem os t rabalhar com a função.
Sin t a x e : En ch oice ( cAlia s, n Re g , n Opc, a Ac, cOpc, cTe x t Ex clu i, a Ach o, a Pos,
a Cpos, n N u m , n ColM e n s, cM e n sa ge m , cTu d Ok , oObj , lVir t u a l)
Pa r â m e t r os:
- 202 -
SA2->A2_NOME
Agora quando querem os r efer enciar a um a variável que est á com o cont eúdo do m esm o
cam po criam os out r o recurso, dest a form a:
M->A2_NOME
E para criar variáveis com o nom e do cam po ut ilizam os um código de bloco ( code- block) e
m ais um laço de leit ura para at ribuir valores iniciais a cada um a dela. Ent ão fica assim o
procedim ent o:
E em out ro m om ent o aprov eit am os est á variável bCam po para facilit ar a at ribuição, v ej a o
ex em plo abaixo :
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := Atribuição inicial ou atribuição de valor
Next nX
Ou sej a, fazer para t odos os cam pos, e a cada cam po criar a variável com a at ribuição inicial
ou at ribuição de valor.
- 203 -
O ex em plo abaixo dem onst ra a m ont agem de um program a para a ut ilização do prot ót ipo
Modelo 3. Ant es de iniciarm os o exem plo vam os est rut urar o pr ogram a.
Est r u t u r a d o p r og r a m a
Linh a s Pr ogr a m a
1 Fun çã o pr in cipa l;
2 Declar ação e at ribuição de variáveis;
3 Acesso a t abela pr incipal e sua or dem ;
4 Cham ada da função MBrowse;
5 Fim da fu n çã o prin cipa l.
6
7 Fun çã o de visua liza çã o, a lt e r a çã o e e x clusã o;
8 Declar ação e at ribuição de variáveis;
9 Acesso ao pr im eiro r egistr o da chave em que est á posicionado na MBrowse;
10 Const rução das var iáveis de m em ór ia M- > ???;
11 Mont agem do vet or aHeader por m eio do dicionár io de dados;
Mont agem do vet or aCOLS de t odos os r egist r os refer ente a chave pr incipal em que est á
12
posicionado na MBr owse;
13 I nst ância da MsDialog;
14 Execução da função Enchoice;
15 I nst ância do obj et o MsGetDados;
16 At ivar o obj et o pr incipal que é o obj et o da j anela;
17 Se for oper ação difer ent e de visualização e clicou no bot ão OK;
18 A oper ação e de Alt er ação?
19 Cham ar a função par a alt er ar os dados;
20 Caso cont rár io
21 Cham ar a função par a excluir os dados;
22 Fim da fu n çã o de v isua liza çã o, a lt e r a çã o e e x clusã o.
23
24 Fun çã o de in clu sã o;
25 Declar ação e at ribuição de variáveis;
26 Const rução das var iáveis de m em ór ia M- > ???;
27 Mont agem do vet or aHeader por m eio do dicionár io de dados;
Mont agem do vetor aCOLS com o seu cont eúdo confor m e o inicializador padr ão do cam po ou
28
vazio, pois t rat a- se de um a inclusão;
29 I nst ância da MsDialog;
30 I nst ância dos obj et os TSay e TGet ;
31 I nst ância do obj et o MsGetDados;
32 At ivar o obj et o pr incipal que é o obj et o da j anela;
33 Se clicou no bot ão OK;
34 Cham ar a função par a incluir os dados;
35 Fim da fu n çã o de in clu sã o.
- 204 -
//+--------------------------------------------------------------------+
//| Rotina | xModelo3 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Função exemplo do protótipo Modelo3. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
#Include "Protheus.ch"
Private aSize := {}
Private aInfo := {}
Private aObj := {}
Private aPObj := {}
Private aPGet := {}
dbSelectArea("ZA1")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA1")
Return
- 205 -
//+--------------------------------------------------------------------+
//| Rotina | Mod3Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
User Function Mod3Inc( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private aHeader := {}
Private aCOLS := {}
Private aGets := {}
Private aTela := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := CriaVar( FieldName( nX ), .T. )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
// Atualização 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.)
- 206 -
//+--------------------------------------------------------------------+
//| Rotina | Mod3Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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])
// Atualização 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.)
- 207 -
//+--------------------------------------------------------------------+
//| Rotina | Mod3aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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
Fu n çã o pa r a m on t a r o ve t or a Cols
//+--------------------------------------------------------------------+
//| Rotina | Mod3aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
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 -
Fu n çã o pa r a a t r ibu ir o n om e do clie n t e a v a r iá v e l
//+--------------------------------------------------------------------+
//| Rotina | Mod3Cli | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para atualizar a variável com o nome do cliente. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
- 209 -
//+--------------------------------------------------------------------+
//| Rotina | Mod3LOk | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para atualizar a variável com o total dos itens. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
User Function Mod3LOk()
Local nI := 0
nTotal := 0
For nI := 1 To Len( aCOLS )
If aCOLS[nI,Len(aHeader)+1]
Loop
Endif
nTotal+=Round(aCOLS[nI,GdFieldPos("ZA2_QTDVEN")]*;
aCOLS[nI,GdFieldPos("ZA2_PRCVEN")],2)
Next nI
oTotal:Refresh()
Return(.T.)
//+--------------------------------------------------------------------+
//| Rotina | Mod3TOk | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar os itens se foram preenchidos. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
Static Function Mod3TOk()
Local nI := 0
Local lRet := .T.
For nI := 1 To Len(aCOLS)
If aCOLS[nI, Len(aHeader)+1]
Loop
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_PRODUT")]) .And. lRet
MsgAlert("Campo PRODUTO preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_QTDVEN")]) .And. lRet
MsgAlert("Campo QUANTIDADE preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_PRCVEN")]) .And. lRet
MsgAlert("Campo PRECO UNITARIO preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If !lRet
Exit
Endif
Next i
Return( lRet )
- 210 -
//+--------------------------------------------------------------------+
//| Rotina | Mod3Grv | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para efetuar a gravação nas tabelas. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+--------------------------------------------------------------------+
Static Function Mod3Grv( nOpc, aAltera )
Local nX := 0
Local nI := 0
// Se for inclusão
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 Cabeçalho
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 alteração
If nOpc == 4
// Grava os itens conforme as alterações
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
- 211 -
// Grava o Cabeçalho
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 exclusão
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 Cabeçalho
dbSelectArea("ZA1")
RecLock("ZA1",.F.)
dbDelete()
MsUnLock()
Endif
Return
- 212 -
A função Modelo3) é um a int erface pré- definida pela Microsiga que im plem ent a de form a
padronizada os com pont es necessários a m anipulação de est rut uras de dados nas quais o
cabeçalho e os it ens da inform ação est ão em t abelas separadas.
Seu obj et ivo é at uar com o um facilit ador de codificação, per m it indo a ut ilização dos r ecursos
básicos dos seguint es com ponent es visuais:
M sD ia log( )
En ch oice ( )
En ch oice Ba r ( )
M sN e w Ge t D a dos( )
Da m esm a form a, o Browse dev e ser t rat ado por est a rot ina, sendo
com um a Modelo3( ) est ar vinculada ao uso de um a MBr owse( ) .
Sin t a x e : M ode lo3 ( [ cTit u lo] , [ cAlia sE] , [ cAlia sGe t D ] , [ a Cp osE] , [ cLin Ok ] ,
[ cTu dOk ] , [ n OpcE] , [ n OpcG] , [ cFie ldOk ] )
Pa r â m e t r os:
- 213 -
Lógico I ndica se a t ela da int er face Modelo2( ) foi confirm ada ou cancelada pelo
usuário.
#INCLUDE "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRWMOD3| Autor | ARNALDO RAYMUNDO JR. |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | EXEMPLO DE UTILIZACAO DA MODELO3(). |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
- 214 -
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ 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 -
If Len(aCols)>0
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Executa a Modelo 3 ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
aCposE := {"C5_CLIENTE"}
Return
- 216 -
Brow se padrão para visualização das inform ações da base de dados, de acordo com as
configurações do SX3 – Dicionário de Dados ( cam po br ow se) .
Recur sos adicionais com o ident ificador es de st at us de regist ros, legendas e filt ros para
as inform ações.
Pa r â m e t r os:
Arquivos de t rabalho
- 217 -
- 218 -
Array cont endo as funções que serão execut adas pela Mbrowse, nele
será definido o t ipo de operação a ser execut ada ( inclusão, alt eração,
exclusão, visualização, pesquisa, et c. ) , e sua est rut ura é com post a de
5 ( cinco) dim ensões:
[ n] [ 1] - Tít ulo;
[ n] [ 2] – Rot ina;
[ n] [ 3] – Reservado;
[ n] [ 4] – Operação ( 1 - pesquisa; 2 - visualização; 3 - inclusão; 4 -
a Rot in a alt eração; 5 - exclusão) ;
Ao definir as funções no ar ray aRot ina, se o nom e da função não for especificado com “ ( ) ” , a
Mbrowse passará com o parâm et ros as seguint es variáveis de cont r ole:
A posição das funções no array aRot ina define o cont eúdo de um a variável de
cont r ole que será repassada para as funções cham adas a part ir da Mbrow se,
conv encionada com o nOpc. Dest a form a, para m ant er o padrão da aplicação
ERP a ordem a ser seguida na definição do aRot ina é:
1. Pesquisar
2. Visualizar
3. I ncluir
4. Alt erar
5. Excluir
6. Livre
- 219 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrição | Exemplo de utilização da função MBROWSE() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
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 Nil
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrição | Exemplo de utilização da função MBROWSE() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 220 -
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return Nil
/*/
+-----------------------------------------------------------------------------
| Função | INCLUI | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de inclusão específica chamando a AXINCLUI() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
nOpcao := AxInclui(cAlias,nReg,nOpc,,,,cTudoOk)
If nOpcao == 1
MsgInfo(“Inclusão concluída com sucesso!”)
ElseIf == 2
MsgInfo(“Inclusão cancelada!”)
Endif
Return Nil
- 221 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | EXCLUI | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de exclusão especifica chamando a AxDeleta |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
nOpcao := AxDeleta(cAlias,nReg,aRotina[nOpc,4])
// Identifica corretamente a opção definida para o função em aRotinas com mais
// do que os 5 elementos padrões.
If nOpcao == 1
MsgInfo(“Exclusão realizada com sucesso!”)
ElseIf == 2
MsgInfo(“Exclusão cancelada!”)
Endif
Return Nil
2 2 .4 .1 . Ax Funct ions( )
Conform e m encionado nos t ópicos sobre as int erfaces padrões AxCadast ro( ) e Mbr ow se( ) ,
exist em funções padr ões da aplicação ERP que perm it em a visualização, inclusão, alt eração e
exclusão de dados em form at o sim ples.
Est as funções são padrões na definição da int erface AxCadast ro( ) e podem ser ut ilizadas
t am bém da const rução no array aRot ina ut ilizado pela Mbr ow se( ) , as quais est ão list adas a
seguir:
AXPESQUI ( )
AX VI SUAL( )
AX I N CLUI ( )
AX ALTERA( )
AX D ELETA( )
- 222 -
Sin t a x e AXPESQUI ( )
Função de pesquisa padrão em r egist ros exibidos pelos br owses do sist em a,
a qual posiciona o br ow se no regist ro pesquisado. Exibe um a t ela que
D e scr içã o
perm it e a seleção do índice a ser ut ilizado na pesquisa e a digit ação das
inform ações que com põe a chave de busca.
AX VI SUAL( )
AX I N CLUI ( )
AX ALTERA( )
AX D ELETA( )
- 223 -
Pa r â m e t r os:
2 2 .4 .3 . EndFilBr w ( )
Pa r â m e t r os:
- 224 -
A PesqBrw( ) é um a funcionalidade que perm it e a pesquisa dent r o da MBr owse( ) . Est a função
dev erá obrigat oriam ent e subst it uir a função AxPesqui, no array do aRot ina, sem pr e que for
ut ilizada a função FilBrowse( ) .
Pa r â m e t r os:
n Re g Núm er o do regist ro
Bloco de Código que cont ém a FilBrowse( )
bBr w Filt e r
Ex: bBrwFilt er : = { | | FilBrowse( cAlias, aQuery , cFilt ro, lShowPr oc) }
2 2 .4 .5 . Br w Le ge nda ( )
Pa r â m e t r os:
Mesm a variável ut ilizada para a MBrow se, que ident ifica o cadast r o que
cCa da st r o
est á em uso no m om ent o
cTit u lo Tít ulo ( ident ificação) da Legenda
Array cont endo de definição da cor e do t ext o, explicat ivo sobr e o que
ela represent a na MBr owse
a Le ge n d a
Ex: { { “ Cor” ,” Text o” } }
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CI NZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PI NK
BR_PRETO
- 225 -
#Include "Protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | MBrwSA2 | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Exemplo da MBrowse utilizando a tabela de Cadastro de |
| | Fornecedores |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
/*
-- CORES DISPONIVEIS PARA LEGENDA --
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PINK
BR_PRETO
*/
dbSelectArea(cAlias)
dbSetOrder(1)
- 226 -
//+------------------------------------------------------------
//| Cria o filtro na MBrowse utilizando a função FilBrowse
//+------------------------------------------------------------
Eval(bFiltraBrw)
dbSelectArea(cAlias)
dbGoTop()
mBrowse(6,1,22,75,cAlias,,,,,,aCores)
//+------------------------------------------------
//| Deleta o filtro utilizado na função FilBrowse
//+------------------------------------------------
EndFilBrw(cAlias,aIndexSA2)
Return Nil
//+---------------------------------------
//|Função: BInclui - Rotina de Inclusão
//+---------------------------------------
User Function BInclui(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxInclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Inclusão efetuada com sucesso!")
Else
MsgInfo("Inclusão cancelada!")
Endif
Return Nil
//+-----------------------------------------
//|Função: BAltera - Rotina de Alteração
//+-----------------------------------------
User Function BAltera(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Alteração efetuada com sucesso!")
Else
MsgInfo("Alteração cancelada!")
Endif
Return Nil
- 227 -
//+-----------------------------------------
//|Função: BDeleta - Rotina de Exclusão
//+-----------------------------------------
User Function BDeleta(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxDeleta(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Exclusão efetuada com sucesso!")
Else
MsgInfo("Exclusão cancelada!")
Endif
Return Nil
//+-------------------------------------------
//|Função: BLegenda - Rotina de Legenda
//+-------------------------------------------
User Function BLegenda()
Local aLegenda := {}
Return Nil
- 228 -
Pa r â m e t r os:
cCa m p o Cam po do arquivo onde será feit o o cont role ( gravação) da m ar ca.
Cam po onde será feit a a validação para m ar cação e exibição do bit m ap
cCpo
de st at us.
Vet or de colunas a ser em exibidas no browse, dev e cont er as seguint es
dim ensões:
cCt r lM Função a ser ex ecut ada caso desej e m arcar t odos elem ent os.
u Pa r 8 Parâm et r o r eservado.
Função que r et orna o cont eúdo inicial do filt ro baseada na chav e de
cEx pI n i
índice selecionada.
Função que r et orna o cont eúdo final do filt ro baseada na chav e de
cEx pFim
índice selecionada.
cAv a l Função a ser ex ecut ada no duplo clique em um elem ent o no br ow se.
Ao definir as funções no ar ray aRot ina, se o nom e da função não for especificado com “ ( ) ” , a
MarkBrowse passar á com o par âm et ros as seguint es variáveis de cont r ole:
- 229 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | MkBrwSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | MarkBrowse Genérico |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aCpos := {}
Local aCampos := {}
Local nI := 0
Local cAlias := "SA1"
Private aRotina := {}
Private cCadastro := "Cadastro de Clientes"
Private aRecSel := {}
AADD(aCpos, "A1_OK" )
AADD(aCpos, "A1_FILIAL" )
AADD(aCpos, "A1_COD" )
AADD(aCpos, "A1_LOJA" )
AADD(aCpos, "A1_NOME" )
AADD(aCpos, "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)
Return Nil
- 230 -
/*/
+-----------------------------------------------------------------------------
| Programa | VisLote() | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | Função 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())
SA1->(dbSkip())
Enddo
IF Len(aRecSel) > 0
cTexto := "Código | Loja | Nome Reduzido "+cEol
// "1234567890123456789012345678901234567890
// "CCCCCC | LL | NNNNNNNNNNNNNNNNNNNN +cEol
For nX := 1 to Len(aRecSel)
Next nX
RETURN
- 231 -
/*/
+-----------------------------------------------------------------------------
| Programa | LimpaMarca | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | Função utilizada para demonstrar o uso do recurso da MarkBrowse|
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
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
- 232 -
2 3 .2 .1 . Cr ia Tr a b( )
Pa r â m e t r os
Os arquivos criados com a função CRI ATRAB( ) serão gerados no diret ório
especificado com o “ St ar t Pat h” , de acordo com o “ Root Pat h” configurado no .ini
da aplicação.
- 233 -
A dbUseAr ea( ) é um a funcionalidade que perm it e definir um arquivo de base de dados, com
um a área de t rabalho disponível na aplicação.
Pa r â m e t r os
2 3 .2 .3 . I ndRe gua ( )
Pa r â m e t r os
cAlia s Alias da t abela onde ser á efet uada o índice/ filt ro t em por ário
x Or de m Parâm et r o nulo
cM e n s Parâm et r o nulo
- 234 -
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Programa | GeraTrab | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Desc. | Utilização de arquivos e índices temporários |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aStru := {}
Local aArqTRB := {}
Local nI := 0
Local cIndTRB := ""
Local cNomArq := ""
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
- 235 -
dbSelectArea("TRB")
dbCloseArea()
Return Nil
• O arr ay a St r u foi criado com base nos cam pos exist ent es no sist em a,
ao invés de criarm os novas est rut uras dos cam pos, ut ilizam os as j á
exist ent es no dicionários de dados ( SX3) .
- 236 -
/*/
+-----------------------------------------------------------------------------
| Programa | IndTwoReg | Autor | MICHEL DANTAS | Data | |
+-----------------------------------------------------------------------------
| Desc. | Utilização de dois índices temporários com DBFCDX |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
LOCAL nOrder := 0
LOCAL cArq1 := CriaTrab(NIL,.F.)
LOCAL cChave1 := "A1_FILIAL+A1_EST"
LOCAL cArq2 := CriaTrab(NIL,.F.)
LOCAL cChave2 := "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())
dbsetOrder(nOrder+1)
dbGoTop()
While !Eof()
Alert("Estado : " + SA1->A1_EST +" "+" Nome : " + SA1->A1_NOME)
dbSkip()
End
dbSetOrder(nOrder+2)
dbGoTop()
While !Eof()
Alert("Estado : " + SA1->A1_EST +" "+" Nome : " + SA1->A1_NOME)
dbSkip()
End
RetIndex("SA1")
Ferase(cArq1+OrdBagext())
Ferase(cArq2+OrdBagext())
Return
- 237 -
Os relat órios desenvolvidos em ADVPL possuem um padrão de desenvolvim ent o que m ais
depende de layout e t ipos de parâm et r os do que qualquer out ro t ipo de inform ação, vist o que
at é o m om ent o percebem os que a linguagem padrão da Microsiga é m uit o m ais com post a de
funções genéricas do que de com andos.
Est e t ipo de r elat ório é caract erizado por um form at o de im pressão t ipo Post Script ® , e perm it e
a geração de um arquivo em form at o t ext o ( .t x t ) , com um a ext ensão própria da aplicação ERP
( .# # R) .
A est rut ura de um r elat ório não gráfico é baseada no uso da função Set Print ( ) , com plem ent ada
pelo uso de out r as funções acessórias, as quais est ão det alhadas no Guia de Refer ência Rápida
que acom panha est e m at erial.
Nest e t ópico ser á dem onst rada a const rução de r elat ório não gráfico baseado no uso da função
Set Print ( ) o qual at ende os form at os de base de dados I SAM e Topconnect , por ém não
cont em plando a t ecnologia Prot heus Em bedded SQL.
Est r u t u r a d o p r og r a m a
Linh a s Pr ogr a m a
1 Fun çã o pr in cipa l;
2 Declar ação e at ribuição de variáveis;
3 At ualização do ar quivo de pergunt as at ravés da função específica Cr iaSX1( ) ;
4 Definição as pergunt as at ravés da função Per gunt e( ) ;
5 Definição das ordens disponíveis par a im pr essão do r elat ór io;
6 Cham ada da função Set Pr int ;
7 At ualização das configur ações de im pr essão com a função Set Default ( ) ;
8 Execução da r ot ina de im pr essão atr avés da função Rpt St at us( )
9 Fim da fu n çã o prin cipa l.
- 238 -
//+-----------------------------------------------------------------+
//| Rotina | Inform | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para gerar relatório utilizando as funções |
//| | SetPrint() e SetDefault(). |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+-----------------------------------------------------------------+
Continuação:
- 239 -
//+-------------------------------------------------
//| Disponibiliza para usuário digitar os parâmetros
//+-------------------------------------------------
Pergunte(cPerg,.F.)
//cPerg -> Nome do grupo de perguntas, .T. mostra a tela,;
// .F. somente carrega as variáveis
//+---------------------------------------------------
//| Solicita ao usuário a parametrização do relatório.
//+---------------------------------------------------
wnrel :=
SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,.F., ;
Tamanho,.F.,.F.)
//SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd,lCompres,;
//cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortToPrint)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
//+------------------------------------------------------------------
//| Estabelece os padrões para impressão, conforme escolha do usuário
//+------------------------------------------------------------------
SetDefault(aReturn,cString)
//+-------------------------------------
//| Verificar se será reduzido ou normal
//+-------------------------------------
nTipo := IIF(aReturn[4] == 1, 15, 18)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
Continuação:
- 240 -
Return
//+-----------------------------------------------------------------+
//| Rotina | ImpRel | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina de processamento e impressão. |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+-----------------------------------------------------------------+
Local nIndice := 0
Local cArq := ""
Local cIndice := ""
Local cFiltro := ""
Local aCol := {}
Local cFornec := ""
Local nValor := 0
Local nPago := 0
Local nSaldo := 0
Local nT_Valor := 0
Local nT_Pago := 0
Local nT_Saldo := 0
Local cArqExcel := ""
Local cAliasImp
Local oExcelApp
Titulo += aOrd[aReturn[8]]
#IFNDEF TOP
cAliasImp := "SE2"
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
Continuação:
- 241 -
cArq := CriaTrab(NIL,.F.)
dbSelectArea(cAliasImp)
IndRegua(cAliasImp,cArq,cIndice,,cFiltro)
nIndice := RetIndex()
nIndice := nIndice + 1
dbSetIndex(cArq+OrdBagExt())
dbSetOrder(nIndice)
#ELSE
cAliasImp := GetNextAlias()
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
Continuação:
- 242 -
dbGoTop()
SetRegua(0)
//+--------------------
//| Coluna de impressão
//+--------------------
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
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
Continuação:
- 243 -
IncRegua()
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
If mv_par07 == 2
@ Li, aCol[1] PSay (cAliasImp)->E2_PREFIXO
@ Li, aCol[2] PSay (cAliasImp)->E2_NUM
@ Li, aCol[3] PSay (cAliasImp)->E2_PARCELA
@ Li, aCol[4] PSay (cAliasImp)->E2_TIPO
@ Li, aCol[5] PSay (cAliasImp)->E2_EMISSAO
@ Li, aCol[6] PSay (cAliasImp)->E2_VENCTO
@ Li, aCol[7] PSay (cAliasImp)->E2_VENCREA
@ Li, aCol[8] PSay (cAliasImp)->E2_VALOR ;
PICTURE "@E 99,999,999,999.99"
@ Li, aCol[9] PSay (cAliasImp)->E2_VALOR -;
(cAliasImp)->E2_SALDO ;
PICTURE "@E 99,999,999,999.99"
@ Li, aCol[10] PSay (cAliasImp)->E2_SALDO ;
PICTURE "@E 99,999,999,999.99"
Li ++
Endif
nValor += (cAliasImp)->E2_VALOR
nPago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nSaldo += (cAliasImp)->E2_SALDO
nT_Valor += (cAliasImp)->E2_VALOR
nT_Pago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nT_Saldo += (cAliasImp)->E2_SALDO
dbSkip()
End
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
nValor := 0
nPago := 0
nSaldo := 0
End
Continuação:
- 244 -
If Li <> 80
Roda(cbCont,cbTxt,Tamanho)
Endif
//+----------------------------------------------------------------------
//| Gera arquivo do tipo .DBF com extensão .XLS p/ usuário 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 não instalado")
Return
Endif
oExcelApp := MsExcel():New()
oExcelApp:WorkBooks:Open( "c:\"+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS" )
oExcelApp:SetVisible(.T.)
Endif
Ms_Flush()
Return
- 245 -
//+-----------------------------------------------------------------+
//| Rotina | CriaSX1 | Autor | Robson Luiz (rleg)| Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para criar o grupo de parâmetros. |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitação. |
//+-----------------------------------------------------------------+
Static Function CriaSx1()
Local aP := {}
Local i := 0
Local cSeq
Local cMvCh
Local cMvPar
Local aHelp := {}
/******
Parâmetros da função padrão
---------------------------
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)
- 246 -
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
- 247 -
2 5 .1 . Ge r a çã o e le it ur a de a r quivos e m for m a t o t e x t o
Arquivos do t ipo t ext o ( t am bém conhecidos com o padrão TXT) são ar quivos com regist ros de
t am anho variável. A indicação do final de cada regist ro é repr esent ada por dois byt es, “ 0D
0A” em hexadecim al ou “ 13 10” em decim al ou, ainda, “ CR LF” para padrão ASCI I .
Apesar do t am anho dos regist ros ser variável, a m aioria dos sist em as gera est e t ipo de arquivo
com r egist ros de t am anho fixo, de acordo com um layout específico que indica quais
são os dados gravados.
Para ilust rar est es procedim ent os, serão ger ados arquivos t ext os, com duas fam ílias de
funções:
1 ª ) Fa m ília : nest a fam ília serão ut ilizadas as funções: FCr eat e( ) , FWrit e( ) , FClose( ) ,
FSeek( ) , FOpen( ) e FRead( ) .
A diferença ent re as duas fam ílias, est á na leit ura do arquivo t ext o.
Quando se t rat ar de arquivo t ext o com t am anho fixo das linhas, poder ão
ser ut ilizadas as duas fam ílias para leit ura do arquivo, por ém , quando se
t rat ar de arquivo t ext o com t am anho variável das linhas, som ent e
poderá ser ut iliza a segunda fam ília, repr esent ada pelas funções:
FT_FUse( ) , FT_FGoTo( ) , FT_FRecno( ) , FT_FGoTop( ) , FT_FLast Rec( ) ,
FT_FEof( ) , FT_FReadLn( ) e FT_FSkip( ) .
- 248 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | GeraTXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Gera o arquivo TXT, a partir do Cadastro de Clientes |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
//+--------------------------------+
//| Declaração de Variáveis |
//+--------------------------------+
Local oGeraTxt
Private cPerg := "EXPSA1"
Private cAlias := "SA1"
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
dbSelectArea(cAlias)
dbSetOrder(1)
//+-----------------------------------+
//| Montagem da tela de processamento.|
//+-----------------------------------+
Return Nil
- 249 -
/*/
+-----------------------------------------------------------------------------
| Função | OKGERATXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função chamada pelo botão OK na tela inicial de processamento. |
| | Executa a geração do arquivo texto. |
+-----------------------------------------------------------------------------
/*/
//+-----------------------------------------------------------------------------
//| Cria o arquivo texto
//+-----------------------------------------------------------------------------
Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl := fCreate(cArqTxt)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" não pode ser executado! Verifique os
parâmetros.","Atenção!")
Return
Endif
Return Nil
/*/
+-----------------------------------------------------------------------------
| Função | RUNCONT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função auxiliar chamada pela PROCESSA. A função PROCESSA |
| | monta a janela com a régua de processamento. |
+-----------------------------------------------------------------------------
/*/
Local cLin
dbSelectArea(cAlias)
dbGoTop()
ProcRegua(RecCount()) // Numero de registros a processar
While (cAlias)->(!EOF())
//Incrementa a régua
IncProc()
cLin := (cAlias)->A1_FILIAL
cLin += (cAlias)->A1_COD
cLin += (cAlias)->A1_LOJA
cLin += (cAlias)->A1_NREDUZ
cLin += STRZERO((cAlias)->A1_MCOMPRA*100,16) // 14,2
cLin += DTOS((cAlias)->A1_ULTCOM)//AAAAMMDD
cLin += CRLF
- 250 -
//+-------------------------------------------------------------------+
//| Gravação no arquivo texto. Testa por erros durante a gravação da |
//| linha montada. |
//+-------------------------------------------------------------------+
If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin)
If !MsgAlert("Ocorreu um erro na gravação do arquivo."+;
"Continua?","Atenção!")
Exit
Endif
Endif
(cAlias)->(dbSkip())
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na função
anterior
fClose(nHdl)
Return Nil
Not e que para a geração do arquivo TXT foram ut ilizadas, basicam ent e, as funções
FCreat e, FWrit e e FClose que, respect ivam ent e, gera o arquivo, adiciona dados e fecha
o arquivo. No ex em plo, o form at o é est abelecido pela concat enação dos dados na
variável cLin a qual é ut ilizada na gravação dos dados. Para a leit ura de dados TXT serão
ut ilizada as funções FOpen e FRead.
#Include "protheus.ch"
/*/
+-----------------------------------------------------------------------
| Programa | LeTXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------
| Descrição | Leitura de arquivo TXT |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
User Function LeTXT()
//+-------------------------------------------------------------------+
//| Declaração de Variáveis |
//+-------------------------------------------------------------------+
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
- 251 -
dbSelectArea(cAlias)
dbSetOrder(1)
//+-------------------------------------------------------------------+
// Montagem da tela de processamento |
//+-------------------------------------------------------------------+
Return Nil
/*/
+-----------------------------------------------------------------------------
| Função | OKLETXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função chamada pelo botão OK na tela inicial de processamento |
| | Executa a leitura do arquivo texto |
+-----------------------------------------------------------------------------
/*/
//+-------------------------------------------------------------------+
//| Abertura do arquivo texto |
//+-------------------------------------------------------------------+
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" não pode ser aberto! Verifique os
parâmetros.","Atenção!")
Return
Endif
- 252 -
/*/
+-----------------------------------------------------------------------------
| Função | RUNCONT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função auxiliar chamada pela PROCESSA. A função PROCESSA |
| | monta a janela com a régua de processamento. |
+-----------------------------------------------------------------------------
/*/
Local nTamFile := 0
Local nTamLin := 56
Local cBuffer := ""
Local nBtLidos := 0
Local cFilSA1 := ""
Local cCodSA1 := ""
Local cLojaSA1 := ""
//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) // Variável para criação da linha do registro para
leitura
//Incrementa a régua
IncProc()
While .T.
IF dbSeek(cFilSA1+cCodSA1+cLojaSA1)
cCodSA1 := SOMA1(cCodSA1)
Loop
Else
Exit
Endif
Enddo
- 253 -
dbSelectArea(cAlias)
RecLock(cAlias,.T.)
(cAlias)->A1_FILIAL := cFilSA1 //- 01, 02 - TAM: 02
(cAlias)->A1_COD := cCodSA1 //- 03, 08 - TAM: 06
(cAlias)->A1_LOJA := cLojaSA1 //- 09, 10 - TAM: 02
(cAlias)->A1_NREDUZ := Substr(cBuffer,11,20)
//- 11, 30 - TAM: 20
(cAlias)->A1_MCOMPRA := Val(Substr(cBuffer,31,16))/100
//- 31, 46 - TAM: 14,2
(cAlias)->A1_ULTCOM := STOD(Substr(cBuffer,47,08))
//- 47, 54 - TAM: 08
MSUnLock()
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na função
anterior.
fClose(nHdl)
Return Nil
#Include "Protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | LeArqTXT | Autor | Robson Luiz | Data | |
+-----------------------------------------------------------------------------
| Descrição | Leitura de arquivo TXT |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
User Function LeArqTxt()
Private nOpc := 0
Private cCadastro := "Ler arquivo texto"
Private aSay := {}
Private aButton := {}
AADD( aSay, "O objetivo desta rotina e efetuar a leitura em um arquivo texto" )
If nOpc == 1
Processa( {|| Import() }, "Processando..." )
Endif
Return Nil
- 254 -
//+-------------------------------------------
//| Função - Import()
//+-------------------------------------------
Static Function Import()
/***
* _________________________________________________________
* cGetFile(<ExpC1>,<ExpC2>,<ExpN1>,<ExpC3>,<ExpL1>,<ExpN2>)
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* <ExpC1> - Expressão de filtro
* <ExpC2> - Titulo da janela
* <ExpN1> - Numero de mascara default 1 para *.Exe
* <ExpC3> - Diretório inicial se necessário
* <ExpL1> - .F. botão salvar - .T. botão abrir
* <ExpN2> - Mascara de bits para escolher as opções de visualização do objeto
* (prconst.ch)
*/
cFileOpen := cGetFile(cExtens,cTitulo1,,cMainPath,.T.)
If !File(cFileOpen)
MsgAlert("Arquivo texto: "+cFileOpen+" não localizado",cCadastro)
Return
Endif
FT_FUSE(cFileOpen) //ABRIR
FT_FGOTOP() //PONTO NO TOPO
ProcRegua(FT_FLASTREC()) //QTOS REGISTROS LER
// Capturar dados
cBuffer := FT_FREADLN() //LENDO LINHA
MsgInfo(cMsg)
- 255 -
A sint axe conv encional para definição de com ponent es visuais da linguagem ADVPL depende
diret am ent e no include especificado no cabeçalho do font e. Os dois includes disponíveis para o
am bient e ADVPL Pr ot heus são:
RWMAKE.CH: perm it e a ut ilização da sint axe CLI PPER na definição dos com ponent es
visuais.
Para ilust rar a diferença na ut ilização dest es dois includes, segue abaixo as diferent es
definições para o com ponent es Dialog e MsDialog:
#include “rwmake.ch”
#include “protheus.ch”
DEFINE MSDIALOG oDlg TITLE "Janela em sintaxe ADVPL "FROM 000,000 TO 400,600
PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Os com ponent es da int erface visual que ser ão t rat ados nest e t ópico, ut ilizando a sint axe
clássica da linguagem ADVPL são:
BUTTON ( )
CH ECKBOX( )
COM BOBOX ( )
FOLD ER( )
M SD I ALOG( )
M SGET( )
- 256 -
BUTTON ( )
CH ECKBOX( )
COM BOBOX ( )
FOLD ER( )
M SD I ALOG( )
- 257 -
RAD I O( )
SAY( )
SBUTTON ( )
- 258 -
Os indicadores de progr esso ou r éguas de processam ent o disponíveis na linguagem ADVPL que
serão abordados nest e m at erial são:
RPTSTATUS( )
PROCESSA( )
M SN EW PROCESS( )
M SAGUARD E( )
M SGRUN ( )
2 6 .2 .1 . Rpt St a t us( )
Régua de pr ocessam ent o sim ples, com apenas um indicador de progresso, ut ilizada no
processam ent o de relat órios do padrão Set Print ( ) .
Re t or n o: N il
Pa r â m e t r os:
Bloco de código que especifica a ação que será ex ecut ada com
bAca o
o acom panham ent o da régua de processam ent o.
Mensagem que será exibida na régua de processam ent o
cM e n sa ge m
durant e a ex ecução.
Ap a r ê n cia
- 259 -
/*/
+---------------------------------------------------------------------------
| Função | GRPTSTATUS | Autor | ROBSON LUIZ | Data | |
+---------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização das funções RPTSTATUS() |
| | SETREGUA() E INCREGUA() |
+---------------------------------------------------------------------------
| Uso | Curso ADVPL |
+---------------------------------------------------------------------------
/*/
CriaSX1()
Pergunte(cPerg,.F.)
If nOpc <> 1
Return Nil
Endif
Return Nil
- 260 -
/*/
+-----------------------------------------------------------------------------
| Função | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de processamento executada através da RPTSTATUS() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5")+mv_par01,.T.)
dbSeek(xFilial("SX5")+mv_par01,.T.)
SetRegua(nCnt)
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA <= mv_par02
IncRegua()
If lEnd
MsgInfo(cCancel,"Fim")
Exit
Endif
dbSkip()
End
Return .T.
SETREGUA( )
A função Set Regua( ) é ut ilizada para definir o valor m áxim o da régua de progr essão criada
at ravés da função Rpt St at us( ) .
Sin t a x e : Se t Re g u a ( n M a x Pr oc)
Pa r â m e t r os:
n M a x Pr oc Variável que indica o v alor m áxim o de pr ocessam ent o ( passos) que serão
indicados pela régua.
Re t or n o:
Nenhum .
- 261 -
...
I N CREGUA( )
A função I ncRegua( ) é ut ilizada para increm ent ar valor na régua de progressão criada at rav és
da função Rpt St at us( )
Sin t a x e : I n cRe gu a ( cM e n sa ge m )
Pa r â m e t r os:
Re t or n o:
Nenhum .
Ex e m plo:
...
- 262 -
Régua de pr ocessam ent o sim ples, com apenas um indicador de progresso, ut ilizada no
processam ent o de rot inas.
Re t or n o: N il
Pa r â m e t r os:
Bloco de código que especifica a ação que será ex ecut ada com
bAca o
o acom panham ent o da régua de processam ent o.
Mensagem que será exibida na régua de processam ent o
cM e n sa ge m
durant e a ex ecução.
Ap a r ê n cia
/*/
+-----------------------------------------------------------------------------
| Função | GPROCES1 | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização das funções PROCESSA() |
| | PROCREGUA() E INCPROC() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 263 -
CriaSX1()
Pergunte(cPerg,.F.)
If nOpc <> 1
Return Nil
Endif
Return Nil
/*/
+-----------------------------------------------------------------------------
| Função | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de processamento executada através da PROCRSSA() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5")+mv_par01,.T.)
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.
- 264 -
A função Set Pr oc( ) é ut ilizada para definir o valor m áxim o da régua de progr essão criada
at ravés da função Pr ocessa( ) .
Pa r â m e t r os:
n M a x Pr oc Variável que indica o v alor m áxim o de pr ocessam ent o ( passos) que serão
indicados pela régua.
Re t or n o:
Nenhum .
Ex e m plo:
...
dbSelect Area( " SA1" )
dbGoTop( )
Set Pr oc( Last Rec( ) )
While ! Eof( )
I ncPr oc( )
I f Li > 60
...
I N CPROC( )
A função I ncProc( ) é ut ilizada para increm ent ar valor na régua de progr essão criada at ravés da
função Pr ocessa( )
Pa r â m e t r os:
Re t or n o:
Nenhum .
Ex e m plo:
...
dbSelect Area( " SA1" )
dbGoTop( )
Set Pr oc( Last Rec( ) )
While ! Eof( )
I ncPr oc( “ Avaliando client e: ” + SA1- > A1_COD)
I f Li > 60
...
- 265 -
Régua de pr ocessam ent o dupla, possuindo dois indicadores de pr ogr esso independent es,
ut ilizada no processam ent o de rot inas.
Pa r â m e t r os:
Bloco de código que especifica a ação que será ex ecut ada com
bAca o
o acom panham ent o da régua de processam ent o.
Mensagem que será exibida na régua de processam ent o
cM e n sa ge m
durant e a ex ecução.
Ap a r ê n cia
M é t odos:
- 266 -
/*/
+-----------------------------------------------------------------------------
| Função | GPROCES2 | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MsNewProcess() |
| | e seus métodos IncReguaX() e SetReguaX() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Return Nil
/*/
+-----------------------------------------------------------------------------
| Função | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de processamento executada através da MsNewProcess() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
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
- 267 -
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
2 6 .2 .4 . M sAgua r de ( ) .
Re t or n o: N il
Pa r â m e t r os:
Bloco de código que especifica a ação que será ex ecut ada com
bAca o
o acom panham ent o da régua de processam ent o.
Mensagem que será exibida na régua de processam ent o
cM e n sa ge m
durant e a ex ecução.
cTit u lo Tít ulo da j anela da régua de processam ent o.
Ap a r ê n cia
- 268 -
/*/
+-----------------------------------------------------------------------------
| Função | GMSAGUARDE | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização das funções MSAGUARDE() |
| | e MSPROCTXT() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
RETURN
/*/
+-----------------------------------------------------------------------------
| Função | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrição | Função de processamento |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
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
- 269 -
Re t or n o: N il
Pa r â m e t r os:
Ap a r ê n cia
Ex e m plo: M SGRu n ( )
/*/
+-----------------------------------------------------------------------------
| Função | GMSGRUN | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização das funções MSGRUN() |
| | e DBEVAL() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX1")
dbGoTop()
RETURN
- 270 -
A sint axe clássica da linguagem ADVPL perm it e que o com ponent e visual List Box im plem ent e
dois t ipos dist int os de obj et os:
List a sim ple s: list a de apenas um a coluna no form at o de um v et or, a qual não
necessit a da especificação de um cabeçalho.
List a com colu n a s: list a com diver sas colunas que necessit a de um cabeçalho no
for m at o de um aHeader ( array de cabeçalho) .
Sin t a x e :
Pa r â m e t r os:
n Lin h a ,n Colu n a Posição do obj et o List Box em função da j anela em que ele
será definido.
oList Box Obj et o List Box que será criado.
n List a Variável num érica que cont ém o núm ero do it em
selecionado no List Box .
a List a Vet or sim ples cont endo as st rings que serão exibidas no
List Box.
n La r gu r a ,n Alt u r a Dim ensões do obj et o List Box .
oObj e t oRe f Obj et o dialog no qual o com ponent e será definido.
UN I D AD E Unidade de m edida das dim ensões: PI XEL.
CH AN GE Função ou list a de expr essões que será ex ecut ada na
seleção de um it em do List Box.
Ap a r ê n cia :
- 271 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | LISTBOXITE | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do LISTBOX() como lista |
| | simples. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
User Function ListBoxIte()
Local aVetor := {}
Local oDlg := Nil
Local oLbx := Nil
Local cTitulo := "Consulta Tabela"
Local nChave := 0
Local cChave := ""
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5"))
CursorWait()
//+-----------------------------------------+
//| Carrega o vetor conforme a condição |
//+-----------------------------------------+
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, "Não existe dados a consultar", {"Ok"} )
Return
Endif
//+-----------------------------------------------+
//| Monta a tela para usuário 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
Return
- 272 -
/*/
+-----------------------------------------------------------------------------
| Função | LISTBOXITE | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrição | Função que carrega os dados da tabela selecionada em um |
| | listbox. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
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", "Necessário 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", "Descrição" 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
- 273 -
Sin t a x e :
Pa r â m e t r os:
M é t odos:
At r ibu t os:
Ap a r ê n cia :
- 274 -
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Função | LIST_BOX | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização de um LISTBOX() com |
| | grid. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aVetor := {}
Local oDlg
Local oLbx
Local cTitulo := "Cadastro de Bancos"
Local cFilSA6
dbSelectArea("SA6")
dbSetOrder(1)
cFilSA6 := xFilial("SA6")
dbSeek(cFilSA6)
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]}}
- 275 -
Return
2 6 .4 . Scr ollBox ( )
O Scr ollBox é o obj et o ut ilizado para perm it ir a um Dialog exibir barras de r olagem vert icais e
Horizont ais. Algum as aplicações com obj et os definem aut om at icam ent e o Scr ollBox, t ais com o:
Enchoice( ) ou MsMGet ( )
New Get Dados( )
List Box( )
Quando é definido um obj et o ScrollBox, os dem ais com ponent es da j anela deverão refer enciar
est e obj et o e não m ais o obj et o Dialog.
Dest a form a o Scr ollBox é at ribuído a um obj et o Dialog, e os com ponent es ao Scr ollBox.
Sin t a x e :
@ nLin h a ,n Colu n a SCROLLBOX oScr ollBox H ORI ZON TAL VERTI CAL SI ZE
n La r gu r a ,n Alt u r a OF oObj e t oRe f BORD ER
Pa r â m e t r os:
- 276 -
#INCLUDE "PROTHEUS.CH"
/*/
+------------------------------------------------------------------------
| Função | SCROLL() | Autor | ROBSON LUIZ |Data | |
+------------------------------------------------------------------------
| Descrição | Programa que demonstra como montar uma enchoice apenas |
| | com variáveis, incluindo o recurso de rolagem. |
+------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------
/*/
- 277 -
cProcesso := "P00001"
cPrefixo := "UNI"
cTipo := "MAN"
cCliente := "000001"
cLoja := "01"
cNome := "JOSE DA SILVA SANTOS SOARES"
cCGC := "00.000.000/0001-91"
dData := "26/03/03"
nTotal := 5922.00
nUFESP := 1000.00
cStatus := "Z"
cCond := "001"
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 122,0 TO 432,600 OF oDlg PIXEL
@ 013,002 TO 154,192 LABEL "Parcelamento" OF oDlg PIXEL
@ 013,195 TO 082,298 LABEL "Títulos" OF oDlg PIXEL
@ 083,195 TO 154,298 LABEL "AIIPM" OF oDlg PIXEL
//scrollbox
@ 019,006 SCROLLBOX oScroll HORIZONTAL VERTICAL SIZE 131,182 OF oDlg BORDER
For n:=1 TO Len(aSay)
- 278 -
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 títulos
@ 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]}}
RETURN
- 279 -
I m plem ent a um a t ela de parâm et r os, que não necessit a da criação de um grupo de pergunt as
no SX1, e com funcionalidades que a Pergunt e( ) não disponibiliza, t ais com o Check Box e
RadioBut t ons.
Cada com ponent e da Param Box será associado a um parâm et r o Privat e denom inado
MV_PARxx, de acordo com a ordem do com ponent e na t ela. Os par âm et r os da Param Box
podem ser ut ilizados de form a independent e em um a r ot ina específica, ou com plem ent ando
opções de um a r ot ina padrão.
Cu id a d os
A PARAMBOX define os parâm et ros seguindo o princípio das variáveis MV_PARxx. Caso
ela sej a ut ilizada em um a rot ina em conj unt o com parâm et ros padrões ( SX1 +
Pergunt e( ) ) é necessário salvar os parâm et r os padrões, cham ar a Param box( ) , salvar o
ret orno da Param box( ) em variáveis Privat e específicas ( MVPARBOXxx) e depois
rest aurar os parâm et ros padrões, conform e o ex em plo dest a docum ent ação.
Ao ut ilizar a Param Box em um a função que t am bém ut ilize parâm et ros definidos pela
função Pergunt e( ) dev e- se:
Pa r â m e t r os:
- 280 -
Re gr a s do a r r a y a Pa r a m Box :
[ 1 ] Tipo do pa r â m e t r o: Para cada t ipo de parâm et r o as dem ais posições do array variam de
cont eúdo conform e abaixo:
1 - M sGe t
[ 2] : Descrição
[ 3] : St ring cont endo o inicializador do cam po
[ 4] : St ring cont endo a Pict ure do cam po
[ 5] : St ring cont endo a validação
[ 6] : Consult a F3
[ 7] : St ring cont endo a validação When
[ 8] : Tam anho do MsGet
[ 9] : Flag .T./ .F. Parâm et r o Obrigat ório ?
2 - Com bo
[ 2] : Descrição
[ 3] : Num érico cont endo a opção inicial do com bo
[ 4] : Array cont endo as opções do Com bo
[ 5] : Tam anho do Com bo
[ 6] : Validação
[ 7] : Flag .T./ .F. Parâm et r o Obrigat ório ?
- 281 -
4 - Ch e ck Box ( Com Sa y )
[ 2] : Descrição
[ 3] : I ndicador Lógico cont endo o inicial do Check
[ 4] : Text o do CheckBox
[ 5] : Tam anho do Radio
[ 6] : Validação
[ 7] : Flag .T./ .F. Parâm et r o Obrigat ório ?
5 - Ch e ck Box ( lin h a in t e ir a )
[ 2] : Descrição
[ 3] : I ndicador Lógico cont endo o inicial do Check
[ 4] : Tam anho do Radio
[ 5] : Validação
[ 6] : Flag .T./ .F. Parâm et r o Obrigat ório ?
6 - File
[ 2] : Descrição
[ 3] : St ring cont endo o inicializador do cam po
[ 4] : St ring cont endo a Pict ure do cam po
[ 5] : St ring cont endo a validação
[ 6] : St ring cont endo a validação When
[ 7] : Tam anho do MsGet
[ 8] : Flag .T./ .F. Parâm et r o Obrigat ório ?
[ 9] : Text o cont endo os t ipos de arquivo
Ex.: " Arquivos .CSV | * .CSV"
[ 10] : Diret ório inicial do CGETFI LE( )
[ 11] : Parâm et ros do CGETFI LE( )
7 - M on t a ge m de e x p r e ssã o d e f ilt r o
[ 2] : Descrição
[ 3] : Alias da t abela
[ 4] : Filt ro inicial
[ 5] : Opcional - Clausula When Bot ão Edit ar Filt ro
8 - M sGe t Pa ssw or d
[ 2] : Descrição
[ 3] : St ring cont endo o inicializador do cam po
[ 4] : St ring cont endo a Pict ure do cam po
[ 5] : St ring cont endo a validação
[ 6] : Consult a F3
[ 7] : St ring cont endo a validação When
[ 8] : Tam anho do MsGet
[ 9] : Flag .T./ .F. Parâm et r o Obrigat ório ?
- 282 -
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------
| Função | xParamBox | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização da PARAMBOX como |
| | forma alternativa de disponibilizar parâmetros em um |
| | processamento. |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local aRet := {}
Local aParamBox := {}
Local aCombo :=
{"Janeiro","Fevereiro","Março","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","Não"},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 Parâmetros...",@aRet)
For i:=1 To Len(aRet)
MsgInfo(aRet[i],"Opção escolhida")
Next
Endif
Return
- 283 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | XPARBOX() | Autor | ARNALDO RAYMUNDO JR.|Data | |
+-----------------------------------------------------------------------------
| Descrição | Função utilizando a PARAMBOX() e protegendo os MV_PARs |
| | ativos do programa principal. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Static Function XPARBOX(cPerg)
Local aParamBox := {}
Local cTitulo := "Transferência para Operação"
Local bOk := {|| .T.}
Local aButtons := {}; Local aRet := {}
Local nPosx; Local nPosy; Local nX := 0
Local cLoad := ""
Local lCentered := .T.; Local lCanSave := .F.; Local lUserSave := .F.
Local aParamAtu := Array(4)
Return
- 284 -
O t erm o orient ação a obj et os pressupõe um a organização de soft war e em t erm os de coleção
de obj et os discret os incorporando est rut ura e com port am ent o próprios. Est a abordagem de
organização é essencialm ent e diferent e do desenvolvim ent o t radicional de soft war e, onde
est rut uras de dados e r ot inas são desenvolvidas de form a apenas fracam ent e acopladas.
Nest e t ópico serão os conceit os de program ação orient ada a obj et os list ados abaixo. Est a
brev e visão geral do paradigm a perm it irá ent ender m elhor os conceit os associados à
program ação orient ada a obj et os e, em part icular, às const ruções im plem ent adas at rav és da
linguagem ADVPL.
Obj e t os
H e r a n ça
At r ibu t os
M é t odos
Cla sse s
Abst r a çã o
Ge n e r a liz a çã o
En ca psu la m e n t o
Polim or f ism o
2 7 .1 . D e finiçõe s
Obj e t o
Um obj et o é um a ent idade do m undo real que t em um a ident idade. Obj et os podem
represent ar ent idades concr et as ( um arquivo no m eu com put ador, um a biciclet a) ou ent idades
conceit uais ( um a est r at égia de j ogo, um a polít ica de escalonam ent o em um sist em a
operacional) . Cada obj et o t er sua ident idade significa que dois obj et os são dist int os m esm o
que eles apr esent em ex at am ent e as m esm as caract eríst icas.
Em bora obj et os t enham exist ência própria no m undo r eal, em t erm os de linguagem de
program ação um obj et o necessit a um m ecanism o de ident ificação. Est a ident ificação de obj et o
dev e ser única, uniform e e independent e do cont eúdo do obj et o. Est e é um dos m ecanism os
que perm it e a criação de coleções de obj et os, as quais são t am bém obj et os em si.
A est rut ura de um obj et o é r epr esent ada em t er m os de at ribut os. O com port am ent o de um
obj et o é r epr esent ado pelo conj unt o de operações que podem ser ex ecut adas sobr e o obj et o.
- 285 -
Obj et os com a m esm a est rut ura e o m esm o com port am ent o são agr upados em classes. Um a
classe é um a abst ração que descreve pr opriedades im port ant es para um a aplicação e
sim plesm ent e ignora o r est o.
Cada classe descr ev e um conj unt o ( possivelm ent e infinit o) de obj et os individuais. Cada obj et o
é dit o ser um a inst ância de um a classe. Assim , cada inst ância de um a classe t em seus próprios
valores para cada at ribut o, m as dividem os nom es dos at ribut os e m ét odos com as out ras
inst âncias da classe. I m plicit am ent e, cada obj et o cont ém um a r efer ência para sua pr ópria
classe, em out ras palavras, ele sabe o que ele é.
- 286 -
Polim orfism o significa que a m esm a operação pode se com port ar de form a difer ent e em
classes difer ent es. Por exem plo, a oper ação m ove quando aplicada a um a j anela de um
sist em a de int erfaces t em um com port am ent o dist int o do que quando aplicada a um a peça de
um j ogo de xadr ez. Um m ét odo é um a im plem ent ação específica de um a oper ação para um a
cert a classe.
Polim orfism o t am bém im plica que um a operação de um a m esm a classe pode ser
im plem ent ada por m ais de um m ét odo. O usuário não pr ecisa saber quant as im plem ent ações
exist em para um a operação, ou explicit ar qual m ét odo dev e ser ut ilizado: a linguagem de
program ação dev e ser capaz de selecionar o m ét odo corr et o a part ir do nom e da operação,
classe do obj et o e ar gum ent os para a oper ação. Dest a for m a, novas classes podem ser
adicionadas sem necessidade de m odificação de código j á exist ent e, pois cada classe apenas
define os seus m ét odos e at ribut os.
No m undo r eal, alguns obj et os e classes podem ser descrit os com o casos especiais, ou
especializações, de out r os obj et os e classes. Por exem plo, a classe de com put adores pessoais
com pr ocessador da linha 80x86 é um a especialização de com put ador es pessoais, que por sua
vez é um a especialização de com put adores. Não é desej áv el que t udo que j á foi descrit o para
com put adores t enha de ser repet ido para com put ador es pessoais ou para com put ador es
pessoais com pr ocessador da linha 80x86.
H e r a n ça
Herança é o m ecanism o do paradigm a de orient ação a obj et os que perm it e com part ilhar
at ribut os e operações ent re classes baseada em um r elacionam ent o hierárquico. Um a classe
pode ser definida de form a genérica e depois refinada sucessivam ent e em t erm os de
subclasses ou classes derivadas. Cada subclasse incorpora, or herda, t odas as pr opriedades de
sua super classe ( ou classe base) e adiciona suas propriedades únicas e part iculares. As
propriedades da classe base não pr ecisam ser r epet idas em cada classe derivada. Est a
capacidade de fat orar as propriedades com uns de diversas classes em um a superclasse pode
reduzir dram at icam ent e a r epet ição de código em um proj et o ou pr ogram a, sendo um a das
principais vant agens da abordagem de orient ação a obj et os.
- 287 -
A abordagem de orient ação a obj et os favor ece a aplicação de diversos conceit os consider ados
fundam ent ais para o desenv olvim ent o de bons program as, t ais com o abst ração e
encapsulam ent o.
Tais conceit os não são exclusivos dest a abordagem , m as são suport ados de form a m elhor no
desenvolvim ent o orient ado a obj et os do que em out ras m et odologias.
Abst r a çã o
Abst ração consist e de focalizar nos aspect os essenciais inerent es a um a ent idade e ignorar
propriedades “ acident ais” . Em t erm os de desenvolvim ent o de sist em as, ist o significa
concent rar- se no que um obj et o é e faz ant es de se decidir com o ele será im plem ent ado. O
uso de abst ração pr eserva a liberdade par a t om ar decisões de desenvolvim ent o ou de
im plem ent ação apenas quando há um m elhor ent endim ent o do pr oblem a a ser r esolvido.
Muit as linguagens de program ação m odernas suport am o conceit o de abst ração de dados;
por ém , o uso de abst r ação j unt am ent e com polim orfism o e herança, com o suport ado em
orient ação a obj et os, é um m ecanism o m uit o m ais poder oso.
O uso apr opriado de abst ração perm it e que um m esm o m odelo conceit ual ( orient ação a
obj et os) sej a ut ilizado para t odas as fases de desenv olvim ent o de um sist em a, desde sua
análise at é sua docum ent ação.
En ca psu la m e n t o
Encapsulam ent o, t am bém r eferido com o esconder inform ação, consist e em separar os
aspect os ext ernos de um obj et o, os quais são acessíveis a out ros obj et os, dos det alhes
int ernos de im plem ent ação do obj et o, os quais perm anecem escondidos dos out r os obj et os. O
uso de encapsulam ent o evit a que um pr ogr am a t orne- se t ão int erdependent e que um a
pequena m udança t enha grandes efeit os colat erais.
O uso de encapsulam ent o perm it e que a im plem ent ação de um obj et o possa ser m odificada
sem afet ar as aplicações que usam est e obj et o. Mot ivos para m odificar a im plem ent ação de
um obj et o podem ser , por exem plo, m elhoria de desem penho, corr eção de er ros e m udança de
plat aform a de ex ecução.
Assim com o abst ração, o conceit o de Encapsulam ent o não é exclusivo da abordagem de
orient ação a obj et os. Ent ret ant o, a habilidade de se com binar est rut ura de dados e
com port am ent o em um a única ent idade t or na a Encapsulam ent o m ais elegant e e m ais
poderosa do que em linguagens convencionais que separam est rut uras de dados e
com port am ent o.
Com p a r t ilh a m e n t o
Técnicas de orient ação a obj et os pr om ovem com part ilham ent o em diversos níveis dist int os.
Herança de est rut ura de dados e com port am ent o perm it e que est rut uras com uns sej am
com part ilhadas ent re diversas classes derivadas sim ilares sem r edundância. O
com part ilham ent o de código usando herança é um a das grandes vant agens da orient ação a
obj et os. Ainda m ais im port ant e que a econom ia de código é a clareza conceit ual de reconhecer
que operações difer ent es são na v erdade a m esm a coisa, o que reduz o núm ero de casos
dist int os que dev em ser ent endidos e analisados.
- 288 -
2 7 .3 . O M ode lo de Obj e t os ( OM T)
Um m odelo de obj et os busca capt urar a est r ut ura est át ica de um sist em a m ost rando os
obj et os exist ent es, seus r elacionam ent os, e at ribut os e operações que caract erizam cada
classe de obj et os. É at ravés do uso dest e m odelo que se enfat iza o desenvolvim ent o em
t erm os de obj et os ao invés de m ecanism os t radicionais de desenvolvim ent o baseado em
funcionalidades, perm it indo um a r epr esent ação m ais próxim a do m undo r eal.
Obj et o é definido nest e m odelo com o um conceit o, abst ração ou coisa com lim it es e
significados bem definidos para a aplicação em quest ão. Obj et os t êm dois propósit os:
prom ov er o ent endim ent o do m undo r eal e suport ar um a base prát ica para um a
im plem ent ação com put acional. Não exist e um a m aneira “ corr et a” de decom por um problem a
em obj et os; est a decom posição depende do j ulgam ent o do proj et ist a e da nat ureza do
problem a. Todos os obj et os t êm ident idade própria e são dist inguíveis.
Um a classe de obj et os descr ev e um grupo de obj et os com propriedades ( at ribut os) sim ilares,
com port am ent os ( oper ações) sim ilares, relacionam ent os com uns com out ros obj et os e um a
sem ânt ica com um . Por ex em plo, Pessoa e Com panhia são classes de obj et os. Cada pessoa
t em um nom e e um a idade; est es seriam os at ribut os com uns da classe. Com panhias t am bém
podem t er os m esm os at ribut os nom e e idade definidos. Ent ret ant o, devido à dist inção
sem ânt ica elas prov avelm ent e est ariam agrupados em out ra classe que não Pessoa. Com o se
pode obser var , o agrupam ent o em classes não leva em cont a apenas o com part ilham ent o de
propriedades.
Todo obj et o sabe a que classe ele pert ence, ou sej a, a classe de um obj et o é um at ribut o
im plícit o do obj et o. Est e conceit o é suport ado na m aior part e das linguagens de program ação
orient ada a obj et os, inclusive em ADVPL.
OMT define dois t ipos de diagram as de obj et os, diagram as de classes e diagram as de
inst âncias. Um diagram a de classe é um esquem a, ou sej a, um padrão ou gabarit o que
descr ev e as m uit as possíveis inst âncias de dados. Um diagram a de inst âncias descr ev e com o
um conj unt o part icular de obj et os est á r elacionado. Diagram as de inst âncias são út eis para
apresent ar exem plos e docum ent ar casos de t est es; diagram as de classes t êm uso m ais
am plos. A Figura abaixo apresent a a not ação adot ada para est es diagram as.
- 289 -
O agrupam ent o de obj et os em classes é um poder oso m ecanism o de abst ração. Dest a form a,
é possível generalizar definições com uns para um a classe de obj et os, ao invés de repet í- las
para cada obj et o em part icular. Est a é um a das form as de r eut ilização e econom ia que a
abordagem de orient ação a obj et os suport a.
2 7 .3 .2 . At r ibut os
Um at ribut o é um valor de dado assum ido pelos obj et os de um a classe. Nom e, idade e peso
são ex em plos de at ribut os de obj et os Pessoa. Cor , peso e m odelo são possíveis at ribut os de
obj et os Car ro. Cada at ribut o t em um valor para cada inst ância de obj et o. Por ex em plo, o
at ribut o idade t em valor ` ` 29'' no obj et o Pedro Y. Em out ras palavras, Pedr o Y t em 29 anos de
idade. Diferent es inst âncias de obj et os podem t er o m esm o valor para um dado at ribut o.
Cada nom e de at ribut o é único para um a dada classe, m as não necessariam ent e único ent r e
t odas as classes. Por exem plo, am bos Pessoa e Com panhia podem t er um at ribut o cham ado
endereço.
No diagram a de classes, at ribut os são list ados no segundo segm ent o da caixa que r epr esent a
a classe. O nom e do at ribut o pode ser seguido por det alhes opcionais, t ais com o o t ipo de
dado assum ido e valor default . A Figura abaixo m ost ra est a r epr esent ação.
Figu r a : Represent ação diagram át ica de OMT para classes e obj et os com at ribut os
Não se dev e confundir ident ificadores int ernos de obj et os com at ribut os do m undo r eal.
I dent ificadores de obj et os são um a conv eniência de im plem ent ação, e não t êm nenhum
significado para o dom ínio da aplicação. Por exem plo, CI C e RG não são ident ificador es de
obj et os, m as sim verdadeiros at ribut os do m undo r eal.
- 290 -
Um a operação é um a função ou t ransform ação que pode ser aplicada a ou por obj et os em um a
classe. Por exem plo, abrir, salvar e im prim ir são operações que podem ser aplicadas a obj et os
da classe Arquivo. Todos os obj et os em um a classe com part ilham as m esm as operações.
Toda operação t em um obj et o- alvo com o um argum ent o im plícit o. O com port am ent o de um a
operação depende da classe de seu alvo. Com o um obj et o “ sabe” qual sua classe, é possível
escolher a im plem ent ação corr et a da operação. Além dist o, out ros ar gum ent os ( parâm et ros)
podem ser necessários para um a operação.
Um a m esm a operação pode se aplicar a diver sas classes difer ent es. Um a operação com o est a
é dit a ser polim órfica, ou sej a, ela pode assum ir dist int as form as em classes diferent es.
Um m ét odo é a im plem ent ação de um a operação para um a classe. Por ex em plo, a operação
im prim ir pode ser im plem ent ada de form a dist int a, dependendo se o arquivo a ser im presso
cont ém apenas t ext o ASCI I , é um arquivo de um processador de t ext o ou binário. Todos est es
m ét odos ex ecut am a m esm a operação: im prim ir o arquivo; por ém , cada m ét odo será
im plem ent ado por um diferent e código.
A assinat ura de um m ét odo é dada pelo núm er o e t ipos de argum ent os do m ét odo, assim
com o por seu valor de ret orno. Um a est rat égia de desenvolvim ent o recom endáv el é m ant er
assinat uras coerent es para m ét odos im plem ent ando um a dada operação, assim com o um
com port am ent o consist ent e ent r e as im plem ent ações.
Em t erm os de diagram as OMT, operações são list adas na t er ceira part e da caixa de um a
classe. Cada nom e de operação pode ser seguida por det alhes opcionais, t ais com o list a de
argum ent os e t ipo de r et orno. A list a de argum ent os é apr esent ada ent re par ênt eses após o
nom e da operação. Um a list a de argum ent os vazia indica que a operação não t em
argum ent os; da ausência da list a de argum ent os não se pode concluir nada. O t ipo de
result ado vem após a list a de argum ent os, sendo precedido por dois pont os ( : ) . Caso a
operação r et orne r esult ado, est e não dev e ser om it ido, pois est a é a for m a de dist ingui- la de
operações que não ret ornam r esult ado. Ex em plos de r epr esent ação de operações em OMT são
apresent ados na Figura abaixo:
Figu r a : Represent ação diagram át ica de OMT para classes com at ribut os e operações
- 291 -
Na const rução de um m odelo para um a aplicação, as seguint es sugest ões dev em ser
observ adas a fim de se obt er r esult ados claros e consist ent es:
Não com ece a const r uir um m odelo de obj et os sim plesm ent e definindo classes,
associações e heranças. A prim eira coisa a se fazer é ent ender o problem a a ser
resolvido.
Tent e m ant er seu m odelo sim ples. Evit e com plicações desnecessárias.
Escolha nom es cuidadosam ent e. Nom es são im port ant es e carr egam conot ações
poderosas. Nom es dev em ser descrit ivos, claros e não deixar am bigüidades. A escolha
de bons nom es é um dos aspect os m ais difíceis da m odelagem .
Não “ ent er re” apont ador es ou out ras r efer ências a obj et os dent ro de obj et os com o
at ribut os. Ao invés dist o, m odele est as refer ências com o associações. I st o t orna o
m odelo m ais claro e independent e da im plem ent ação.
Tent e evit ar associações que env olvam t rês ou m ais classes de obj et os. Muit as vezes,
est es t ipos de associações podem ser decom post os em t erm os de associações binárias,
t ornando o m odelo m ais claro.
Não t ransfira os at ribut os de ligação para dent r o de um a das classes.
Tent e evit ar hierarquias de generalização m uit o profundas.
Não se surpr eenda se o seu m odelo necessit ar v árias revisões; ist o é o norm al.
Sem pr e docum ent e seus m odelos de obj et os. O diagram a pode especificar a est rut ur a
do m odelo, m as nem sem pre é suficient e para descr ev er as razões por t rás da definição
do m odelo. Um a explicação escrit a pode clarificar pont os t ais com o significado de
nom es e explicar a razão para cada classe e r elacionam ent o.
Nem sem pr e t odas as const ruções OMT são necessárias para descrever um a aplicação.
Use apenas aquelas que forem adequadas para o pr oblem a analisado.
- 292 -
Nest e t ópico será det alhada a form a com a qual a linguagem ADVPL im plem ent a os conceit os
de orient ação a obj et os e a sint axe ut ilizada no desenvolvim ent o de aplicações.
Pa la vr a s r e se r v a da s
CLASS
CON STRUCTOR
D ATA
EN D CLASS
FROM
M ETH OD
SELF
CLASS
Sin t a x e 2 METHOD < nom e_do_m ét odo> CLASS < nom e_da_classe>
CON STRUCTOR
D ATA
EN D CLASS
Sin t a x e ENDCLASS
- 293 -
M ETH OD
Sin t a x e 2 METHOD < nom e_do_m ét odo( < parâm et r os> ) > CLASS < nom e_da_classe>
SELF
Ut ilizada principalm ent e pelo m ét odo const rut or para ret ornar o obj et o
D e scr içã o
criado para a aplicação.
Sin t a x e Ret urn SELF
Local nPosCur so : = 0
Local nNot a : = 0
ENDI F
- 294 -
Exemplo:
#include “protheus.ch”
CLASS Pessoa()
Seguindo o m esm o princípio de variáveis não t ipadas, os at ribut os das classes em ADVPL não
precisam t er seu t ipo especificado, sendo necessário apenas det erm inar seus nom es.
Dest a form a é recom endado o uso da not ação Húngara t am bém para a definição dos at ribut os
de form a a facilit ar a análise, int erpret ação e ut ilização da classe e seus obj et os inst anciados.
Exemplo:
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
A prot ot ipação dos m ét odos é um a r egra ut ilizada pelas linguagens orient adas a obj et os,
at ravés da qual são especificadas as operações que podem ser realizadas pelo obj et o,
diferenciando os m ét odos de out ras funções int ernas de uso da classe, e para especificar quais
são os m ét odos const rut or es.
Em linguagens t ipadas, na prot ot ipação dos m ét odos é necessário definir quais são os
parâm et ros r ecebidos e seus r espect ivos t ipos, além de definir o t ipo do ret orno que ser á
fornecido. Em ADVPL é necessário apenas descrever a cham ada do m ét odo e caso necessário
se o m esm o é um const rut or .
- 295 -
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
ENDCLASS
M é t odo Con st r u t or
O m ét odo const rut or possui a caract eríst ica de ret ornar um obj et o com o t ipo da classe da qual
o m esm o foi inst anciado. Por est a razão diz- se que o t ipo do obj et o inst anciado é a classe
daquele obj et o.
Para produzir est e efeit o, o m ét odo const rut or ut iliza a palavra r eservada “ SELF” , a qual é
ut ilizada pela linguagem ADVPL para r efer ência a própria classe daquele obj et o.
Exemplo:
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
ENDCLASS
::cNome := cNome
::nIdade := nIdade
Return SELF
- 296 -
Os at ribut os definidos para um a classe com a ut ilização da palavra r eservada “ DATA” em sua
declaração podem ser m anipulados por seus m ét odos ut ilizando o operador “ : : ” .
A ut ilização dest e operador perm it e ao int erpret ador ADVPL diferenciar variáveis com uns
criadas pelas funções e m ét odos que ut ilizam est e obj et o dos at ribut os propriam ent e dit os.
Exemplo:
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
::cNome := cNome
::nIdade := nIdade
Return SELF
Conform e m encionado ant eriorm ent e, a ut ilização da palavra reservada “ METHOD” perm it e ao
int erpr et ador ADVPL difer enciar os m ét odos que podem ser ut ilizados at ravés da referência do
obj et o de funções int ernas descrit as int ernam ent e na classe.
#include “protheus.ch”
Local oPessoa
Local cNome := “”
Local dNascimento:= CTOD(“”)
Local aDados := {}
aDados := GetDados()
oPessoa := Pessoa():Create(cNome,dNascimento)
Return
- 297 -
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
DATA dNascimento
ENDCLASS
H e r a n ça e n t r e cla sse s
Seguindo o principio da orient ação a obj et os, a linguagem ADVPL perm it e que um a classe
receba por herança os m ét odos e at ribut os definidos em um a out ra classe, a qual t ornasse a
super classe dest a inst ância.
Para ut ilizar est e r ecur so deve ser ut ilizada a palavra reservada “ FROM” na declaração da
classe, especificando a super classe que será refer enciada.
Em ADVPL o exem plo prát ico dest a sit uação é a superclasse TSr vObj ect , a qual é ut ilizada pela
m aioria das classes e com ponent es da int erface visual, com o dem onst rado no m ódulo 06.
#include “protheus.ch”
CLASS Pessoa()
DATA cNome
DATA nIdade
DATA dNascimento
ENDCLASS
- 298 -
#include “protheus.ch”
CLASS Aluno() FROM Pessoa
DATA nID
DATA aCursos
ENDCLASS
Quant o é ut ilizado o r ecurso de herança ent re classes, o const rut or da classe inst anciada deve
receber um t rat am ent o adicional, para que o obj et o inst anciado sej a criado com os at ribut os e
m ét odos definidos na super classe.
Nest es casos, logo após a definição do m ét odo const rut or da classe, deverá ser execut ado o
m ét odo const rut or da superclasse.
METHOD Create(cNome,dNascimento,nID)
:Create(cNome,dNascimento) // Chamada do método construtor da classe Pessoa.
::nID := ID
Return SELF
- 299 -
A linguagem ADVPL possui diversos com ponent es visuais e auxiliares, os quais podem ser
represent ados ut ilizando a est rut ura abaixo:
Cla sse s de Ja n e la s
Msdialog
Tdialog
Twindow
- 300 -
TSRVOBJECT( )
Classe abst rat a inicial de t odas as classes de int erface do ADVPL. Não dev e
D e scr içã o
ser inst anciada diret am ent e.
TFON T( )
Classe de obj et os que define a font e do t ext o ut ilizado nos cont r oles
D e scr içã o
visuais.
Cla sse s de j a n e la s
M SD I ALOG( )
Classe de obj et os que dev e ser ut ilizada com o padrão de j anela para
ent rada de dados. MSDialog é um t ipo de j anela diálogo m odal, ist o é,
D e scr içã o
não perm it e que out ra j anela at iva receba dados enquant o est a est iver
at iva.
TD I ALOG( )
Classe de obj et os do t ipo diálogo de ent rada de dados, sendo seu uso
D e scr içã o reservado. Recom enda- se ut ilizar a classe MSDialog que é herdada dest a
classe.
TW I N D OW ( )
TCON TROL( )
Classe abst rat a com um ent re t odos os com ponent es visuais edit áveis.
D e scr içã o
Não dev e ser inst anciada diret am ent e.
- 301 -
BRGETD D B( )
M SCALEN D ( )
M SCALEN D GRI D ( )
M SSELBR( )
M SW ORKTI M E( )
D e scr içã o Classe de obj et os visuais do t ipo cont r ole - Bar r a de Período.
SBUTTON ( )
Classe de obj et os visuais do t ipo bot ão, o qual pode possuir im agens
D e scr içã o
padrões associadas ao seu t ipo.
TBAR( )
TBI TM AP( )
TBROW SEBUTTON ( )
TBTN BM P( )
Classe de obj et os visuais do t ipo bot ão, o qual perm it e que sej a
D e scr içã o
vinculada um a im agem ao cont r ole.
- 302 -
TBUTTON ( )
TCBROW SE( )
TCH ECKBOX ( )
TCOLORTRI AN GLE( )
TCOM BOBOX ( )
Classe de obj et os visuais do t ipo t Com boBox, a qual cria um a ent rada
de dados com m últ ipla escolha com it em definido em um a list a
vert ical, acionada por F4 ou pelo bot ão esquer do localizado na part e
D e scr içã o
direit a do cont role. A v ariável associada ao cont role t erá o valor de
um dos it ens selecionados ou no caso de um a list a indexada, o valor
de seu índice.
TFOLD ER( )
TGET( )
TGROUP( )
- 303 -
TI BROW SER( )
TLI STBOX ( )
Classe de obj et os visuais do t ipo cont r ole – t List box, a qual cria um a
D e scr içã o j anela com it ens selecionáveis e barra de r olagem . Ao selecionar um
it em , um a variável é at ualizada com o cont eúdo do it em selecionado.
TM EN U( )
TM EN UBAR( )
D e scr içã o Classe de obj et os visuais do t ipo cont r ole - Bar r a de Menu.
TM ETER( )
Classe de obj et os visuais do t ipo cont r ole – t Met er, a qual exibe um a
D e scr içã o régua ( gauge) de processam ent o, descr ev endo o andam ent o de um
processo at ravés da exibição de um a barra horizont al.
TM SGRAPH I C( )
TM SGBAR( )
TM ULTI BTN ( )
D e scr içã o Classe de obj et os visuais do t ipo cont r ole - Múlt iplos bot ões.
TM ULTI GET( )
- 304 -
TPAGEVI EW ( )
TPAN EL( )
TRAD M EN U( )
TSBROW SE( )
Classe de obj et os visuais do t ipo cont r ole – TSBrow se, a qual perm it e
D e scr içã o
criar um cont r ole visual do t ipo Grid.
TSAY( )
TSCROLLBOX( )
Classe de obj et os visuais do t ipo cont r ole – t Scr ollbox, a qual perm it e
D e scr içã o criar um painel com scr oll deslizant es nas lat er ais ( horizont ais e
vert icais) do cont r ole.
Classe de obj et os visuais do t ipo cont r ole – t Sim pleEdit or, a qual
D e scr içã o perm it e criar um cont role visual para edição de t ext os com r ecur sos
sim ples, com o o Not ePad®
TSLI D ER( )
TSPLI TTER( )
Classe de obj et os visuais do t ipo cont r ole – t Split t er, a qual perm it e
D e scr içã o
criar um cont r ole visual do t ipo divisor.
- 305 -
TTOOLBOX( )
TW BROW SE( )
Classe de obj et os visuais do t ipo cont r ole – TWBrow se, a qual perm it e
D e scr içã o
criar um cont r ole visual do t ipo Grid.
VCBROW SE( )
Classe de obj et os visuais do t ipo cont r ole – VCBrow se, a qual perm it e
D e scr içã o
criar um cont r ole visual do t ipo Grid.
Os com ponent es da int er face visual da linguagem ADVPL ut ilizados nest e t r einam ent o est ão
docum ent ados na seção Guia de Referência, ao final dest e m at erial.
Para visualizar a docum ent ação com plet a de t odos os com ponent es m encionados nest e
capít ulo deve ser acesso o sit e DEM – Docum ent ação Elet r ônica Microsiga
( dem .m icrosiga.com .br) confor m e abaixo:
- 306 -
As cor es dest e padrão são definidas pela seguint e fór m ula, a qual dev e ser avaliada t endo
com o base a palet a de cor es no form at o RGB:
n Cor := n Ve r m e lh o + ( n V e r d e * 2 5 6 ) + ( n Az u l * 6 5 5 3 6 )
Com base nest a palet a, podem os definir os valores das seguint es cores básicas:
Cor R G B Va lor
Pret o 0 0 0 0
Azul 0 0 255 16711680
Verde 0 255 0 65280
Ciano 0 255 255 16776960
Verm elho 255 0 0 255
Rosa 255 0 255 16711935
Am arelo 255 255 0 65535
Branco 255 255 255 16777215
- 307 -
M SD I ALOG( )
TSAY( )
Fu n çã o RGB( )
A linguagem ADVPL possui a função RGB( ) a qual ret orna o valor da cor a ser definido, de
acordo com a param et rização de cada um dos elem ent os da palet a RGB.
RGB( n Re d, n Gr e e n , n Blu e )
- 308 -
A linguagem ADVPL possui int erfaces visuais pré- definidas que auxiliam no desenv olvim ent o
de aplicações m ais com plet as, com binando est as int erfaces com os com ponent es visuais
dem onst rados ant erior m ent e.
Didat icam ent e as int erfaces visuais pré- definidas da linguagem ADVPL podem ser divididas em
t rês grupos:
Em ADVPL, as t elas de capt ura de inform ações com post as por m últ iplos cam pos digit áv eis
acom panhados de seus r espect ivos t ext os explicat ivos são com um ent e cham ados de
Enchoices.
Um Enchoice pode ser facilm ent e ent endida com o diversos conj unt os de obj et os TSay e TGet
alinhados de form a a visualizar ou capt urar inform ações, nor m alm ent e vinculadas a arquivos
de cadast r os ou m ovim ent ações sim ples.
- 309 -
Fu n çã o En ch oice : Sint axe t radicionalm ent e ut ilizada em ADVPL, a qual não ret orna
um obj et o para a aplicação cham adora;
Cla sse M sM Ge t : Classe do obj et o Enchoice, a qual perm it e a inst anciação diret a de um
obj et o, t ornando- o disponível na aplicação cham adora.
3 0 .1 .1 . Enchoice ( )
Re t or n o: N il
Pa r â m e t r os:
- 310 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWENCH | Autor | ARNALDO RAYMUNDO JR.|Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização da função Enchoice() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
Local aCpoEnch := {}
Local aAlter := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
- 311 -
aAlterEnch := aClone(aCpoEnch)
Return
3 0 .1 .2 . M sM Ge t ( )
Re t or n o: oM sM Ge t obj e t o d o t ipo M sM Ge t ( )
Pa r â m e t r os:
- 312 -
Ex e m plo: Ut iliz a çã o d o ob j e t o M sM Ge t ( )
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWMSGET | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MsMget() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
- 313 -
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
oDlg := MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
oDlg:lCentered := .T.
oDlg:Activate()
Return
A linguagem ADVPL perm it e a ut ilização de basicam ent e dois t ipos de obj et os do t ipo grid, ou
com o t am bém são conhecidos: m ult i- line:
Gr ids d igit á v e is: per m it em a visualização e capt ura de inform ações, com um ent e
ut ilizados em int erfaces de cadast r o e m anut enção, t ais com o:
M SGETD B( )
M SGETD AD OS( )
M SN EW GETD AD OS( )
Gr ids n ã o dig it á v e is: perm it em som ent e a visualização de inform ações, com um ent e
ut ilizados com o brow ses do ERP Pr ot heus, t ais com o:
TW BROW SE( )
M AW N D BROW SE( )
M BROW SE( )
Nest e t ópico serão t rat adas as grids digit áveis disponíveis na linguagem ADVPL para o
desenvolvim ent o de int er faces de cadast r os e m anut enção de inform ações.
- 314 -
A classe de obj et os visuais MsGet DB( ) perm it e a criação de um grid digit ável com um a ou m ais
colunas, baseado em um a t abela t em porária.
Pa r â m e t r os:
- 315 -
Va r iá ve is p r iv a t e :
1- Pesquisar
2- Visualizar
3- I ncluir
4- Alt erar
5- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 316 -
Fu n çõe s de va lida çã o:
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Função | GETDBSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MsGetDB() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDB
Local nUsado := 0
Local aStruct := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 317 -
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg:lCentered := .T.
oDlg:Activate()
DbSelectArea(cCriaTrab)
DbCloseArea()
Return
- 318 -
A classe de obj et os visuais MsGet Dados( ) per m it e a criação de um grid digit ável com um a ou
m ais colunas, baseado em um array.
Pa r â m e t r os:
- 319 -
Va r iá ve is p r iv a t e :
6- Pesquisar
7- Visualizar
8- I ncluir
9- Alt erar
10- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 320 -
Fu n çõe s de va lida çã o:
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Função | GETDADOSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MSGETADOS() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 321 -
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg:lCentered := .T.
oDlg:Activate()
Return
- 322 -
A classe de obj et os visuais MsNewGet Dados( ) perm it e a criação de um grid digit ável com um a
ou m ais colunas, baseado em um array .
Pa r â m e t r os:
- 323 -
Va r iá ve is p r iv a t e :
1- Pesquisar
2- Visualizar
3- I ncluir
4- Alt erar
5- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 324 -
Fu n çõe s de va lida çã o:
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWGETD | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização dos objetos |
| | MsNewGetDados() e MsMGet() combinados |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
- 325 -
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
- 326 -
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
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/,/*cTexto*/,;
aCpoEnch,aPos,aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
/*cTudoOk*/, oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,;
lProperty)
- 327 -
Conform e vist o no t ópico sobr e definição das propriedades de cor es para os com ponent es
visuais, cada obj et o possui caract eríst icas que dev em ser respeit adas para corr et a ut ilização
dest e r ecurso.
lUse D e fa u lt Color s At ribut o que dev erá ser definido com o .F. par a que as
alt erações nas cor es sej am perm it idas.
Se t Blk Ba ck Color Mét odo que define a cor que será ut ilizada para cada linha do
grid. Não é necessário ut ilizar o m ét odo Refr esh( ) após a
definição da cor por est e m ét odo.
Ap a r ê n cia :
- 328 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MRBWGTCL | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização dos objetos |
| | MsNewGetDados() e MsMGet() combinados e tratamento de cores |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
Local aPos := {000,000,080,400}
Local nModelo := 3
Local lF3 := .F.
Local lMemoria := .T.
Local lColumn := .F.
Local caTela := ""
Local lNoFolder := .F.
Local lProperty := .F.
Local aCpoGDa := {}
Local cAliasGD := "SC6"
Local nSuperior := 081
Local nEsquerda := 000
Local nInferior := 250
Local nDireita := 400
Local cLinOk := "AllwaysTrue"
Local cTudoOk := "AllwaysTrue"
Local cIniCpos := "C6_ITEM"
Local nFreeze := 000
Local nMax := 999
- 329 -
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
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
- 330 -
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
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oGetD:oBrowse:lUseDefaultColors := .F.
oGetD:oBrowse:SetBlkBackColor({|| GETDCLR(oGetD:aCols,oGetD:nAt,aHeader)})
Return
- 331 -
Return nRet
- 332 -
A linguagem ADVPL perm it e a im plem ent ação de bar ras de bot ões ut ilizando funções pré-
definidas desenvolvidas com o obj et ivo de facilit ar sua ut ilização, ou at rav és da ut ilização
diret a dos com ponent es visuais disponíveis. Dent re os r ecur sos da linguagem que podem ser
ut ilizados com est a finalidade serão abordados:
Cla sse TBa r : Classe do obj et o TBar( ) , a qual perm it e a inst anciação diret a de um
obj et o do t ipo bar ra de bot ões superior, t ornando- o disponível na aplicação cham adora.
Cla sse Bu t t on Ba r : Classe do obj et o But t onBar( ) , a qual perm it e a inst anciação diret a
de um obj et o bar ra de bot ões genérico, o qual pode ser ut ilizado em qualquer posição
da t ela, t ornando- o disponível na aplicação cham adora.
3 0 .3 .1 . Enchoice Ba r ( )
Função que cria um a barra de bot ões no form at o padrão ut ilizado pelas int erfaces de cadast r o
da aplicação Prot heus.
Est a bar ra possui os bot ões padrões para confirm ar ou cancelar a int erface e ainda perm it e a
adição de bot ões adicionais com a ut ilização do parâm et r o a Bu t t on s.
Sin t a x e :
Pa r â m e t r os:
Ap a r ê n cia :
- 333 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | DENCHBAR | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização da função |
| | EnchoiceBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600 PIXEL OF;
oMainWnd
Return
- 334 -
Classe de obj et os visuais que perm it e a im plem ent ação de um com ponent e do t ipo barr a de
bot ões para a part e superior de um a j anela previam ent e definida.
Pa r â m e t r os:
Ap a r ê n cia :
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------------
| Função | TSTBAR | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto TBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 335 -
oDlg:lCentered := .T.
oDlg:Activate()
Return
3 0 .3 .3 . But t onBa r
A sint axe Bu t t on Ba r é a form a clássica ut ilizada na linguagem ADVPL para im plem ent ar um
obj et o da classe TBar( ) , o qual possui as caract eríst icas m encionadas no t ópico ant erior .
Sin t a x e :
Re t or n o: ( ) .
Pa r â m e t r os:
- 336 -
Sin t a x e a d icion a l:
Pa r â m e t r os:
Ap a r ê ncia :
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------
| Função | TstBBar | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto TBar() |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local oDlg
Local oBtn1
Local oBtn2
- 337 -
oBtn1:cTitle:="Calc"
DEFINE BUTTON RESOURCE "S4WB009N" OF oBar ACTION Agenda() TOOLTIP "Agenda"
DEFINE BUTTON RESOURCE "S4WB010N" OF oBar ACTION OurSpool() TOOLTIP "Spool"
DEFINE BUTTON RESOURCE "S4WB016N" OF oBar GROUP;
ACTION HelProg() TOOLTIP "Ajuda"
oBtn2:cTitle:="Param."
Return
- 338 -
Conform e m encionado nos t ópicos ant eriores, os bot ões visuais do t ipo bar ra de bot ões
perm it em a definição de it ens com ações e im agens vinculadas.
Dent r e os obj et os e funções m encionados, foi cit ada a EnchoiceBar( ) , a qual perm it e a adição
de bot ões adicionais at ravés do parâm et r o a Bu t t on, sendo que os it ens dest e ar ray dev em
possuir o seguint e form at o:
Est r u t u r a :
D ESTI N OS D I SCAGEM
ED I T ED I TABLE
EXCLUI R FORM
GRAF2 D GRAF3 D
LI N E N OTE
OBJETI VO OK
PEN D EN TE PRECO
PROD UTO S4 SB0 1 4 N
S4 W B0 0 1 N S4 W B0 0 5 N
S4 W B0 0 6 N S4 W B0 0 7 N
S4 W B0 0 8 N S4 W B0 0 9 N
S4 W B0 1 0 N S4 W B0 1 1 N
S4 W B0 1 3 N S4 W B0 1 4 A
S4 W B0 1 6 N SI M ULACA
VEN D ED OR USER
Ex e m plo:
AADD(aButtons,{"USER",{||AllwaysTrue()},"Usuário"})
- 339 -
Algum as operações num éricas podem causar diferenças de ar r edondam ent o. I sso ocor r e
devido a diferenças no arm azenam ent o de variáveis num éricas nos diversos pr ocessadores,
diferença est a, inclusive, pr esent e no ADVPL, m esm o ant es do surgim ent o do Pr ot heus.
Para evit ar esses problem as de arr edondam ent o, dev e ser ut ilizada a função Round( ) ,
principalm ent e ant es de r ealizar um a com paração e ant es de se ut ilizar a função I nt ( ) .
Desse m odo, assegura- se que o result ado será cor r et o independent em ent e do pr ocessador ou
plat aform a.
Ex e m plo 0 1 :
Ex e m plo 0 2 :
32. Ut iliz a çã o de I de nt a çã o
É obrigat ória a ut ilização da ident ação, pois t orna o código m uit o m ais legível. Vej a os
ex em plos 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
- 340 -
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)
OtherWise
TrataCompra(SB1->B1_COD, SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
Para ident ar o código ut ilize a t ecla < TAB> e na ferram ent a DEV- St udio, a qual pode ser
configurada at rav és da opção “ Pr efer ências” :
- 341 -
Um a conv enção am plam ent e ut ilizada é a de capit ular as palavras chaves, funções, variáveis e
cam pos ut ilizando um a com binação de caract er es em m aiúsculo e m inúsculo, visando facilit ar
a leit ura do código font e. O código a seguir:
Para funções de m anipulação de dados que com ecem por “ db” , a capit ulação
só será efet uada após o “ db” :
dbSe e k ( )
dbSe le ct Ar e a ( )
3 3 .1 . Pa la vr a s e m m a iú sculo
Con st a nt e s:
Va r iá ve is de m e m ór ia :
Ca m p os:
Qu e r y s:
SELECT * FROM...
- 342 -
A not ação húngara consist e em adicionar os prefixos aos nom es de variáveis, de m odo a
facilm ent e se ident ificar seu t ipo. I st o facilit a na criação de códigos- font e ext ensos, pois
usando a Not ação Húngara, v ocê não pr ecisa ficar o t em po t odo volt ando à definição de um a
variável para se lem brar qual é o t ipo de dados que dev e ser colocado nela. Variáveis devem
t er um pr efixo de Not ação Húngara em m inúsculas, seguido de um nom e que ident ifique a
função da variável, sendo que a inicial de cada palavra dev e ser m aiúscula.
É obrigat ória a ut ilização dest a not ação para nom ear variáveis.
N ot a çã o Tipo de da do Ex e m plo
a Array aValores
b Bloco de código bSeek
c Caract er cNom e
d Dat a dDat aBase
l Lógico lCont inua
n Num érico nValor
o Obj et o oMainWindow
x I ndefinido xCont eudo
Para o desenvolvim ent o de sist em as e a pr ogram ação de r ot inas, sem pr e é esperado que
qualquer código escrit o sej a:
Fu n cion a lm e n t e cor r e t o
Eficie n t e
Le gív e l
Re u t iliz á ve l
Ex t e n sív e l
Por t á ve l
- 343 -
Com a ot im ização do código da função Get Answer( ) , pode facilm ent e verificar que a m esm a
não r ealiza nada adicional à cham ada de Get Ok( ) , podendo ser subst it uída por um a cham ada
diret a dest a, cont inuando a funcionar cor ret am ent e.
Nenhum com ent ário subst it ui um código claram ent e escrit o, e est e não é um acident e.
Consider e o exem plo:
O t am anho da variável cVar não é evident e por si só e não é facilm ent e verificado. Est es
m esm os 10 espaços est ariam m ais óbvios e ainda assim garant idos se a inst rução fosse escrit a
com o:
cVar := Space(11)
O m esm o princípio pode ser aplicado para qualquer st ring longa de caract eres r epet idos. A
função Replicat e pode ser ut ilizada com o a seguir:
Est e t ipo de program ação deixa o código fácil de digit ar, fácil de ler e m ais flexível.
- 344 -
Sim plicidade na criação de inst ruções t orna a program ação e at é m esm o a ex ecução m ais
rápida. Consider e a linha de código:
Se o valor da variável nVar for igual a zero ( 0) no m om ent o da ex ecução dest a linha de
código, am bas as com parações separadas pelo operador lógico .Or. serão efet uadas: Após ser
avaliada, a prim eira com paração irá falhar. A segunda com paração será ent ão av aliada e
falhará t am bém . Com o result ado, o código exist ent e dent ro da est rut ura de fluxo I f não será
ex ecut ado. Tal código som ent e será ex ecut ado quando o valor dest a variável for m aior OU
m enor do que zero. Ou sej a, sem pr e que for DI FERENTE de zero, o que t orna a linha a seguir
m ais eficient e:
If nVar != 0
Est e t ipo de alt eração t orna o código m ais legível e o pr ocessam ent o m ais rápido, evit ando a
avaliação de inst ruções desnecessariam ent e.
Exist em out ras sit uações onde a sim plificação pode ser ut ilizada. A expressão de avaliação a
seguir:
If cVar == "A" .Or. cVar == "B" .Or cVar == "C" .Or. cVar == "D"
If cVar $ "ABCD"
A m elhor solução é aquela que envolve o problem a im ediat o e previne problem as no fut ur o.
Consider e o exem plo:
Excet o cont ando- se os caract eres, não exist e m aneira de saber se o núm ero de car act er es de
exclam ação é o esperado. Enquant o ist o é um problem a, exist em algo m ais grave. A expressão
de pict ure é est át ica. Se no fut ur o for necessário aj ust ar o t am anho da variável cVar, ser á
necessário localizar t odos os lugares no código onde est a m áscara de pict ure est á sendo
ut ilizada para aj ust e m anual.
- 345 -
Opçã o da p r a t icida de a o dr a m a
Se a solução par ece com plexa, pr ovav elm ent e é porque o cam inho escolhido est á levando a
isso. Deve- se sem pr e se pergunt ar porque alguém desenv olveria um a linguagem que requisit e
t ant os com andos com plicados para fazer algo sim ples. Na grande m aioria dos casos, exist e
um a solução m ais sim ples. O exem plo abaixo deixa isso bem claro:
Est e código pode ser escrit o de um a form a m uit o m ais sim ples, confor m e dem onst rado abaixo:
Ut iliz a çã o d e op e r a dor e s de in cr e m e n t o/ d e cr e m e n t o
Ut ilizados devidam ent e, os operador es de increm ent o e decrem ent o t ornam o código m ais fácil
de ler e possivelm ent e um pouco m ais rápidos. Ao cont rário de escrever adições sim ples com o:
nVar := nVar + 1
nVar := nVar -1
++nVar
--nVar
Dev e- se apenas t om ar cuidado com a precedência dest es operador es, pois o " + + " ou o " - - "
podem aparecer ant es ou depois de um a variável, e em alguns casos quando a variável for
ut ilizada dent ro de um a expressão, a prefixação ou sufixação dest es operador es afet ará o
result ado. Para m aiores det alhes, consult e a docum ent ação de operador es da linguagem
ADVPL.
- 346 -
Exist e um a diferença ent re um bom hábit o e perda de t em po. Algum as v ezes est es conceit os
podem est ar m uit o pr óxim os, m as um m odo de difer enciá- los é balancear os benefícios de
realizar algum a ação cont ra o pr oblem a que result aria se não fosse ex ecut ada. Obser ve o
ex em plo:
Local nCnt := 0
For nCnt := 1 To 10
<código>
Next nCnt
Nest e ex em plo não há nenhum pont o negat ivo e nada er rado ocorr er á se a variável não for
inicializada, port ant o é aconselhável evit ar est e t ipo de inicialização, pois não t orna o código
m ais segur o e t am bém não expr essa a int enção do código m ais claram ent e.
Local nCnt
While ( nCnt++ < 10 )
<código>
EndDo
Em ADVPL, variáveis não inicializadas sem pre t em seu valor cont endo nulo ( nil) a princípio, o
que fará com que um a exceção em t em po de execução acont eça quando a inst rução de
repet ição while for ex ecut ada.
Diferent em ent e do prim eiro ex em plo, onde a inicialização da variável não fazia diferença
algum a, nest e segundo ex em plo a inicialização é absolut am ent e necessária. Deve- se pr ocurar
inicializar variáveis num éricas com zer o ( 0) e variáveis caract er com st ring nula ( " " ) apenas
quando realm ent e necessário.
- 347 -
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 código de um a única let ra, ( A at é E) , foi inform ado para indicar a cor de cabelo. Est e
código foi ent ão conv er t ido e ar m azenado com o um a st ring. Pode- se not ar que a cor " Pret o"
será at ribuída se nenhum a out ra opção for v erdadeira.
Um a alt ernat iva que reduz o nível de ident ação t orna o código m ais fácil de ler enquant o reduz
o núm ero de com andos 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
- 348 -
Se um arquivo de código criado se refer encia a com andos para int erpr et ação e t rat am ent o de
arquivos XML, est e deve se incluir o arquivo de cabeçalho próprio para t ais com andos
( XMLXFUN.CH no exem plo) . Por ém não dev e- se incluir arquivos de cabeçalho apenas por
segurança. Se não se est á r efer enciando nenhum a das const ant es ou ut ilizando nenhum dos
com andos cont idos em um dest es arquivos, a inclusão apenas t ornará a com pilação m ais
dem orada.
Con st a n t e s e m m a iú scu lo
I st o é um a convenção que faz sent ido. Em ADVPL, com o em C por ex em plo, a regra é ut ilizar
t odos os caract eres de um a const ant e em m aiúsculo, a fim de que possam ser claram ent e
reconhecidos com o const ant es no código, e que não sej a necessários lem brar onde for am
declarados.
Ut iliz a çã o d e ide n t a çã o
Est e é um hábit o que t odo program ador dev e desenvolver. Não consom e m uit o esforço para
m ant er o código alinhado durant e o t r abalho, porém quando necessário pode- se ut ilizar a
ferram ent a TOTVS Dev St udio para a re- ident ação de código. Para m aior es det alhes, consult e a
docum ent ação sobre a ident ação de códigos font es disponível nos dem ais t ópicos dest e
m at erial.
Ut iliz a çã o d e e sp a ços e m br a n co
Espaços em branco ext r as t ornam o código m ais fácil para a leit ura. Não é necessário im ensas
áreas em br anco, m as agrupar pedaços de código at ravés da ut ilização de espaços em branco
funciona m uit o bem . Cost um a- se separar parâm et r os com espaços em branco.
Qu e br a de lin h a s m u it o lon g a s
Com o obj et ivo de t ornar o código m ais fácil de ler e im prim ir, as linhas do código não devem
est ender o lim it e da t ela ou do papel. Podem ser " quebradas" em m ais de um a linha de t ext o
ut ilizando o pont o- e- vírgula ( ; ) .
Ca pit u la çã o de p a la vr a s- ch a v e
Um a conv enção am plam ent e ut ilizada é a de capit ular as palavras chaves, funções, variáveis e
cam pos ut ilizando um a com binação de caract er es em m aiúsculo e m inúsculo, visando facilit ar
a leit ura do código font e.
local ncnt
while ( ncnt++ < 10 )
ntotal += ncnt * 2
enddo
- 349 -
Local nCnt
Ut iliz a çã o d a N ot a çã o H ú n g a r a
A Not ação Húngara é m uit o com um ent re pr ogram ador es xBase e de out ras linguagens. A
docum ent ação do ADVPL ut iliza est a not ação para a descrição das funções e com andos e é
aconselhável sua ut ilização na criação de rot inas, pois aj uda a evit ar pequenos err os e facilit a
a leit ura do código. Para m aiores det alhes, consult e a docum ent ação sobr e a ut ilização da
Not ação Húngara de códigos font es disponível nos dem ais t ópicos dest e m at erial.
Criar variáveis com o nNum er o ou dDat a t am bém não aj udam na ident ificação. A Not ação
Húngara j á est á sendo ut ilizada para isso e o obj et ivo do nom e da variável deveria ser
ident ificar sua ut ilização, não o t ipo de dado ut ilizado. Deve- se procurar subst it uir t ais
variáveis por algo com o nTot al ou dCom pra.
O m esm o é válido para nom es de funções, que dev em descrev er um pouco sobr e o que a
função faz. Novam ent e nom es ext r em am ent e curt os não são aconselháveis.
Com ent ários são m uit o út eis na docum ent ação de pr ogram as criados e para facilit ar a
ident ificação de pr ocessos im port ant es no fut ur o e devem sem pr e ser ut ilizados.
Sem pr e que possível, funções criadas dev em t er um a breve descrição do seu obj et ivo,
parâm et ros e ret orno. Além de servir com o docum ent ação, os com ent ários em belezam o
código ao separar as funções um as das out ras. Os com ent ários dev em ser ut ilizados com bom
senso, pois r eescrever a sint axe ADVPL em port uguês t orna- se apenas perda de t em po:
- 350 -
Sej a oferecendo assist ência, exibindo m ensagens de aviso ou m ant endo o usuário inform ado
do est ado de algum processo, as m ensagens dev em r eflet ir o t om geral e a im port ância da
aplicação. Em t erm os gerais, dev e- se evit ar ser m uit o inform al e ao m esm o t em po m uit o
t écnico.
Esse t ipo de m ensagem pode dar inform ações dem ais para o usuário e deixá- lo sent indo- se
desconfort áv el se não souber o que significa " reindexando" , et c. E de fat o, o usuário não devia
ser incom odado com t ais det alhes. Apenas a frase " Aguarde, indexando." funcionaria
corr et am ent e, assim com o palavras " pr ocessando" ou " r eorganizando" .
Out ra boa idéia é evit ar a r efer encia a um it em corr ent e de um a t abela com o um " r egist ro" :
Se a operação est iver sendo efet uada em um arquivo de client es, o usuário deve ser
quest ionado sobre a rem oção do client e cor rent e, se possível inform ando valores de
ident ificação com o o código ou o nom e.
Apesar do ADVPL supor t ar a abr eviação de com andos em quat r o let r as ( por exem plo, r epl no
lugar de r eplace) não há necessidade de ut ilizar t al funcionalidade. I st o apenas t orna o código
m ais difícil de ler e não t orna a com pilação m ais rápida ou sim ples.
Não dev e- se criar const ant es para expr essões com plexas. I st o t ornará o código m uit o difícil de
com preender e poderá causar er r os prim ários, pois pode- se im aginar que um a at ribuição é
efet uada a um a variável quando na v erdade há t oda um a expr essão disfarçada:
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
- 351 -
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK 5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
Dada sua nat ur eza binária, t udo pode ou não acont ecer dent r o de um com put ador . Adicionar
pedaços de código apenas para " garant ir a segurança" é fr eqüent em ent e ut ilizado com o um a
desculpa para evit ar cor rigir o pr oblem a r eal. I st o pode incluir a checagem para validar
int ervalos de dat as ou para t ipos de dados corr et os, o que é com um ent e ut ilizando em
funções:
I sola m e n t o de st r in g s d e t e x t o
No caso de m ensagens e st rings de t ext o, a cent ralização é um bom negócio. Pode- se colocar
m ensagens, cam inhos para arquivos, e m esm o out ros valor es em um local específico. I st o os
t orna acessíveis de qualquer lugar no program a e fáceis de ger enciar.
Por exem plo, se exist e um a m ensagem com um com o " I m pr im in do, por fa vor a g u a r de ..."
em m uit as part es do código, corr e- se o risco de não seguir um padrão para um a das
m ensagens em algum lugar do código. E m ant ê- las em um único lugar, com o um arquivo de
cabeçalho, t orna fácil a produção de docum ent ação e a int ernacionalização em out r os idiom as.
- 352 -
Desenv olver um progr am a que im plem ent e a função AxCadast ro( ) para a
01
t abela padrão do sist em a SA2 – Cadast ro de Fornecedor es.
- 353 -
I m plem ent ar na Mar kBr owse( ) desenv olvida no it em ant erior um a função para
07 exclusão de m últ iplos regist ros da t abela padrão do sist em a SA2 – Cadast ro
de Fornecedor es.
- 354 -
- 355 -
Desenv olver um progr am a que crie um arquivo de t rabalho com est rut ura
13
sim ilar ao SA1 e receba as inform ações dest a t abela.
I m plem ent ar na r ot ina desenvolvida no it em ant erior, um Mar kBr owse que
14
perm it e a seleção e visualização de apenas um r egist ro selecionado.
Desenv olver um progr am a que im plem ent e um r elat ório que perm it a a
15 im pressão de um a list agem sim ples dos dados da t abela padrão SA1 –
Cadast r o de client es.
- 356 -
Desenv olver um program a que realize a export ação dos it ens m arcados no
17 SA1 – Cadast ro de Client es para um arquivo no form at o .TXT em um diret ório
especificado pelo usuário.
Desenv olver um program a que r ealize a im port ação das inform ações cont idas
18 em um arquivo no form at o .TXT selecionado pelo usuário e as at ualize n o SA1
– Cadast r o de Client es.
- 357 -
Desenv olver um a aplicação visual que im plem ent e cada um dos com ponent es
20
disponíveis no font e DI ALOG_OBJETOS.PRW.
I m plem ent ar as r ot inas de im port ação e expor t ação desenvolvidas nos it ens
21
ant erior as r éguas de pr ocessam ent o m ais adequadas.
- 358 -
- 359 -
Desenv olver a int erface visual para int eragir com a classe Aluno( )
28
im plem ent ada ant erior m ent e.
- 360 -
Desenv olver um a rot ina que im plem ent e um a Enchoice( ) para o SA1 –
30
Cadast r o de client es.
- 361 -
Convert er a sint axe clássica dos font es “ List Box” para a sint axe orient ada a
36
obj et os.
- 362 -
Objetivos do projeto
Deverá ser entregue na data estabelecida pelo instrutor, contendo os fontes e demais arquivos
necessários. A avaliação do projeto será realizada após a entrega, no prazo estabelecido pelo
instrutor;
Pode ser realizado em grupos de até 03 pessoas. Caso existam alunos sem grupos, estes poderão
integrar equipes já formadas com o total de membros estabelecido, mediante aprovação do
instrutor;
Avaliação do projeto
Desenvolver uma aplicação utilizando a linguagem ADVPL que contemple as seguintes funcionalidades:
A part ir da seleção dos r egist ros disponíveis nest e arquivo int erm ediário, o
usuário poderá:
- 363 -
A linguagem ADVPL possui diversos com ponent es visuais e auxiliares, os quais podem ser
represent ados ut ilizando a est rut ura abaixo:
Cla sse s de Ja n e la s
Msdialog
Tdialog
Twindow
- 364 -
- 365 -
TSRVOBJECT( )
D e scr içã o: Classe abst rat a inicial de t odas as classes de int erface do ADVPL. Não dev e
ser inst anciada diret am ent e.
Pr opr ie da d e s:
Pa r â m e t r os:
Nenhum -
- 366 -
Se t Focu s
D e scr içã o: Força m udança do foco de ent rada de dados para o cont r ole.
Sin t a x e : Set Focus( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
N il
H ide
Nenhum -
Re t or n o:
N il
Show
Nenhum -
Re t or n o:
N il
En a ble
Nenhum -
Re t or n o:
N il
- 367 -
Nenhum -
Re t or n o:
N il
Re fr e sh
Nenhum -
Re t or n o:
N il
Ex e m plo:
- 368 -
TFON T( )
D e scr içã o: Classe de obj et os que define a font e do t ext o ut ilizado nos cont roles
visuais.
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
Ex e m plo:
#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
- 369 -
M SD I ALOG( )
D e scr içã o: Classe de obj et os que deve ser ut ilizada com o padr ão de j anela para
ent rada de dados. MSDialog é um t ipo de j anela diálogo m odal, ist o
é, não perm it e que out ra j anela at iva receba dados enquant o est a
est iver at iva.
Pr opr ie da d e s:
Pa r â m e t r os:
- 370 -
Ex e m plo:
#include 'protheus.ch'
User Function Teste()
// cria diálogo
Local oDlg := MSDialog():New(10,10,300,300,'Meu
dialogo',,,,,CLR_BLACK,CLR_WHITE,,,.T.)
TD I ALOG( )
D e scr içã o: Classe de obj et os do t ipo diálogo de ent rada de dados, sendo seu
uso reservado. Recom enda- se ut ilizar a classe MSDialog que é
herdada dest a classe.
Pr opr ie da d e s:
Pa r â m e t r os:
- 371 -
M é t odos a u x ilia r e s:
Act iv a t e
Re t or n o:
Nenhum -
- 372 -
Nenhum -
Ap a r ê n cia :
Ex e m plo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
// cria diálogo
oDlg := MSDialog():New(10,10,300,300,'Meu
dialogo',,,,,CLR_BLACK,CLR_WHITE,,,.T.)
// ativa diálogo centralizado
oDlg:Activate(,,,.T.,{||msgstop('validou!'),.T.},,{||msgstop('iniciando..
.')} )
- 373 -
D e scr içã o: Classe de obj et os do t ipo diálogo principal de program a. Dev erá
exist ir apenas um a inst ância dest e obj et o na execução do program a.
Pr opr ie da d e s:
Pa r â m e t r os:
- 374 -
Act iv a t e
D e scr içã o: At iva ( exibe) a j anela. Cham ar esse m ét odo apenas um a vez.
Sin t a x e : Act ivat e( [ acShow] , [ bPar2] , [ bPar3] , [ bPar4] , [ bPar5] , [ bPar 6] ,
[ abI nit ] , [ bPar8] , [ bPar9] , [ bPar10] , [ bPar11] , [ bPar12] ,[ bPar13] ,
[ bPar14] , [ bPar15] , [ abValid] , [ bPar17] , [ bPar18] ) .
Pa r â m e t r os:
Re t or n o:
Nenhum -
En d
Nenhum -
- 375 -
Nenhum -
Nenhum -
Ap a r ê n cia :
Ex e m plo:
#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,,)
- 376 -
TCON TROL( )
D e scr içã o: Classe abst rat a com um ent r e t odos os com ponent es visuais
edit áveis. Não dev e ser inst anciada diret am ent e.
Pr opr ie da d e s:
Pa r â m e t r os:
Nenhum -
M é t odos a u x ilia r e s:
Se t Focu s
D e scr içã o: Força m udança do foco de ent rada de dados para o cont r ole.
Sin t a x e : Set Focus( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
N il
Ex e m plo:
- 377 -
BRGETD D B( )
Pr opr ie da d e s:
Pa r â m e t r os:
- 378 -
M é t odos a u x ilia r e s:
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
GoTop
Nenhum -
Re t or n o:
N il
GoBot t om
Nenhum -
Re t or n o:
N il
- 379 -
Nenhum -
Re t or n o:
N il
Ap a r ê n cia :
- 380 -
#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.)
M SCALEN D ( )
Pr opr ie da d e s:
- 381 -
Ap a r ê n cia :
Ex e m plo:
#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 mudança de Dia
oCalend:bChange := {|| Alert('Dia Selecionado: ' +
dtoc(oCalend:dDiaAtu)) }
// Code-Block para mudança de mes
oCalend:bChangeMes := {|| alert('Mes alterado') }
ACTIVATE MSDIALOG oDlg CENTERED
Return
- 382 -
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Add
- 383 -
Re t or n o:
N il
Ap a r ê n cia :
Ex e m plo:
#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
- 384 -
Pr opr ie da d e s:
Pa r â m e t r os:
- 385 -
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
GoTop
Nenhum -
Re t or n o:
N il
GoBot t om
Nenhum -
Re t or n o:
N il
- 386 -
Nenhum -
Re t or n o:
N il
Ap a r ê n cia :
- 387 -
#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.)
M SW ORKTI M E( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role - Bar ra de Período.
Pr opr ie da d e s:
Pa r â m e t r os:
- 388 -
M é t odos a u x ilia r e s:
Ge t Va lu e
Nenhum -
Re t or n o:
Ge t I n t e r Tim e
Nenhum -
Re t or n o:
Se t Re sol
Re t or n o:
N il
- 389 -
D e scr içã o: At ribui um det erm indo cont eúdo para um obj et o ou at ribut o
de um obj et o.
Sin t a x e : Set Value( xValue, cPict ure)
Pa r â m e t r os:
Re t or n o:
Nenhum
Ap a r ê n cia :
Ex e m plo:
#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
- 390 -
D e scr içã o: Classe de obj et os visuais do t ipo bot ão que Define o com ponent e
visual SBut t on, o qual perm it e a inclusão de bot ões de operação na
t ela da int erface, os quais serão visualizados dependendo da
int erface do sist em a ERP ut ilizada som ent e com um t ext o sim ples
para sua ident ificação, ou com um a im agem ( Bit Map) pré- definido.
Pr opr ie da d e s:
Pa r â m e t r os:
Pa r â m e t r o Tipo / Descrição
Num érico, opcional. Coordenada vert ical em pixels ou
n Top
carat er es.
Num érico, opcional. Coordenada horizont al em pixels ou
n Le ft
caract eres.
n Type Num érico. Tipo do Bot ão
Bloco de código, opcional. Bloco que dev erá ser acionado
bAct ion
quando o bot ão for pressionado.
Obj et o, opcional. Janela ou cont r ole onde o bot ão deverá ser
oW n d
criado.
lEn a ble Logico, opcional. Habilit a/ Desabilit a bot ão
cM sg Caract er , Opicional. Descrição do t ipo t oolt ip( hint ) do it em
Bloco de código, opcional. Execut ado quando m udança de
foco de ent rada de dados est á sendo efet uada na j anela
a bW h e n
onde o cont r ole foi criado. O bloco deve r et ornar .T. se o
cont r ole dev e perm anecer habilit ado ou .F. se não.
M é t odos a u x ilia r e s:
Cr e a t e
D e scr içã o: Ret orna Mét odo const rut or opcional da classe.
Sin t a x e : Creat e( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
- 391 -
Ex e m plo:
#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
- 392 -
D e scr içã o: Classe de obj et os visuais que perm it e a im plem ent ação de um
com ponent e do t ipo barra de bot ões para a part e superior de um a
j anela previam ent e definida.
Pr opr ie da d e s:
Con st r u t or :
Pa r â m e t r os:
Ap a r ê n cia :
- 393 -
#include 'protheus.ch'
/*/
+------------------------------------------------------------------------
| Função | TSTBAR | Autor | MICROSIGA |Data | |
+------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto TBar() |
+------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------
/*/
Exemplo (continuação):
oDlg:lCentered := .T.
oDlg:Activate()
Return
- 394 -
Pr opr ie da d e s:
Pa r â m e t r os:
- 395 -
Cr e a t e
D e scr içã o: Ret orna Mét odo const rut or opcional da classe.
Sin t a x e : Creat e( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
Se t Bm p
D e scr içã o: Mét odo par a car r egar um a im agem do reposit ório.
Sin t a x e : Set Bm p( acResNam e )
Pa r â m e t r os:
Re t or n o:
Nenhum -
Loa d
D e scr içã o: Mét odo par a car r egar um a im agem do reposit ório ou local.
Sin t a x e : Load( acResNam e, acBm pFile )
Pa r â m e t r os:
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 396 -
#include “protheus.ch”
Return
TBROW SEBUTTON ( )
D e scr içã o: Classe de obj et os visuais do t ipo bot ão no form at o padrão ut ilizado
em br ow ses da aplicação.
Pr opr ie da d e s:
Con st r u t or : New( [ nRow] , [ nCol] , [ cCapt ion] , [ oWnd] , [ bAct ion] , [ nWidt h] ,
[ nHeight ] , [ nHelpI d] , [ oFont ] , [ lDefault ] , [ lPixel] , [ lDesign] , [ cMsg] ,
[ lUpdat e] , [ bWhen] , [ bValid] , [ lCancel] )
Pa r â m e t r os:
n H e lp I d Reser vado
Obj et o, opcional. Obj et o t ipo t Font com propriedades da
oFon t
font e ut ilizada para o t ít ulo do bot ão.
lD e f a u lt Reser vado
Lógico, opcional. Se .T. considera as coordenadas passadas
lPix e l
em pixels, se .F. ( padrão) considera em caract eres.
- 397 -
Ap a r ê n cia :
Ex e m plo:
#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.,,,)
- 398 -
D e scr içã o: Classe de obj et os visuais do t ipo bot ão, o qual perm it e que sej a
vinculada um a im agem ao cont r ole.
Pr opr ie da d e s:
Con st r u t or : NewBar( [ cResNam e1] , [ cResNam e2] , [ cBm pFile1] , [ cBm pFile2] ,
[ cMsg] , [ bAct ion] , [ lGroup] , [ oWnd] , [ lAdj ust ] , [ bWhen] , [ cToolTip] ,
[ lPressed] , [ bDr op] , [ cAct ion] , [ nPos] , [ cPr om pt ] , [ oFont ] ,
[ cResNam e3] , [ cBm pFile3] , [ lBorder] )
Pa r â m e t r os:
- 399 -
Loa dBit m a ps
Pa r â m e t r os:
Re t or n o:
Nenhum
Se t Pop UpM e n u
Nenhum -
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 400 -
#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. )
TBTN BM P2 ( )
D e scr içã o: Classe de obj et os visuais do t ipo bot ão, o qual perm it e a exibição de
um a im agem ou de um popup.
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
- 401 -
Pa r â m e t r os:
Re t or n o:
Nenhum
Se t Pop UpM e n u
Nenhum -
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 402 -
/**************************/
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 ( )
D e scr içã o: Classe de obj et os visuais do t ipo bot ão, o qual perm it e a ut ilização
de t ext o para sua ident ificação.
Pr opr ie da d e s:
lPr oce ssin g Lógico. Se .T. indica o bot ão est á efet uando um a ação.
bAct ion Bloco de código. Execut ado quando o bot ão é pressionado.
Pa r â m e t r os:
Pa r â m e t r o Tipo / Descrição
Num érico, opcional. Coordenada vert ical em pixels ou
a nRow
carat er es.
Num érico, opcional. Coordenada horizont al em pixels ou
a nCol
caract eres.
a cCa pt ion Caract er e, opcional. Tit ulo do bot ão.
Obj et o, opcional. Janela ou cont r ole onde o bot ão deverá ser
a oW n d
criado.
Bloco de código, opcional. Bloco que dev erá ser acionado
a bAct ion
quando o bot ão for pressionado.
a nW idt h Num érico, opcional. Lar gura do bot ão em pixels.
a n H e igh t Num érico, opcional. Alt ura do bot ão em pixels.
n Pa r 8 Reser vado.
Obj et o, opcional. Obj et o t ipo t Font com propriedades da
a oFon t
font e ut ilizada para o t ít ulo do bot ão.
- 403 -
Ap a r ê n cia :
Ex e m plo:
#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')
- 404 -
Pr opr ie da d e s:
Pa r â m e t r os:
- 405 -
M é t odos a u x ilia r e s:
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
GoTop
Nenhum -
Re t or n o:
N il
GoBot t om
Nenhum -
Re t or n o:
N il
- 406 -
Nenhum -
Re t or n o:
N il
Ap a r ê n cia :
- 407 -
#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), 'Descrição 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','Descrição','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. )
- 408 -
Pr opr ie da d e s:
Con st r u t or : New( [ nRow] , [ nCol] , [ cCapt ion] , [ bSet Get ] , [ oDlg] , [ nWidt h] ,
[ nHeight ] , [ aHelpI ds] , [ bLClicked] , [ oFont ] , [ bValid] , [ nClrText ] ,
[ nClrPane] , [ lDesign] , [ lPixel] , [ cMsg] , [ lUpdat e] , [ bWhen] )
Pa r â m e t r os:
- 409 -
Ex e m plo:
#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.,,,)
- 410 -
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Cr e a t e
Re t or n o:
Re t Color
Nenhum -
Re t or n o:
- 411 -
Re t or n o:
Nenhum -
Se t Color
Re t or n o:
Nenhum -
Se t Siz e Tr ia n g u le
Re t or n o:
N e n h um -
Ap a r ê n cia :
- 412 -
#include “protheus.ch”
TCOM BOBOX ( )
D e scr içã o: Classe de obj et os visuais do t ipo t Com boBox, a qual cria um a
ent rada de dados com m últ ipla escolha com it em definido em um a
list a vert ical, acionada por F4 ou pelo bot ão esquerdo localizado na
part e direit a do cont role. A variável associada ao cont role t erá o
valor de um dos it ens selecionados ou no caso de um a list a
indexada, o valor de seu índice.
Pr opr ie da d e s:
Pa r â m e t r os:
Pa r â m e t r o
Num érico, opcional. Coordenada vert ical em pixels ou
a nRow
caract eres.
Num érico, opcional. Coordenada horizont al em pixels ou
a nCol
caract eres.
Bloco de código, opcional. Bloco de código no form at o { | u|
if( Pcount ( ) > 0, < var> : = u, < var> ) } que o cont role ut iliza
para at ualizar a variável < var > . < var > deve ser t ipo
a bSe t Ge t caract er. Se a list a for seqüencial, o cont role at ualizará
< var> com o cont eúdo do it em selecionado, se a list a for
indexada, < var> será at ualizada com o valor do índice do
it em selecionado.
Array , opcional. List a de it em s, caract er es, a ser em exibidos.
Pode t er os seguint es form at os: a) Seqüencial, ex em plo:
anI tem s
{ “ it em 1” ,” it em 2” ,...,” it em N” } ou b) I ndexada, exem plo:
{ “ a= it em 1” ,” b= it em 2” , ..., “ n= it em N” } .
a nW idt h Num érico, opcional. Lar gura do cont role em pixels.
- 413 -
M é t odos a u x ilia r e s:
Se le ct
Re t or n o:
Nenhum -
- 414 -
Ex e m plo:
#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')
- 415 -
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Se t Opt ion
Re t or n o:
Nenhum -
- 416 -
Re t or n o:
Nenhum -
a En a ble
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 417 -
Local oFolder
Local aFolder := { 'Folder 1', 'Folder 2', 'Folder 3' }
TGET( )
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – t Get , a qual cria um
cont r ole que arm azena ou alt era o cont eúdo de um a variável at ravés
de digit ação. O cont eúdo da variável só é m odificado quando o
cont r ole perde o foco de edição para out ro cont r ole.
Pr opr ie da d e s:
Pa r â m e t r os:
- 418 -
Ap a r ê n cia :
- 419 -
#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')
Return NIL
TGROUP( )
D e scr içã o: Classe de obj et os visuais do t ipo painel – t Group, a qual cria um
painel onde cont r oles visuais podem ser agrupados ou classificados.
Nest e painel é criada um a borda com t ít ulo em volt a dos cont r oles
agrupados.
Pr opr ie da d e s:
Pa r â m e t r os:
- 420 -
Ex e m plo:
#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
- 421 -
Pr opr ie da d e s:
Pa r â m e t r os:
Pa r â m e t r o Tipo / Descrição
Num érico, opcional. Coordenada vert ical em pixels ou
a nRow
carat er es.
Num érico, opcional. Coordenada horizont al em pixels ou
a nCol
caract eres.
a cCa pt ion Caract er e, opcional. Tit ulo do bot ão.
Obj et o, opcional. Janela ou cont r ole onde o bot ão deverá ser
a oW n d
criado.
Bloco de código, opcional. Bloco que dev erá ser acionado
a bAct ion
quando o bot ão for pressionado.
a nW idt h Num érico, opcional. Lar gura do bot ão em pixels.
a n H e igh t Num érico, opcional. Alt ura do bot ão em pixels.
Obj et o, opcional. Obj et o t ipo t Font com propriedades da
a oFon t
font e ut ilizada para o t ít ulo do bot ão.
Bloco de código, opcional. Execut ado quando m udança de
foco de ent rada de dados est á sendo efet uada na j anela
a bW h e n
onde o cont r ole foi criado. O bloco deve r et ornar .T. se o
cont r ole dev e perm anecer habilit ado ou .F. se não.
M é t odos a u x ilia r e s:
Cr e a t e
Re t or n o:
- 422 -
Ex e m plo:
#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 método 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
TI BROW SER( )
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
- 423 -
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
- 424 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t List box, a qual cria um a
j anela com it ens selecionáveis e barra de rolagem . Ao selecionar um
it em , um a variável é at ualizada com o cont eúdo do it em selecionado.
Pr opr ie da d e s:
Pa r â m e t r os:
- 425 -
M é t odos a u x ilia r e s:
Se le ct
Re t or n o:
Nenhum -
Add
Re t or n o:
Nenhum -
M odify
Re t or n o:
Nenhum -
- 426 -
Re t or n o:
Nenhum -
Le n
Nenhum -
Re t or n o:
Re se t
Nenhum -
Re t or n o:
Nenhum -
- 427 -
Ex e m plo:
#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
- 428 -
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
- 429 -
#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 )
TM EN UBAR( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role - Bar ra de Menu.
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
- 430 -
#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.)
TM ETER( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Met er, a qual exibe um a
régua ( gauge) de pr ocessam ent o, descr ev endo o andam ent o de um
processo at ravés da exibição de um a barra horizont al.
Pr opr ie da d e s:
Con st r u t or : New( [ anRow] , [ anCol] , [ abSet Get ] , [ anTot al] , [ aoWnd] , [ anWidt h] ,
[ anHeight ] , [ lPar8] , [ alPixel] , [ oPar10] , [ cPar11] , [ alNoPerc] ,
[ anClrPane] , [ nPar14] , [ anClrBar] , [ nPar16] , [ lPar17] )
Pa r â m e t r os:
- 431 -
M é t odos a u x ilia r e s:
Se t
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 432 -
#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 régua
// botão para ativar andamento da régua
@ 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 régua
While .T. .and. !lStop
Sleep(1000) // pára 1 segundo
ProcessMessages() // atualiza a pintura da janela, processa mensagens do
windows
nCurrent:= Eval(oMeter:bSetGet) // pega valor corrente da régua
nCurrent+=10 // atualiza régua
oMeter:Set(nCurrent)
if nCurrent==oMeter:nTotal
Return
endif
Enddo
lRunning:= .F.
lStop:= .F.
Return
- 433 -
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Cr e a t e Se r ie
Re t or n o:
- 434 -
Re t or n o:
Nenhum -
Se t Gr a d ie n t e
D e scr içã o: Mét odo par a set ar o fundo do gráfico com um a cor gradient e
em det erm inada direção.
Sin t a x e : Set Gr adient ( nDirect ion, St art Color , EndColor )
Pa r â m e t r os:
Re t or n o:
Nenhum -
Se t Tit le
Re t or n o:
Nenhum -
- 435 -
Re t or n o:
Nenhum -
Se t M a r gin s
D e scr içã o: Mét odo par a set ar as m argens superior , inferior e lat erais do
gráfico.
Sin t a x e : Set Margins( nTop, nLeft , nBot t om , nRight )
Pa r â m e t r os:
Re t or n o:
Nenhum -
Se t Ra n ge Y
Re t or n o:
Nenhum -
- 436 -
Re t or n o:
Sa ve ToI m a ge
Re t or n o:
D e lSe r ie
Re t or n o:
Zoom I n
D e scr içã o: Mét odo par a efet uar zoom int erno ( + ) .
Sin t a x e : Zoom I n( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
Nenhum -
- 437 -
D e scr içã o: Mét odo par a efet uar zoom ext erno ( - ) .
Sin t a x e : Zoom Out ( )
Pa r â m e t r os:
Nenhum -
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 438 -
#include 'MSGRAPHI.CH'
User Function tMsGraphicTst()
nSerie := oGraphic:CreateSerie( 10 )
oGraphic:l3D := .T. // Grafico em 3D
oGraphic:lAxisVisib := .T. // Mostra os eixos
// Itens do Grafico
oGraphic:Add(nSerie, 200, 'Item01', CLR_BLUE )
oGraphic:Add(nSerie, 180, 'Item02', CLR_RED )
oGraphic:Add(nSerie, 210, 'Item03', CLR_BLUE )
oGraphic:Add(nSerie, 110, 'Item04', CLR_BLUE )
oGraphic:Add(nSerie, 100, 'Item05', CLR_BLUE )
oGraphic:Add(nSerie, 080, 'Item06', CLR_BLUE )
oGraphic:Add(nSerie, 110, 'Item07', CLR_BLUE )
@ 001, 124 BUTTON 'Salva Grafico' SIZE 40,14 OF oDlg PIXEL ACTION
oGraphic:SaveToBMP('Exemplo.bmp','\web\')
@ 020, 124 BUTTON 'Zoom IN' SIZE 40,14 OF oDlg PIXEL ACTION
oGraphic:ZoomIn()
@ 040, 124 BUTTON 'Zoom OUT' SIZE 40,14 OF oDlg PIXEL ACTION
oGraphic:ZoomOut()
@ 060, 124 BUTTON 'Deleta Serie' SIZE 40,14 OF oDlg PIXEL ACTION
oGraphic:DelSerie(nSerie)
Return
- 439 -
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Add I t e m
Re t or n o:
Nenhum -
- 440 -
Re t or n o:
Nenhum -
Ap a r ê n cia :
Ex e m plo:
#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')} )
- 441 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – ut ilizado para adicionar
m ensagens em out ros obj et os, com o bar ras e m enus.
Pr opr ie da d e s:
Con st r u t or : N e w ( < oM sgBa r > , < cM sg > , < n Siz e > , < oFon t > , < n Clr For e > ,
< n Clr Ba ck > , lEn a ble , [ < { bAct ion } > ] , cI m a ge m )
Pa r â m e t r os:
Ap a r ê n cia :
- 442 -
#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')} )
TM ULTI BTN ( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role - Múlt iplos bot ões.
Pr opr ie da d e s:
Con st r u t or : New( [ nRow] , [ nCol] , [ cTit le] , [ oWnd] , [ bAct ion] , [ nWidt h] ,
[ nHeight ] , [ im gNam e] , [ ori] , [ cMsg] , [ bt nPer Line] )
Pa r â m e t r os:
- 443 -
Loa dI m a ge
D e scr içã o: Muda a figura a esquerda do com ponent e
Sin t a x e : LoadI m age( cI m agem )
Pa r â m e t r os:
Re t or n o:
Nenhum -
Add Bu t t on
D e scr içã o: I nser e um bot ão
Sin t a x e : AddBut t on( cText o)
Pa r â m e t r os:
Re t or n o:
Nenhum -
Se t Tit le
D e scr içã o: Muda o t it ulo e o num er o de bot ões por linha
Sin t a x e : Set Tit le( cText o, nBot oes)
Pa r â m e t r os:
Re t or n o:
Nenhum -
Se t Fon t s
D e scr içã o: Muda a font do t it ulo e dos bot ões
Sin t a x e : Set Tit le( cFont Tit , nSizeTit , nFont But , nSizeBut )
Pa r â m e t r os:
Re t or n o:
Nenhum -
- 444 -
Ex e m plo:
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 304,504 PIXEL TITLE 'Exemplo'
otMultiBtn:SetFonts('Tahoma',16,'Tahoma',10)
otMultiBtn:AddButton('btn01')
otMultiBtn:AddButton('btn02')
otMultiBtn:AddButton('btn04')
otMultiBtn:AddButton('btn05')
- 445 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role - edição de t ext o de
m últ iplas linhas.
Pr opr ie da d e s:
Pa r â m e t r os:
Parâm et r o
Num érico, opcional. Coordenada vert ical em pixels ou
anRow
caract eres.
Num érico, opcional. Coordenada horizont al em pixels ou
anCol
caract eres.
Bloco de código, opcional. Bloco de código no form at o { | u|
if( Pcount ( ) > 0, < var> : = u, < var> ) } que o cont role ut iliza
abSet Get
para at ualizar a variável < var > . < var > deve ser t ipo
caract er.
Obj et o, opcional. Janela ou cont r ole onde o cont role será
aoWnd
criado.
anWidt h Num érico, opcional. Lar gura do cont role em pixels.
anHeight Num érico, opcional. Alt ura do cont role em pixels.
Obj et o, opcional. Obj et o t ipo t Font ut ilizado para definir as
aoFont caract eríst icas da font e ut ilizada para exibir o cont eúdo do
cont r ole.
Lógico, opcional. Se .T., habilit a barra de rolagem
alHScroll
horizont al.
anClrFore Num érico, opcional. Cor de fundo do cont role.
anClrBack Num érico, opcional. Cor do t ext o do cont role.
oPar11 Reser vado.
Lógico, opcional. Se .T. as coordenadas inform adas são em
alPixel
pixels, se .F. são em car act eres.
cPar13 Reser vado.
lPar14 Reser vado.
Bloco de código, opcional. Execut ado quando m udança de
foco de ent rada de dados est á sendo efet uada na j anela
abWhen
onde o cont r ole foi criado. O bloco deve r et ornar .T. se o
cont r ole dev e perm anecer habilit ado ou .F. se não.
lPar16 Reser vado.
lPar17 Reser vado.
alReadOnly Lógico, opcional. Se .T. o cont r ole so perm it ira leit ura.
Bloco de código, opcional. Execut ado quando o cont eúdo do
abValid cont r ole dev e ser validado, dev e ret ornar .T. se o cont eúdo
for válido e .F. quando o cont eúdo for inválido.
bPar20 Reser vado.
lPar21 Reser vado.
- 446 -
M é t odos a u x ilia r e s:
Re t or n o:
Nenhum -
En a b le H Scr oll
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 447 -
#include “protheus.ch”
User Function Teste()
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.)
MsgStop(cMemo)
Return NIL
D e scr içã o: Classe de obj et os visuais do t ipo cont role, a qual perm it e a criação
de um bot ão vinculado a um obj et o OLE.
Pr opr ie da d e s:
Con st r u t or : New( [ nRow] , [ nCol] , [ nWidt h] , [ nHeight ] , [ oWnd] , [ lAut oAct ivat e] ,
[ cFileNam e] )
Pa r â m e t r os:
- 448 -
Ope n Fr om File
Re t or n o:
Nenhum -
Ap a r ê n cia :
Ex e m plo:
#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' )
- 449 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role, que perm it e a
visualização de arquivos no form at o ger ado pelo spool de im pressão
do Prot heus.
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Pa ge Siz e
Re t or n o:
Nenhum -
Pr in t Pa g e
Re t or n o:
Nenhum -
- 450 -
Ex e m plo:
#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
- 451 -
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – t Panel, a qual perm it e
criar um painel est át ico, onde podem ser criados out ros cont r oles
com o obj et ivo de organizar ou agrupar com ponent es visuais.
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
- 452 -
#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
botão sobre o painel
@ 200,10 BUTTON oBtn2 PROMPT 'show' OF oDlg ACTION oPanel:Show() // cria
botão fora o painel
ACTIVATE MSDIALOG oDlg CENTERED
Return
TRAD M EN U( )
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – TRadMenu, a qual
perm it e criar um cont role visual no form at o Radio But t on.
Pr opr ie da d e s:
Pa r â m e t r os:
- 453 -
M é t odos a u x ilia r e s:
Se t Opt ion
Re t or n o:
Nenhum -
En a b le I t e m
Re t or n o:
Nenhum -
En a ble
Re t or n o:
Nenhum -
- 454 -
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 455 -
#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. )
- 456 -
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – TSBr ow se, a qual
perm it e criar um cont role visual do t ipo Grid.
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
- 457 -
Nenhum -
Re t or n o:
N il
GoBot t om
Nenhum -
Re t or n o:
N il
Row Cou n t
Nenhum -
Re t or n o:
N il
LEdit Ce ll
Re t or n o:
N il
- 458 -
- 459 -
#include 'protheus.ch'
User Function Teste()
Local oDlg
DEFINE MSDIALOG oDlg FROM 0,0 TO 302,402 PIXEL TITLE 'Exemplo'
// 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.)
- 460 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Say, a qual exibe o
cont eúdo de t ext o est át ico sobr e um a j anela ou cont role
previam ent e definidos.
Pr opr ie da d e s:
Pa r â m e t r os:
- 461 -
Ex e m plo:
#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
- 462 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Scrollbox, a qual
perm it e criar um painel com scroll deslizant es nas lat erais
( horizont ais e v ert icais) do cont r ole.
Pr opr ie da d e s:
Pa r â m e t r os:
Ap a r ê n cia :
- 463 -
#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
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Sim pleEdit or, a qual
perm it e criar um cont r ole visual para edição de t ext os com recursos
sim ples, com o o Not ePad®
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
Cr e a t e
- 464 -
Loa d
Re t or n o:
Nenhum -
Te x t Bold
Re t or n o:
Nenhum -
Te x t Un d e r lin e
Re t or n o:
Nenhum -
Te x t I t a lic
Re t or n o:
Nenhum -
- 465 -
Re t or n o:
Nenhum -
Te x t Siz e
Re t or n o:
Nenhum -
Te x t St yle
1 – Norm al
2 – Disco ( Bullet )
anSt yle
3 – Circulo ( Bullet )
4 – Quadrado ( Bullet )
5 – Ordem decim al
6 – Ordem alfanum érica m inúsculo
7 – Ordem alfanum érica m aiúsculo
Re t or n o:
Nenhum -
- 466 -
Re t or n o:
N e n hu m -
Te x t For m a t
Re t or n o:
Nenhum -
Re t Te x t
Re t or n o:
Nenhum -
Re t Te x t Se l
Nenhum -
Re t or n o:
St r in g Text o selecionado.
- 467 -
Nenhum -
Re t or n o:
1 – Lógico Negrit o
2 – Lógico I t álico
Ar r a y
3 – Lógico Sublinhado
4 – Caract er RGB da cor
5 – Caract er Tam anho da font e
6 – Caract er Font e
Ap a r ê n cia :
- 468 -
#include “protheus.ch”
TSLI D ER( )
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – t Slider, a qual perm it e
criar um cont r ole visual do t ipo bot ão deslizant e.
Pr opr ie da d e s:
Pa r â m e t r os:
M é t odos a u x ilia r e s:
- 469 -
Re t or n o:
se t Ra ng e
Re t or n o:
Nenhum -
se t M a r k s
Re t or n o:
Nenhum -
- 470 -
Re t or n o:
Nenhum -
se t V a lu e
Re t or n o:
Nenhum -
se t St e p
Re t or n o:
Nenhum -
se t Or ie n t
D e scr içã o: Especifica a orient ação do bot ão, horizont al ou vert ical.
Sin t a x e : set Orient ( nOr ient )
Pa r â m e t r os:
Re t or n o:
Nenhum -
- 471 -
Ex e m plo:
#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 método 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
TSPLI TTER( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Split t er, a qual perm it e
criar um cont r ole visual do t ipo divisor.
Pr opr ie da d e s:
Pa r â m e t r os:
- 472 -
Cr e a t e
Re t or n o:
se t Or ie n t
Re t or n o:
Nenhum -
se t Ch ildColla p se
Re t or n o:
Nenhum -
- 473 -
Re t or n o:
Nenhum -
m ovToLa st
Re t or n o:
Nenhum -
m ovToFir st
Re t or n o:
Nenhum -
se t Op a qu e Re siz e
Re t or n o:
Nenhum -
- 474 -
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 475 -
#include “protheus.ch”
#include “hbutton.ch”
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE “Meu tSplitter”
// Usando o command
@ 1, 1 SPLITTER oSplitter SIZE 100, 100 OF oDlg
@ 1, 1 MSPANEL oPanel1 OF oSplitter
@ 1, 2 MSPANEL oPanel2 OF oSplitter
@ 1, 3 MSPANEL oPanel3 OF oSplitter
Return Nil
TTABS( )
D e scr içã o: Classe de obj et os visuais do t ipo cont r ole – TTabs, a qual perm it e
criar um cont r ole visual do t ipo past a.
Pr opr ie da d e s:
Con st r u t or : New( [ anTop] , [ anLeft ] , [ aPr om pt s] , [ bAct ion] , [ oWnd] , [ nOpt ion] ,
[ nClrFore] , [ nClrBack] , [ lPixel] , [ lDesign] , [ nWidt h] , [ nHeigt h] ,
[ cMsg] )
Pa r â m e t r os:
- 476 -
M é t odos a u x ilia r e s:
Add I t e m
Re t or n o:
N e n hu m -
Se t Opt ion
Re t or n o:
Nenhum -
Ap a r ê n cia :
- 477 -
#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. )
TTOOLBOX( )
D e scr içã o: Classe de obj et os visuais do t ipo cont role – t Toolbox, a qual perm it e
criar um cont r ole visual para agrupar difer ent es obj et os.
Pr opr ie da d e s:
Pa r â m e t r os:
- 478 -
Cr e a t e
Re t or n o:
a dd Gr ou p
Re t or n o:
Nenhum -
r e m ov e Gr ou p
Re t or n o:
Nenhum -
se t Cu r r e n t Gr ou p
aoObj Obj et o. Obj et o Pai que será definido com o grupo cor r ent e.
Re t or n o:
Nenhum -
- 479 -
Ex e m plo:
#include “protheus.ch”
DEFINE MSDIALOG oDlg FROM 0,0 TO 500,600 PIXEL TITLE “Meu Toolbox”
// Usando o command
@ 200,100 TOOLBOX oTb SIZE 100,30 OF oDlg
Return Nil
- 480 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – TWBrow se, a qual
perm it e criar um cont role visual do t ipo Grid.
Pr opr ie da d e s:
Pa r â m e t r os:
- 481 -
M é t odos a u x ilia r e s:
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
GoTop
Nenhum -
Re t or n o:
N il
GoBot t om
Nenhum -
Re t or n o:
- 482 -
Row Cou n t
Nenhum -
Re t or n o:
N il
LEdit Ce ll
Re t or n o:
N il
Ap a r ê n cia :
- 483 -
#include 'protheus.ch'
User Function Teste()
Local oDlg
Local oOK := LoadBitmap(GetResources(),'br_verde')
Local oNO := LoadBitmap(GetResources(),'br_vermelho')
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.)
- 484 -
D e scr içã o: Classe de obj et os visuais do t ipo cont role – VCBr ow se, a qual
perm it e criar um cont role visual do t ipo Grid.
Pr opr ie da d e s:
Pa r â m e t r os:
- 485 -
M é t odos a u x ilia r e s:
GoUp
Nenhum -
Re t or n o:
N il
GoD ow n
Nenhum -
Re t or n o:
N il
GoTop
Nenhum -
Re t or n o:
N il
- 486 -
Nenhum -
Re t or n o:
N il
Row Cou n t
Nenhum -
Re t or n o:
N il
LEdit Ce ll
Re t or n o:
N il
- 487 -
- 488 -
#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: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.)
- 489 -
Os com ponent es da int er face visual da linguagem ADVPL ut ilizados nest e t r einam ent o est ão
docum ent ados na seção Guia de Referência, ao final dest e m at erial.
Para visualizar a docum ent ação com plet a de t odos os com ponent es m encionados nest e
capít ulo deve ser acesso o sit e DEM – Docum ent ação Elet r ônica Microsiga
( dem .m icrosiga.com .br) confor m e abaixo:
- 490 -
As cor es dest e padrão são definidas pela seguint e fór m ula, a qual dev e ser avaliada t endo
com o base a palet a de cor es no form at o RGB:
n Cor := n Ve r m e lh o + ( n V e r d e * 2 5 6 ) + ( n Az u l * 6 5 5 3 6 )
Com base nest a palet a, podem os definir os valores das seguint es cores básicas:
Cor R G B Va lor
Pret o 0 0 0 0
Azul 0 0 255 16711680
Verde 0 255 0 65280
Ciano 0 255 255 16776960
Verm elho 255 0 0 255
Rosa 255 0 255 16711935
Am arelo 255 255 0 65535
Branco 255 255 255 16777215
- 491 -
M SD I ALOG( )
TSAY( )
Fu n çã o RGB( )
A linguagem ADVPL possui a função RGB( ) a qual ret orna o valor da cor a ser definido, de
acordo com a param et rização de cada um dos elem ent os da palet a RGB.
RGB( n Re d, n Gr e e n , n Blu e )
- 492 -
A linguagem ADVPL possui int erfaces visuais pré- definidas que auxiliam no desenv olvim ent o
de aplicações m ais com plet as, com binando est as int erfaces com os com ponent es visuais
dem onst rados ant erior m ent e.
Didat icam ent e as int erfaces visuais pré- definidas da linguagem ADVPL podem ser divididas em
t rês grupos:
Em ADVPL, as t elas de capt ura de inform ações com post as por m últ iplos cam pos digit áveis
acom panhados de seus r espect ivos t ext os explicat ivos são com um ent e cham ados de
Enchoices.
Um Enchoice pode ser facilm ent e ent endida com o diversos conj unt os de obj et os TSay e TGet
alinhados de form a a visualizar ou capt urar inform ações, nor m alm ent e vinculadas a arquivos
de cadast r os ou m ovim ent ações sim ples.
- 493 -
Fu n çã o En ch oice : Sint axe t radicionalm ent e ut ilizada em ADVPL, a qual não ret orna
um obj et o para a aplicação cham adora;
Cla sse M sM Ge t : Classe do obj et o Enchoice, a qual perm it e a inst anciação diret a de um
obj et o, t ornando- o disponível na aplicação cham adora.
3 7 .1 .1 . Enchoice ( )
Re t or n o: N il
Pa r â m e t r os:
- 494 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWENCH | Autor | ARNALDO RAYMUNDO JR.|Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização da função Enchoice() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
Local aCpoEnch := {}
Local aAlter := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
- 495 -
aAlterEnch := aClone(aCpoEnch)
Return
3 7 .1 .2 . M sM Ge t ( )
Re t or n o: oM sM Ge t obj e t o d o t ipo M sM Ge t ( )
Pa r â m e t r os:
- 496 -
Ex e m plo: Ut iliz a çã o d o ob j e t o M sM Ge t ( )
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWMSGET | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MsMget() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
- 497 -
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
oDlg := MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
oDlg:lCentered := .T.
oDlg:Activate()
Return
A linguagem ADVPL perm it e a ut ilização de basicam ent e dois t ipos de obj et os do t ipo grid, ou
com o t am bém são conhecidos: m ult i- line:
Gr ids d igit á v e is: per m it em a visualização e capt ura de inform ações, com um ent e
ut ilizados em int erfaces de cadast r o e m anut enção, t ais com o:
M SGETD B( )
M SGETD AD OS( )
M SN EW GETD AD OS( )
Gr ids n ã o dig it á v e is: perm it em som ent e a visualização de inform ações, com um ent e
ut ilizados com o brow ses do ERP Pr ot heus, t ais com o:
TW BROW SE( )
M AW N D BROW SE( )
M BROW SE( )
Nest e t ópico serão t rat adas as grids digit áveis disponíveis na linguagem ADVPL para o
desenvolvim ent o de int er faces de cadast r os e m anut enção de inform ações.
- 498 -
A classe de obj et os visuais MsGet DB( ) perm it e a criação de um grid digit ável com um a ou m ais
colunas, baseado em um a t abela t em porária.
Pa r â m e t r os:
- 499 -
Va r iá ve is p r iv a t e :
11- Pesquisar
12- Visualizar
13- I ncluir
14- Alt erar
15- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 500 -
Fu nçõe s de va lida çã o:
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Função | GETDBSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MsGetDB() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDB
Local nUsado := 0
Local aStruct := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 501 -
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg:lCentered := .T.
oDlg:Activate()
DbSelectArea(cCriaTrab)
DbCloseArea()
Return
- 502 -
A classe de obj et os visuais MsGet Dados( ) per m it e a criação de um grid digit ável com um a ou
m ais colunas, baseado em um array.
Pa r â m e t r os:
- 503 -
Va r iá ve is p r iv a t e :
16- Pesquisar
17- Visualizar
18- I ncluir
19- Alt erar
20- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 504 -
Fu n çõe s de va lida çã o:
#include “protheus.ch”
/*/
+-----------------------------------------------------------------------------
| Função | GETDADOSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto MSGETADOS() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 505 -
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg:lCentered := .T.
oDlg:Activate()
Return
- 506 -
A classe de obj et os visuais MsNewGet Dados( ) perm it e a criação de um grid digit ável com um a
ou m ais colunas, baseado em um array .
Pa r â m e t r os:
- 507 -
Va r iá ve is p r iv a t e :
6- Pesquisar
7- Visualizar
8- I ncluir
9- Alt erar
10- Excluir
{ cTit ulo, cCam po, cPict ure, nTam anho, nDecim ais,;
cValidação, cReservado, cTipo, xReservado1, x Reser vado2}
- 508 -
Fu n çõe s de va lida çã o:
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MBRWGETD | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização dos objetos |
| | MsNewGetDados() e MsMGet() combinados |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
- 509 -
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
- 510 -
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
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/,/*cTexto*/,;
aCpoEnch,aPos,aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
/*cTudoOk*/, oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,;
lProperty)
- 511 -
Conform e vist o no t ópico sobr e definição das propriedades de cor es para os com ponent es
visuais, cada obj et o possui caract eríst icas que dev em ser respeit adas para corr et a ut ilização
dest e r ecurso.
lUse D e fa u lt Color s At ribut o que dev erá ser definido com o .F. par a que as
alt erações nas cor es sej am perm it idas.
Se t Blk Ba ck Color Mét odo que define a cor que será ut ilizada para cada linha do
grid. Não é necessário ut ilizar o m ét odo Refr esh( ) após a
definição da cor por est e m ét odo.
Ap a r ê n cia :
- 512 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | MRBWGTCL | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização dos objetos |
| | MsNewGetDados() e MsMGet() combinados e tratamento de cores |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
Local aPos := {000,000,080,400}
Local nModelo := 3
Local lF3 := .F.
Local lMemoria := .T.
Local lColumn := .F.
Local caTela := ""
Local lNoFolder := .F.
Local lProperty := .F.
Local aCpoGDa := {}
Local cAliasGD := "SC6"
Local nSuperior := 081
Local nEsquerda := 000
Local nInferior := 250
Local nDireita := 400
Local cLinOk := "AllwaysTrue"
Local cTudoOk := "AllwaysTrue"
Local cIniCpos := "C6_ITEM"
Local nFreeze := 000
Local nMax := 999
- 513 -
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
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
- 514 -
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
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oGetD:oBrowse:lUseDefaultColors := .F.
oGetD:oBrowse:SetBlkBackColor({|| GETDCLR(oGetD:aCols,oGetD:nAt,aHeader)})
Return
- 515 -
Return nRet
- 516 -
A linguagem ADVPL perm it e a im plem ent ação de bar ras de bot ões ut ilizando funções pré-
definidas desenvolvidas com o obj et ivo de facilit ar sua ut ilização, ou at rav és da ut ilização
diret a dos com ponent es visuais disponíveis. Dent re os r ecur sos da linguagem que podem ser
ut ilizados com est a finalidade serão abordados:
Cla sse TBa r : Classe do obj et o TBar( ) , a qual perm it e a inst anciação diret a de um
obj et o do t ipo bar ra de bot ões superior, t ornando- o disponível na aplicação cham adora.
Cla sse Bu t t on Ba r : Classe do obj et o But t onBar( ) , a qual perm it e a inst anciação diret a
de um obj et o bar ra de bot ões genérico, o qual pode ser ut ilizado em qualquer posição
da t ela, t ornando- o disponível na aplicação cham adora.
3 7 .3 .1 . Enchoice Ba r ( )
Função que cria um a barra de bot ões no form at o padrão ut ilizado pelas int erfaces de cadast r o
da aplicação Prot heus.
Est a bar ra possui os bot ões padrões para confirm ar ou cancelar a int erface e ainda perm it e a
adição de bot ões adicionais com a ut ilização do parâm et r o a Bu t t on s.
Sin t a x e :
Pa r â m e t r os:
Ap a r ê n cia :
- 517 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Função | DENCHBAR | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização da função |
| | EnchoiceBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600 PIXEL OF;
oMainWnd
Return
- 518 -
Classe de obj et os visuais que perm it e a im plem ent ação de um com ponent e do t ipo barr a de
bot ões para a part e superior de um a j anela previam ent e definida.
Pa r â m e t r os:
Ap a r ê n cia :
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------------
| Função | TSTBAR | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto TBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 519 -
oDlg:lCentered := .T.
oDlg:Activate()
Return
3 7 .3 .3 . But t onBa r
A sint axe Bu t t on Ba r é a form a clássica ut ilizada na linguagem ADVPL para im plem ent ar um
obj et o da classe TBar( ) , o qual possui as caract eríst icas m encionadas no t ópico ant erior .
Sin t a x e :
Re t or n o: ( ) .
Pa r â m e t r os:
- 520 -
Sin t a x e a d icion a l:
Pa r â m e t r os:
Ap a r ê n cia :
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------
| Função | TstBBar | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------
| Descrição | Programa que demonstra a utilização do objeto TBar() |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local oDlg
Local oBtn1
Local oBtn2
- 521 -
oBtn1:cTitle:="Calc"
DEFINE BUTTON RESOURCE "S4WB009N" OF oBar ACTION Agenda() TOOLTIP "Agenda"
DEFINE BUTTON RESOURCE "S4WB010N" OF oBar ACTION OurSpool() TOOLTIP "Spool"
DEFINE BUTTON RESOURCE "S4WB016N" OF oBar GROUP;
ACTION HelProg() TOOLTIP "Ajuda"
oBtn2:cTitle:="Param."
Return
- 522 -
Conform e m encionado nos t ópicos ant eriores, os bot ões visuais do t ipo bar ra de bot ões
perm it em a definição de it ens com ações e im agens vinculadas.
Dent r e os obj et os e funções m encionados, foi cit ada a EnchoiceBar( ) , a qual perm it e a adição
de bot ões adicionais at ravés do parâm et r o a Bu t t on, sendo que os it ens dest e ar ray dev em
possuir o seguint e form at o:
Est r u t u r a :
D ESTI N OS D I SCAGEM
ED I T ED I TABLE
EXCLUI R FORM
GRAF2 D GRAF3 D
LI N E N OTE
OBJETI VO OK
PEN D EN TE PRECO
PROD UTO S4 SB0 1 4 N
S4 W B0 0 1 N S4 W B0 0 5 N
S4 W B0 0 6 N S4 W B0 0 7 N
S4 W B0 0 8 N S4 W B0 0 9 N
S4 W B0 1 0 N S4 W B0 1 1 N
S4 W B0 1 3 N S4 W B0 1 4 A
S4 W B0 1 6 N SI M ULACA
VEN D ED OR USER
Ex e m plo:
AADD(aButtons,{"USER",{||AllwaysTrue()},"Usuário"})
- 523 -
3 8 .1 . M a W ndBr ow se ( )
D e scr içã o: Br owse que perm it e a visualização de r egist ros para arquivos / t abelas que
não possuem est rut ura definida no Dicionário de Dados do sist em a.
Sin t a x e : MaWndBr ow se ( nLin1, nCol1, nLin2, nCol2, cTit le, cAlias, aCam pos, aRot ina,
cFunLeg, cTopFun, cBot Fun, lCent ered, aResource, nMod, aPesqui, cSeek ,
lDic, lSavOrd)
Pa r â m e t r os:
Est r u t u r a d o a r r a y a Ca m pos
- 524 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------
| Função | WndBrwTRB | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Demonstra a utilização da MaWndBrowse com Temporário |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
- 525 -
aAdd(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
aAdd(aRotina,{"Visualizar","U_TVisual",0,2})
aAdd(aRotina,{"Incluir" ,"U_TInclui",0,3})
aAdd(aRotina,{"Alterar" ,"U_TAltera",0,4})
aAdd(aRotina,{"Excluir" ,"U_TExclui",0,5})
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Crio arq. de trab. p/ gravar as inconsistencias. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
cArqTrb := CriaTrab(aStruTRB,.t.)
dbUseArea(.T.,,cArqTrb,"TRB",.T.,.F.)
cChave := "TRB_FILIAL+TRB_ID"
IndRegua("TRB",cArqTrb,cChave,,,"Selecionando Registros...")
- 526 -
Return
Com foco nest a necessidade, foi desenvolvida para o curso de ADVPL a função
TEnchoice.
D e scr içã o: Função par a m anipulação de r egist ros de um arquivo t em porário sim ular a
Enchoice do am bient e Prot heus.
Sin t a x e : TEnchoice( oDlg, aCam pos, nLeft E, nTopE, nHeight E, nWidt hE, lEnchBar)
Pa r â m e t r os:
Pr é - r e qu isit os d a f u n çã o ch a m a dor a :
Para cor r et a ut ilização da função TEnchoice são necessários os seguint es t rat am ent os /
definições na função cham adora:
Tr a t a m e n t o 0 1 : M on t a ge m do a r r a y a Ca m pos
O ar ray aCam pos ut ilizado pela TEnchoice possui basicam ent e o m esm o form at o do
array ut ilizado pela função Modelo2( ) .
" < V a r ia v e l> " Nom e da variável Privat e que est á vinculada ao cam po
digit ável.
{ n Lin h a ,n Colu n a } Posição em pixels do cam po na Enchoice.
" < Tit u lo> " Tít ulo do cam po.
" < Pict u r e > " Pict ure de form at ação do cam po.
" < V a lida ca o> " Validação do cam po digit ável.
" < F3 > " Consult a F3 vinculada ao cam po.
- 527 -
Os parâm et ros de dim ensão da TEnchoice não precisam se inform ados, pois ela irá se
aj ust ar ao t am anho do obj et o Dialog ao qual for vinculado, caso o obj et ivo sej a que a
TEnchoice ocupe t oda a área disponível do obj et o.
Ap a r ê n cia :
D e t a lh a m e n t o da fu n çã o TEn choice :
- 528 -
Local aSays := {}
Local aGets := {}
Local cCaption := ""
Local cPict := ""
Local cValid := ""
Local cF3 := ""
Local cWhen := ""
Local cBlKSay := ""
Local cBlkGet := ""
Local cBlKVld := ""
Local cBlKWhen := ""
Local nLeft := 0
Local nTop := 0
Local nI := 0
If Len(aCampos) > 0
If Len(aCampos[nI])==8
cCampo := aCampos[nI,1]
nLeft := aCampos[nI,2,1]-13
nTop := aCampos[nI,2,2]
cCaption:= Iif(Empty(aCampos[nI,3]), " " ,aCampos[nI,3])
cPict := Iif(Empty(aCampos[nI,4]), Nil ,aCampos[nI,4])
cValid := Iif(Empty(aCampos[nI,5]), ".t." ,aCampos[nI,5])
cF3 := Iif(Empty(aCampos[nI,6]), NIL ,aCampos[nI,6])
cWhen := Iif(Empty(aCampos[nI,7]), ".T." ,aCampos[nI,7])
- 529 -
AADD(aSays,Array(1))
aSays[nI] := TSay():New(nLeft+1, nTop, &(cBlkSay), oScroll,,,;
.F., .F., .F., .T.,,, 50, 8, .F., .F., .F., .F.,;
.F. )
AADD(aGets,Array(1))
EndIf
Next
Endif
Return
- 530 -
/*/
+-----------------------------------------------------------------------
| Função | TVisual | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk := {||oDlg:End()}
LOCAL bCancel := {||oDlg:End()}
LOCAL 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.)
RETURN
- 531 -
/*/
+-----------------------------------------------------------------------
| Função | TInclui | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL aArea := GetArea()
LOCAL 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()",;
"",".T.",aCampos[nX][4]})
SetPrvt("_"+aCampos[nX][1])
Do Case
Case aCampos[nX][5] == "C"
&("_"+aCampos[nX][1]) := Space(aCampos[nX][4])
Case aCampos[nX][5] == "N"
&("_"+aCampos[nX][1]) := 0
Case aCampos[nX][5] == "D"
&("_"+aCampos[nX][1]) := CTOD("")
Case aCampos[nX][5] == "L"
&("_"+aCampos[nX][1]) := .F.
Case aCampos[nX][5] == "M"
&("_"+aCampos[nX][1]) := Space(aCampos[nX][4])
EndCase
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
- 532 -
RETURN
/*/
+-----------------------------------------------------------------------
| Função | TAltera | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL aArea := GetArea()
LOCAL 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()",;
"",aCampos[nX][6],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.)
- 533 -
RETURN
/*/
+-----------------------------------------------------------------------
| Função | TExclui | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL 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.)
- 534 -
RETURN
/*/
+-----------------------------------------------------------------------
| Função | TValid | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
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
- 535 -
/*/
+-----------------------------------------------------------------------
| Função | TGravar | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
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
- 536 -
D e scr içã o: Classe Adv pl que perm it e a criação de um obj et o visual do t ipo Tree.
Pr opr ie da d e s:
Ap a r ê n cia :
- 537 -
Pa r â m e t r os:
Re t or n o:
Obj e t o Ret orna um a nov a inst ância do Obj et o da Classe DbTr ee.
M é t odo: AddTr e e ( )
Pa r â m e t r os:
- 538 -
Re t or n o:
Nenhum -
M é t odo: AddTr e e I t e m ( )
Sin t a x e : oObj : AddTr eeI t em ( < cLabel> , [ cResource] , [ cBit Map] , [ cCargo] )
Pa r â m e t r os:
Re t or n o:
Nenhum -
M é t odo: En dTr e e ( )
Pa r â m e t r os:
Nenhum
Re t or n o:
Nenhum
- 539 -
#include "Protheus.ch"
/*/
+-----------------------------------------------------------------------
| Função | TDBTree | Autor | MICROSIGA | Data | |
+-----------------------------------------------------------------------
| Descrição | Exemplo de utilização da função DbTree |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
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 Mãe",.T.,cBmp1,cBmp1,,,"2.0")
oDBTree:AddTreeItem("Processador",cBmp2,,"2.1")
oDBTree:AddTreeItem("Memória" ,cBmp2,,"2.2")
oDBTree:AddTreeItem("Vídeo",cBmp2,,"2.3")
oDBTree:AddTreeItem("Fonte",cBmp2,,"2.4")
oDBTree:EndTree()
oDBTree:EndTree()
Return
- 540 -
If cCargo == "1.1"
MsgInfo("Gabinete Torre com 4 baias - Preto, com unidade de leitura e”+;
“gravação de CD/DVD",cCadastro)
Elseif cCargo == "1.2"
MsgInfo("Monitor LCD 17' - LG",cCadastro)
Elseif cCargo == "1.3"
MsgInfo("Teclado multimídia com funções de internet e e-mail",cCadastro)
Elseif cCargo == "1.4"
MsgInfo("Mouse Optico sem fio",cCadastro)
Elseif cCargo == "1.5"
MsgInfo("2 Caixas de Som - 50W RMS Cada",cCadastro)
Elseif cCargo == "2.1"
MsgInfo("Processador Pentium 4 - 3.8 Ghz",cCadastro)
Elseif cCargo == "2.2"
MsgInfo("1 Pente de Memória de 1Gb - DDR 500",cCadastro)
Elseif cCargo == "2.3"
MsgInfo("Placa de Vídeo GeoForce 5000 com 256Mb",cCadastro)
Elseif cCargo == "2.4"
MsgInfo("Fonte de Alimentação de 500W",cCadastro)
Endif
Return
- 541 -
D e scr içã o: A classe MsSelect cria um obj et o brow se ( ou grid) , com a prim eira coluna
sendo do t ipo m arcação.
Pr opr ie da d e s:
Ap a r ê n cia :
- 542 -
Sin t a x e : MsSelect ( ) : NEW ( < cAlias > , [ cCam po ] , [ cCpo ] , [ aCam pos ] , [
lI nv ] , [ cMar ] , [ aCord ] , [ cTopFun ] , [ cBot Fun ] , [ oWnd ] , [
reserv ed ] , [ aColors ] )
Pa r â m e t r os:
- 543 -
Re t or n o:
Ex e m plo:
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)}
- 544 -
3 9 .1 . TRe por t ( )
3 9 .1 .1 . I nt r oduçã o
Fin a lid a de
O Pr ot heus ofer ece o r ecur so per sonalização para alguns relat órios de cadast r os e
m ovim ent ações do sist em a. Ele t em com o pr incipais funcionalidades a definição de cores,
est ilos, t am anho, font es, quebras, m áscara das células para cada seção, criação de fórm ulas e
funções ( Som a, Média, et c.) , possibilidade de salvar as configurações por usuário e criação de
gráficos.
Com a funcionalidade de Relat órios Per sonalizáveis, o usuário pode m odificar os r elat órios
padrões, criando seu pr óprio layout .
Vale lem brar que nem t odos os r elat órios são per sonalizáveis. Por ex em plo, relat órios que
t enham layout pré- definidos por lei e form ulários ( bolet os, not as- fiscais, et c) não poderão ser
alt erados.
Os relat órios per sonalizados são gravados com ext ensão .PRT, diferenciando- se dos r elat órios
padrões que recebem a ext ensão .# # R.
- 545 -
O TReport é um a classe de im pressão que subst it ui as funções Set Print , Set Default ,
Rpt St at us e Cabec.
A classe TReport perm it e que o usuário personalize as inform ações que serão apresent adas no
relat ório, alt erando font e ( t ipo, t am anho, et c) , cor, t ipo de linhas, cabeçalho, rodapé, et c.
Pr é - Re qu isit os
Para ut ilizar o TReport , verifique se o seu r eposit ório est á com o Release 4 do Pr ot heus- 8, ou
versão superior .
A função TRepI nUse( ) verifica se a lib do TReport est á liberada no reposit ório em uso. O
ret orno é um a variável lógica.
#include "protheus.ch"
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
- 546 -
Cada com ponent e da t ela de im pressão do TReport , deve ser configurado no program a, par a
que o usuário t enha acesso às personalizações:
3 9 .1 .2 .1 . Pa r â m e t r os d e im pr e ssã o
A caixa de list agem apr esent ada deve ser ut ilizada conform e o m eio de saída do r elat ório. Vej a
a seguir.
I m pr e ssã o
Ar q u iv o
O r elat ório será gravado em disco com o nom e apr esent ado. Caso sej a escolhida a opção
" Ser vidor" ele será gr avado no diret ório det erm inado na senha do usuário, at rav és do
configurador , sendo est e sem pre no ser vidor ( padrão \ SPOOL\ ) . Na escolha da opção " Local"
será abert a um a j anela para que sej a escolhido o local onde o relat ório será gravado na
m áquina do usuário.
O r elat ório gerado a part ir dest a opção pode ser im presso ou enviado por e- m ail após ser
apresent ado na t ela.
- 547 -
Direciona o r elat ório para im pressão via configuração do Windows® das im pressoras
inst aladas.
E- m a il
Envia o r elat ório por e- m ail ( I nt ernet ) . Para ist o, dev em ser configurados os seguint es
parâm et ros no Am bient e Configurador:
M V_ RELACN T
Define a cont a de e- m ail para ident ificar a prov eniência dos r elat órios.
Ex em plo: relprot heus@m icrosiga.com .br
M V_ RELPSW
Define a senha da cont a de e- m ail para envio dos r elat órios.
M V_ RELSERV
Define o servidor da cont a de e- m ail para o envio do relat ório.
Ex em plo: sm t p.m icrosiga.com .br
Quando selecionada est a opção, dev e- se infor m ar, no cam po em dest aque na figura abaixo, o
e- m ail para o qual o relat ório deve ser r em et ido.
- 548 -
Pr ogr a m a çã o Te lN e t
TelNet é part e da gam a de pr ot ocolos TCP/ I P que perm it e a conexão a um com put ador rem ot o
at ravés de um a aplicação client e dest e pr ot ocolo. O PROTHEUS Ser ver pode em ular um
t erm inal TelNet , at ravés da execução de r ot inas escrit as em ADVPL. Ou sej a, pode- se escrever
rot inas ADVPL cuj a int erface final será um t erm inal TelNet ou um colet or de dados m óv el.
Pa pe l
Ta m a n h o do p a pe l
Selecione o for m at o de im pressão, clicando nos bot ões de opção “ Ret rat o” ou “ Paisagem ” ,
fazendo assim que o r elat ório sej a im presso na orient ação vert ical ou horizont al,
respect ivam ent e.
Tít u lo
Caso queira alt erar a opção sugerida pelo sist em a, digit e o cabeçalho do r elat ório.
Or de m
Escolha a ordem em que as inform ações serão apresent adas no relat ório, clicando em um a das
chaves disponíveis.
La you t
Per m it e selecionar o m odelo de relat ório para im pressão, à m edida que novos leiaut es forem
gravados para um relat ório, seus nom es serão list ados nessa caixa.
Pr e vie w
Faz a exibição do relat ório ger ado na t ela, possibilit ando, na seqüência, o seu envio para
im pressora ou a cancelam ent o da im pr essão.
- 549 -
Essa opção perm it e que o relat ório sej a gerado e enviado para a fila de im pressão, enquant o o
usuário pode execut ar out ras t ar efas no sist em a.
3 9 .1 .3 . Pe r sona liz a çã o
É possível configurar- se as colunas do lay- out do relat ório, bem com o os acum uladores,
cabeçalhos e linhas.
Est ão disponíveis para per sonalização t am bém a font e, t am anho, cor es, e et c.
3 9 .1 .3 .1 . Edit a n do o la you t do r e la t ór io
O prim eiro passo é ent ender a nova est rut ura dos r elat órios desenv olvidos com a fer ram ent a
TReport .
O Relat ório possui Seções e Células. É cham ada de Seção, cada um dos grupos de
inform ações, e de Célula, cada um dos cam pos que serão im pressos.
- 550 -
O r elat ório m ais sim ples que se consegue em it ir em TReport , é um a list agem .
A função Report Def( ) é responsáv el pela const rução do lay- out do relat ório ( oReport ) . É ela
quem define as colunas, os cam pos e as inform ações que serão im pressas.
Os com andos que fará essa const rução são:
1. DEFI NE REPORT
2. DEFI NE SECTI ON
3. DEFI NE CELL
- 551 -
A função DEFI NE REPORT é r esponsáv el pela criação do obj et o Report , ou sej a, o r elat ório.
I nt ernam ent e, o DEFI NE REPORT irá execut ar o m ét odo TReport ( ) : New( ) .
Est rut ura do com ponent e TReport :
D EFI N E SECTI ON
Ainda no Report Def( ) , são definidas as seções ( oSect ion) do r elat ório.
As seções do r elat ório r epr esent am os difer ent es grupos de inform ações exibidos.
Há a seção principal e as específicas.
I nt ernam ent e, o DEFI NE SECTI ON irá ex ecut ar o m ét odo TRSect ion( ) : New( ) .
A classe TRSect ion pode ser ent endida com o um layout do relat ório, por cont er células,
quebras e t ot alizadores que darão um form at o para sua im pressão.
Com a classe TRSect ion é possível definir um a query , filt ro ou índice com filt ro ( I ndRegua) que
será ut ilizada por ela para pr ocessam ent o do r elat ório, at ravés do m ét odo Print e ut ilizando as
células de posicionam ent o ( TRPosit ion) .
D EFI N E CELL
Para cada seção, dev em ser definidas as células. Célula é cada inform ação que deverá ser
im pressa. Pode ser um cam po do cadast r o, ou um result ado de um a operação. É um a Célula
de im pressão de um a seção ( TRSect ion) de um r elat ório que ut iliza a classe TReport
I nt ernam ent e, o DEFI NE CELL irá execut ar o m ét odo TRCell( ) : New ( ) .
- 552 -
O TOTVSDBAccess é um a ferram ent a de conect ividade a bases de dados, perm it indo que
aplicat ivos acessem um a am pla variedade de ser vidores de banco de dados sem a necessidade
de geração de códigos específicos para cada um a delas.
- 553 -
Após enviar ao Banco de Dados um a solicit ação de abert ura de Quer y , em caso de sucesso na
operação, o TOPConnect obt ém do Banco de Dados a quant idade de colunas que serão
ret ornadas, e qual é o t am anho e t ipo e especificações de cada um a das colunas, para r et ornar
ao Pr ot heus um a est rut ura definida de inform ações, e o cursor aber t o é lido conform e são
solicit ados os pr óxim os r egist ros ( DBSkip( ) no Advpl ) , e a cada requisição, um a linha do
cursor é r et ornada, at é não hav er m ais linhas no cursor , at ingindo o final do arquivo no Advpl (
EOF( ) ) .
Quando especificam os um a coluna de ret orno na Query , que cor responde a inform ações lidas
diret am ent e de um a ou m ais coluna( s) da t abela, cada coluna ret ornada pela Query cont ém
um a definição de t ipo e t am anho corr espondent e ao cam po de origem do dado de r et orno.
Dest e m odo, se considerarm os, por exem plo, a Query : SELECT A1_FI LI AL FROM SA1990 ,
onde o cam po A1_FI LI AL na t abela SA1990 é um cam po do t ipo varchar , com 2 byt es de
t am anho, quando o cur sor for abert o no Banco de Dados, o TOPConnect irá obt er do banco
que o r esult - set gerado possui apenas um a coluna, e est a coluna é do t ipo varchar , com no
m áxim o 2 byt es de t am anho.
Os Bancos de Dados não apenas perm it em r ecuperar ret ornos diret am ent e lidos de um a ou
m ais t abelas, m as t am bém é possível abrir um cursor onde um a ou m ais colunas cont enham
um result ado calculado, ut ilizando- se de expressões e/ ou funções nat ivas do Banco de Dados.
Para est es t ipos de ret orno, cada banco de dados pode apresent ar com port am ent os
diferenciados ao descr ever o t am anho de ret or no da( s) coluna( s) .
Est e com port am ent o pode variar de acordo com o Banco de Dados, a expr essão e/ ou funções
ut ilizadas para ger ar a coluna de r et orno, e inclusive podem t er difer enças ent r e versões e
Build’s do m esm o Banco de Dados e/ ou param et rizações específicas do Banco de Dados e/ ou
da aplicação Client / ODBC / API ut ilizada para acesso ao Banco.
Para ilust rar m elhor est as diferenças, v ej am os abaixo os result ados obt idos com queries, em
bancos dist int os, onde foi criada um a t abela com a m esm a est rut ura, e 10 linhas de dados, e
nela foram ex ecut adas algum as querys, onde t em os com o r et orno um a coluna calculada. A
t abela possui os cam pos CPOC, t ipo Caract er e, t am anho 10 byt es, num erados de 0000000001
a 0000000010 e um cam po num érico CPON, alim ent ado com valor es posit ivos. Para cada
Query, m ost ram os o valor r et ornado ao Advpl, cont endo o t ipo de dado ret ornado e o t am anho
( len) da coluna, no form at o . ( Tipo ( t am anho ) ) .
Ba n cos:
D a t a ba se Tipo Ta m a n h o Con t e ú do
M SSQL 2 0 0 0 Caract er 10 0000000001
I N FORM I X Caract er 10 0000000001
ORACLE Caract er 10 0000000001
M YSQL Caract er 10 0000000001
D B2 Caract er 10 0000000001
- 554 -
Ba n cos:
D a t a ba se Tipo Ta m a n h o Con t e ú do
M SSQL 2 0 0 0 Caract er 10 Vazio
POSTGRES Ca r a ct e r 0 Va z io
I N FORM I X Caract er 10 Vazio
ORACLE Caract er 10 Vazio
M YSQL Caract er 10 Vazio
D B2 Caract er 10 Vazio
Ba n cos:
D a t a ba se Tipo Ta m a n h o Con t e ú do
M SSQL 2 0 0 0 Caract er 5 00000
M YSQL Caract er 5 00000
D B2 Ca r a ct e r 4000 00000 …
Ba n cos:
D a t a ba se Tipo Ta m a n h o Con t e ú do
M SSQL 2 0 0 0 Caract er 4 0000
POSTGRES Caract er 2000 0000 …
I N FORM I X Caract er 4 0000
ORACLE Caract er 4 0000
M YSQL Caract er 4 0000
D B2 Caract er 4 0000
- 555 -
Se j á é de conhecim ent o do pr ogram ador que o cam po da base de dados CPOC dest a t abela
t em 10 byt es de t am anho, devem os fazer um cast dest e r et orno, par a char ou var char, com
t am anho de 10 byt es. Dessa form a, o banco ret orna o t am anho esperado da coluna para o
TOPConnect quando da abert ura da quer y. I st o evit a que espaços desnecessários t rafeguem
pela rede para at ender à r equisição, e que est e valor ex cedent e sej a usado para alim ent ar
um a variável do Advpl. Vej am os com o usar est e r ecurso na query acim a descrit a, ut ilizando
um a sint axe aceit a pela m aioria dos Bancos de Dados hom ologados :
Vale a pena salient ar que, cada banco de dados possui, com pequenas variações, um a sint axe
para perm it ir o CAST de um ret orno. Para m aior es det alhes, a docum ent ação do banco dev e
ser consult ada.
O Banco de Dados Post gres possuem um com port am ent o diferenciado ent r e os Builds do
Ser ver do Banco, e possui um a param et rização na configuração do ODBC que pode int erferir
na m aneira com o os at ribut os das colunas de r et orno de um a query são r et ornados.
Em versões inferior es ào Post gr es 8.x , as diferenças de com port am ent o em relação àos dem ais
Bancos de Dados possuem um difer encial m uit o significat ivo, em prat icam ent e t odas as
funções de r et orno calculado. Para est es casos, em se t rat ando de Post gres versões inferiores
a 8.x, a pr ecisão de r et orno da coluna corr esponde ao t am anho m áxim o de r et orno do t ipo
VarChar. ( Est e t am anho m áxim o pode ser configurado na conexão ODBC do Post gr eSql, e o
valor default é 65536 byt es. )
Quando foram hom ologados os Bancos Post gr es para uso com o ERP Microsiga e TOPConnect
4, prat icam ent e não er am ut ilizadas queries com colunas calculadas nas aplicações Advpl, e
est e com port am ent o diferenciado não foi percebido. Confor m e as r ot inas foram evoluindo,
buscando m ais per form ance at rav és do uso de Queries, t ornou- se per cept ível est as difer enças
operacionais.
- 556 -
Para t odos os efeit os, para ut ilização com as versões hom ologadas de Post gr es inferiores a
8.x, é necessário alt erar a configuração de ODBC do Post gr es, para lim it ar o r et orno do t ipo
VarChar par a 2000 Byt es, pois o r et orno do valor default ( 65536 byt es ) não é suport ado pelo
TOPConnect / TOTVSDBAccess. Alt eram os est a configuração no arquivo .odbc.ini no linux, e/ ou
no arquivo de configuração do ODBC do Post gres ut ilizado, inserindo na seção da conexão /
ident ificação do banco a chave abaixo :
MaxLongVarcharSize=2000
At ualm ent e est á em processo de hom ologação as v er sões m ais recent es ( 8.x) do banco
Posgres. Quando hom ologado, a inform ação est ará disponivel na DEM, em Principal - > Guia de
Refer ência - > Guia de Plat aform as Hom ologadas - > Bancos de Dados Relacional X S.O.
Quando ut ilizam os CodeBase/ DBF, podem os especificar com o cam pos de chave de índice o
ret orno de funções, com o por ex em plo STR( ) , DTOS( ) , SUBSTR( ) , ent re out ras suport adas de
m odo nat ivo pela aplicação provedor a de acesso, no caso ADS Local e/ ou ADS Ser ver.
Fu n cion a m e n t o I n t e r n o
A expr essão ut ilizada para a criação de um índice perm anent e em Adv pl, por ex em plo : CPOC
+ DTOS( CPOD) + STR( CPON,10 ) , quando ut ilizam os o RDD TOPCONN, será aj ust ada para o
Banco de Dados r elacional ut ilizado para um a expr essão cont endo apenas a list a de cam pos
desej ada, na sequência em que foi especificada, e as funções DTOS( ) e STR( ) nao são
passadas ao banco de dados, pois não exist e a necessidade de conversão de dados para o
Banco.
Um cam po do t ipo 'D' Dat a é t rat ado pelo TOPConnect e gravado na t abela em quest ão com o
um cam po 'C' Caract ere, de 10 byt es, no for m at o AAAAMMDD, e os núm er os são gravados em
um cam po DOUBLE* .
- 557 -
Os Bancos r elacionais, em sua grande m aioria, senão t odos, suport am apenas a criação de
índices onde sej am especificados cam pos físicos da base de dados. Não são suport adas
funções de conversão ou t ransform ação de dados na criação de índices, com o por ex em plo
subst ring( ) , left ( ) , ent re out ras. Em bora alguns bancos perm it am a criação de colunas
calculadas, as m esm as são 'virt uais', ist o é, não exist em fisicam ent e na t abela, e t am bém não
é perm it ido o uso de colunas virt uais para a criação de índices.
Ent endem os que o RDD CodeBase / DBF, onde originalm ent e foi desenvolvido o ERP, nos dava
cert a flexibilidade ao perm it ir operações com o est as, por ém a um cust o de processam ent o
m ais alt o, pois para cada inser ção ou alt eração, o RDD t em que ex ecut ar funções de conversao
e concat enação de st rings para at ualização dos índices que usam est e r ecur so.
Mant er o suport e a t odos os indices perm anent es, criados a part ir de result ados de
expr essões, nas v ersões ant eriores do ERP, t eríam os um cust o m uit o alt o de com plexidade,
perform ance e duplicidade de inform ações nas t abelas. Seria necessário criar colunas físicas
nas t abelas, t ranspar ent es ao usuario, para m ant er copias em duplicidade de part es de colunas
agrupadas, com gat ilhos do banco de dados disparados int ernam ent e em operações de insert e
updat e, um m ecanism o r elat ivam ent e com plex o de se m ant er, inst ável para dar m anut enção,
e cust oso em per form ance para o Banco de Dados.
Part indo da prem issa que, se um a det erm inada inform ação deve ser indexada para busca, ela
dev e ser um a inform ação que ocupa exclusivam ent e um cam po físico da base de dados, são
evit adas as operações const ant es de concat enação e desm em bram ent o de um a inform ação
agrupada, colocando cada part e da infor m ação em seu devido espaço ( cam po )
definido, m esm o com o im pact o gerado para alt erar as aplicações que usavam est es t ipos
de índices, os ganhos obt idos em organização e per form ance foram m uit o significat ivos.
- 558 -
Quant o ut ilizado o TOPConnect / DbAccess para conexão e operações com Bancos de Dados,
as ocorr ências de err o são r eport adas ao Prot heus inform ando em conj unt o com o er r o um
núm ero m enor que zer o, cor respondendo a um t ipo de err o.
Para a m aioria das ocor rências, r elacionadas ao Banco de Dados, dev e- se olhar o log de er r o
gravado pelo TOPConnect / DbAccess ( arquivo t opconn.log ) para obt er m aiores det alhes
sobr e a ocor rência.
- 559 -
Nest e t ópico serão descrit as as funções da linguagem ADVPL que per m it em a int eração
com a aplicação TopConnect / DbAccess.
TCCAN OPEN
TCCON TYPE
TCD ELFI LE
TCGEN QRY
TCGETD B
TCLI N K
TCQUERY
TCQUI T
TCSETCON N
TCSETFI ELD
TCSPEXEC
TCSPEXI ST
TCSQLERROR
TCSQLEXEC
TCSRVTYPE
TCUN LI N K
TCCH KOBJ
TCEXEERROR
TCPGM EXE
TCSYSEXE
List a d a s f u n çõe s a ce ssór ia s u t iliz a d a s n os fon t e s com o f a cilit a d or a s:
CH AN GEQUERY
RETFULLN AM E
RETSQLCON D
RETSQLN AM E
RETSQLTABLE
SQLCOPY
SQLORD ER
SQLTOTRB
- 560 -
TCCAN OPEN ( )
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
TCCON TYPE( )
Pa r â m e t r os:
cType Tipo de pr ot ocolo de com unicação a ser ut ilizado pelo TopConnect , aonde:
- 561 -
Nenhum .
Ex e m plo:
#INCLUDE "TOPCONN.CH"
//Especifica conexão TCP/IP
TCConType("TCPIP")
Pa r â m e t r os:
Re t or n o:
Nenhum .
Ex e m plo:
- 562 -
Pa r â m e t r os:
x Pa r a m 1 Parâm et r o r eservado.
x Pa r a m 2 Parâm et r o r eservado.
cQu e r y Query de seleção com sint axe no padrão SQL ANSI a ser execut ada no banco
de dados.
Re t or n o:
Para que os dados cont idos no RecordSet r et or nado pela função TCGenQry( )
sej am ut ilizados pela aplicação ADVPL é necessário disponibilizá- los em um a
WorkAr ea.
Dest a form a a função TCGenQry( ) deverá ser ut ilizada em conj unt o com a
função DbUseAr ea( ) , para que a m esm a disponibilize o RecordSet com o um a
área de t rabalho do ADVPL.
Ex e m plo:
TCGETD B( )
Sin t a x e : TCGETD B( )
Pa r â m e t r os:
Nenhum .
- 563 -
Ex e m plo:
TCLI N K( )
Pa r â m e t r os:
Obse r v a çõe s:
Para o TOPConnect AS/ 400 um am bient e é um a Library criada at rav és do com ando
CRTTOPENV do TOPConnect .
- 564 -
A list a dos t ipos de bancos de dados supor t ados pela aplicação TopConnect /
DbAccess é a m esm a das possibilidades de ret orno da função TCGETDB conform e
abaixo:
Re t or n o:
N u m é r ico A função TCLink r et orna ou o núm ero da conexão ou um valor negat ivo
cont endo o código do er ro.
A relações dos códigos de er ros ocor ridos durant e um a t ent at iva de conexão
est á disponível no t ópico 8.1. dest e m at erial.
Ex e m plo:
nCon := TCLink("MSSQL/SIGAADV","TOPSRV")
if nCon < 0 //Conexões com retorno < 0 significam erro
Alert("Falha de conexão com o TOPConnect")
endif
//Protocolo TCP/IP
TCConType("TCPIP")
//Conecta-se ao Oracle – no ambiente TESTES
nCon := TCLink("ORACLE/TESTES",172.16.1.2)
//Protocolo APPC
//Conecta-se ao AS/400 no ambiente PRODUCAO
nCon := TCLink("PRODUCAO","TOP400")
- 565 -
Durant e o processo de com pilação, a sint axe TCQUERY( ) é subst it uída pelas
expr essão:
Pa r â m e t r os:
Obse r v a çõe s:
A Work Ar ea criada com o com ando TCQUERY é READ- ONLY, port ant o não é
perm it ido o uso de APPEND's ou REPLACE's.
O TOPConnect t em apenas um cur sor para a Query execut ada port ando apenas os
seguint es com andos são suport ados em um a Work Area criada com TCQUERY:
o GO TOP - DbGoTop( )
o GO BOTTOM - DbGoBot t om ( )
o SKI P - DbSkip( )
o Eof( )
o Bof( )
Re t or n o:
Nenhum .
- 566 -
While !Eof()
ALERT(CODIGO+"|"+NOME)
dbSkip()
end
TCQUI T( )
Sin t a x e : TCQu it ( )
Pa r â m e t r os:
Nenhum .
Re t or n o:
Nenhum .
TCSETCON N ( )
Pa r â m e t r os:
Re t or n o:
Nenhum .
- 567 -
TCSetConn(nCon1)
TCSetConn(nCon2)
TCSETFI ELD ( )
Est a função serv e com o apoio ao com ando TCQUERY, na recuperação de cam pos t ipo
NUMERI C, DATE e LOGI CAL, pois os m esm os são gravados fisicam ent e no Banco de Dados
com o caract eres, e no caso dos num éricos com o float .
Pa r â m e t r os:
Re t or n o:
Nenhum .
- 568 -
TCQUERY "SELECT NOME, DATA, MARRIED, VALOR FROM CUSTOMER" ALIAS QUERY VIA
"TOPCONN"
TCSetField("QUERY","DATA","D")
TCSetField("QUERY","VALOR","N",12,2)
A est rut ura dos parâm et r os da função TCSETFI ELD( ) é a m esm a ret ornada
pela função DbSt ruct ( ) e que é ut ilizada em diversas funções que m anipulam
arquivos de dados.
Ex e m plo 0 2 :
If Select("SA1SQL") <> 0
DbSelectArea("SA1SQL")
DbCloseArea()
Endif
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"SA1SQL",.T.,.F.)
- 569 -
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( )
Pa r â m e t r os:
Se for ex ecut ada com a sint axe: TCSPEx ec( “ MAT001” ,...) ocor rerá
um er ro na aplicação pois est a pr ocedur e não exist e.
- 570 -
Ex e m plo:
cRetorno := ""
For i:= 1 to Len(aRet)
cRetorno += "|"+ IIF(ValType(aRet[i]) == "C", aRet[i],;
IIF(ValType(aRet[i]) == "N", CValToChar(aRet[i]), "U"))
Next
Else
ALERT("Erro executando Stored Procedure"+CRLF+"Mensagem: "+TCSQLError())
Endif
EndIf
A função TCSPExist ( ) dev e ser ut ilizada apenas para v erificação da ex ist ência
de St or ed Procedures padrões da aplicação ERP, ou que possuam concat e
nadas no nom e a infor m ação da em pr esa para qual est ão habilit adas.
Para v erificação de pr ocedur es sem est a caract eríst ica deve ser ut ilizada a
função Exist Pr oc( ) .
- 571 -
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
If TCSPExist("MAT001_01")
TCSPExec("MAT001_01",...)
Endif
A função TCSPExist ( ) dev e ser ut ilizada apenas para v erificação da ex ist ência
de St or ed Procedures padrões da aplicação ERP, ou que possuam concat e
nadas no nom e a infor m ação da em pr esa para qual est ão habilit adas.
Para v erificação de pr ocedur es sem est a caract eríst ica deve ser ut ilizada a
função Exist Pr oc( ) .
TCSQLERROR( )
Ret orna o últ im o er ro r egist rado pelo TOPConnect durant e a execução de um a Query.
Sin t a x e : TCSQLEr r or ( )
Pa r â m e t r os:
Nenhum .
Re t or n o:
Ex e m plo:
- 572 -
TCSQLEXEC( )
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
TCSRVTYPE( )
Ret orna o t ipo do servidor no qual TOPConnect / TOTVS DbAccess est á em ex ecução.
Pa r â m e t r os:
Nenhum .
Re t or n o:
St r in g Tipo do ser vidor, com o por ex em plo: " WinNT" ou " AS/ 400" .
Ex e m plo:
TCLink("MSSQL/TESTE","TOPSRV")
ALERT(TCSrvtype())
- 573 -
# I FDEF TOP
I f TcSrv Type( ) ! = " AS/ 400"
Else
# ENDI F
# I FDEF TOP
Endif
# ENDI F
TCUN LI N K( )
Pa r â m e t r os:
Re t or n o:
Nenhum .
Ex e m plo:
TCConType("NPIPE")
nConn := TCLink("MSSQL/TOPCONN","TOPSRV")
TCUnLink(nConn)
- 574 -
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
nError := TCChkObj("CALCCUST","PRODUCAO","*PGM")
TCEXEERROR( )
Ret orna um a st ring com a m ensagem de er r o r et ornada pela ex ecução das funções
TCPGMEXE( ) e TCSYSEXE( ) .
Sin t a x e : TCEx e Er r or ( )
Pa r â m e t r os:
Nenhum .
Re t or n o:
St r in g Mensagem de er ro.
Ex e m plo:
If TCPGMEXE("CALCCUST") != 0
ALERT(TCExeError())
Endif
- 575 -
TCPGM EXE( )
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
If TCPGMEXE("CALCCUST") != 0
ALERT(TCExeError())
Endif
TCSYSEXE( )
Per m it e a ex ecução de um com ando ut ilizando a sint axe e r ecur sos nat ivos do DB2/ 400,
diret am ent e no ser vidor do banco de dados.
Pa r â m e t r os:
cCom m a n d Com ando a ser ex ecut ado no servidor de banco de dados ut ilizando sint axe
DB2/ 400.
Re t or n o:
- 576 -
CH AN GEQUERY( )
Função que efet ua as adequações necessárias a query par a que a m esm a possa ser execut ada
adequadam ent e no banco de dados em uso pela aplicação ERP at rav és do TopConnect .
Est a função é necessária pois a aplicação ERP Prot heus pode ser ut ilizada com diver sos bancos
de dados, e cada banco possui part icularidades em sua sint axe, de for m a que m esm o um a
query escrit a respeit ando o padrão SQL ANSI pode necessit ar de adequações.
Sin t a x e : Ch a n ge Qu e r y( cQu e r y)
Pa r â m e t r os:
cQu e r y St ring cont endo a quer y escrit a em sint axe SQL ANSI .
Re t or n o:
St r in g
Query adequada em função do banco em uso pela conexão at iva com a
aplicação TopConnect .
Ex e m plo:
- 577 -
A razão dist o é perm it ir ao analist a, que t enha conhecim ent os m ais apurados
do banco de dados em uso pelo client e, ut ilizar um a sint axe focada em ut ilizar
m elhor os recursos do banco, ot im izando a perform ance da aplicação.
RETFULLN AM E( )
Ret orna o nom e r eal da t abela no banco de dados para ut ilização dest a na seleção da query .
A função Ret FullNam e( ) não é ex clusiva para uso em queries, sendo ut ilizada
pela aplicação ERP par a verificar o nom e da t abela para o alias, especificado
no SX2 da em pr esa indicada.
Pa r â m e t r os:
cAlia s Nom e da área de t rabalho da aplicação para ident ificação da t abela no banco
de dados.
cEm p Código da em presa a ser avaliada.
Re t or n o:
Ex e m plo:
SA1->(DbSetOrder(1)) // A1_FILIAL+A1_COD+A1_LOJA
cOrder := SqlOrder(IndexKey())
cRealName := RetFullName("TRBSQL")
- 578 -
Pa r â m e t r os:
Re t or n o:
St r in g
Condições de seleção padrões para o alias indicado.
As condições padr ões são:
ALI AS_FI LI AL = xFilial( ALI AS) .AND.
ALI AS.D_E_L_E_T_ = “ ” .
Ex e m plo:
RETSQLN AM E( )
Ret orna o nom e padrão da t abela para seleção no banco de dados at ravés da query.
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
- 579 -
Ret orna o nom e r eal da t abela para seleção no banco de dados at rav és da quer y.
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
SQLCOPY( )
Cria um arquivo no for m at o especificado pela configuração LOCALFI LES do am bient e com o
ret orno da query .
Pa r â m e t r os:
Re t or n o:
Nenhum .
- 580 -
Convert e a sint axe de um indíce em form at o I SAM ( CODEBASE) para o for m at o SQL ANSI
Pa r â m e t r os:
Re t or n o:
Ex e m plo:
SA1->(DbSetOrder(1)) // A1_FILIAL+A1_COD+A1_LOJA
cOrder := SqlOrder(IndexKey())
cRealName := RetFullName("TRBSQL")
- 581 -
Pa r â m e t r os:
Re t or n o:
Nenhum .
Ex e m plo:
cCampos:= ""
nX := 0
nMax := Len(aStruSQL)
cArqTrb := CriaTrab(aStruSQL,.T.)
dbUseArea(.T.,__LOCALDRIVER,cArqTrb,cAlias,.T.,.F.)
cQuery := "SELECT "+cCampos+" FROM "+RetSqlName("SA1")+" (NOLOCK) "
SqlToTrb(cQuery,aStruSQL,cAlias)
cArqInd := CriaTrab(Nil,.F.)
cChave := "A1_FILIAL+A1_COD+A1_LOJA"
IndRegua(cAlias,cArqInd,cChave,,,"Indexando Registros...")
dbSelectArea( cAlias )
dbGotop()
- 582 -
Rot inas de pr ocessam ent o ut ilizando queries par a seleção dos r egist ros;
Relat órios para seleção dos regist r os;
Rot inas de at ualização para ex ecução dos com ando de at ualização diret am ent e
no banco de dados.
Em r esum o, qualquer aplicação do am bient e ERP pode ser escrit a ut ilizando os recursos de
int eração com a aplicação TopConnect / TOTVS DbAccess, para obt er, m anipular e at ualizar os
dados do banco do banco de dados.
Nest e t ópico serão det alhadas duas aplicações ut ilizando est as funções, cuj o grau de
com plexidade ilust ra bem o pot encial dest a fer r am ent a.
Ba n co de da dos de in t e r f a ce
Ut ilizando est a part icularidade da MaWndBrowse é possível ent ão com por um alias
t em porário cont endo o r et orno de um a query e exibi- lo em um browse.
Consult a Kardex em t ela, pois est e r elat ório com bina dados das t abelas de
it ens dos docum ent os de ent rada ( SD1) , it ens dos docum ent os de saída
( SD2) e m ovim ent ações int ernas ( SD3) .
Dem onst ração em t ela das depr eciações dos bens do im obilizado por
período, com pondo dinam icam ent e as colunas de depreciação de acordo
com o int ervalo de m eses selecionados. Est e recurso é int eressant e pois
elim ina a lim it ação de espaço da im pressão e pode ser com binado com a
funcionalidade de expor t ação de grids de dados para o Micr osoft Ex cel.
- 583 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------
| Função | WndSQLTRB | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Demonstra a utilização da MaWndBrowse com SQL |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
- 584 -
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)
- 585 -
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)
If File(cArqInd+OrdBagExt())
FErase(cArqInd+OrdBagExt())
ENDIF
DbSelectArea("SA1")
DbSetOrder(1)
Return
/*/
+-----------------------------------------------------------------------
| Função | TcVisual | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk := {||oDlg:End()}
LOCAL bCancel := {||oDlg:End()}
LOCAL nX
Continuação:
- 586 -
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.)
RETURN
/*/
+-----------------------------------------------------------------------
| Função | TcInclui | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL aArea := GetArea()
LOCAL nX
Continuação:
- 587 -
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]) := Space(aCampos[nX][4])
Case aCampos[nX][5] == "N"
&("_"+aCampos[nX][1]) := 0
Case aCampos[nX][5] == "D"
&("_"+aCampos[nX][1]) := CTOD("")
Case aCampos[nX][5] == "L"
&("_"+aCampos[nX][1]) := .F.
Case aCampos[nX][5] == "M"
&("_"+aCampos[nX][1]) := Space(aCampos[nX][4])
EndCase
Next nX
oDlg := TDialog():New(000,000,400,650,cCadastro,,,,,,,,,.T.)
TEnchoice(oDlg, aCposEnch,,,,,.T.)
RETURN
- 588 -
/*/
+-----------------------------------------------------------------------
| Função | TcAltera | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL aArea := GetArea()
LOCAL 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()",;
"",aCampos[nX][6],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.)
RETURN
- 589 -
/*/
+-----------------------------------------------------------------------
| Função | TcExclui | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aCposEnch := {}
LOCAL nLinha := 15
LOCAL nColuna := 10
LOCAL nOpcE := aRotina[nOpc][4] // Opcao de verdade
LOCAL bOk
LOCAL bCancel := {||oDlg:End()}
LOCAL 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.)
RETURN
Continuação:
- 590 -
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
- 591 -
/*/
+-----------------------------------------------------------------------
| Função | TcGravar | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
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
- 592 -
/*/
+-----------------------------------------------------------------------
| Função | TEnchoice | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | Enchoice para arquivos temporarios |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local aSays := {}
Local aGets := {}
Local cCaption := ""
Local cPict := ""
Local cValid := ""
Local cF3 := ""
Local cWhen := ""
Local cBlKSay := ""
Local cBlkGet := ""
Local cBlKVld := ""
Local cBlKWhen := ""
Local nLeft := 0
Local nTop := 0
Local nI := 0
If Len(aCampos) > 0
If Len(aCampos[nI])==8
cCampo := aCampos[nI,1]
nLeft := aCampos[nI,2,1]-13
nTop := aCampos[nI,2,2]
cCaption:= Iif(Empty(aCampos[nI,3]), " " ,aCampos[nI,3])
cPict := Iif(Empty(aCampos[nI,4]), Nil ,aCampos[nI,4])
cValid := Iif(Empty(aCampos[nI,5]), ".t." ,aCampos[nI,5])
cF3 := Iif(Empty(aCampos[nI,6]), NIL ,aCampos[nI,6])
- 593 -
AADD(aSays,Array(1))
aSays[nI] := TSay():New(nLeft+1, nTop, &(cBlkSay), oScroll,,,;
.F., .F., .F., .T.,,, 50, 8, .F., .F., .F., .F.,;
.F. )
AADD(aGets,Array(1))
EndIf
Next
Endif
Return
- 594 -
O t erm o “ Banco de dados de int erface” é ut ilizado para classificar um a aplicação ADVPL escrit a
com funções de int eração com a aplicação TopConnect / TOTVS DbAccess para r ealizar a
int egração ent r e a aplicação ERP Prot heus e out ro sist em a, ut ilizando com o m eio de
com unicação um banco de dados e não m ais im port ação de arquivos em “ N” form at os, t ais
com o .TXT, .DBF e sim ilares.
Est e t ipo de int egração não visa subst it uir form at os de int egrações padrões j á
exist ent es com o o padr ão CNAB e o padrão Web XML.
Sua aplicação é int egr ação diret a ent re sist em as at rav és de um banco de
dados com form at o e padrões com uns ent r e elas.
Maior cont role da int egração das inform ações ent re os sist em as, perm it indo um
t rat am ent o adequado de ev ent os de err os;
Transparência e rast r eabilidade das inform ações int egradas, im plem ent ando
confiabilidade no pr ocesso;
Possibilidade de desenv olvim ent o de ferram ent as para m onit orar e gerenciar a
int egração ent r e os sist em as at rav és do cont r ole da área de int erface no banco
de dados, inclusive com a ut ilização de St or ed Pr ocedur es par a aum ent ar a
perform ance da aplicação de int erface.
- 595 -
Ta r e f a D e scr içã o D e t a lh a m e n t o
Ut ilização de queries ou st or ed
procedur es para at ualização das
01 Ex por t a çã o Pr ot h e u s - > D b I n t e r f a ce t abelas do banco DBI nt erface no
for m at o necessário ao ERP X,
ex ecut adas a part ir do ERP Pr ot heus.
Fer ram ent as propriet ár ias do ERP X
para leit ura do DBI nt erface e
02 I m por t a çã o D b I n t e r f a ce - > ERP X t rat am ent o das infor m ações para
at ualização do banco de dados dest a
aplicação.
Pode ser um a fer ram ent a propriet ária
da aplicação ERP X, ou pode ser um
conj unt o de queries e st or ed
procedur es desenv olvidas em
03 Ex t r a çã o ERP X - > D b I n t e r fa ce
conj unt o com a equipe do ERP X e a
equipe TOTVS, perm it indo o cont r ole
de ex ecução da ext ração pelo ERP
Prot heus.
Ut ilização de queries ou st or ed
procedur es para leit ura das
inform ações do DBI nt erface e
04 I m por t a çã o D b I n t e r f a ce - > Pr ot h e u s
at ualização de t abelas int erm ediárias
no banco de dados do ERP Pr ot heus,
ex ecut adas a part ir do ERP Pr ot heus.
Ut ilização de funções próprias para
est a finalidade no ERP Prot heus para
efet ivação das inform ações
05 Efe t iv a çã o Pr ot h e u s - > Pr ot h e u s im port adas em infor m ações válidas no
ERP. Est as funções nor m alm ent e são
com pat íveis com a ex ecução at rav és
do r ecurso de MsExecAut o( ) .
- 596 -
Para ext ração das inform ações t ant o do banco de dados Prot heus para
export ação, quant o do banco de dados do sist em a ERP X é r ecom endável o uso
de St or ed Procedures para aum ent ar a perform ance do processo com o um t odo.
É im port ant e lem brar que se o sist em a ERP X possuir pr ocedur es de export ação
as m esm as poderão ser ex ecut adas diret am ent e pelo Pr ot heus at ravés da função
TCSpEx ec( ) ;
É recom endáv el que as funcionalidades de Ex port ação, Ext ração, I m port ação e
Efet ivação sej am t rat adas t ant o com int erfaces de ex ecução diret a quant o
at ravés de ex ecução via Job.
- 597 -
O obj et ivo do Em bedded SQL é facilit ar a escrit a e leit ura de query 's. Foi definida um a sint axe
para que se possa escr ev er a query diret am ent e no código ADVPL, sem a necessidade de ficar
concat enando pedaços de st ring para com por a st ring final.
D isp on ibilid a d e d o Re cu r so
Est e recur so est á disponível apenas no Prot heus 8. A ut ilização do Em bedded SQL divide- se
em : com pilação do font e, e ex ecução do font e. Para ser possível com pilar um font e com o
código escrit o no form at o Em bedded, deve ser ut ilizado um Prot heus, com Build igual ou
superior a 7.00.050721p, em um am bient e com r eposit ório para TopConnect ( RPODB= TOP ) .
- 598 -
O bloco onde será escrit o o Select deve sem pr e ser iniciado com ' Be g in Sq l a lia s' e finalizado
com 'En dSq l'.
Part es do código que devem ser subst it uídas aparecem ent r e os sinais de % . Est as expressões
possuem t r at am ent o especial em m om ent o de ex ecução.
Qualquer inst rução colocada ent r e BEGI NSQL... ENDSQL, que não sej a um a expr essão % ...% ,
será inserida na quer y a ser enviada para o banco, de form a lit eral.
Em colu m n , especificar cam pos da query que são do t ipo dat a, lógico ou num érico ( DATE,
LOGI C, NUMBER) . Est a linha é t r ocada por cham adas à função TCSe t Fie ld.
% n op a r se r % indica que a query não dev e passar pela função 'Ch a n ge Qu e r y ' ant es de ser
enviada ao banco de dados. Caso não especificado, o default é a st ring da query ser passada
aut om at icam ent e pela função ChangeQuery.
% t a ble :< a lia s> % é subst it uída por Re t SqlN a m e ( < a lia s> )
% Or de r :< a lia s> % é subst it uída por SqlOr d e r ( < a lia s> - > ( I n de x Ke y( ) ) )
Lim it a çã o:
Não é perm it ido incluir funções no m eio do código 'em bedded'. Se pr ecisar, o valor dev e ser
guardado em um a variável ant es do início do BeginSql.
tam_cp := GetE2ValorSize()
- 599 -
Caso sej a ut ilizado algum argum ent o inválido para especificar as colunas, ou err os de sint axe
nas expressões a ser em t ransform adas para a m ont agem da query, a com pilação do font e é
int err om pida com a ocor rência 'Synt ax Err or ', inform ando a linha onde a prim eira ocor rência
foi encont rada.
Caso a ocorr ência de com pilação apont e diret am ent e para a linha do código- font e, onde est á
escrit a a inst rução EndSql, verifique se exist e algum espaço em branco ou t abulação, a part ir
do início da linha, ant es da inst rução EndSql. A ver são at ual desde am bient e não suport a est a
declaração, exigindo que a inst rução EndSql sej a alinhada à esquerda do font e, sem espaços
ou t abulações.
Er r os d e Ex e cu çã o
Caso a inst rução BeginSQL especifique um alias que j á est ej a abert o ( em uso) , a aplicação
é abort ada com a ocor r ência de er ro fat al acim a, inform ando em XXX o alias ut ilizado.
Caso algum a expr essão inform ada na Quer y, at rav és da t ag % exp: ... % , r et orne um valor de
t ipo difer ent e de 'C' Cat act er, 'D' Dat a, 'N' Num érico, ou 'L' Lógico, a aplicação é abort ada com
a ocorr ência de er ro acim a, onde o t ipo do argum ent o inesperado é m ost rado em [ X] .
Est a ocorr ência, se repr oduzida, inform ará na pilha de cham adas o núm er o da linha do código-
font e cor r espondent e à inst rução EndSQL. Ocor re caso algum a função int erm ediária do engine
do Em bedded SQL, excluindo- se as funções especificadas na quer y com a sint axe % exp: ... %
, r et ornar um cont eúdo não- caract er e a ser acr escent ado na Query . Est a ocor rência é de m ais
difícil localização, sendo út il nest es casos a análise do arquivo t em por ár io gerado pelo Pr ot heus
I DE, no m om ent o da com pilação.
H e lp N OFUN CW - Fu n çã o _ _ EXECSQL
Caso um font e com o Em bedded SQL sej a ex ecut ado em um r eposit ório que não t enha sido
at ualizado, OU que não sej a um Reposit ório para o am bient e TOPConnect ( RPODB= TOP) , a
aplicação exibirá a ocorr ência acim a, indicando que a função int erna de ex ecução da Quer y
não est á pr esent e no am bient e. Verifique se a lib est á at ualizada, e se o RPO em uso é de um
am bient e TOPConnect .
- 600 -
Dada a m ont agem da Query, não é possível depurar o bloco do código- font e com pr eendido
ent re as inst ruções BeginSql e EndSql, não sendo considerados pont os de parada de depuração
( BreakPoint s ) , caso colocados nest e int ervalo do código. A colocação de pont os de parada
dev e ser r ealizada ant es ou depois dest e bloco.
Fu n çã o a u x ilia r - GETLa st Qu e r y ( )
Após a abert ura do cur sor, no alias especificado, a função Get Last Quer y( ) r et orna um ar ray ,
com 5 elem ent os, onde est ão disponíveis as seguint es inform ações sobr e a Query ex ecut ada :
%noparser%
- 601 -
__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 '+RetSqlName('SE2')+' SE2, '+RetSqlName('QEK')+' QEK WHERE
SE2.E2_FILIAL= '' +xFilial('SE2')+'' AND qek.D_E_L_E_T_= ' ' AND
SE2.E2_PREFIXO<> '+___SQLGetValue(CPREFIXO)+' AND SE2.E2_NUM <> '+
___SQLGetValue((CALIAS)->M0_CODIGO)+' AND SE2.E2_NUM<>45 AND SE2.E2_FORNECE= '+
___SQLGetValue(SPACE(LEN(SE2->E2_FORNECE)))+' AND SE2.E2_EMISSAO<> '+
___SQLGetValue(MV_PAR06)+' AND SE2.E2_LOJA<> '+___SQLGetValue(MV_PAR05) +' AND
SE2.E2_VALOR<> '+___SQLGetValue(MV_PAR04)+' AND qek.QEK_SKLDOC<> '+
___SQLGetValue(MV_PAR03)+' And SE2.D_E_L_E_T_= ' ' ORDER BY '+
SqlOrder(SE2->(IndexKey(1))), {{'E2_EMISSAO','D',8,0}, {'E2_VALOR','N',tam_cp,2},
{'QEK_SKLDOC','L',1,0}},.T.)
)
- 602 -
A funcionalidade MsEx ecAut o, ou t am bém conhecida com o Rot ina Aut om át ica, perm it e a
ex ecução de r ot inas do am bient e ERP Pr ot heus por funções específicas, o que confere ao
desenvolvedor a possibilidade de efet uar t r at am ent os específicos ant es da ex ecução da r ot ina
padrão, e m ais im port ant e, não perder nenhum a funcionalidade que a r ot ina padrão ofer ece.
Com o o desenvolvedor opt ou por r ealizar t odo o t rat am ent o de form a específica, em
um a at ualização do ERP est e desenv olvim ent o pr ecisará ser r evist o ou at é m esm o
refeit o, o que im placará em cust o para o client e ou par a o desenv olvedor.
Se o desenv olvedor t ivesse opt ado por ut ilizar a rot ina padrão encapsulada em seu
desenvolvim ent o ele não t eria problem as em adapt ar sua rot ina as novas
necessidades do sist em a, pois a r ot ina padrão j á se preocupada com a
com pat ibilidade ent re as versões, possibilit ando que um a sim ples m anut enção
at ualize t oda a r ot ina específica, ist o se est a m anut enção for necessária, pois a
rot ina padrão poder t rat ar a novas infor m ações com “ cont eúdos padrões”
dependendo da sit uação em que est as não forem inform adas.
Se est a sit uação não for previst a, a inclusão de inform ações ut ilizando a rot ina
padrão do sist em a poderá sofr er diversas v alidações ou at é m esm o efet uar a
gravação de inform ações adicionais, as quais não est ão visíveis na r ot ina específica,
gerando graves inconist ências na base de dados.
Avaliando est as considerações per cebesse o fat or de sucesso que um desenv olvim ent o
específico pode t er ao opt ar por refazer t odos os t rat am ent os do sist em a em det rim ent o de
ut ilizar a funcionalidade MsEx ecAut o, ou sej a, qualquer m odificação no am bient e,
independent e do quão sim ples pode t ornar a r ot ina específica inadequada.
- 603 -
Tendo em vist a est e cenário fica a pergunt a: “ Quando ut ilizar a funcionalidade MsEx ecAut o ?”
A respost a pode ser óbvia e at é conser vadora, m as é “ Sem pre que a funcionalidade est iver
disponível naquele processo” .
Em r esum o, qualquer funcionalidade de int erface, sej a ela de carga ou cont ínua, qualquer
funcionalidade de at ualização, ou sej a, qualquer m anut enção na base de dados do sist em a,
sem pre que possível, deve ut ilizar a funcionalidade MsExecAut o.
Pode- se dizer que as pr incipais rot inas de at ualização do ERP Pr ot heus at ualm ent e possuem o
t rat am ent o necessário para sua ex ecução por MsEx ecAut o, e com base nas necessidades de
desenvolvim ent o int ernas da TOTVS e nas m elhorias solicit adas por client es e analist as de
im plant ação as dem ais rot inas necessárias são at ualizadas para cont em plar est e t rat am ent o.
O quadr o abaixo ilust ra um dos últ im os cenários de t rat am ent o de MsEx ecAut o pelas rot inas
da aplicação ERP Prot heus.
Rot in a Pa r â m e t r os
ATFA0 1 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
ATFA0 3 0 ( xAut oCab, nOpc)
ATFA0 3 5 ( xAut oCab, nOpc)
CFGX0 1 6 ( xAut oCab, xAut oI t ens)
CTBA0 1 5 ( nOpcAut o, aAut o)
CTBA0 1 6 ( nOpcAut o, aAut o)
CTBA0 2 0 ( aRot Aut o, nOpcAut o, aRot I t em )
CTBA1 0 2 ( xAut oCab, xAut oI t ens, nOpcAut o)
CTBA2 7 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
FATA1 4 0 ( nOpcAut o, aAut o)
FATA2 2 0 ( nOpcAut o, aAut oCab)
FATA3 0 0 ( nOpcAut o, xAut oCab, x Aut oAD2, xAut oAD3, xAut oAD4, xAut oAD9)
FATA3 1 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
FATA3 2 0 ( xAut oVend, xAut oTask, xAut oCalend)
FI N A0 1 0 ( aRot Aut o, nOpcAut o)
FI N A0 4 0 ( aRot Aut o, nOpcAut o)
FI N A0 5 0 ( aRot Aut o, nOpcion, nOpcAut o)
FI N A0 7 0 ( xAut oCab, nOpc)
FI N A0 8 0 ( xAut oCab, nOpc)
FI N A3 9 0 ( nPosAr ot ina, xAut oCab, nOpcAut o)
M ATA0 4 0 ( aAut o, nOpcAut o)
M ATA0 8 0 ( aRot aut o, nOpcAut o)
M ATA1 0 3 ( xAut oCab, xAut oI t ens, nOpcAut o, lWhenGet , x Aut oI m p)
M ATA1 0 5 ( xReser vCab, xReserv I t ens, nOpcAut o)
M ATA1 1 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
M ATA1 1 6 A ( xAut oCab, xAut oI t ens, lI nclui)
M ATA1 2 0 ( nFuncao, xAut oCab, xAut oI t ens, nOpcAut o, )
M ATA1 2 5 ( xAut oCab, xAut oI t ens, nOpcAut o)
M ATA1 4 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
M ATA1 4 5 ( xAut oCab, xAut oI t , xAut oI t 2, nOpcAut o)
M ATA1 5 0 ( xAut oCab, xAut oI t ens, nOpcAut o)
- 604 -
Apesar de t odas as or ient ações dos t ópicos ant erior es exist em sit uações nas quais não é
recom endado ut ilizar a funcionalidade MsEx ecAut o, no caso, em sit uações para as quais
exist em r ot inas padrões da aplicação ERP par a processam ent os de int egrações e at ualizações
que possuem t rat am ent o para execução diret a ou execução via Job.
Para est es casos a r ot ina j á est á pré- dispost a a execução diret a, não havendo a necessidade
de t rat am ent o via MsEx ecAut o, ou o t rat am ent o r ealizado pela rot ina é o m ais adequado par a
aquele volum e de dados.
O ex em plo clássico dest a sit uação é para im port ação de lançam ent os ou saldos cont ábeis. A
aplicação ERP possui um a rot ina de int egração denom inada “ Cont abilização TXT” ( CTBA500)
m as a rot ina de lançam ent os cont ábeis ( CTBA102) pode ser execut ada at rav és da
MsExecAut o.
Para im port ações de saldos e lançam ent os dev e- se opt ar pela ut ilização da r ot ina de
“ Cont abilização TXT” , devido aos t rat am ent os que a m esm a perm it e at ravés das configurações
da própria rot ina em conj unt o com as param et rizações do m ódulo. O uso da CTBA102 –
Laçam ent os Cont ábeis via MsExecAut o é r ecom endado para r ot inas de m anut enção ou
funcionalidades específicas / m elhorias, com por exem plo o est orno de lançam ent os cont ábeis
sem a necessidade de avaliar regras de cont abilização.
- 605 -
Va r iá ve is de con t r ole
Pr iv a t e lM sEr r oAu t o
I ndica de se houv e er ro não fat al durant e a execução.
Pr iv a t e lM sH e lp Au t o
Habilit a a capt ura das m ensagens de er ro.
M on t a g e m dos a r r a y s de p a r â m e t r os
Tipos de a r r a y s d e pa r â m e t r os:
Basicam ent e um a MsExecAut o possui dois t ipos de arrays de parâm et r os: Array de
Dados de Cabeçalho e Array de Dados de I t ens.
Os ex em plos a seguir visam ilust rar a ut ilização de cada um a dos t ipos de ar ray s:
Cadast r o de client es ( MATA030) : Est a rot ina at ualiza apenas os dados da t abela
SA1 – Cadast r o de Client es, port ant o será necessário apenas um ar ray de dados
cont endo as inform ações que dev erão ser gravadas na t abela SA1.
Docum ent os de ent rada ( MATA103) : Est a r ot ina at ualiza basicam ent e os dados
das t abelas SF1 – Cabeçalho do Docum ent o de Ent rada e SD1 – I t ens do
Docum ent o de ent rada, port ant o ser ão necessários dois arrays de dados
cont endo as inform ações do cabeçalho do docum ent o de ent rada e dos it ens do
docum ent o de ent rada, sendo que est e últ im o t erá sua est rut ura de cont eúdo
repet ida para cada it em do docum ent o.
Aviso de Recebim ent o de Carga ( MATA145) : Est a rot ina at ualiza basicam ent e os
dados das t abelas DB1 – Aviso de Recebim ent o de Carga, DB2 – Cabeçalho do
docum ent o recebido e DB3 – I t ens do docum ent o recebido, port ant o são
necessários t rês arr ay de dados cont endo as respect ivas inform ações para as
t abelas DB1, DB2 e DB3, sendo que as duas últ im as t erão suas est r ut uras de
cont eúdo r epet idas para cada docum ent o r ecebido.
- 606 -
Ar r a y d e d a dos do ca be ça lh o ( x Au t oCa b ) :
O ar ray cont endo os dados do cabeçalho é com post o por: Cam po, Cont eúdo e
Validação.
Cada it em dest e ar ray é um dos cam pos da t abela de cabeçalho das inform ações
que serão processadas pela MsEx ecAut o. Com base nos exem plos ant erior es, a
MsExecAut o da MATA030 possui apenas um array de parâm et ros no form at o
xAut oCab, sendo que a MATA103 ut ilizará o xAut oCab para a t abela SF1 e a
MATA145 para a t abela DB1.
Sin t a x e :
Ex e m plo:
Ar r a y d e d a dos dos it e n s ( x Au t oI t e n s) :
O array cont endo os dados dos it ens t am bém é com post o por: Cam po, Cont eúdo
e Validação; sendo que a diferença est á no fat o de que para cada it em a ser
t rat ado pela MsEx ecAut o dev erá ser r epet ida e preenchida a est rut ura do ar ray
com as inform ações do m esm o.
Com base nos ex em plos ant erior es, a MsEx ecAut o da MATA030 não possui um
array de par âm et ros no form at o xAut oI t ens, j á a MATA103 ut ilizará o x Aut oI t ens
para a t abela SD1 e a MATA145 ut ilizará dois xAut oI t ens, sendo o prim eiro para
a t abela DB2 e o segundo para a t abela DB3.
Sin t a x e :
xAutoItem := {}
AADD(xAutoItens, xAutoItem)
</Estrutura>
- 607 -
For nX := 1 to 2
xAutoItem := {}
AADD(xAutoItens, xAutoItem)
Next nX
Est e m ét odo é o m ais com um de ser ut ilizado dado sua prat icidade, e pela possibilidade
do desenvolvedor especificar som ent e os cam pos obrigat órios para a t abela e aqueles
que cont erão as inform ações geradas por sua aplicação.
Ex e m plo:
- 608 -
Est e m ét odo consist e em com parar a est rut ura do arquivo de origem ( a ser im port ado)
cont ra a do arquivo de dest ino ( t rat ado pela MsEx ecAut o) . Dest a form a os cam pos que
for em coincident es ent r e o arquivo de origem e o arquivo de dest ino serão pr eenchidos
com as inform ações do arquivo im port ado, caso cont rário os m esm os poderão ser
desconsiderados ou ser em pr eenchidos com um cont eúdo padrão.
Ex e m plo:
FOR nX := 1 TO LEN(aStruSN1)
IF SN1IMP->(FieldPos(aStruSN1[nX][1]))>0
DO CASE
CASE EMPTY(SN1IMP->&(aStruSN1[nX][1]))
AADD(xAutoCab,{aStruSN1[nX][1],;
CRIAVAR(aStruSN1[nX][1]), NIL})
- 609 -
...
END
Est e é pont o no qual o desenvolvedor inclui os t rat am ent os necessários a cor r et a execução da
rot ina, além de seus t rat am ent os específicos, os quais j ust ificaram o desenvolvim ent o.
Ut ilizando o m esm o ex em plo ant erior da ATFA010 – Cadast r o de At ivos podem os cit ar dois
t rat am ent os específicos necessários para a corr et a execução da MsEx ecAut o:
Ch a m a da d a s pe r gu n t a s d a ATFA0 1 0 :
Muit as vezes um a est r ut ura que funciona para um MsEx ecAut o pode não
funcionar para out r o do m esm o t ipo, devido as car act eríst icas individuais de
cada r ot ina. Podem os cit ar os seguint es exem plos:
- 610 -
A ut ilização do cont role de t ransação perm it e garant ir a int egridade das inform ações gravadas
pelo processam ent o.
Para ut ilização do cont r ole de t ransação na aplicação podem ser ut ilizados os seguint es blocos
de cont r ole:
Um bloco de código det erm inado pelos com andos Begin Transact ion ... End Transact ion
t erá suas inform ações at ualizadas som ent e se ant es do ex ecução do com ando End
Transact ion não for ex ecut ada a função Disarm Transact ion( ) .
Dest a form a pode- se im plem ent ar um cont role de t ransação por it em processado, sendo
ex ecut ado o Disarm Transact ion( ) para aquele elem ent o em que houv e algum problem a
de pr ocessam ent o.
Seguindo est e m esm o r aciocínio, caso ocorra um er ro fat al na aplicação, som ent e o it em
que est á em pr ocessam ent o será desconsiderado, pois a aplicação ERP efet ua um
DisarTransact ion( ) aut om at icam ent e, fecham ent o as t ransações pendent es e
rest aurando as sit uações ant erior es, m as apenas para aqueles processam ent o pr ot egidos
pelo bloco de cont r ole de t ransação.
O com ando END TRANSACTI ON não pode t er sua int erpr et ação vinculada a
um a condição. Nest es casos ocor rerá um err o de com pilação indicando que o
bloco abert o pelo com ando BEGI N TRANSACTI ON não foi cor r et am ent e
fechado.
Ex e m plo:
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ENDIF
END TRANSACTION
- 611 -
As funções BeginTran( ) e EndTran( ) visam perm it ir que o t érm ino da t ransação sej a
condicional, elim inando a lim it ação da est rut ura BEGI N TRANSACTI ON ... END
TRANSACTI ON.
Ex e m plo:
BeginTran()
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ELSE
EndTran()
ENDIF
MsUnlockAll()
- 612 -
Com a ut ilização da funcionalidade MsExecAut o a aplicação ERP disponibiliza diver sos m ét odos
para visualização e t rat am ent o das m ensagens de er ro ocor ridas durant e a execução da r ot ina,
sendo est es:
Visu a liz a çã o do e ve n t o de e r r o
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro()
DisarmTransaction()
ENDIF
END TRANSACTION
O cont eúdo das variáveis PRI VATE de cont role da MsEx ecAut o dev e ser
configurado conform e abaixo:
- 613 -
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro(“\system\”)
DisarmTransaction()
ENDIF
END TRANSACTION
A função Most raEr ro( ) possui o par âm et ro cPat h o qual pode ser infor m ado
de duas form as:
Apenas o diret ório: Se for inform ado apenas o diret ório será
gerado um arquivo com denom inação no form at o SCxx xxx x.log,
aonde x xxx xx ser á um núm ero sequencial gerado int ernam ent e
pelo sist em a.
Caso sej a necessário gerar um único arquivo t ext o cont endo t odos os
ev ent os de err o gerados pelos sucessivos pr ocessam ent os da MsEx ecAut o,
a função Most raErr o( cPat h) deverá ser cham ada apenas um a vez, ao
t érm ino do processam ent o da r ot ina.
- 614 -
Para processam ent os m ais volum osos, a ger ação de diver sos arquivos de t ext os ou
at é m esm o a geração de um único arquivo t ext o cont endo t odos os event os de er ro
pode dificult ar a análise e cor r eção dos problem as encont rados durant e o
processam ent o.
Dest a form a é possível per sonalizar a gravação do event o de err o, de form a que o
m esm o sej a gerado em um arquivo no form at o .DBF, perm it indo o vínculo do regist r o
processado com a m ensagem de er ro gerada.
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
// Função que retorna o evento de erro na forma de um array
aAutoErro := GETAUTOGRLOG()
DisarmTransaction()
ENDIF
END TRANSACTION
- 615 -
#INCLUDE "PROTHEUS.CH"
/*/
+-----------------------------------------------------------------------
| Função | IATF001 | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | IMPORTACAO DO CADASTRO DE ATIVO IMOBILIZADO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL oProcess
PRIVATE oMainWnd
RpcSetType(3)
RpcSetEnv("99", "01",,,,,
{"CT1","SF9","SN1","SN2","SN3","SN4","SN5","SNG","SM2"})
RpcClearEnv()
RETURN
- 616 -
/*/
+-----------------------------------------------------------------------
| Função | PROCATIVO | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | PROCESSAMENTO DA IMPORTACAO DO CADASTRO DE IMOBILIZADO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
- 617 -
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())
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
- 618 -
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 não 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 não 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 não 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 não existe."+;
CRLF+"Verifique caminho informado.",1,0)
RETURN
ENDIF
ENDIF
- 619 -
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 não 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 não existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
lMSHelpAuto := .T.
DbSelectArea("SN1IMP")
DbGotop()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Preparação para inicio do processamento ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
cKeyImp := DTOS(dDatabase)+StrZero(HoraToInt(Time()),6)
// Identidficador dos registros do log de erros
ConOut("Processando importação:")
ConOut("Inicio: "+Time())
ConOut("Registros SN1IMP: "+CValToChar(SN1IMP->(RecCount())))
ConOut("Registros SN2IMP: "+CValToChar(SN2IMP->(RecCount())))
ConOut("Registros SN3IMP: "+CValToChar(SN3IMP->(RecCount())))
DbSelectArea("SN1IMP")
DbGotop()
- 620 -
While SN1IMP->(!Eof())
nProcRegs++
oProcess:IncRegua1("Processando item: "+CValToChar(nProcRegs)+" / "+;
CValToChar(nTotRegs))
oProcess:IncRegua2("Ficha de Ativo: ")
aDadosSN1 := {}
aDadosSN3 := {}
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
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
- 621 -
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 := {}
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
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 -
ENDIF
Next nX
AADD(aDadosSN3,aItensSN3)
SN3IMP->(DbSkip())
Enddo
Begin Transaction
cFilAnt := SN1IMP->N1_FILIAL
lMsErroAuto := .F.
MSExecAuto({|x,y,z| Atfa010(x,y,z)},aDadosSN1,aDadosSN3,3)
// Cabeçalho, Itens e Opção
IF lMsErroAuto
aAutoErro := GETAUTOGRLOG()
XGRVLOG(cKeyImp,;
SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM),;
SN1IMP->N1_DESCRIC, XCONVERRLOG(aAutoErro))
DisarmTransaction()
MostraErro(Alltrim(MVParBox06))
ELSE
RECLOCK("SN2",.T.)
SN2->N2_FILIAL := SN1->N1_FILIAL
SN2->N2_CBASE := SN1->N1_CBASE
SN2->N2_ITEM := SN1->N1_ITEM
SN2->N2_TIPO := "01"
SN2->N2_SEQ := "001"
SN2->N2_SEQUENC := STRZERO(nX,2)
SN2->N2_HISTOR := SUBSTR(cHistorico,nX,40)
MSUNLOCK()
NEXT nX
ENDIF
End Transaction
- 623 -
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
- 624 -
DbSelectArea("LOGIMP")
DbCloseArea()
cFilAnt := cFilAtu
RestArea(aArea)
RETURN
/*/
+-----------------------------------------------------------------------
| Função | CT001PARBX | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | TELA DE PARAMETROS ESPECIFICOS DA ROTINA CUSTOMIZADA |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
LOCAL aParamBox := {}
LOCAL cTitulo := "Importacao de cadastros"
LOCAL aRet := {}
LOCAL bOk := {|| .T.}
LOCAL aButtons := {}
LOCAL lCentered := .T.
LOCAL nPosx
LOCAL nPosy
LOCAL cLoad := ""
LOCAL lCanSave := .T.
LOCAL lUserSave := .T.
LOCAL nX := 0
LOCAL lRet := .F.
- 625 -
RETURN lRet
/*/
+-----------------------------------------------------------------------
| Função | IATFCIAP | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | IMPORTACAO DO LIVRO FISCAL CIAP |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
STATIC FUNCTION IATFCIAP(aStruSF9,aDadosSF9)
Local aDadosCIAP := {}
Local nX := 0
Local nPosSF9 := 0
RETURN lMsErroAuto
- 626 -
/*/
+-----------------------------------------------------------------------
| Função | XDBFLOG | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | 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
/*/
+-----------------------------------------------------------------------
| Função | XGRVLOG | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | GRAVACAO DA MENSAGEM DE ERRO NO ARQUIVO DBF DE CONTROLE |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
STATIC FUNCTION XGRVLOG(cKeyImp, cKeyReg, cDescReg, cMsgErr)
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
- 627 -
/*/
+-----------------------------------------------------------------------
| Função | XCONVERRLOG | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | CONVERTE O ARRAY AAUTOERRO EM TEXTO CONTINUO. |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
FOR nX := 1 to Len(aAutoErro)
cRet += aAutoErro[nX]+CHR(13)+CHR(10)
NEXT nX
RETURN cRet
- 628 -
Nest e t ópico ser ão descrit as as funções da linguagem ADVPL que per m it em o envio e o
recebim ent o de m ensagens at rav és de e- m ails.
CALLPROC
M AI LSM TPON
M AI LPOPON
M AI LSM TPOFF
M AI LPOPOFF
M AI LRECEI VE
M AI LAUTH
POPM SGCOUN T
M AI LSEN D
M AI LGETERR
CALLPROC( )
Mét odo do obj et o oRpcSrv que perm it e a ut ilização de t odas as funções de envio e
recebim ent o de e- m ail descrit as nest e t ópico.
Pa r â m e t r os:
cFu n ca o Nom e da função ou m ét odo do obj et o oRpcSrv que será execut ado.
x Pa r a m N Parâm et r os da função ou m ét odo que será execut ado.
Re t or n o:
Nenhum .
- 629 -
CONNECT SMTP SERVER cServer ACCOUNT cUser PASSWORD cPass TIMEOUT nTimeOut IN
SERVER oRpcSrv RESULT lResult
Pa r â m e t r os:
Re t or n o:
Lógico I ndica se foi realizada com sucesso a conexão com o ser vidor indicado.
M AI LPOPON ( )
At iva um a conexão com o serviço de POP para a t hread at iva. - > lRet urn
CONNECT POP SERVER cServer ACCOUNT cUser PASSWORD cPass TIMEOUT nTimeOut IN
SERVER oRpcSrv RESULT lResult
Pa r â m e t r os:
Re t or n o:
Lógico I ndica se foi realizada com sucesso a conexão com o ser vidor indicado.
- 630 -
Pa r â m e t r os:
Nenhum .
Re t or n o:
M AI LPOPOFF( )
Sin t a x e : M a ilPopOff ( )
Pa r â m e t r os:
Nenhum .
Re t or n o:
- 631 -
RECEIVE MAIL MESSAGE nNumber FROM cFrom TO cTo CC cCc BCC cBcc SUBJECT
cSubject BODY cBody ATTACHMENT aFiles SAVE IN cPath DELETE IN SERVER oRpcSrv
RESULT lResult
Pa r â m e t r os:
Re t or n o:
Lógico I ndica se a oper ação de recebim ent o de m ensagens foi realizada com
sucesso.
- 632 -
Função que ex ecut a a aut ent icação do usuário no ser viço at ivo.
Pa r â m e t r os:
Re t or n o:
Lógico I ndica se foi realizada a aut ent icação do usuário com sucesso.
A função MailAut h( ) deverá ser ut ilizada obrigat oriam ent e após a abert ura da
conexão com o servidor , sej a ele de envio ou recebim ent o de m ensagens.
Para validação da conex ão sem pr e efet ue a v erificação com o usuário cont endo
o ender eço com plet o do e- m ail, e caso necessário som ent e com o usuário,
elim inando o r est ant e do ender eço após o caract er e “ @” .
- 633 -
Verifica quant as m ensagens exist em na caixa de ent rada do serviço POP at ivo.
Pa r â m e t r os:
n M sgCou n t Variável local do font e que será at ualizada com a quant idade de m ensagens
disponíveis para r ecebim ent o na caixa de e- m ails.
Re t or n o:
M AI LSEN D ( )
Sin t a x e : M a ilSe n d( cFr om , a To, a Cc, a Bcc, cSu bj e ct , cBod y, a File s, lTe x t )
SEND MAIL FROM cFrom TO aTo,... CC aCc,... BCC aBcc,... SUBJECT cSubject BODY
cBody FORMAT TEXT ATTACHMENT aFiles,... IN SERVER oRpcSrv RESULT lResult
Pa r â m e t r os:
Re t or n o:
- 634 -
Sin t a x e : M a ilGe t Er r ( )
Pa r â m e t r os:
Nenhum .
Re t or n o:
#include "protheus.ch"
#include "tbiconn.ch"
#include "AP5MAIL.CH"
/*/
+-----------------------------------------------------------------------
| Função | SENDMAIL | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | ENVIO DE E-MAIL GENERICO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
- 635 -
cMsg := "--------------------------------------------------"
cMsg += "CURSO DE ADVPL "
cMsg += "--------------------------------------------------"
cMsg += "Você está recebendo um e-mail do curso de ADVPL avançado"
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 terão: De, Para, Assunto e Mensagem, porém precisa analisar
se tem: Com Cópia 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 -
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 autenticação do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticação do e-mail:" + cError)
Endif
Endif
IF lResulSend
If _lJob
ConOut(Padc("E-mail enviado com sucesso",80))
Else
MsgInfo("E-mail enviado com sucesso" + cError)
Endif
ENDIF
RETURN lResulSend
- 637 -
#include "protheus.ch"
#include 'tbiconn.ch'
#include "AP5MAIL.CH"
/*/
+-----------------------------------------------------------------------
| Função | SENDMAIL | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | ENVIO DE E-MAIL GENERICO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
cMsg := "--------------------------------------------------"
cMsg += "CURSO DE ADVPL "
cMsg += "--------------------------------------------------"
cMsg += "Você está recebendo um e-mail do curso de ADVPL avançado"
//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
- 638 -
// Sintaxe: SEND MAIL FROM cDe TO cPara CC cCc SUBJECT cAssunto BODY cMsg
ATTACHMENT cAnexo RESULT lResulSend
// Todos os e-mail terão: De, Para, Assunto e Mensagem, porém precisa analisar
se tem: Com Cópia 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 autenticação do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticação do e-mail:" + cError)
Endif
Endif
Continuação:
- 639 -
IF lResulSend
If _lJob
ConOut(Padc("E-mail enviado com sucesso",80))
Else
MsgInfo("E-mail enviado com sucesso" + cError)
Endif
ENDIF
RETURN lResulSend
- 640 -
#include "protheus.ch"
#include "tbiconn.ch"
#include "AP5MAIL.CH"
/*/
+-----------------------------------------------------------------------
| Função | POPMAIL | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | RECEBIMENTO DE E-MAIL GENERICO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
If !lResulConn
cError := MailGetErr()
If _lJob
ConOut(Padc("Falha na conexao "+cError,80))
Else
MsgAlert("Falha na conexao "+cError)
Endif
Return(.F.)
Endif
- 641 -
/*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)
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
MsgInfo(cMessage,"E-mail Recebido")
Endif
Else
If _lJob
ConOut(Padc("Falha na autenticação do e-mail: "+cError,80))
Else
MsgAlert("Falha na autenticação do e-mail:" + cError)
Endif
Endif
MailPopOff()
- 642 -
IF lResulPop
If _lJob
ConOut(Padc("E-mails recebidos com sucesso",80))
Else
MsgInfo("E-mail recebidos com sucesso" + cError)
Endif
ENDIF
RETURN lResulPop
4 3 .1 . Ex por t a çã o pa r a EXCEL
A funcionalidade básica de export ação de infor m ações para o Micr osoft Excel ut iliza a função
DlgToExcel( ) , a qual perm it e que as inform ações em form at os de ar ray sej am geradas em um a
planilha.
D LGTOEXCEL( )
Realiza a export ação das inform ações do am bient e Prot heus em form at o de ar ray s para um a
planilha do Microsoft Ex cel.
Pa r â m e t r os:
Re t or n o:
Nenhum .
Na export ação das infor m ações par a o Microsoft Excel deve- se at ent ar para as
colunas que possuírem inform ações alfanum éricas m as que cont ém apenas
núm eros. Para que est as colunas sej am exibidas cor ret am ent e deve ser
acr escent ado um caract er especial no início da st ring de form a que o Microsoft
Excel as reconheça com o t ext o e não com o num éricas.
- 643 -
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------
| Função | GExpExcel | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Descrição | EXPORTACAO PARA EXCEL GENERICO |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Return
/*/
+-----------------------------------------------------------------------
| Função | GProcItens | Autor | Arnaldo R. Junior | Data | |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local aItem
Local nX
DbSelectArea("SA1")
DbSetOrder(1)
DbGotop()
- 644 -
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
- 645 -
- 646 -
LI NE PCOFXOK PMSTASK4
- 647 -
- 648 -
- 649 -
PI N S4WB013N SEMSOM
- 650 -
- 651 -
- 652 -
GOBOTTOM
- 653 -
Desenv olver um diálogo para int eragir com a classe Aluno desenvolvida no
02
ex er cício ant erior.
- 654 -
Desenv olver um a int erface de cadast r o que com bine os obj et os MsMGet e
05
MsNewGet Dados causando o efeit o de um a Modelo3( ) .
Convert er o font e DI ALOG_OBJETOS.PRW para sint axe orient ada à obj et os.
07
- 655 -
I m plem ent ar um a funcionalidade com m últ iplos TwBr owses que perm it a
09
pesquisar client es e visualizar os t ít ulos a r eceber dos m esm os.
I m plem ent ar um obj et o TFolder para m ont ar um r odapé para um a int er face
10
que cont enha MsMGet ( ) e MsNew Get Dados( ) .
- 656 -
I m plem ent ar no font e WndSqlConn desenv olvido ant eriorm ent e as funções
15 TcI nclui( ) , TcAlt era( ) , TcExclui( ) com o uso das funções TEnchoice( ) e
TcSqlExec( ) .
- 657 -
I m plem ent ar um a rot ina que r ealize o r ecebim ent o do e- m ail enviado
17
ant eriorm ent e para a cont a de e- m ail @t ot vs.
I m plem ent ar um a rot ina aut om át ica para grav ar as inform ações no cadast ro
18
de client es ( MATA030) .
- 658 -
Objetivos do projeto
Deverá ser entregue na data estabelecida pelo instrutor, contendo os fontes e demais arquivos
necessários. A avaliação do projeto será realizada após a entrega, no prazo estabelecido pelo
instrutor;
Pode ser realizado em grupos de até 03 pessoas. Caso existam alunos sem grupos, estes poderão
integrar equipes já formadas com o total de membros estabelecido, mediante aprovação do
instrutor;
Avaliação do projeto
Desenvolver uma aplicação utilizando a linguagem ADVPL que contemple as seguintes funcionalidades:
- 659 -
Oficina de Programação
Robson Luiz Estefani Gonçalves
- 660 -