Você está na página 1de 247

CLASSES VISUAIS

TSRCOBJECT
Caractersticas
Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser
instanciada diretamente.
Propriedades
Propriedade Tipo Descrio
nLeft Numrico. Coordenada horizontal em piels.
nTop Numrico. Coordenada vertical em piels.
n!idth Numrico. Lar"ura em piels.
n#ei"ht Numrico. Altura em piels.
cCaption Caractere. T$tulo ou conte%do do ob&eto.
cTooltip Caractere. 'ensa"em eibida (uando ob&eto eibe seu tooltip.
l)ho*#int L+"ico.
,la" (ue ativa .T. ou desativa .,. a eibio do tooltip do
ob&eto.
c's" Caractere.
'ensa"em eibida na barra de status da &anela principal
(uando o ob&eto "anha foco.
nClrTet Numrico. Cor do teto do ob&eto.
nClrPane Numrico. Cor do fundo do ob&eto.
b!hen
-loco de
c+di"o.
.ecutado (uando h/ movimentao de foco na &anela.)e
retornar .T. o ob&eto continua habilitado0 se retornar .,. o
ob&eto ser/ desabilitado.
b1alid
-loco de
c+di"o.
.ecutado (uando o conte%do do ob&eto modificado e
dever/ ser validado. Deve retornar .T. se o conte%do v/lido
e .,. se conte%do inv/lido.
blClic2ed
-loco de
c+di"o.
.ecutado (uando acionado clic2 do boto es(uerdo do
mouse sobre o ob&eto.
brClic2ed
-loco de
c+di"o.
.ecutado (uando acionado clic2 do boto direito do mouse
sobre o ob&eto.
blDblClic2
-loco de
c+di"o.
.ecutado (uando acionado duplo clic2 do boto es(uerdo
do mouse sobre o ob&eto.
o!nd 3b&eto. 4anela onde o ob&eto foi criado.
l1isible -ooleano. )e .T. o ob&eto vis$vel0 se .,. o ob&eto invis$vel.
Car"o
3b&eto ou
vari/vel.
Conte%do associado ao ob&eto.
bLost,ocus
-loco de
c+di"o.
.ecutado (uando ob&eto perde foco.
b5ot,ocus -loco de .ecutado (uando ob&eto "anha foco.
c+di"o.
Mtodos
SetFocus
)intae )et,ocus6 7
Descrio ,ora o foco de entrada de dados mudar para o ob&eto.
8etorno N9L
Hide
)intae #ide6 7
Descrio Torna ob&eto invis$vel.
8etorno N9L

So!
)intae )ho*6 7
Descrio Torna ob&eto vis$vel.
8etorno N9L

E"a#$e
)intae .nable6 7
Descrio #abilita o ob&eto.
8etorno N9L

%isa#$e
)intae Disable6 7
Descrio Desabilita o ob&eto.
8etorno N9L

Re&res
)intae 8efresh6 7
Descrio
,ora atualizao 6sincronia7 de propriedades entre o pro"rama e o
Protheus 8emote.
Caractersticas
')Dialo" deve ser utilizada como padro de &anela para entrada de dados. ')Dialo"
um tipo de &anela di/lo"o modal0 isto 0 no permite (ue outra &anela ativa receba dados
en(uanto esta estiver ativa.
Propriedades
1ide classes ancestrais.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:anTop;0 :anLeft;0 :an-ottom;0 :an8i"ht;0 :acCaption;0
:cPar<;0 :nPar=;0 :lPar>;0 :nPar?;0 :anClrTet;0 :anClr-ac2;0
:oPar@A;0 :ao!nd;0 :alPiel;0 :oPar@B;0 :oPar@<;0 :lPar@=;7
Par+,etros
ParCmetro Tipo D Descrio
anTop
Numrico0 opcional. Coordenada vertical superior em
piels ou caracteres.
anLeft
Numrico0 opcional. Coordenada horizontal es(uerda
em piels ou caracteres.
an-otom
Numrico0 opcional. Coordenada vertical inferior em
piels ou caracteres.
an8i"ht
Numrico0 opcional. Coordenada horizontal direita em
piels ou caracteres.
acCaption Caractere0 opcional. T$tulo da &anela.
cPar< 8eservado.
nPar= 8eservado.
lPar> 8eservado.
nPar? 8eservado.
anClrTet Numrico0opcional. Cor do teto.
anClr-ac2 Numrico0opcional. Cor de fundo.
oPar@A 8eservado.
ao!nd
3b&eto0 opcional. 4anela me da &anela a ser criada0
padro a &anela principal do pro"rama.
alPiel
L+"ico0 opcional. )e .T. considera as coordenadas
passadas em piels0 se .,. considera caracteres.
oPar@B 8eservado.
oPar@< 8eservado.
nPar@= 8eservado.
Retor"o 3 Di/lo"o criado.
E*e,p$o
#INCLUDE protheus.ch
User Function Teste()
// cria dilogo
Local oDlg:=MSDialog():New(10,10,300,300,Meu
dialogo,,,,,CLR_BLACK,CLR_WHITE,,,.T.)
// ativa dilogo centralizado
oDlg:Activate(,,,.T.,{||msgstop(validou!),.T.},,{||
msgstop(iniciando.) )
Return
%escri()o
Etilize a classe t-utton para criar um controle visual do tipo boto.
Propriedades
Nome Tipo D Descrio
lProcessin" L+"ico. )e .T. indica o boto est/ efetuando uma ao.
bAction -loco de c+di"o. .ecutado (uando o boto pressionado.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :acCaption;0 :ao!nd;0 :abAction;0
:an!idth;0 :an#ei"ht;0 :nPar>;0 :ao,ont;0 :lPar@F;0 :alPiel;0
:lPar@A;0:cPar@G;0 :lPar@H;0 :ab!hen;0 :bPar@<;0 :lPar@=;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
carateres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
acCaption Caractere0 opcional. Titulo do boto.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o boto
dever/ ser criado.
abAction
-loco de c+di"o0 opcional. -loco (ue dever/ ser
acionado (uando o boto for pressionado.
an!idth Numrico0 opcional. Lar"ura do boto em piels.
an#ei"ht Numrico0 opcional. Altura do boto em piels.
nPar> 8eservado.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont com propriedades
da fonte utilizada para o t$tulo do boto.
lPar@F 8eservado.
alPiel
L+"ico0 opcional. )e .T. considera as coordenadas
passadas em piels0 se .,. 6padro7 considera em
caracteres.
lPar@A 8eservado.
cPar@G 8eservado.
lPar@H 8eservado.
ab!hen
-loco de c+di"o0 opcional. .ecutado (uando mudana
de foco de entrada de dados est/ sendo efetuada na
&anela onde o controle foi criado. 3 bloco deve
retornar .T. se o controle deve permanecer habilitado ou
.,. se no.
bPar@< 8eservado.
lPar@= 8eservado.
E*e,p$o
#include protheus.ch
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, aItems:=
{item1,item2,item3}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop(Mudou item)},,,,.T.,,,,,,,,,cCombo)
// Boto para fechar a janela
oButton:=tButton():New(30,10,fechar,oDlg,{||
oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )
Return NIL
%escri()o
Etilize a classe tChec2bo (uando dese&ar criar um controle (ue possua dois estados .T.
ou .,..
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :acCaption;0 :ab)et5et;0 :ao!nd;0
:an!idth;0 :an#ei"ht;0 :nPar>;0 :abClic2;0 :ao,ont;0 :ab1alid;0
:anClr,ore;0 :anClr-ac2;0 :lPar@H;0 :alPiel;0 :cPar@<;0 :lPar@=;0
:ab!hen;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
carateres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
acCaption Caractere0 opcional. Teto eibido pelo controle.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no formato
IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue o controle
utiliza para atualizar a vari/vel LvarK. LvarK deve ser
tipo l+"ico0 se LvarK N .T. ento o controle aparecer/
checado.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
dever/ ser criado.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
nPar> 8eservado.
abClic2
-loco de c+di"o0 opcional. .ecutado (uando o
controle clic2 do boto es(uerdo do mouse acionado
sobre o controle.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont com propriedades
da fonte utilizada para o teto do controle.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deve ser validado0 deve
retornar .T. se o conte%do for v/lido e .,. (uando o
conte%do for inv/lido.
anClr,ore Numrico0 opcional. Cor de fundo do controle.
anClr-ac2 Numrico0 opcional. Cor do teto do controle.
lPar@H 8eservado.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas so
em piels0 se .,. so em caracteres.
cPar@< 8eservado.
lPar@= 8eservado.
ab!hen -loco de c+di"o0 opcional. .ecutado (uando mudana
de foco de entrada de dados est/ sendo efetuada na
&anela onde o controle foi criado. 3 bloco deve
retornar .T. se o controle deve permanecer habilitado ou
.,. se no.
Retor"o 3 ob&eto constru$do.
E*e,p$o
#include protheus.ch
User Function Teste()
Local oDlg, oButton, oCheck, lCheck:=.F.
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu programa
oCheck:= tCheckBox():New(10,10,funcionou?,;
{|u|if( pcount()>0,lCheck:=u,lCheck)};
,oDlg,100,20,,,,,,,,.T.)
oButton:=tButton():New(30,10,fechar,oDlg,{||oDlg:End()},;
100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
If lCheck
MsgStop( Funcionou! )
Endif
Return NIL
%escri()o
Etilize a classe tCombo-o para cria uma entrada de dados com m%ltipla escolha com
item definido em uma lista vertical0 acionada por ,H ou pelo boto es(uerdo localizado
na parte direita do controle. A vari/vel associada ao controle ter/ o valor de um dos
itens selecionados ou no caso de uma lista indeada0 o valor de seu $ndice.
Propriedades
Nome Tipo D Descrio
a9tems
ArraP. Lista de itens0 caracteres0 a serem eibidos. Pode ter os se"uintes
formatosM a7 )e(Qencial0 eemploM IRitem@S0SitemAS0...0SitemNSO ou b7 9ndeada0
eemploM IRaNitem@S0SbNitemAS0 ...0 RnNitemNSO.
nAt Numrico. Posio do item selecionado.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :ab)et5et;0 :an9tems;0 :an!idth;0
:an#ei"ht;0 :ao!nd;0 :nPar>;0 :abChan"e;0 :ab1alid;0 :anClrTet;0
:anClr-ac2;0 :alPiel;0 :ao,ont;0 :cPar@B;0 :lPar@<;0 :ab!hen;0
:lPar@>;0 :aPar@?;0 :bParAF;0 :cParA@;0 :ac8ead1ar;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no formato
IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue o controle
utiliza para atualizar a vari/vel LvarK. LvarK deve ser
tipo caracter. )e a lista for se(Qencial0 o controle
atualizar/ LvarK com o conte%do do item selecionado0
se a lista for indeada0 LvarK ser/ atualizada com o
valor do $ndice do item selecionado.
an9tems
ArraP0 opcional. Lista de items0 caracteres0 a serem
eibidos. Pode ter os se"uintes formatosM a7 )e(Qencial0
eemploM IRitem@S0SitemAS0...0SitemNSO ou b7
9ndeada0 eemploM IRaNitem@S0SbNitemAS0 ...0
RnNitemNSO.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
nPar> 8eservado.
abChan"e
-loco de c+di"o0 opcional. .ecutado (uando o
controle modifica o item selecionado.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deve ser validado0 deve
retornar .T. se o conte%do for v/lido e .,. (uando o
conte%do for inv/lido.
anClr-ac2 Numrico0 opcional. Cor de fundo do controle.
anClrTet Numrico0 opcional. Cor do teto do controle.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas so
em piels0 se .,. so em caracteres.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont utilizado para
definir as caracter$sticas da fonte utilizada para eibir o
conte%do do controle.
cPar@B 8eservado.
lPar@< 8eservado.
ab!hen -loco de c+di"o0 opcional. .ecutado (uando mudana
de foco de entrada de dados est/ sendo efetuada na
&anela onde o controle foi criado. 3 bloco deve retornar
.T. se o controle deve permanecer habilitado ou .,. se
no.
lPar@> 8eservado.
aPar@? 8eservado.
bParAF 8eservado.
cParA@ 8eservado.
ac8ead1ar
Caractere0 opcional. Nome da vari/vel (ue o controle
dever/ manipular0 dever/ ser a mesma vari/vel
informada no parCmetro ab)et5et0 e ser/ o retorno da
funo 8ead1ar6 7.
Retor"o 3 ob&eto criado.

Se$ect
%escri()o 'uda o item selecionado no combobo.
Si"ta*e )elect6 :an9tem; 7
Par+,etros
ParCmetro Tipo D Descrio
an9tem Numrico0 opcional. Posio do item a ser selecionado.
Retor"o N9L
E*e,p$o
#include protheus.ch
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, aItems:=
{item1,item2,item3}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop(Mudou item)},;
,,,.T.,,,,,,,,,cCombo)
// Boto para fechar a janela
@ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )
Return NIL
Caractersticas
tControl a classe comum entre todos os componentes visuais edit/veis.
Propriedades
Nome Tipo D Descrio
Ali"n
Numrico. Alinhamento do controle no espao disponibilizado pelo seu
ob&eto parente. F N Nenhum 6padro70 @N no topo0 A N no rodap0 GN a
es(uerda0 H N a direita e B N em todo o parente.
l'odified
L+"ico. )e .T. indica (ue o conte%do da vari/vel associada ao controle foi
modificado.
l8ead3nlP
L+"ico. )e .T. o conte%do da vari/vel associada ao controle permanecer/
apenas para leitura.
hParent
Numrico. #andle 6identificador7 do ob&eto sobre o (ual o controle foi
criado.
bChan"e
-loco de c+di"o. .ecutado (uando o estado ou conte%do do controle
modificado pela ao sobre o controle.
Mtodos
SetFocus
%escri()o ,ora mudana do foco de entrada de dados para o controle.
Si"ta*e )et,ocus6 7
REtor"o N9L
%escri()o
Etilize ob&eto t,ont para modificar a fonte padro de controles visuais.
Propriedades
1ide classes ancestrais.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:acName;0 :nParA;0 :an#ei"ht;0 :lParH;0 :al-old;0 :nPar<;0
:lPar=;0 :nPar>;0 :al9talic;0 :alEnderline;7
Par+,etros
ParCmetro Tipo D Descrio
acName
Caractere0 opcional. Nome da fonte0 o padro
RArialS.
nParA 8eservado.
an#ei"ht
Numrico0 opcional. Tamanho da fonte. 3 padro
T@@.
lParH 8eservado.
al-old L+"ico0 opcional. )e .T. o estilo da fonte ser/ ne"rito.
nPar< 8eservado.
lPar= 8eservado.
nPar> 8eservado.
al9talic L+"ico0 opcional. )e .T. o estilo da fonte ser/ it/lico.
alEnderline
L+"ico0 opcional. )e .T. o estilo da fonte ser/
sublinhado.
Retor"o 3 ob&eto criado.
E*e,p$o
#INCLUDE "PROTHEUS.CH"
User Function Teste()
Local oDlg, oSay
Local oFont:= TFont():New("Courier New",,-14,.T.)
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE "My dialog" PIXEL
// Apresenta o tSay com a fonte Courier New
oSay := TSay():New( 10, 10, {|| "Mensagem"},oDlg,, oFont,,,, .T.,
CLR_WHITE,CLR_RED )
/* o comando abaixo proporciona o mesmo resultado
@ 10,10 SAY oSay PROMPT "Mensagem" FONT oFont COLOR CLR_WHITE,CLR_RED
OF oDlg PIXEL
*/
oSay:lTransparent:= .F.
ACTIVATE MSDIALOG oDlg CENTERED
Return
%escri()o
Ese t5et para criar um controle (ue armazene ou altere o conte%do de uma vari/vel
atravs de di"itao. 3 conte%do da vari/vel s+ modicado (uando o controle perde o
foco de edio para outro controle.
Propriedades
Nome Tipo D Descrio
lPass*ord
L+"ico. )e .T. o controle se comporta como entrada de dados de senha0
eibindo asteriscos UVW para esconder o conte%do di"itado.
Picture Caractere. '/scara de formatao do conte%do a ser eibido.
Mtodos
'e!
%escri()o 'todo construtor do controle.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :ab)et5et;0 :ao!nd;0 :an!idth;0
:an#ei"ht;0 :acPict;0 :ab1alid;0 :anClr,ore;0 :anClr-ac2;0 :ao,ont;0
:lPar@A;0 :oPar@G;0 :alPiel;0 :cPar@B;0 :lPar@<;0 :ab!hen;0
:lPar@>;0 :lPar@?;0 :abChan"e;0 :al8ead3nlP;0 :alPass*ord;0
:cParAG;0 :ac8ead1ar;0 :cParAB;0 :lParA<;0 :nParA=;0 :lParA>;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no
formato IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue
o controle utiliza para atualizar a vari/vel LvarK.
LvarK deve ser tipo caracter0 numrico ou data.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
acPict
Caractere0 opcional. '/scara de formatao do
conte%do a ser eibido.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deve ser validado0 deve
retornar .T. se o conte%do for v/lido e .,. (uando o
conte%do for inv/lido.
anClr,ore Numrico0 opcional. Cor de fundo do controle.
anClr-ac2 Numrico0 opcional. Cor do teto do controle.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont utilizado para
definir as caracter$sticas da fonte utilizada para eibir
o conte%do do controle.
lPar@A 8eservado.
oPar@G 8eservado.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas
so em piels0 se .,. so em caracteres.
cPar@B 8eservado.
lPar@< 8eservado.
ab!hen
-loco de c+di"o0 opcional. .ecutado (uando
mudana de foco de entrada de dados est/ sendo
efetuada na &anela onde o controle foi criado. 3 bloco
deve retornar .T. se o controle deve permanecer
habilitado ou .,. se no.
lPar@> 8eservado.
lPar@? 8eservado.
abChan"e
-loco de c+di"o0 opcional. .ecutado (uando o
controle modifica o valor da vari/vel associada.
al8ead3nlP
L+"ico0 opcional. )e .T. o controle no poder/ ser
editado.
alPass*ord
L+"ico0 opcional. )e .T. o controle eibir/ asteriscos
RVS no lu"ar dos caracteres eibidos pelo controle para
simular entrada de senha.
cParAG 8eservado.
ac8ead1ar
Caractere0 opcional. Nome da vari/vel (ue o controle
dever/ manipular0 dever/ ser a mesma vari/vel
informada no parCmetro ab)et5et0 e ser/ o retorno da
funo 8ead1ar6 7.
cParAB 8eservado.
lParA< 8eservado.
nParA= 8eservado.
lParA> 8eservado.
Retor"o 3 controle constru$do.
E*e,p$o
#include protheus.ch
User Function TesteGet()
Local oDlg, oGet1, oButton, 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)
/* Tem o mesmo efeito
@ 10,10 MSGET oGet1 VAR nGet1 SIZE 100,20 OF oDlg PIXEL PICTURE @E
999,999.99 VALID nGet1>1000.00
*/
// Boto para fechar a janela
@ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +Transform(nGet1,@E 999,999.00) )
Return NIL
%escri()o
Etilize a classe t5roup para criar um painel onde controles visuais podem ser a"rupados
ou classificados. X criada uma borda com t$tulo em volta dos controles a"rupados.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:anTop;0 :anLeft;0 :an-ottom;0 :an8i"ht;0 :acCaption;0
:ao!nd;0 :anClrTet;0 :anClrPane;0 :alPiel;0 :lPar@F;7
Par+,etros
ParCmetro Tipo D Descrio
anTop
Numrico0 opcional. Coordenada vertical superior em
piels ou caracteres.
anLeft
Numrico0 opcional. Coordenada horizontal es(uerda
em piels ou caracteres.
an-ottom
Numrico0 opcional. Coordenada vertical inferior em
piels ou caracteres.
an8i"ht
Numrico0 opcional. Coordenada horizontal direita em
piels ou caracteres.
acCaption Caractere0 opcional. T$tulo do "rupo.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
anClrTet Numrico0 opcional. Cor do teto.
anClrPane Numrico0 opcional. Cor do fundo.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas so
em piels0 se .,. so em caracteres.
lPar@F 8eservado.
Retor"o 3 ob&eto criado.
E*e,p$o
#include protheus.ch
User function teste()
Local oDlg, oGroup, oGet1, oGet2, cGet1:=Space(10),;
cGet2:= Space(10)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE My test PIXEL
oGroup:= tGroup():New(10,10,200,200,grupo de gets,oDlg,,,.T.)
@ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL
@ 30,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oGroup PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
%escri()o
Etilize a classe tListbo para criar uma &anela com itens selecion/veis e barra de
rola"em. Ao selecionar um item0 uma vari/vel atualizada com o conte%do do item
selecionado.
Propriedades
Nome Tipo D Descrio
nAt Numrico. Posio do item selecionado.
a9tems ArraP de items caracteres. Lista do itens selecion/veis.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :ab)et5et;0 :aa9tems;0 :an!idth;0
:an#ei"th;0 :abChan"e;0 :ao!nd;0 :ab1alid;0 :anClr,ore;0
:anClr-ac2;0 :alPiel;0 :lPar@G;0 :abLD-LClic2;0 :ao,ont;0
:cPar@<;0 :lPar@=;0 :ab!hen;0 :aPar@?;0 :bParAF;0 :lParA@;0
:lParAA;0 :ab8i"htClic2; 7
Par+,etros ParCmetro Tipo D Descrio
an8o* Numrico0 opcional. Coordenada vertical em piels
ou caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em
piels ou caracteres.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no
formato IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7O
(ue o controle utiliza para atualizar a vari/vel
LvarK. LvarK deve ser tipo caracter ou numrica.
aa9tems
ArraP de items caracteres0 opcional. Lista de items
selecion/veis.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
abChan"e
-loco de c+di"o0 opcional. .ecutado (uando o
item selecionado alterado.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deve ser validado0 deve
retornar .T. se o conte%do for v/lido e .,. (uando o
conte%do for inv/lido.
anClr,ore Numrico0 opcional. Cor de fundo do controle.
anClr-ac2 Numrico0 opcional. Cor do teto do controle.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas
so em piels0 se .,. so em caracteres.
lPar@G 8eservado.
abLD-LClic2
-loco de c+di"o0 opcional. .ecutado (uando
acionado duplo clic2 do boto es(uerdo do mouse
sobre o controle.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont utilizado para
definir as caracter$sticas da fonte utilizada para
eibir o conte%do do controle.
cPar@< 8eservado.
lPar@= 8eservado.
ab!hen
-loco de c+di"o0 opcional. .ecutado (uando
mudana de foco de entrada de dados est/ sendo
efetuada na &anela onde o controle foi criado. 3
bloco deve retornar .T. se o controle deve
permanecer habilitado ou .,. se no.
aPar@? 8eservado.
bParAF 8eservado.
lParA@ 8eservado.
lParAA 8eservado.
ab8i"htClic2
-loco de c+di"o0 opcional. .ecutado (uando
acionado clic2 do boto direito do mouse sobre o
controle.
Retor"o 3 ob&eto criado.

Se$ect
%escri()o ,ora a seleo de um item.
Si"ta*e )elect6 :an9tem; 7
Par+,etros
ParCmetro Tipo D Descrio
n9tem Numrico0 opcional. Posio do item a ser selecionado.
Retor"o N9L

Add
%escri()o 9nsere ou adiciona novo item.
Si"ta*e Add6 cTet0 nPos 7
Par+,etros
ParCmetro Tipo D Descrio
cTet Caractere0 obri"at+rio. Teto do item.
nPos
Numrico0 obri"at+rio. )e F ou maior (ue o n%mero de
itens0 insere o item no final da lista. )e valor entre @ e
n%mero de itens0 insere o item na posio informada0
empurrando o item anterior para baio.
Retor"o N9L

Modi&-
%escri()o 'odifica o teto de um item.
Si"ta*e 'odifP6 cTet0 nPos 7
Par+,etros
ParCmetro Tipo D Descrio
cTet Caractere0 obri"at+rio. Novo teto do item.
nPos
Numrico0 obri"at+rio. Posio a ser modificada deve
ser maior (ue F e menor ou i"ual (ue o n%mero de itens.
Retor"o N9L

%e$
%escri()o Apa"a um item.
Si"ta*e Del6 nPos 7
Par+,etros
ParCmetro Tipo D Descrio
nPos
Numrico0 obri"at+rio. Posio a ser ecluida0 deve ser
maior (ue F e menor ou i"ual (ue o n%mero de itens.
Retor"o N9L

Le"
%escri()o 8etorna o n%mero de itens.
Si"ta*e Len6 7
Retor"o Numrico. N%mero de itens.

Reset
%escri()o Apa"a todos os itens.
Si"ta*e 8eset6 7
Retor"o N9L
E*e,p$o
#include protheus.ch
User Funcion Teste()
Local oDlg, oList, nList:= 1, 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
%escri()o
Etilize a classe t'eter para criar um controle (ue eibe uma r"ua 6"au"e7 de
processamento0 descrevendo o andamento de um processo atraves da eibio de uma
barra horizontal.
Propriedades
Nome Tipo D Descrio
nTotal
Numrico. N%mero total de passos at o preenchimento da r"ua de
processo.
lPercenta"e L+"ico. )e .T. considera o passo de movimentao em porcenta"em.
nClr-ar Numrico. Cor da barra de andamento.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :ab)et5et;0 :anTotal;0 :ao!nd;0 :an!idth;0
:an#ei"ht;0 :lPar>;0 :alPiel;0 :oPar@F;0 :cPar@@;0 :alNoPerc;0
:anClrPane;0 :nPar@H;0 :anClr-ar;0 :nPar@<;0 :lPar@=;7
Par+,etros ParCmetro Tipo D Descrio
an8o* Numrico0 opcional. Coordenada vertical em piels ou
caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no formato
IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue o controle
utiliza para atualizar a vari/vel LvarK. LvarK deve ser
tipo numrico.
anTotal
Numrico0 opcional. Numero total de passos at o
preenchimento da r"ua de processo.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
sera criado.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
lPar> 8eservado.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas so
em piels0 se .,. so em caracteres.
oPar@F 8eservado.
cPar@@ 8eservado.
alNoPerc
L+"ico0 opcional. )e .T. 6padro7 no considera os
passos de atualizao em porcenta"em.
anClrPane Numrico0 opcional. Cor de fundo do controle.
nPar@H 8eservado.
anClr-ar Numrico0 opcional. Cor da barra de andamento.
nPar@< 8eservado.
lPar@= 8eservado.
Retor"o 3 ob&eto criado.

Set
%escri()o Atualiza a posio da r"ua de processamento.
Si"ta*e )et6 :n1al; 7
Par+,etros
ParCmetro Tipo D Descrio
n1al
Numrico0 opcional. Novo valor da posio da r"ua de
processamento.
Retor"o N9L
E*e,p$o
#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
oMeter:= tMeter():New(10,10,{|u|if(Pcount()>0,nMeter:=u,nMeter)};
,100,oDlg,100,20,,.T.) // cria a rgua
// boto para ativar andamento da rgua
@ 30,10 BUTTON oBtn1 PROMPT Run OF oDlg PIXEL ACTION
RunMeter(oMeter)
@ 50,10 BUTTON oBtn2 PROMPT Stop OF oDlg PIXEL ACTION lStop:=.T.
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
STATIC Function RunMeter(oMeter)
If lRunning
Return
Endif
lRunning:= .T.
oMeter:Set(0) // inicia a rgua
While .T. .and. !lStop
Sleep(1000) // pra 1 segundo
ProcessMessages() // atualiza a pintura da janela, processa
mensagens do windows

nCurrent:= Eval(oMeter:bSetGet) // pega valor corrente da rgua
nCurrent+=10 // atualiza rgua
oMeter:Set(nCurrent)
if nCurrent==oMeter:nTotal
Return
endif
Enddo
lRunning:= .F.
lStop:= .F.
Return
%escri()o
Etilize a classe t'ulti"et para criar controle de edio de teto de m%ltiplas linhas.
Propriedades
Nome Tipo D Descrio
l!ord!rap L+"ico. )e .T.0 faz (uebra autom/tica de linhas.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :ab)et5et;0 :ao!nd;0 :an!idth;0
:an#ei"ht;0 :ao,ont;0 :al#)croll;0 :anClr,ore;0 :anClr-ac2;0
:oPar@@;0 :alPiel;0 :cPar@G;0 :lPar@H;0 :ab!hen;0 :lPar@<;0
:lPar@=;0 :al8ead3nlP;0 :ab1alid;0 :bParAF;0 :lParA@;0
:alNo-order;0 :alNo1)croll;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels
ou caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no
formato IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue
o controle utiliza para atualizar a vari/vel LvarK.
LvarK deve ser tipo caracter.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont utilizado para
definir as caracter$sticas da fonte utilizada para eibir
o conte%do do controle.
al#)croll
L+"ico0 opcional. )e .T.0 habilita barra de rola"em
horizontal.
anClr,ore Numrico0 opcional. Cor de fundo do controle.
anClr-ac2 Numrico0 opcional. Cor do teto do controle.
oPar@@ 8eservado.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas
so em piels0 se .,. so em caracteres.
cPar@G 8eservado.
lPar@H 8eservado.
ab!hen
-loco de c+di"o0 opcional. .ecutado (uando
mudana de foco de entrada de dados est/ sendo
efetuada na &anela onde o controle foi criado. 3 bloco
deve retornar .T. se o controle deve permanecer
habilitado ou .,. se no.
lPar@< 8eservado.
lPar@= 8eservado.
al8ead3nlP
L+"ico0 opcional. )e .T. o controle so permitira
leitura.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deve ser validado0 deve retornar
.T. se o conte%do for v/lido e .,. (uando o conte%do
for inv/lido.
bParAF 8eservado.
lParA@ 8eservado.
alNo-order L+"ico0 opcional. )e .T. cria controle sem borda.
alNo1)croll
L+"ico0 opcional. )e .T.0 habilita barra de rola"em
vertical.
Retor"o 3 ob&eto criado.

E"a#$eVScro$$
%escri()o #abilita a barra de rola"em vertical.
Si"ta*e .nable1)croll6 l.nable 7
Par+,etros
ParCmetro Tipo D Descrio
l.nable
L+"ico0 obri"at+rio. )e .T. habilita se .,. desabilita a
barra de rola"em.
Retor"o N9L

E"a#$eHScro$$
%escri()o #abilita a barra de rola"em horizontal.
Si"ta*e .nable#)croll6 l.nable 7
Par+,etros
ParCmetro Tipo D Descrio
l.nable
L+"ico0 obri"at+rio. )e .T. habilita se .,. desabilita a
barra de rola"em.
Retor"o N9L
E*e,p$o
#include protheus.ch
User Function Teste()
Local oDlg, oMemo, cMemo:= space(50)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test
oMemo:= tMultiget():New(10,10,{|u|if(Pcount()>0,cMemo:=u,cMemo)};
,oDlg,100,100,,,,,,.T.)
@ 200,10 BUTTON oBtn PROMPT Fecha OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop(cMemo)
Return NIL
%escri()o
Etilize a classe tPanel (uando dese&ar criar um painel est/tico0 onde podem ser criados
outros controles com o ob&etivo de or"anizar ou a"rupar componentes visuais.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :acTet;0 :ao!nd;0 :ao,ont;0 :alCentered;0
:lPar<;0 :anClrTet;0 :anClr-ac2;0 :an!idth;0 :an#ei"ht;0
:alLo*ered;0 :al8aised;7
Par+,etros
ParCmetro Tipo D Descrio
an8o* Numrico0 opcional. Coordenada vertical em piels.
anCol Numrico0 opcional. Coordenada horizontal em piels.
acTet Caractere0 opcional. Teto a ser eibido ao fundo.
ao!nd
3b&eto0 opcional. 4anela ou controle onde ser/ criado o
ob&eto.
alCentered
L+"ico0 opcional. )e .T. eibe o teto de t$tulo ao
centro do controle.
lPar< 8eservado.
anClrTet Numrico0 opcional. Cor do teto do controle.
anClr-ac2 Numrico0 opcional. Cor do fundo do controle.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
alLo*ered
L+"ico0 opcional. )e .T. eibe o painel rebaiado em
relao ao controle de fundo.
al8aised
L+"ico0 opcional. )e .T. eibe a borda do controle
rebaiada em relao ao controle de fundo.
Retor"o 3 ob&eto criado.
E*e,p$o
#include protheus.ch
User Function Teste()
Local oDlg, oPanel, oBtn1, oBtn2
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test
oPanel:= tPanel():New(10,10,,oDlg,,,,,CLR_BLUE,100,100) // cria o
painel
@ 10,10 BUTTON oBtn1 PROMPT hide OF oPanel ACTION oPanel:Hide() //
cria boto sobre o painel
@ 200,10 BUTTON oBtn2 PROMPT show OF oDlg ACTION oPanel:Show() //
cria boto fora o painel
ACTIVATE MSDIALOG oDlg CENTERED
Return
%escri()o
Etilize a classe t8ad'enu para criar um controle (ue possibilita escolha de item atravs
de uma lista.
Propriedades
Nome Tipo D Descrio
n3ption Numrico. 9tem selecionado.
a9tems ArraP de caracteres. Lista de items selecion/veis.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :aac9tems;0 :ab)et5et;0 :ao!nd;0 :aPar<;0
:abChan"e;0 :anClrTet;0 :anClrPan;0 :cPar@F;0 :lPar@@;0 :ab!hen;0
:an!idth;0 :an#ei"ht;0 :ab1alid;0 :lPar@<;0 :lPar@=;0 :alPiel;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
aac9tems ArraP de caracteres0 opcional. Lista de opYes.
ab)et5et
-loco de c+di"o0 opcional. -loco de c+di"o no formato
IJuJ if6 Pcount6 7KF0 LvarKMN u0 LvarK 7 O (ue o controle
utiliza para atualizar a vari/vel LvarK. LvarK deve ser
tipo numrico.
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
aPar< 8eservado.
abChan"e
-loco de c+di"o0 opcional. .ecutado (uando o item
selecionado alterado.
anClrTet Numrico0 opcional. Cor do teto do controle
anClrPan Numrico0 opcional. Cor de fundo do controle.
cPar@F 8eservado.
lPar@@ 8eservado.
ab!hen
-loco de c+di"o0 opcional. .ecutado (uando mudana
de foco de entrada de dados est/ sendo efetuada na
&anela onde o controle foi criado. 3 bloco deve
retornar .T. para (ue o controle permanea habilitado0
ou .,. se no.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
ab1alid
-loco de c+di"o0 opcional. .ecutado (uando o
conte%do do controle deva ser validado0 retornando .T.
se o conte%do for v/lido0 e .,. (uando inv/lido.
lPar@< 8eservado.
Lpar@= 8eservado.
alPiel
L+"ico0 opcional. )e .T. as coordenadas informadas so
em piels0 se .,. so em caracteres.
Retor"o 3 ob&eto criado.

E"a#$eIte,
%escri()o #abilita ou desabilita item.
Si"ta*e .nable9tem6 :n9tem;0 :l.nable;7
Par+,etros
ParCmetro Tipo D Descrio
n9tem Numrico0 opcional. 9tem selecionado.
l.nable
L+"ico0 opcional. )e .T. habilita o item se .,. desabilita
o item.
Retor"o N9L
E*e,p$o
#include protheus.ch
User Function Teste()
Local oDlg, oButton, oRadio, nRadio:=1
Local aOptions:={escolha1,escolha2}
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Get
oRadio:= tRadMenu():New(10,10,aOptions,;
{|u|if(PCount()>0,nRadio:=u,nRadio)},;
oDlg,,,,,,,,100,20,,,,.T.)
@ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop(Escolheu +aOptions[nRadio] )
Return NIL
%escri()o
3 ob&eto tipo t)aP eibe o conte%do de teto est/tico sobre uma &anela ou controle.
Propriedades
Nome Tipo D Descrio
l!ord!rap
L+"ico. )e .T. (uebra o teto em v/rias linhas de maneira a en(uadrar o
conte%do na /rea determinada para o controle0 sendo o padro .,.
lTransparent
L+"ico. )e .T. a cor de fundo do controle i"norada assumindo o conte%do
ou cor do controle ou &anela ao fundo0 sendo o padro .T.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:an8o*;0 :anCol;0 :abTet;0 :ao!nd;0 :acPicture;0 :ao,ont;0
:lPar=;0 :lPar>;0 :lPar?;0 :alPiels;0 :anClrTet;0 :anClr-ac2;0
:an!idth;0 :an#ei"ht;0 :lPar@B;0 :lPar@<;0 :lPar@=;0 :lPar@>;0
:lPar@?;7
Par+,etros ParCmetro Tipo D Descrio
an8o*
Numrico0 opcional. Coordenada vertical em piels ou
caracteres.
anCol
Numrico0 opcional. Coordenada horizontal em piels
ou caracteres.
abTet
Codebloc20 opcional. Zuando eecutado deve retornar
uma cadeia de caracteres a ser eibida.
ao!nd
3b&eto0 opcional. 4anela ou di/lo"o onde o controle
ser/ criado.
acPicture
Caractere0 opcional. Picture de formatao do conte%do
a ser eibido.
ao,ont
3b&eto0 opcional. 3b&eto tipo t,ont para confi"urao
do tipo de fonte (ue ser/ utilizado para eibir o
conte%do.
lPar= 8eservado.
lPar> 8eservado.
lPar? 8eservado.
alPiels
L+"ico0 opcional. )e .T. considera coordenadas
passadas em piels se .,.0 padro0 considera as
coordenadas passadas em caracteres.
anClrTet Numrico0 opcional. Cor do conte%do do controle.
anClr-ac2 Numrico0 opcional. Cor do fundo do controle.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
lPar@B 8eservado.
lPar@< 8eservado.
lPar@= 8eservado.
lPar@> 8eservado.
lPar@? 8eservado.
Retor"o 3 ob&eto criado.

SetTe*t
%escri()o 'odifica o conte%do a ser eibido pelo controle.
Si"ta*e )etTet6 :1al; 7
Par+,etros
ParCmetro Tipo D Descrio
1al
Caracter D Numrico D Data0 3pcional. 1alor a ser
eibido.
Retor"o N9L
E*e,p$o
#include protheus.ch
User Function Teste()
Local oDlg, oSay
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL
oSay:= tSay():New(10,10,{||para exibir},oDlg,,,,;
,,.T.,CLR_WHITE,CLR_RED,100,20)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL
%escri()o
Etilize a classe t)crollbo para criar um painel com scroll deslizantes nas laterais do
controle.
Mtodos
'e!
%escri()o 'todo construtor da classe.
Si"ta*e
Ne*6:ao!nd;0 :anTop;0 :anLeft;0 :an#ei"ht;0 :an!idth;0
:al1ertical;0 :al#orizontal;0 :al-order;7
Par+,etros
ParCmetro Tipo D Descrio
ao!nd
3b&eto0 opcional. 4anela ou controle onde o controle
ser/ criado.
anTop Numrico0 opcional. Coordenada vertical em piels.
anLeft
Numrico0 opcional. Coordenada horizontal em
piels.
an#ei"ht Numrico0 opcional. Altura do controle em piels.
an!idth Numrico0 opcional. Lar"ura do controle em piels.
al1ertical
L+"ico0 opcional. )e .T. eibe a barra de scroll
vertical.
al#orizontal
L+"ico0 opcional. )e .T. eibe a barra de scroll
horizontal.
al-order L+"ico0 opcional. )e .T. eibe a borda do controle.
Retor"o 3 ob&eto criado.
E*e,p$o
#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 400,400 PIXEL My test
oScr:= TScrollBox():New(oDlg,10,10,200,200,.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 NIL
Caractersticas
Classe de &anela principal de pro"rama0 dever/ eistir apenas uma instCncia deste ob&eto
na eecuo do pro"rama.
Propriedades
b9nit -loco de c+di"o. .ecutado (uando a &anela est/ sendo eibida.
l.scClose L+"ico. )e .T. habilita o L.)CK cancelar a eecuo da &anela.
oCtl,ocus 3b&eto. 3b&eto contido na &anela (ue est/ com foco de entrada de dados.
Mtodos
'e!
%escri()o 'todo construtor da &anela.
Si"ta*e
Ne*6 :anTop;0 :anLeft;0:an-ottom;0 :an8i"ht;0 :acTitle;0 :nPar<;0
:oPar=; 0:oPar>;0:oPar?;0 :aoParent;0 :lPar@@;0 :lPar@A;0
:anClr,ore;0 :anClr-ac2;0 :oPar@B;0 :cPar@<;0 :lPar@=;0 :lPar@>;0
:lPar@?;0 :lParAF;0 :alPiel; 7[
Par+,etros ParCmetro Tipo D Descrio
nTop
Numrico0 opcional. Coordenada vertical superior em
piels ou caracteres.
nLeft
Numrico0 opcional. Coordenada horizontal es(uerda
em piels ou caracteres.
n-ottom
Numrico0 opcional. Coordenada vertical inferior em
piels ou caracteres.
n8i"ht
Numrico0 opcional. Coordenada horizontal inferior em
piels ou caracteres.
cTitle Caractere0 opcional. T$tulo da &anela.
nPar< 8eservado.
oPar= 8eservado.
oPar> 8eservado.
oPar? 8eservado.
oParent 3b&eto0 opcional. 4anela me da &anela corrente.
lPar@@ 8eservado.
lPar@A 8eservado.
nClr,ore Numrico0 opcional. Cor de fundo da &anela.
nClrTet Numrico0 opcional. Cor do teto da &anela.
oPar@B 8eservado.
cPar@< 8eservado.
lPar@= 8eservado.
lPar@> 8eservado.
lPar@? 8eservado.
lParAF 8eservado.
lPiel
L+"ico0 opcional. )e .T. 6padro7 considera coordenadas
passadas em piels0 se .,. considera caracteres.
Retor"o 3b&eto. A &anela constru$da.

Acti.ate
%escri()o Ativa 6eibe7 a &anela. Chamar esse mtodo apenas uma vez.
Si"ta*e
Activate6:ac)ho*;0 :bParA;0 :bParG;0 :bParH;0 :bParB;0 :bPar<;0
: ab9nit ;0 :bPar>;0 :bPar?;0 :bPar@F;0 :bPar@@;0 :bPar@A; 0:bPar@G;0
:bPar@H;0 :bPar@B;0 :ab1alid;0 :bPar@=;0 :bPar@>; 7.
Par+,etros
ParCmetro Tipo D Descrio
ac)ho*
Caracter0 opcional. R9C3N9\.DS para &anela iconizada
ou R'A]9'9\.DS para &anela maimizada.
bParA 8eservado.
bParG 8eservado.
bParH 8eservado.
bParB 8eservado.
bPar< 8eservado.
ab9nit
-loco de c+di"o. .ecutado (uando &anela est/ sendo
eibida.
bPar> 8eservado.
bPar? 8eservado.
bPar@F 8eservado.
bPar@@ 8eservado.
bPar@A 8eservado.
bPar@G 8eservado.
bPar@H 8eservado.
bPar@B 8eservado.
ab1alid
-loco de c+di"o. .ecutado (uando a &anela for
solicitada de fechar. Dever/ retornar .T. se o conte%do
da &anela for v/lido0 ou .,. se no. )e o bloco retornar
.,. a &anela no fechar/.
bPar@= 8eservado.
bPar@> 8eservado.
Retor"o N9L

E"d
%escri()o )olicita encerramento da &anela.
Si"ta*e .nd6 7
Retor"o L+"ico. .T. se encerrou a &anela e .,. se no.

Ce"ter
%escri()o Centraliza a &anela.
Si"ta*e Center6 7
Retor"o N9L
E*e,p$o
#INCLUDE "PROTHEUS.CH"
USER FUNCTION Teste()
Local oWindow
Local abInit:= {||conout("ativando!")}
Local abValid:= {||conout("encerrando!"),.T.}
oWindow:= tWindow():New( 10, 10, 200, 200, "Meu
programa",,,,,,,,CLR_WHITE,CLR_BLACK,,,,,,,.T. )
oWindow:Activate("MAXIMIZED",,,,,,abInit,,,,,,,,,abValid,,)
/* os comandos abaixo proporcionam o mesmo resultado
DEFINE WINDOW oWindow FROM 10, 10 TO 200,200 PIXEL TITLE "Meu
programa" COLOR CLR_WHITE,CLR_BLACK
ACTIVATE WINDOW oWindow MAXIMIZED ON INIT abInit VALID abValid
*/
Return NIL
CLASSES '/O VISUAIS
%escri()o
A T'ail'ana"er uma classe (ue tem por finalidade criar coneYes em servidores
)'TP ou P3P
'todos
'todo Descrio
CHANGEFOLDER
'todo C#AN5.,3LD.8 usado apenas para coneo
IMAP0
3 mtodo Chan"e,older67 da classe T'ail'ana"er tem
como ob&etivo realizar a mudana de pasta em (ue estamos
conectados.
COPYMSG
'todo C3P^')5 usado apenas para coneo IMAP.
3 mtodo CopP's"67 da classe t'ail'ana"er tem como
ob&etivo Copiar uma determinada mensa"em da pasta
corre"te e, 1ue esta,os posicio"ados "o ser.idor
IMAP para uma outra pasta no servidor0 ou at mesmo para
a pasta corrente.
X muito importante entendermos a localizao (ue estamos
no server 9'AP0 isso (uando usamos funoes (ue lidam
com o posicionamento no folder do servidor 9'AP como
chan"e,older670 create,older67 ou delete,older67.
Para Copiar uma mensa"em devemos informar (ual
mensa"em (ueremos mover atravs do primeiro parametro
da funo e a pasta de acordo com o nome no servidor
9'AP0 a funo ir/ procurar pelo 9D da mensa"em apenas
na pasta em (ue estamos posicionados e tentar/ mover para
o folder informado6lembrando (ue o nome deve ser
identico ao criado no servidor7
CREATEFOLDER
'todo C8.AT.,3LD.8 usado apenas para coneo
IMAP
3 mtodo Create,older67 da classe t'ail'ana"er tem
como ob&etivo realizar a criao de uma nova pasta de
mensa"ens no servidor de emails 9'AP.
Para se criar uma pasta no diret+rio root do servidor 9'AP
basta apenas passar o nome da pasta (ue dese&amos0 sem
path al"um de um device.
Para se criar uma subpasta0 devemos informar a hierar(uia
de pastas e o nome da pasta. Para se criar uma subpasta de
9nbo0 basta chamar a funo create folder informando
_9nbo`Teste_ e assim por diante.
DELETEFOLDER
'todo D.L.T.,3LD.8 usado apenas para coneo
IMAP0
3 mtodo Delete,older67 da classe t'ail'ana"er0 tem
como ob&etivo deletar uma pasta do servidor de email
9'AP.
9nformando a pasta (ue ser/ deletada por parametro na
funo0 (ue deve conter o nome passado idantico ao da
pasta no sevidor 6case sensitive7.
DELETEMSG
'todo D.L.T.')5
3 mtodo Delete's"67 da classe t'ail'ana"er tem como
ob&etivo deletar uma determinada mensa"em do servidor0
de acordo com o numero da mensa"em passada por
parametro para a funo.
A funo ir/ retornar true caso tenha sido encontrado a
mensa"em e deletada.
GETALLFOLDERLIST
'todo 5.TALL,3LD.8L9)T usado apenas para
coneo IMAP.
3 mtodo 5etAll,olderList67 da classe T'ail'ana"er0 tem
como ob&etivo obter todas as pastas de determinada conta
de email0 (ue esto no servidor email 9'AP.
3 mtodo retorna todas as pastas assi"adas6so as pastas
abilitadas ou )ubscribe7e ")o assi"adas0 esse retorno vem
em forma de arraP0 do se"uinte modoM
arraP:@;
arraP:@;:@;McNome
arraP:@;:A;MnNum's"
arraP:@;:G;MnNum's"NaoLidas
arraP:@;:H;Mc)tatus
M M
M M
cStatus2 9 N N39N,.893)0 N N N3).L.CT0 ' N
'Ab.D e E N EN'A8b.D
"'u,Ms32 Zuantidade de mensa"ens (ue eistem na
pasta.
c'o,e2 3 respectivo nome da pasta.
"'u,Ms3'aoLidas2 Numero de mensa"ens nao lidas na
pasta
GETERRORSTRING
'todo 5.T.8838)T89N5
3 mtodo 5et.rror)trin" da classe T'ail'ana"er0 tem
como ob&etivo retornar um erro em forma de strin"0
trazendo sua descrio de acordo com al"um erro (ue tenha
ocorrido durante al"uma outra funo da classe com
)end'ail670 al"um connect e assim por diante.
3 valor informado por parametro representa erros definidos
por padro do protocolo de coneo )'TP.
GETFOLDER
'todo 5.T,3LD.8 usado apenas para coneo IMAP.
3 mtodo "et,older da classe t'ail'ana"er tem como
ob&etivo obter o folder corrente em (ue estamos
posicionados6est/ em uso7 no servidor 9'AP.
A funo ir/ retornar o nome do folder0 de acordo com o
nome criado no servidor.
GETFOLDERLIST 'todo 5.T,3LD.8L9)T usado apenas para coneo
IMAP.
3 mtodo 5et,olderList67 da classe T'ail'ana"er0 tem
como ob&etivo obter todas as pastas de determinada conta
de email0 (ue esto no servidor email 9'AP.
3 mtodo retorna todas as pastas assi"adas6so as pastas
abilitadas ou )ubscribe70 esse retorno vem em forma de
arraP0 do se"uinte modoM
arraP:@;
arraP:@;:@;McNome
arraP:@;:@;MnNum's"NaoLidas
arraP:@;:@;MnNum's"
arraP:@;:@;Mc)tatus
M M
M M
cStatus2 9 N N39N,.893)0 N N N3).L.CT0 ' N
'Ab.D e E N EN'A8b.D
"'u,Ms32 Zuantidade de mensa"ens (ue eistem na
pasta.
c'o,e2 3 respectivo nome da pasta.
"'u,Ms3'aoLidas2 Numero de mensa"ens nao lidas da
pasta
GETMSGBODY
'todo 5.T')5-3D^ usado apenas para coneo
IMAP.
3 mtodo 5et's"-odP67 da classe de t'ail'ana"er tem
como ob&etivo obter o conteudo da mensa"em indicada de
acordo com o parametro (ue representa o numero da
mensa"em para a funo.
3 valor informado por parametro o numero da mensa"em
na pasta do servidor. 3 mtodo ir/ procurar pela mensa"em
no folder (ue estiver posicionado no server 9'AP.
GETMSGHEADER
'todo 5.T')5#.AD.8 usado apenas para coneo
IMAP.
3 mtodo 5et's"#eader67 da classe t'ail'ana"er tem
como ob&etivo se comunicar com o server de email 9'AP e
obter o cabealho da mensa"em re(uerida de acordo com o
parametro informando.
.sse cabealho da mensa"em contem todos os dados
relativos ao email como M ,rom0 To0 CC0 -CC0 etc...
3 valor informado por parametro o numero da mensa"em
na pasta do servidor.
3bs.M o servidor 9'AP ir/ procurar pela mensa"em apenas
na pasta corrente em uso0 caso a pasta em uso se&a a _9nbo_
o mensa"em ser/ procurada apenas na nesta pasta.
GETNUMMSGS
'todo 5.TNE'')5)
3 mtodo 5etNum's"s67 da classe T'ail'ana"er tem
como ob&etivo retornar o numero de mensa"ens (ue
eistem no servidor.
Devemos informar um numrico no parametro da funo
como referancia0 indicando o total de mensa"ens ap+s a
eecuo da funo0 o valor retornado pela funo apenas
o status de funcionou ou no.
3bs.M A funo retorna o numero de mensa"ens total da
conta de usu/rio informada e nao apenas por pasta como
inbo0 sent itens0 etc..
GETPOPTIMEOUT
'todo 5.TP3PT9'.3ET
3 mtodo 5etPopTime3ut67 da classe t'ail'ana"er tem
como ob&etivo retornar o tempo em se"undos (ue
est/ estabelecido com o servidor POP para (ue se&a
finalizada a coneo por timeTout.
3bs.M caso nao tenha sido estabelecido nenhum tempo de
timeTout pela funo ).TP3PT9'.3ET0 ser/ retornado
F6zero7.
GETSMTPTIMEOUT
'todo 5.T)'TPT9'.3ET
3 mtodo 5et)'TPTime3ut67 da classe t'ail'ana"er
tem como ob&etivo retornar o tempo em se"undos (ue
est/ estabelecido com o servidor SMTP para (ue se&a
finalizada a coneo por timeTout.
3bs.M caso nao tenha sido estabelecido nenhum tempo de
timeTout pela funo ).T)'TPT9'.3ET0 ser/ retornado
F6zero7.
GETUSER
'todo 5.TE).8
3 mtodo usado apenas para coneo IMAP.
A funo 5etEser67 da classe de email t'ail'ana"er tem
como ob&etivo obter o usuario corrente em (ue estamos
lo"ados no momento.
A funo ir/ retornar uma strin" contendo o valor da conta
de email do usuario antes do c.
IMAPCONNECT
'todo 9'APC3NN.CT usado apenas para coneo
IMAP0
3 mtodo 9'APConnect67 da classe T'ail'ana"er tem
como ob&etivo realizar a coneo em um 9'AP eTmail
server e sincroniza o mailbo folders.
A coneo atravs de 9'AP trataTse de um mtodo de
acesso a mensa"ens eletrdnicas armazenadas em um
servidor local ou remoto.
3 mtodo ir/ se conectar de acordo com os dados
informados atravs do mtodo init67.
O#s02U,a caracterstica i,porta"te do IMAP
per,itir 1ue a ,a"ipu$a()o de ,e"sa3e"s e pastas se4a
&eita co,o se esti.esse, "o co,putador $oca$0 Se,pre
1ue &or esta#e$ecida u,a co"e*)o co, ser.idor IMAP
atra.s da &u"()o i,apCo""ect56 i,porta"te &i"a$i7ar
a co"e*)o uti$i7a"do a i,ap%isco""ect560
IMAPDISCONNECT
'todo 9'APD9)C3NN.CT usado apenas para coneo
IMAP.
3 mtodo 9'APDisConnect67 da classe T'ail'ana"er tem
como ob&etivo realizar o fim da coneo entre a aplicao
e um 9'AP eTmail server.
3bs.M sempre (ue for estabelecida uma coneo com
servidor 9'AP atravs da funo imapConnect67
importante finalizar a coneo utilizando a disconnect.
IMAPSTORE
'todo 9'AP)T38. usado apenas para coneo IMAP
3 mtodo imap)tore67 da classe t'ail'ana"er tem como
ob&etivo armazenar uma determinada mensa"em em al"um
folder do servidor 9'AP.
3bs.M A funo muito util (uando por eemplo dese&amos
(ue ao enviar uma mensa"em ela se&a salva em al"uma
pasta do server 9'AP.
INIT
'todo 9N9T
Atravs desse mtodo da classe t'ail'ana"er0
iniciamos uma nova coneo com um servidor de
emails POP ou SMTP0
Zuando informamos por ar"umento o servidor pop 6..M
popG.microsi"a.com.br7 (ue si"inifica o protocolo usado
na internet para a recebimento de mensa"ens ao usu/rio
final e o servidor s,tp 6..M smtp.microsi"a.com.br7 (ue
si"inifica o protocolo usado na internet para a envio de
mensa"ens ao usu/rio final0 devemos tambm informar um
usuario (ue este&a devidamente cadastrado no servidor e
sua senha.
Podemos ainda informar o tempo de timeout para (ueda da
coneo e ainda o numero de porta0 caso a porta do servidor
dese&ado no se&a a default de um s,tp
MOVEMSG
'todo '31.')5 usada apenas para coneo IMAP.
A funo 'ove's"67 da classe t'ail'ana"er tem como
ob&etivo mover uma determinada mensa"em da pasta
corre"te e, 1ue esta,os posicio"ados "o ser.idor
IMAP para uma outra pasta no servidor.
X muito importante entendermos a localizao (ue estamos
no server 9'AP0 isso (uando usamos funoes (ue lidam
com os folder como chan"e,older670 create,older67 ou
delete,older67.
Para mover uma mensa"em devemos informar (ual
mensa"em (ueremos mover atravs do primeiro parametro
da funo e a pasta de acordo com o nome no servidor
9'AP0 a funo ir/ procurar pelo 9D da mensa"em apenas
na pasta em (ue estamos posicionados e tentar/ mover para
o folder informado6lembrando (ue o nome deve ser
identico ao criado no servidor7
NEW
Contrutor da Classe t'ail'ana"er.
8etorna uma nova instCncia do 3b&eto da Classe
t'ail'ana"er.
Antes da utilizao das funYes eDou propriedades da classe
de email necessario criarmos uma instancia da classe
atravs do contrutor Ne*67.
POPCONNECT
'todo P3PC3NN.CT
3 mtodo PopConnect67 da classe Tmail'ana"er se
conecta com o servidor de email0 atravs dos parametros
(ue foram informados atravs do mtodo 9N9T67.
Com esse mtodo realizamos a coneo no servidor POP0
ou se&a0 apenas realizaremos o recebimento das mensa"ens
eistentes na caia postal do usuario informado.
POPDISCONNECT
'todo P3PD9)C3NN.CT
3 mtodo P3PDisconnect67 da classe T'ail'ana"er ir/
realizar o fim da coneo com o servidor P3P0 se
desconectando apenas com o servidor P3P.
Ao solicitar a finalizao da coneo com o servidor
P3P0 a funo ir/ retornar o status da operao0 caso tenha
sido bem sucedida retorna F0 outros valores de erro caso
contr/rio.
PURGE
'todo PE85. usado apenas para coneo IMAP
3 metodo pur"e67 da classe t'ail'ana"er
RENAMEFOLDER
'todo 8.NA'.,3LD.8 usado apenas para coneo
IMAP.
A funo 8ename,older67 da classe t'ail'an"er tem
como ob&etivo realizar a mudana entre os nomes da pastas
no servidor de eTmails 9'AP.
SENDMAIL
'todo ).ND'A9L
3 mtodo )end'ail67 da classe T'ail'ana"er tem a
funo de mandar um eTmail de acordo com os dados
passados por parametro para a funo.
Ao informar os parametros (ue representam os
destinatarios podeTse informar mais de uma conta de email0
porm devidamente separada por 8 ..M
user@cserver.com.br[ userAcserver.com.br
SETFOLDERSUBSCRIBE
'todo ).T,3LD.8)E-)C89-. usado apenas para
coneo IMAP.
A funo set,older)ubscribe da classe t'ail'ana"er tem
como ob&etivo tornar uma pasta do servidor de email 9'AP
assinada.
Tornar uma pasta assinada0 tem um si"nificado parecido
como deiaTl/ visivel em nossa caia de email0 as
mensa"ens para esta pasta sero _baiadas_.
A pasta 9nbo por eemplo0 sempre assinada por default.
SETMSGFLAG
'todo ).T')5,LA5 usado apenas para coneo
IMAP.
A funo )et's",la"67 da classe t'ail'ana"er tem como
ob&etivo indicar o status para uma determinada mensa"em
indicada de acordo com o parametro informado para a
funo.
3s estados possiveis para setar na mensa"em soM
A N AN)!.8.D0 , N ,LA55.D0 D N D.L.T.D0 ) N )..N0 8 N
D8A,T0 C N 8.C.NT0 P N )P.C9AL
SETPOPTIMEOUT
'todo ).TP3PT9'.3ET
3 mtodo )etPopTime3ut67 da classe t'ailmana"er ir/
confi"urar um tempo para (ue uma coneo
estabelecida com servidor POP se&a finalizada por timeT
out.
3bs.M 3 tempo informado pelo mtodo deve ser em
se"undos.
SETSMTPTIMEOUT
'todo ).T)'TPT9'.3ET
3 mtodo )et)'TPTime3ut67 da classe t'ailmana"er ir/
confi"urar um tempo para (ue uma coneo
estabelecida com servidor SMTP se&a finalizada por timeT
out.
3bs.M 3 tempo informado pelo mtodo deve ser em
se"undos.
SMTPCONNECT
'todo )'TPC3NN.CT
3 mtodo )'TPConnect67 da classe Tmail'ana"er se
conecta com o servidor de email0 atravs dos parametros
(ue foram informados atravs do mtodo 9N9T67.
Com esse mtodo realizamos a coneo no servidor SMTP0
ou se&a0 apenas realizaremos o envio de mensa"ens para
uma determinada conta de usuario0 informados
anteriormente pelo metodo 9N9T67.
SMTPDISCONNECT
'todo )'TPD9)C3NN.CT
3 mtodo )'TPDisconnect67 da classe T'ail'ana"er ir/
realizar o fim da coneo com o servidor )'TP0 se
desconectando apenas com o servidor )'TP.
Ao solicitar a finalizao da coneo com o servidor
)'TP0 a funo ir/ retornar o status da operao0 caso
tenha sido bem sucedida retorna F0 outros valores de erro
caso contr/rio.
SETUSEREALID
'todo ).TE).8.AL9D usado apenas para coneo
IMAP.
A funo )etEse8eal9D67 da classe t'ail'ana"er tem
como ob&etivo definir (ual id ser/ usado para busca das
mensa"ens.
Ema mensa"em de email possui dois modos de se
identificada no servidor 9'APM
TAtravs do seu n%mero6o servidor mantm um _contador_
do numero de mensa"ens (ue che"am para determinada
conta e atribui esse numero a mensa"em. .M 9ma"ine uma
conta (ue acabou de ser criada0 ao receber sua @e ms"0 esta
recebera um identificador de numero @ e assim por
diante..7.
TAtravs de um 9D %nico (ue o servidor atribui para a
mensa"em.
Por default as funoes usam o numero da mensa"em0
podemos usar a funo )etEse8eal9D67 para mudar isso0
passando um parametro booleano para a funo.
ENDGETALLMSGHEADER
'todo .ND5.TALL')5#.AD.8 usado apenas para
coneo IMAP.
A funo .nd5etAll's"#eader67 da classe t'ail'ana"er
usada ap+s a chamada da funo )tart5etAll's"#eader67
(ue inicia o processo de pe"ar o header das mensa"ens.
A funo recebe um arraP como parametro (ue deve ser
passado como referancia pois os headers das mensa"ens
iro ser retornados atravs deste arraP.
Zuando o servidor terminar de baiar as mensa"ens ser/
retornado true atravs da funo0 en(uanto for retornado
false o parametro nao vem populado com as mensa"ens.
STARTGETALLMSGHEADER
'todo )TA8T5.TALL')5#.AD.8 usado apenas
para coneo IMAP.
A funo )tart5etAll's"#eader67 da classe t'ail'ana"er
tem como ob&etivo dar inicio ao processo de obteno de
todos os cabealhos6headers7 de todas as mensa"ens de
uma determinada pasta.
A funo ir/ avisar ao servidor 9'AP (ue um processo de
obteno das mensa"ens vai ocorrer0 definindo (ual a
pasta6folder7 deve se iniciar o processo e (ual as infomao
no header da mensa"em deve ser retornada.
o#s02 a &u"()o ape"as i"icia o processo9 para pe3ar os
ca#e(a$os das ,e"sa3e"s da pasta use a &u"()o
E"d:etA$$Ms3Header560
.ste eemplo tem como ob&etivo principal documentar a classe tMai$Ma"a3er0 com
foco nas funoes (ue so usadas apenas por coneo IMAP0
.ste eemplo ir/ fazer basicamente manipulao dos folders de uma conta de email0
atravs de uma coneo com o servidor IMAP0 .M imap.microsi"a.com.br
#include "Protheus.ch"
STATIC oMailManager := Nil
User Function tstIMAP()
Local aStPastas := {}
Local sFolder := "TSTIMAP"
Local sErro := ""

if !myConnect( "imap.microsiga.com.br", "", "seuNomeAntesDo@",
"senhadoemail", @sErro )
return .F.
endif

//tento ir para o folder TSTIMAP
If ! oMailManager:ChangeFolder( ConvFdlName( sFolder, .F. ) )
//entrei aqui pq o folder nao existe, entao crio ele
CreateFolder( sFolder )
EndIf
//pego os folders(pastas) existentes no servidor, incluido o
TSTIMAP
GetFolderList( @aStPastas )
varinfo("PASTAS", aStPastas)

//Verificamos o folder corrente em uso
GetFolder( @sFolder )
conout("Folder Corrente" + sFolder)


If !oMailManager:DeleteFolder( ConvFdlName( sFolder, .F. ) )
conout("nao foi possivel deletar a pasta" + sFolder)
Return .F.
EndIf
myDisconnect()
return .T.
function myConnect( sSrvIMAP, sSrvSMTP, sLogin, sPass, sErro )
Local nErro := 0
//obtenho uma nova instancia da classe de email.
oMailManager := TMailManager():New()
//uso a funo init para setar os dados.
If (nErro := oMailManager:Init( sSrvIMAP, sSrvSMTP, sLogin,
sPass )) != 0
sErro := oMailManager:GetErrorString( nErro )
Conout( sErro )
Return .F.
EndIf

//realizo uma CONEXAO IMAP
If (nErro := oMailManager:IMAPConnect()) != 0
sErro := oMailManager:GetErrorString( nErro )
Conout( sErro )
Return .F.
EndIf

//informo o server que iremos trabalhar com ID real da mensagem
oMailManager:SetUseRealID( .T. )
Return .T.
function myDisconnect()
oMailManager:IMAPDisconnect()
Return .T.
function GetFolderList( aStPastas )
Local nI := 0, nTam := 0
Local aTemp := {}
Local aFolder
aTemp := oMailManager:GetFolderList()
nTam := Len( aTemp )
For nI := 1 To nTam
//crio um array temp {nome, nTotalMensagens,
nMensagensNaoLidas, lAssinada}
aFolder := {}
aAdd(aFolder, ConvFdlName( aTemp[ nI ][1], .T. ))
aAdd(aFolder, aTemp[ nI ][3])
aAdd(aFolder, aTemp[ nI ][5])
aAdd(aFolder, .T.)

//adiciono no array de referencia do parametro
aAdd( aStPastas, aFolder )
aFolder := NIL
Next
Return .T.
// Retorna a pasta que esta em uso, sFolder referencia
function GetFolder( sFolder )
sFolder := ConvFdlName( oMailManager:GetFolder(), .F. )
Return .T.
Function CreateFolder( sFolder )
sFolder := ConvFdlName( sFolder, .F. )
//tento criar o folder no server IMAP
If ! oMailManager:CreateFolder( sFolder )
Return .F.
EndIf

//set o folder como assinado, para aparecer
If ! oMailManager:SetFolderSubscribe( sFolder, .T. )
Return .F.
EndIf
Return .T.
)intae
o3b&MC#AN5.,3LD.8 6 L s,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
s,older Caracter 8epresenta o nome da pasta na (ual dese&amos nos
mudar6conectar7 no servidor 9'AP.
8etorno
Tipo Descrio
L+"ico
8etorna true0 caso tenha sido possivel mudar de pasta no servidor 9'AP0
false caso contrario.
Descrio
'todo C#AN5.,3LD.8 usado apenas para coneo IMAP0
3 mtodo Chan"e,older67 da classe T'ail'ana"er tem como ob&etivo realizar a
mudana de pasta em (ue estamos conectados.
o3b&MC3P^')5 6 L n's" K 0 L s,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
n's" Numrico
1alor numerico da mensa"em no servidor de email 9'AP
ou seu 9D.
s,older Caracter
9ndica o nome da pasta no servidor de email 9'AP0 no
(ual dese&amos transferir a mensa"em.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido possivel encontrar a mensa"em re(uirida e
Copiar para a pasta informada0 false caso contr/rio.
Descrio
'todo C3P^')5 usado apenas para coneo IMAP.
3 mtodo CopP's"67 da classe t'ail'ana"er tem como ob&etivo Copiar uma
determinada mensa"em da pasta corre"te e, 1ue esta,os posicio"ados "o ser.idor
IMAP para uma outra pasta no servidor0 ou at mesmo para a pasta corrente.
X muito importante entendermos a localizao (ue estamos no server 9'AP0 isso
(uando usamos funoes (ue lidam com o posicionamento no folder do servidor
9'AP como chan"e,older670 create,older67 ou delete,older67.
Para Copiar uma mensa"em devemos informar (ual mensa"em (ueremos mover atravs
do primeiro parametro da funo e a pasta de acordo com o nome no servidor 9'AP0 a
funo ir/ procurar pelo 9D da mensa"em apenas na pasta em (ue estamos posicionados
e tentar/ mover para o folder informado6lembrando (ue o nome deve ser identico ao
criado no servidor7
o3b&MC3P^')5 6 L n's" K 0 L s,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
n's" Numrico
1alor numerico da mensa"em no servidor de email 9'AP
ou seu 9D.
s,older Caracter
9ndica o nome da pasta no servidor de email 9'AP0 no
(ual dese&amos transferir a mensa"em.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido possivel encontrar a mensa"em re(uirida e
Copiar para a pasta informada0 false caso contr/rio.
Descrio
'todo C3P^')5 usado apenas para coneo IMAP.
3 mtodo CopP's"67 da classe t'ail'ana"er tem como ob&etivo Copiar uma
determinada mensa"em da pasta corre"te e, 1ue esta,os posicio"ados "o ser.idor
IMAP para uma outra pasta no servidor0 ou at mesmo para a pasta corrente.
X muito importante entendermos a localizao (ue estamos no server 9'AP0 isso
(uando usamos funoes (ue lidam com o posicionamento no folder do servidor
9'AP como chan"e,older670 create,older67 ou delete,older67.
Para Copiar uma mensa"em devemos informar (ual mensa"em (ueremos mover atravs
do primeiro parametro da funo e a pasta de acordo com o nome no servidor 9'AP0 a
funo ir/ procurar pelo 9D da mensa"em apenas na pasta em (ue estamos posicionados
e tentar/ mover para o folder informado6lembrando (ue o nome deve ser identico ao
criado no servidor7
)intae
o3b&MD.L.T.,3LD.8 6 L c,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
c,older Caracter
8epresenta o nome da pasta na (ual dese&amos deletar no
servidor 9'AP.
8etorno
Tipo Descrio
L+"ico
8etorna true0 caso tenha sido possivel mudar de pasta no servidor 9'AP0
false caso contrario.
Descrio
'todo D.L.T.,3LD.8 usado apenas para coneo IMAP0
3 mtodo Delete,older67 da classe t'ail'ana"er0 tem como ob&etivo deletar uma pasta
do servidor de email 9'AP.
9nformando a pasta (ue ser/ deletada por parametro na funo0 (ue deve conter o nome
passado idantico ao da pasta no sevidor 6case sensitive7.
)intae
o3b&MD.L.T.')5 6 L n's" K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
n's" Numrico Numero da mensa"em a ser deletada.
8etorno
Tipo Descrio
6NEL37
8etorna true0 caso tenha sido possivel deletar a mensa"em. Caso contr/rio
retorna false.
Descrio
'todo D.L.T.')5
3 mtodo Delete's"67 da classe t'ail'ana"er tem como ob&etivo deletar uma
determinada mensa"em do servidor0 de acordo com o numero da mensa"em passada
por parametro para a funo.
A funo ir/ retornar true caso tenha sido encontrado a mensa"em e deletada.
)intae
o3b&M.ND5.TALL')5#.AD.8 6 L a#eaders K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
a#eaders ArraP
ArraP usado como referancia para o retorno dos headers das
mensa"ens.
8etorno
Tipo Descrio
L+"ico
8etorna true (uando o servidor 9'AP terminou de mandar todos os
headers das mensa"ens0 false caso contr/rio.
Descrio
'todo .ND5.TALL')5#.AD.8 usado apenas para coneo IMAP.
A funo .nd5etAll's"#eader67 da classe t'ail'ana"er usada ap+s a chamada da
funo )tart5etAll's"#eader67 (ue inicia o processo de pe"ar o header das mensa"ens.
A funo recebe um arraP como parametro (ue deve ser passado como referancia pois
os headers das mensa"ens iro ser retornados atravs deste arraP.
Zuando o servidor terminar de baiar as mensa"ens ser/ retornado true atravs da
funo0 en(uanto for retornado false o parametro nao vem populado com as mensa"ens.
)intae
o3b&M5.TALL,3LD.8L9)T 6 7 TTK a8et
8etorno
Tipo Descrio
ArraP
8etorna um ArraP contendo todas as pastas 6AssinadasDNao Assinadas7 e
informaoes sobre a respectiva pasta0 como est/ status0 o seu nome e
numero de mensa"ens eistentes nela.
Descrio
'todo 5.TALL,3LD.8L9)T usado apenas para coneo IMAP.
3 mtodo 5etAll,olderList67 da classe T'ail'ana"er0 tem como ob&etivo obter todas
as pastas de determinada conta de email0 (ue esto no servidor email 9'AP.
3 mtodo retorna todas as pastas assi"adas6so as pastas abilitadas ou )ubscribe7e ")o
assi"adas0 esse retorno vem em forma de arraP0 do se"uinte modoM
arraP:@;
arraP:@;:@;McNome
arraP:@;:A;MnNum's"
arraP:@;:G;MnNum's"NaoLidas
arraP:@;:H;Mc)tatus
M M
M M
cStatus2 9 N N39N,.893)0 N N N3).L.CT0 ' N 'Ab.D e E N EN'A8b.D
"'u,Ms32 Zuantidade de mensa"ens (ue eistem na pasta.
c'o,e2 3 respectivo nome da pasta.
"'u,Ms3'aoLidas2 Numero de mensa"ens nao lidas na pasta
)intae
o3b&M5.T.8838)T89N5 6 L n.rror K 7 TTK c8et
ParCmetros
Ar"umento Tipo Descrio
n.rror Numrico
8epresenta um valor numrico a ser passado de al"um
erro de acordo como )'TP.
8etorno
Tipo Descrio
Caracter
8etorna uma cadeia de caracteres com a descrio0 de acordo com o valor
do erro passado.
Descrio
'todo 5.T.8838)T89N5
3 mtodo 5et.rror)trin" da classe T'ail'ana"er0 tem como ob&etivo retornar um erro
em forma de strin"0 trazendo sua descrio de acordo com al"um erro (ue tenha
ocorrido durante al"uma outra funo da classe com )end'ail670 al"um connect e assim
por diante.
3 valor informado por parametro representa erros definidos por padro do protocolo de
coneo )'TP.
)intae
o3b&M5.T,3LD.8 6 7 TTK c,older
8etorno
Tipo Descrio
Caracter 8etorna uma strin" contendo o nome do folder em uso pela aplicao.
Descrio
'todo 5.T,3LD.8 usado apenas para coneo IMAP.
3 mtodo "et,older da classe t'ail'ana"er tem como ob&etivo obter o folder corrente
em (ue estamos posicionados6est/ em uso7 no servidor 9'AP.
A funo ir/ retornar o nome do folder0 de acordo com o nome criado no servidor.
)intae
o3b&M5.T,3LD.8L9)T 6 7 TTK a8et
8etorno
Tipo Descrio
ArraP
8etorna um ArraP contendo todas as pastas e informaoes sobre a
respectiva pasta0 como se est/ status0 o seu nome e numero de mensa"ens
eistentes nela.
Descrio
'todo 5.T,3LD.8L9)T usado apenas para coneo IMAP.
3 mtodo 5et,olderList67 da classe T'ail'ana"er0 tem como ob&etivo obter todas as
pastas de determinada conta de email0 (ue esto no servidor email 9'AP.
3 mtodo retorna todas as pastas assi"adas6so as pastas abilitadas ou )ubscribe70 esse
retorno vem em forma de arraP0 do se"uinte modoM
arraP:@;
arraP:@;:@;McNome
arraP:@;:@;MnNum's"NaoLidas
arraP:@;:@;MnNum's"
arraP:@;:@;Mc)tatus
M M
M M
cStatus2 9 N N39N,.893)0 N N N3).L.CT0 ' N 'Ab.D e E N EN'A8b.D
"'u,Ms32 Zuantidade de mensa"ens (ue eistem na pasta.
c'o,e2 3 respectivo nome da pasta.
"'u,Ms3'aoLidas2 Numero de mensa"ens nao lidas da pasta
)intae
o3b&M5.T')5-3D^ 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo 5.T')5-3D^ usado apenas para coneo IMAP.
3 mtodo 5et's"-odP67 da classe de t'ail'ana"er tem como ob&etivo obter o
conteudo da mensa"em indicada de acordo com o parametro (ue representa o numero
da mensa"em para a funo.
3 valor informado por parametro o numero da mensa"em na pasta do servidor. 3
mtodo ir/ procurar pela mensa"em no folder (ue estiver posicionado no server 9'AP.
)intae
o3b&M5.T')5#.AD.8 6 L n's" K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
n's" Numrico 1alor numerico da mensa"em no servidor de email 9'AP.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido possivel encontrar a mensa"em re(uirida e
retornar seu cabealho0 false caso contr/rio.
Descrio
'todo 5.T')5#.AD.8 usado apenas para coneo IMAP.
3 mtodo 5et's"#eader67 da classe t'ail'ana"er tem como ob&etivo se comunicar
com o server de email 9'AP e obter o cabealho da mensa"em re(uerida de acordo
com o parametro informando.
.sse cabealho da mensa"em contem todos os dados relativos ao email como M ,rom0
To0 CC0 -CC0 etc...
3 valor informado por parametro o numero da mensa"em na pasta do servidor.
3bs.M o servidor 9'AP ir/ procurar pela mensa"em apenas na pasta corrente em uso0
caso a pasta em uso se&a a _9nbo_ o mensa"em ser/ procurada apenas na nesta pasta.
)intae
o3b&M5.TNE'')5) 6 L nNum's" K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
nNum's" Numrico
Parametro passado por referencia0 retorna nele o numero
de mensa"ens (ue esto no servidor.
8etorno
Tipo Descrio
Numrico F N Lista recebida com sucesso
Descrio
'todo 5.TNE'')5)
3 mtodo 5etNum's"s67 da classe T'ail'ana"er tem como ob&etivo retornar o
numero de mensa"ens (ue eistem no servidor.
Devemos informar um numrico no parametro da funo como referancia0 indicando o
total de mensa"ens ap+s a eecuo da funo0 o valor retornado pela funo apenas o
status de funcionou ou no.
3bs.M A funo retorna o numero de mensa"ens total da conta de usu/rio informada e
nao apenas por pasta como inbo0 sent itens0 etc..
)intae
o3b&M5.TP3PT9'.3ET 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico
8etorna o tempo em se"undos para a finalizao por time out da coneao
P3P.
Descrio
'todo 5.TP3PT9'.3ET
3 mtodo 5etPopTime3ut67 da classe t'ail'ana"er tem como ob&etivo retornar o
tempo em se"undos (ue est/ estabelecido com o servidor POP para (ue se&a finalizada
a coneo por timeTout.
3bs.M caso nao tenha sido estabelecido nenhum tempo de timeTout pela funo
).TP3PT9'.3ET0 ser/ retornado F6zero7.
)intae
o3b&M5.T)'TPT9'.3ET 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico
8etorna um tempo em se"undos0 (ue representa o tempo para a finalizao
da coneo com o servidor )'TP.
Descrio
'todo 5.T)'TPT9'.3ET
3 mtodo 5et)'TPTime3ut67 da classe t'ail'ana"er tem como ob&etivo retornar o
tempo em se"undos (ue est/ estabelecido com o servidor SMTP para (ue se&a
finalizada a coneo por timeTout.
3bs.M caso nao tenha sido estabelecido nenhum tempo de timeTout pela funo
).T)'TPT9'.3ET0 ser/ retornado F6zero7.
)intae
o3b&M5.TE).8 6 7 TTK s8et
8etorno
Tipo Descrio
Caracter
8etorna uma )trin" contento o nome do usuario da conta de email (ue
estamos conectados.
Descrio
'todo 5.TE).8
3 mtodo usado apenas para coneo IMAP.
A funo 5etEser67 da classe de email t'ail'ana"er tem como ob&etivo obter o usuario
corrente em (ue estamos lo"ados no momento.
A funo ir/ retornar uma strin" contendo o valor da conta de email do usuario antes do
c.
)intae
o3b&M9'APC3NN.CT 6 7 TTK l8et
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido poss$vel realizar a coneo no servidor 9map0
false caso contr/rio.
Descrio
'todo 9'APC3NN.CT usado apenas para coneo IMAP0
3 mtodo 9'APConnect67 da classe T'ail'ana"er tem como ob&etivo realizar a
coneo em um 9'AP eTmail server e sincroniza o mailbo folders.
A coneo atravs de 9'AP trataTse de um mtodo de acesso a mensa"ens eletrdnicas
armazenadas em um servidor local ou remoto.
3 mtodo ir/ se conectar de acordo com os dados informados atravs do mtodo init67.
O#s02U,a caracterstica i,porta"te do IMAP per,itir 1ue a ,a"ipu$a()o de
,e"sa3e"s e pastas se4a &eita co,o se esti.esse, "o co,putador $oca$0 Se,pre 1ue
&or esta#e$ecida u,a co"e*)o co, ser.idor IMAP atra.s da &u"()o
i,apCo""ect56 i,porta"te &i"a$i7ar a co"e*)o uti$i7a"do a i,ap%isco""ect560
)intae
o3b&M9'APD9)C3NN.CT 6 7 TTK l8et
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido poss$vel realizar a finalizao da coneo no
servidor 9map0 false caso contr/rio.
Descrio
'todo 9'APD9)C3NN.CT usado apenas para coneo IMAP.
3 mtodo 9'APDisConnect67 da classe T'ail'ana"er tem como ob&etivo realizar o
fim da coneo entre a aplicao e um 9'AP eTmail server.
3bs.M sempre (ue for estabelecida uma coneo com servidor 9'AP atravs da funo
imapConnect67 importante finalizar a coneo utilizando a disconnect.
)intae
o3b&M9'AP)T38. 6 L c,older K 0 L o's" K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
c,older Caracter
8epresenta uma )trin" (ue contm o nome da pasta6folder7
no (ual dese&amos armazenar a mensa"em.
o's" 3b&eto
9ndica um ob&eto t'ail'essa"e (ue contem as informaoes
da mensa"em (ue dese&amos armazenar.
8etorno
Tipo Descrio
Numrico
8etorna um inteiro informando o status da operao0 caso retornado @
ocorreu erro durante a funo0 caso contrario retorna outros valores de
informao.
Descrio
'todo 9'AP)T38. usado apenas para coneo IMAP
3 mtodo imap)tore67 da classe t'ail'ana"er tem como ob&etivo armazenar uma
determinada mensa"em em al"um folder do servidor 9'AP.
3bs.M A funo muito util (uando por eemplo dese&amos (ue ao enviar uma
mensa"em ela se&a salva em al"uma pasta do server 9'AP.
)intae
o3b&M9N9T 6 L cPop9map K 0 L c)mtp K 0 L cEser K 0 L cPass K 0 L nTime3ut K 0 L
nPorta K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
cPop9map Caracter
.ndereo do servidor P3P ou 9'AP0 no caso de coneo
)'TP passe esse como ff6branco7.
c)mtp Caracter
.ndereo do servidor )'TP0 no caso de coneo P3P
passe esse como ff6branco7
cEser Caracter Lo"in no servidor.
cPass Caracter )enha no servidor.
nTime3ut Numrico Time out para a coneo.
nPorta Numrico Porta para se conectar.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo 9N9T
Atravs desse mtodo da classe t'ail'ana"er0 iniciamos uma nova coneo com um
servidor de emails POP ou SMTP0
Zuando informamos por ar"umento o servidor pop 6..M popG.microsi"a.com.br7 (ue
si"inifica o protocolo usado na internet para a recebimento de mensa"ens ao usu/rio
final e o servidor s,tp 6..M smtp.microsi"a.com.br7 (ue si"inifica o protocolo usado
na internet para a envio de mensa"ens ao usu/rio final0 devemos tambm informar um
usuario (ue este&a devidamente cadastrado no servidor e sua senha.
Podemos ainda informar o tempo de timeout para (ueda da coneo e ainda o numero
de porta0 caso a porta do servidor dese&ado no se&a a default de um s,tp
)intae
o3b&M'31.')5 6 L nNum's" K 0 L s,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
nNum's" Numrico 1alor numerico da mensa"em no servidor de email 9'AP.
s,older Caracter
9ndica o nome da pasta no servidor de email 9'AP0 no
(ual dese&amos transferir a mensa"em.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido possivel encontrar a mensa"em re(uirida e
mover para a pasta informada0 false caso contr/rio.
Descrio
'todo '31.')5 usada apenas para coneo IMAP.
A funo 'ove's"67 da classe t'ail'ana"er tem como ob&etivo mover uma
determinada mensa"em da pasta corre"te e, 1ue esta,os posicio"ados "o ser.idor
IMAP para uma outra pasta no servidor.
X muito importante entendermos a localizao (ue estamos no server 9'AP0 isso
(uando usamos funoes (ue lidam com os folder como chan"e,older670 create,older67
ou delete,older67.
Para mover uma mensa"em devemos informar (ual mensa"em (ueremos mover atravs
do primeiro parametro da funo e a pasta de acordo com o nome no servidor 9'AP0 a
funo ir/ procurar pelo 9D da mensa"em apenas na pasta em (ue estamos posicionados
e tentar/ mover para o folder informado6lembrando (ue o nome deve ser identico ao
criado no servidor7
)intae
t'ail'ana"er67MN.! 6 7 TTK o3b&t'ail'ana"er
8etorno
Tipo Descrio
3b&eto 8etorna uma nova instCncia do 3b&eto da Classe t'ail'ana"er.
Descrio
Contrutor da Classe t'ail'ana"er.
8etorna uma nova instCncia do 3b&eto da Classe t'ail'ana"er.
Antes da utilizao das funYes eDou propriedades da classe de email necessario
criarmos uma instancia da classe atravs do contrutor Ne*67.
)intae
o3b&MP3PC3NN.CT 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo P3PC3NN.CT
3 mtodo PopConnect67 da classe Tmail'ana"er se conecta com o servidor de email0
atravs dos parametros (ue foram informados atravs do mtodo 9N9T67.
Com esse mtodo realizamos a coneo no servidor POP0 ou se&a0 apenas realizaremos
o recebimento das mensa"ens eistentes na caia postal do usuario informado.
)intae
o3b&MP3PD9)C3NN.CT 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico 8etorna F (uando for Disconectado0 outro valor caso contr/rio.
Descrio
'todo P3PD9)C3NN.CT
3 mtodo P3PDisconnect67 da classe T'ail'ana"er ir/ realizar o fim da coneo com
o servidor P3P0 se desconectando apenas com o servidor P3P.
Ao solicitar a finalizao da coneo com o servidor P3P0 a funo ir/ retornar o status
da operao0 caso tenha sido bem sucedida retorna F0 outros valores de erro caso
contr/rio.
)intae
o3b&MPE85. 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo PE85. usado apenas para coneo IMAP
3 metodo pur"e67 da classe t'ail'ana"er
)intae
o3b&M8.NA'.,3LD.8 6 L s3ld,older K 0 L sNe*,older K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
s3ld,older Caracter
8epresenta o nome atual (ue a pasta tem no servidor de
email 9'AP0 o valor a(ui informado deve ser idantico ao
"ravado no servidor0 caso contr/rio a pasta no ser/
encontrada.
sNe*,older Caracter
9ndica o novo nome no (ual dese&amos atribuir para a
pasta.
8etorno
Tipo Descrio
6NEL37
8etorna true caso tenha sido poss$vel realizar a mudana de nome das
pastas0 false caso contr/rio.
Descrio
'todo 8.NA'.,3LD.8 usado apenas para coneo IMAP.
A funo 8ename,older67 da classe t'ail'an"er tem como ob&etivo realizar a mudana
entre os nomes da pastas no servidor de eTmails 9'AP.
)intae
o3b&M).ND'A9L 6 L s,rom K 0 L sTo K 0 L s)ub&ect K 0 L s-odP K 0 : sCC ; 0
: c-CC ; 0 : aAttach ; 0 : nNumAttach ; 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
s,rom Caracter
9ndica uma conta de email no (ual ser/ usada para
representar de (uem foi mandado o email. .M
Deusuariocmicrosi"a.com.br
sTo Caracter
9ndica a conta de email no (ual ser/ usada para enviar o
respectivo email.
.M Parausuariocmicrosi"a.com.br
s)ub&ect Caracter
8epresenta o assunto do email ou mensa"em0 (ue ser/
enviado para a conta de email indicada.
s-odP Caracter 8epresenta o conteudo da mensa"em (ue ser/ enviada.
sCC Caracter
3pcional. Parametro para adicionar endereos ao (ual ser/
enviado na seo Com C+pia6CC7.
c-CC Caracter
3picional. Parametro para adicionar endereos de email
no (ual ser/ enviado na seo Com C+pia 3culta6-CC7
aAttach ArraP
3pcional. Parametro no (ual podemos informar um ArraP
de strin"s contento de o Path dos ar(uivos (ue dese&amos
enviar como atachados ao email.
nNumAttach Numrico
3picional. Zuando dese&amos enviar ar(uivos atachados
devemos informar esse ar"umento (ue contem a
(uandidade de ar(uivos (ue sero atachados no email0 no
caso a (uantidade de elementos do arraP.
8etorno
Tipo Descrio
6NEL37
8etrona F0 (uando o .Tmail for enviado com sucesso0 outro valor (ual(uer
caso contrario.
Descrio
'todo ).ND'A9L
3 mtodo )end'ail67 da classe T'ail'ana"er tem a funo de mandar um eTmail de
acordo com os dados passados por parametro para a funo.
Ao informar os parametros (ue representam os destinatarios podeTse informar mais de
uma conta de email0 porm devidamente separada por 8 ..M user@cserver.com.br[
userAcserver.com.br
)intae
o3b&M).T,3LD.8)E-)C89-. 6 L c,older K 0 L lAssinado K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
c,older Caracter
8epresenta o nome do folder no servidor de email 9'AP
(ue dese&amos deiar subscribe ou no.
lAssinado L+"ico
True caso dese&amos (ue o folder este&a
assinado6subscribe70 falso caso contr/rio.
8etorno
Tipo Descrio
L+"ico
8etorna true caso a operao tenha sido realizada com sucesso0 falso caso
contr/rio.
Descrio
'todo ).T,3LD.8)E-)C89-. usado apenas para coneo IMAP.
A funo set,older)ubscribe da classe t'ail'ana"er tem como ob&etivo tornar uma
pasta do servidor de email 9'AP assinada.
Tornar uma pasta assinada0 tem um si"nificado parecido como deiaTl/ visivel em nossa
caia de email0 as mensa"ens para esta pasta sero _baiadas_.
A pasta 9nbo por eemplo0 sempre assinada por default.
)intae
o3b&M).T')5,LA5 6 L nNum's" K 0 L s,la" K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
nNum's" ArraP
9ndica o numero da mensa"em (ue dese&amos alterar seu
status6fla"7.
s,la" ArraP 9nforma o novo status (ue dese&amos para a mensa"em.
8etorno
Tipo Descrio
L+"ico
8etorna true caso a mensa"em tenha sido setada corretamente0 caso
contr/rio false.
Descrio
'todo ).T')5,LA5 usado apenas para coneo IMAP.
A funo )et's",la"67 da classe t'ail'ana"er tem como ob&etivo indicar o status
para uma determinada mensa"em indicada de acordo com o parametro informado para a
funo.
3s estados possiveis para setar na mensa"em soM
A N AN)!.8.D0 , N ,LA55.D0 D N D.L.T.D0 ) N )..N0 8 N D8A,T0 C N 8.C.NT0 P N
)P.C9AL
)intae
o3b&M).TP3PT9'.3ET 6 L nTime3ut K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
nTime3ut Numrico Tempo para (ue a coneo se&a fechada por TimeT3ut.
8etorno
Tipo Descrio
Numrico F N Time out setado
Descrio
'todo ).TP3PT9'.3ET
3 mtodo )etPopTime3ut67 da classe t'ailmana"er ir/ confi"urar um tempo para (ue
uma coneo estabelecida com servidor POP se&a finalizada por timeTout.
3bs.M 3 tempo informado pelo mtodo deve ser em se"undos.
)intae
o3b&M).T)'TPT9'.3ET 6 L nTime K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
nTime Numrico Tempo para (ue a coneo se&a fechada por TimeT3ut.
8etorno
Tipo Descrio
Numrico F T Time out confi"urado
Descrio
'todo ).T)'TPT9'.3ET
3 mtodo )et)'TPTime3ut67 da classe t'ailmana"er ir/ confi"urar um tempo para
(ue uma coneo estabelecida com servidor SMTP se&a finalizada por timeTout.
3bs.M 3 tempo informado pelo mtodo deve ser em se"undos.
)intae
o3b&M).TE).8.AL9D 6 L l3pt K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
l3pt L+"ico
9ndica (ual tipo de 9dentificador dese&aTse usar0 caso
informado true ser/ usado o 9D real da mensa"em0 caso
informado false ser/ usado o numero da mensa"em.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo ).TE).8.AL9D usado apenas para coneo IMAP.
A funo )etEse8eal9D67 da classe t'ail'ana"er tem como ob&etivo definir (ual id
ser/ usado para busca das mensa"ens.
Ema mensa"em de email possui dois modos de se identificada no servidor 9'APM
TAtravs do seu n%mero6o servidor mantm um _contador_ do numero de mensa"ens
(ue che"am para determinada conta e atribui esse numero a mensa"em. .M 9ma"ine
uma conta (ue acabou de ser criada0 ao receber sua @e ms"0 esta recebera um
identificador de numero @ e assim por diante..7.
TAtravs de um 9D %nico (ue o servidor atribui para a mensa"em.
Por default as funoes usam o numero da mensa"em0 podemos usar a funo
)etEse8eal9D67 para mudar isso0 passando um parametro booleano para a funo.
)intae
o3b&M)'TPC3NN.CT 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico F T Conectado
Descrio
'todo )'TPC3NN.CT
3 mtodo )'TPConnect67 da classe Tmail'ana"er se conecta com o servidor de email0
atravs dos parametros (ue foram informados atravs do mtodo 9N9T67.
Com esse mtodo realizamos a coneo no servidor SMTP0 ou se&a0 apenas
realizaremos o envio de mensa"ens para uma determinada conta de usuario0 informados
anteriormente pelo metodo 9N9T67.
)intae
o3b&M)'TPD9)C3NN.CT 6 7 TTK n8et
8etorno
Tipo Descrio
6NEL37 F N Disconectado
Descrio
'todo )'TPD9)C3NN.CT
3 mtodo )'TPDisconnect67 da classe T'ail'ana"er ir/ realizar o fim da coneo
com o servidor )'TP0 se desconectando apenas com o servidor )'TP.
Ao solicitar a finalizao da coneo com o servidor )'TP0 a funo ir/ retornar o
status da operao0 caso tenha sido bem sucedida retorna F0 outros valores de erro caso
contr/rio.
)intae
o3b&M)TA8T5.TALL')5#.AD.8 6 L s,3lder K 0 L a#eader K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
s,3lder Caracter
9ndica (ual o folder no servidor (ue dese&amos obter os
cabealhos das mensa"ens.
a#eader ArraP
ArraP (ue representa as informaoes (ue dese&amos serem
retornadas nos cabealhos das mensa"ens.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha sido possivel iniciar o processo de obteno de
cabealho das mensa"ens0 false caso contrario.
Descrio
'todo )TA8T5.TALL')5#.AD.8 usado apenas para coneo IMAP.
A funo )tart5etAll's"#eader67 da classe t'ail'ana"er tem como ob&etivo dar
inicio ao processo de obteno de todos os cabealhos6headers7 de todas as mensa"ens
de uma determinada pasta.
A funo ir/ avisar ao servidor 9'AP (ue um processo de obteno das mensa"ens vai
ocorrer0 definindo (ual a pasta6folder7 deve se iniciar o processo e (ual as infomao no
header da mensa"em deve ser retornada.
o#s02 a &u"()o ape"as i"icia o processo9 para pe3ar os ca#e(a$os das ,e"sa3e"s da
pasta use a &u"()o E"d:etA$$Ms3Header560
T,ai$,essa3e
.ste eemplo tem como ob&etivo principal mostrar o uso dos mtodos da classe
tMai$Messa3e0 Para isto usamos a classe t'ail'ana"er6responsavel por estabelecer a
coneo de fato7.
A classe tMai$Messa3e possu$ uma dependencia direta com a classe tMai$Ma"a3er0
devemos ima"inar a classe t'ail'essa"e como a mensa"em (ue ser/ enviada de fato
e tendo atravs dos mtodos e propriedades a forma (ue iremos preencher os dados
necess/rios para um email comoM Assunto0 Corpo da 'ensa"em0 _Com C+pia_0 etc..
Assim atravs da classe podemos customizar tambm a mensa"em (ue (ueremos
enviar. Acompanhe o eemplo abaio.
#include "Protheus.ch"
user Function EMail()
Local oServer
Local oMessage
Local nNumMsg := 0
Local nTam := 0
Local nI := 0
//Crio a conexo com o server STMP ( Envio de e-mail )
oServer := TMailManager():New()
oServer:Init( "", "smtp.microsiga.com.br", "ricardo.reis",
"rica4758", 0, 25 )

//seto um tempo de time out com servidor de 1min
If oServer:SetSmtpTimeOut( 60 ) != 0
Conout( "Falha ao setar o time out" )
Return .F.
EndIf

//realizo a conexo SMTP
If oServer:SmtpConnect() != 0
Conout( "Falha ao conectar" )
Return .F.
EndIf
//Apos a conexo, crio o objeto da mensagem
oMessage := TMailMessage():New()
//Limpo o objeto
oMessage:Clear()
//Populo com os dados de envio
oMessage:cFrom := "Microsiga "
oMessage:cTo :=
"microsiga@microsiga.com.br;microsiga@microsiga.com.br"
oMessage:cCc := "microsiga@microsiga.com.br"
oMessage:cBcc := "microsiga@microsiga.com.br"
oMessage:cSubject := "Teste de Email"
oMessage:cBody := "Conteudo do e-mail"
//Adiciono um attach
If oMessage:AttachFile( "arquivo.txt" ) < 0
Conout( "Erro ao atachar o arquivo" )
Return .F.
Else
//adiciono uma tag informando que um attach e o nome
do arq
oMessage:AddAtthTag( 'Content-Disposition: attachment;
filename=arquivo.txt')
EndIf
//Envio o e-mail
If oMessage:Send( oServer ) != 0
Conout( "Erro ao enviar o e-mail" )
Return .F.
EndIf
//Disconecto do servidor
If oServer:SmtpDisconnect() != 0
Conout( "Erro ao disconectar do servidor SMTP" )
Return .F.
EndIf
//Crio uma nova conexo, agora de POP
oServer := TMailManager():New()
oServer:Init( "pop3.microsiga.com.br", "", "SeunomeAntesDo@",
"senhaDoEmail", 0, 110 )
If oServer:SetPopTimeOut( 60 ) != 0
Conout( "Falha ao setar o time out" )
Return .F.
EndIf
If oServer:PopConnect() != 0
Conout( "Falha ao conectar" )
Return .F.
EndIf
//Recebo o nmero de mensagens do servidor
oServer:GetNumMsgs( @nNumMsg )
nTam := nNumMsg
For nI := 1 To nTam
//Limpo o objeto da mensagem
oMessage:Clear()
//Recebo a mensagem do servidor
oMessage:Receive( oServer, nI )
//Escrevo no server os dados do e-mail recebido
Conout( oMessage:cFrom )
Conout( oMessage:cTo )
Conout( oMessage:cCc )
Conout( oMessage:cSubject )
Conout( oMessage:cBody )
Next
//Deleto todas as mensagens do servidor
For nI := 1 To nTam
oServer:DeleteMsg( nI )
Next
//Diconecto do servidor POP
oServer:POPDisconnect()
Return .T.
)intae
o3b&MADDATT#TA5 6 L cTa" K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
cTa" Caracter
8epresenta os dados (ue dese&amos informa no caso de um
ar(uivo atachado.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo ADDATT#TA5
3 mtodo addAttTa"67 da classe t'ail'essa"e tem como ob&etivo setar al"uma
informao especial (uando passado al"um ar(uivo atachado para a mensa"em (ue
ser/ enviada.
.M AddAttTa35 ;Co"te"t<%ispositio"2 attac,e"t8 &i$e"a,e=ar1ui.o0t*t;6
adiciono uma ta" informando (ue um attach e o nome do ar(uivo.
)intae
o3b&MATTAC#,9L. 6 L cAr( K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
cAr( Caracter 9ndica o nome do ar(uivo a ser adicionado no eTmail.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo ATTAC#,9L.
3 mtodo Attach,ile67 da classe t'ail'essa"e tem como ob&etivo adicionar um ar(uivo
ao ob&eto de eTmail0 _um Attach_.
)intae
o3b&MCL.A8 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo CL.A8
3 mtodo clear67 da classe t'ail'essa"e tem como ob&etivo limpar o conteudo do
ob&eto0 assim podemos receber varias mensa"em no mesmo ob&eto0 apenas limpando o
seu conteudo antes.
Esando a funo clear0 nao precisamos criar varias vezes o mesmo ob&eto0 para receber
mais de uma mensa"em.
)intae
o3b&M5.TATTAC# 6 L cNum's" K 7 TTK s8et
ParCmetros
Ar"umento Tipo Descrio
cNum's" Numrico
8epresenta o 9d6numero da mensa"em7 (ue dese&amos
obter informaYes.
8etorno
Tipo Descrio
Caracter
8etorno uma )trin"6cadeia de caracteres7 contendo o conteudo do ar(uivo
atachado na mensa"em.
Descrio
'todo 5.TATTAC#
3 mtodo "etAttach da classe t'ail'essa"e tem como ob&etivo obter o conteudo do
ar(uivo atachado e retornar esse conteudo atravs de uma )trin".
Devemos informar o numero da mensa"em (ue dese&amos obter o attach.
)intae
o3b&M5.TATTAC#C3ENT 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico 8etorna o numero de aneos a mensa"em.
Descrio
'todo 5.TATTAC#C3ENT
3 mtodo "etAttachCount67 da classe t'ail'essa"e tem como ob&etivo informar (ual a
(uantidade de ar(uivos aneados a mensa"em.
)intae
o3b&M5.TATTAC#9N,3 6 L n's" K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
n's" Numrico 9ndica o numero da mensa"em (ue dese&amos verificar.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo 5.TATTAC#9N,3
3 mtodo "etAttach9nfo67 da classe t'ail'essa"e tem como ob&etivo trazer todas
informaoes sobre um attachment em al"uma mensa"em.
Devemos informar o numero da mensa"em (ue dese&amos trazer as informaoes sobre
os attachments0 o mtodo ir/ retornar as se"uintes informaYesM
)hortNameM 3 nome do attachment
TPpeM 3 tipo do attachment0 podendo ser ,9L. e T.]T por eemplo.
DispositionM Tipo do ar(uivo
DispositionNameM informa o nome do tipo de ar(uivo
9dM 9dentificao do attachment
LocationM Local fisico do attachment
)intae
t'ail'essa"e67MN.! 6 7 TTK o3b&t'ail'essa"e
8etorno
Tipo Descrio
3b&eto 8etorna uma nova instCncia do 3b&eto da Classe t'ail'essa"e.
Descrio
Contrutor da Classe t'ail'essa"e.
8etorna uma nova instCncia do 3b&eto da Classe t'ail'essa"e0 representa uma
mensa"em
)intae
o3b&M8.C.91. 6 L o)erver K 0 L n's" K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
o)erver 'emo
9ndica o 3b&eto do servidor P3P0 criado atraves no
obe&eto T'ail'ana"er.
n's" Numrico
9ndica o N%mero da mensa"em a ser criada0 recebido
atraves do metodo T'ail'ana"erM5etNum's"s.
8etorno
Tipo Descrio
Numrico
8etorna F6zero7 (uando o .Tmail foi recebido com sucesso0 outro valor
caso contr/rio.
Descrio
'todo 8.C.91.
3 mtodo receive67 da classe t'ail'essa"e0 tem como ob&etivo receber uma nova
mensa"em do servidor populando o ob&eto da mensa"em.
)intae
o3b&M)A1. 6 L cNum's" K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
cNum's" ArraP 8epresenta o numero da mensa"em (ue dese&amos salvar.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo )A1.
3 mtodo save67 da classe t'ail'essa"e tem como ob&etivo obter todo o conteudo de
uma determinada mensa"em0 (ue ser/ encontrada atravs do parametro informado0 (ue
repesenta o 9d6numero da mensa"em7 e salvar a mensa"em.
)intae
o3b&M).ND 6 L o)erver K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
o)erver 3b&eto
9ndica o ob&eto da classe t'ail'ana"er para o envio da
mensa"em.
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
'todo ).ND
3 mtodo )end67 da classe T'ail'essa"e tem a funo de enviar um eTmail de acordo
com os dados passados pelo ob&eto da classe t'ail'ana"er por parametro para a
funo.
Para (ue a funo se&a usada corretamente preciso antes popular al"umas das
propriedades da classe t'ail'essa"e basicas para o envio comoM
c,romM .mail de (uem est/ mandando.
cToM .mail6s7 para o (ual dese&amos enviar a mensa"em.
cCcM .mail6s7 para o (ual dese&amos enviar a mensa"em na seo fcom c+piaf.
c-ccM .mail6s7 para o (ual dese&amos enviar a mensa"em na seo fcom c+pia 3cultaf.
c)ub&ectM Assunto da mensa"em (ue ser/ enviada.
c-odPM Conteudo da mensa"em.
Descrio
.sta classe permite estabelecer uma coneo cliente de soc2et do tipo TCP "enrica.
.nviar e receber dados atravs de uma soc2et "enrico e tambm pode ser usada como
base para implementao de protocolos no suportados pelo protheus.
'todos
'todo Descrio
CloseConnection ,inaliza a coneo TCP "enrica 6soc2et 7 do ob&eto corrente.
Connect .stabelece um coneo TCP "enrica 6soc2et 7.
IsConnected 1erifica se eiste coneo valida no ob&eto corrente.
Ne Cria o ob&eto t)oc2etClient0 sem coneo ativa.
Recei!e
8ecebe os dados pela coneo ativa do ob&eto0 (ual(uer tipo de
dado pode ser recebido.
Reset
,inaliza anormalmente a coneo0 no avisa o outro lado (ue a
coneo ser/ finalizada.
Deve ser utilizado apenas em casos etremos.
Send Transmite o buffer pela coneo TCP 5enrica ativa.
3 .emplo abaio eemplifica a utilizao de um cliente soc2et0 note (ue para o
pro"rama funcionar corretamente0 deveTse alterar os parametros da coneo.
user function MySocket
Local oObj := tSocketClient():New()
nResp := oObj:Connect( 999, "172.255.255.255", 1000 )
if(nResp == 0 )
Conout( "Conexo OK!" )
else
Conout( "Erro na Conexo OK! ", nResp )
return
endif
cSend = "Ola!!!! Estou transmitindo um dado!"
nResp := oObj:Send( cSend )
if( nResp != len( cSend ) )
conout( "Erro! Dado nao transmitido" )
else
conout( "Dado Enviado" )
endif
cBuffer := ""
nQtd = oObj:Receive( cBuffer, 10000 )
if( nQtd >= 0 )
conout( "Dados Recebidos " + Str( nQtd, 4, 0 ), cBuffer )
else
conout( "Nao recebi nada" )
endif
cSend = "Dados que ser transmitido!!!"
nResp := oObj:Send( cSend )
if( nResp != len( cSend ) )
conout( "Erro! Dado nao transmitido" )
else
conout( "Dado Enviado" )
endif
if( oObj:IsConnected() )
conout( "OK! Estou conectado" )
else
conout( "Ops! Nao estou conectado" )
endif
oObj:CloseConnection()
if( !oObj:IsConnected() )
conout( "Desconectei" )
else
conout( "Ainda estou conectado, erro na desconexao" )
endif
return
)intae
o3b&MCloseConnection 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
,inaliza a coneo TCP "enrica 6soc2et 7 do ob&eto corrente.
)intae
o3b&MCloseConnection 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
,inaliza a coneo TCP "enrica 6soc2et 7 do ob&eto corrente.
Abran"ancia
1erso <.F? 1erso =.@F 1erso >.@@
)intae
o3b&M9sConnected 6 7 TTK lLo"ico
8etorno
Tipo Descrio
L+"ico 8etorna True se a coneo esta ativa e false caso este&a
inv/lidaDdesconectado.
Descrio
1erifica se eiste coneo valida no ob&eto corrente.
)intae
t)oc2etClient67MNe* 6 7 TTK o)oc2et
8etorno
Tipo Descrio
3b&eto 8etorna um 3b&eto do tipo t)oc2etClient
Descrio
Cria o ob&eto t)oc2etClient0 sem coneo ativa.
)intae
o3b&M8eceive 6 L cc-uffer K 0 L nTimeout K 7 TTK nZtd8ecebida
ParCmetros
Ar"umento Tipo Descrio
c-uffer Caracter -uffer (ue conter/ os dados a serem recebidos.
nTimeout Numrico
tempo em milise"undos (ue a funo receive espera at
receber al"um dado pela coneo.
8etorno
Tipo Descrio
Numrico
Ztde de bPtes recebidos0 se houver al"um erro nZtd8ecebida ser/ menor
(ue zero.
Descrio
8ecebe os dados pela coneo ativa do ob&eto0 (ual(uer tipo de dado pode ser recebido.
)intae
o3b&M8eset 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 8etorno nulo.
Descrio
,inaliza anormalmente a coneo0 no avisa o outro lado (ue a coneo ser/ finalizada.
Deve ser utilizado apenas em casos etremos.
)intae
o3b&M)end 6 : c-uffer ; 7 TTK nZtdTrasmitido
ParCmetros
Ar"umento Tipo Descrio
c-uffer Caracter -uffer com os dados a serem transmitidos pela coneo.
8etorno
Tipo Descrio
Numrico
Numero de bPtes transmitidos0 caso o numero se&a diferente do tamanho de
c-uffer0 al"um erro aconteceu.
Descrio
Transmite o buffer pela coneo TCP 5enrica ativa.
BANCO DE DADOS
Copy
)intae
C3P^ : ,9.LD) Lcampo0...K ; T3 c,ile : escopo ; : !#9L. LlCondicaoK ; : ,38
LlCondicaoK ; : )D, J D.L9'9T.D :!9T# LcDelimiterK; ; : 19A LcDriverK ;
ParCmetros
Ar"umento Tipo Descrio
,9.LD)
Lcampo0...K
Caracter
,9.LD) Lcampo0...K especifica um ou mais campos0
separados por v$r"ula0 a serem copiados para a tabela de
destino. Caso no especificado este parCmetro0 sero
copiados todos os campos da tabela de ori"em.
T3 c,ile Caracter T3 Lc,ileK especifica o nome do ar(uivo de destino. 3
nome do ar(uivo de destimno pode ser especificado de
forma literal direta0 ou como uma epresso Advpl0 entre
paranteses.
Caso se&am especificadas as cl/usulas )D, ou
D.L9'9T.D0 "erado um ar(uivo A)C990 com etenso
.tt por default.
escopo Caracter
LescopoK define a poro de dados da tabela atual a ser
coipiada. Por default0 so copiados todos os re"istros
6ALL7. 3s escopos poss$veis de uso soM
ALL T Copia todos os re"istros.
8.)T T Copia0 a partir do re"istro atualmente posicionado0
at o final da tabela.
N.]T LnK T Copia apenas LnK re"istros0 iniciando a partir
do re"istro atualmente posicionado.
3-).81Agh3 M 1ale a pena lembrar (ue o escopo
sens$vel tambm is demais condiYes de filtro 6 !#9L. D
,38 7.
!#9L.
LlCondicaoK
L+"ico
!#9L. LlCondicaoK permite especificar uma condio
para realizao da c+pia0 a partir do re"istro atual0
eecutada antes de inserir cada re"istro na tabela de
destino0 sendo realizada a operao de c+pia en(uanto esta
condio for verdadeira.
,38 LlCondicaoK L+"ico
,38 LlCondicaoK especifica uma condio para c+pia de
re"istros0 eecutada antes de inserir um re"istro na tabela
de destino0 sendo a operao realizada apenas se lCondicao
ser verdadeira 6 .T. 7
: )D, J
D.L9'9T.D
:!9T#
LcDelimiterK; ;
Caracter
: )D, J D.L9'9T.D :!9T# LcDelimiterK; ;
)D, especifica (ue o tipo de ar(uivo de destino "erado
um ar(uivo no formato f)Pstem Data ,ormatf A)C990 onde
re"istros e campos possuiem tamanho fio no ar(uivo de
destino.
D.L9'9T.D especifica (ue o ar(uivo A)C99 de destino
ser/ no formato delimitado0 onde os campos do tipo
Caractere so delimitados entre aspas duplas 6 delimitador
Default 7. 8e"istros e campos tam tamanho vari/vel no
ar(uivo A)C99.
D.L9'9T.D !9T# LcDelimiterK permite especificar um
novo caractere0 ou se(uancia de caracteres0 a ser utilizada
como delimitador0 ao invs do default 6 aspas duplas 7. 3
caractere delimitador pode ser escrito de forma literal0 ou
como uma epresso entre paranteses.
Nas Tabelas complementares A e -0 na documentao do
comando0 so detalhadas as especificaYes dos formatos
)D, e D.L9'9T.D.
19A LcDriverK Caracter 19A LcDriverK permite especificar o driver utilizado para
criar a tabela de destino dos dados a serem copiados.
3 Driover deve ser especificado como uma epresso
caractere. Caso especificado como um valor literal direto0 o
mesmo deve estar entre aspas.
Descrio
C3P^ T3 um comando de banco de dados0 (ue permite a c+pia de todos ou parte
dos re"istros da tabela atualmente selecionada na /rea de trabalho atual0 para um novo
ar(uivo. 3s re"istros considerados para a c+pia podem ser limitados pela cl/usula
LescopoK0 atravs de epressYes ,38 D !#9L. 0 eDou atravs de um filtro.
)e o filtro para re"istros deletados 6 ).T D.L.T.D 7 estiver desli"ado 63,,70
re"istros deletados 6 marcados para deleo 7 so copiados para o ar(uivo de destino0
mantendo este status. Caso contr/rio0 nenhum re"istro deletado copiado. Da mesma
maneira0 caso eista uma condio de filtro na tabela atual 6 ).T ,9LT.8 70 apenas os
re"istros (ue satisfaam a condio de fintro sero copiados.
3s re"istros so lidos na tabela atual0 respeitando a ordem de $ndice setada. Caso no
ha&am $ndices abertos0 ou a ordem de nave"ao nos $ndices 6).T 38D.8 7 se&a F
6zero70 os re"istros so lidos em orden natural 6 ordem de 8.CN3 7 .
A tabela de destino dos dados copiados criada0 e aberta em modo eclusivo0 antes
da operao de c+pia efetiva ser iniciada.
Tabela A M .specificao do formato )D, 6 )Pstem Data ,ormat 7
.lemento do Ar(uivo ,ormato
Campos _C_ Caractere Tamanho fio0 a&ustado com espaos em branco
Campos _D_ Data ,ormato aaaammdd 6 ano0 mas0 dia 7
Campos _L_ l+"icos T ou ,
Campos _'_ 'emo 6campo i"norado7
Campos _N_ Numricos A&ustados i direita0 com espaos em branco.
Delimitador de Campos Nenhum
)eparador de 8e"istros C8L, 6 A)C99 @G j A)C99 @F 7
'arca de final de ar(uivo
6.3,7
Nenhum
Tabela - M .specificao do formato delimitado 6 D.L9'9T.D D D.L9'9T.D !9T#
LcDelimiterK 7
.lemento do Ar(uivo ,ormato
Campos _C_ Caractere Delimitados0 i"norando espaos i direita
Campos _D_ Data ,ormato aaaammdd 6 ano0 mas0 dia 7
Campos _L_ l+"icos T ou ,
Campos _'_ 'emo 6campo i"norado7
Campos _N_ Numricos sem espaos em branco.
Delimitador de Campos 1$r"ula
)eparador de 8e"istros C8L, 6 A)C99 @G j A)C99 @F 7
'arca de final de ar(uivo
6.3,7
Nenhum
Observaes
A Lin"ua"em Advpl0 antes do Protheus0 suportava a "erao de uma tabela
delimitada diferenciada0 obtida atravs do comando COPY TO (...) DELIMITED
WITH BLANK . No Protheus este formato no suportado. Caso utilizeTse este
comando com a sintae acima0 o ar(uivo A)C99 "erado ser/ delimitado0
utilizandoTse a se(uancia de caracteres _-LANb_ como delimitadora de campos
Caractere.

COPY STRUCTURE
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
)intae
C3P^ )T8ECTE8. T3 LcData-aseK
ParCmetros
Ar"umento Tipo Descrio
T3 LcData-aseK Caracter
Deve ser especificado em cDatabase o nome da tabela a
ser criada.
Descrio
C3P^ )T8ECTE8. um comando de banco de dados0 (ue cria uma nova tabela0
vazia0 com a estrutura da tabela ativa na /rea de trabalho atual. )e a tabela a ser criada &/
eista0 a mesma sobrescrita. A tabela de destino criada utiliza o mesmo 8DD da tabela
de ori"em 6 tabela ativa na /rea de trabalho atual 7.
Observaes
A Lin"ua"em Advpl0 antes do Protheus0 suportava a parametrizao de uma lista
de campos da tabela atual0 para compor a estrutura da tabela de destino0 atravs
da cl/usula FIELDS <campo,...>. .sta opo no suportada no Protheus. Caso
se&a utilizada0 o pro"rama ser/ abortado com a ocorrancia de erro fatal M
'DBCopyStruct - Parameter <Fields> not supported in Proteus'
FUNES GENRICAS
)intae
.]9)TD98 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo .istDir tem como ob&etivo determinar se um path de diret+rio eiste e
valido.
.emplo no server a partir do rootPathM
.istDir6_`teste_7
.emplo no client0 passando o fullPathM
.istDir6_cM`AP3_7
)intae
,TP1.8)93N 6 7 TTK c8et
8etorno
Tipo Descrio
Caracter 8etorna uma )trin" contendo o valor da verso de ,TP.
Descrio
A funo ,tp1ersion tem como ob&etivo determinar (ual a verso do Protocolo de
Transferancia de Ar(uivos.
)intae
5.TC3'PET.8NA'. 6 7 TTK Nome da m/(uina
8etorno
Tipo Descrio
Caracter Nome da m/(uina
Descrio
8etorna o nome da m/(uina 6#3)TNA'.7 (ue est/ eecutando o Protheus 8emote
)intae
5.T.N1 6 L c1ariavel K 7 TTK c8et
ParCmetros
Ar"umento Tipo Descrio
c1ariavel Caracter
Nome da variavel de ambiente do sistema (ue dese&amos
obter.
8etorno
Tipo Descrio
Caracter
8etorna o conte%do da varivavel de ambiente0 se encontrada na tabela de
variaveis de sistema. Caso contr/rio0 retorna N9L.
Descrio
A funo 5et.nv67 tam como ob&etivo determinar o valor de uma
vari/vel do environment da plataforma6)istema 3peracional7 em uso0 no ambiente do
Protheus )erver.
3 valor de retorno da funo ser/ 'IL se o parametro va!am" informado no for
encontrado na tabela das vari/veis de ambiente do )istema 3peracional.
!"emplo#
c)PsPath MN 5et.nv6_PAT#_7
)intae
5.T.N1).81.8 6 7 TTK c8et
8etorno
Tipo Descrio
Caracter )trin" contendo o nome do environment em eecuo.
Descrio
A funo 5et.nv)erver67 tem como ob&etivo retornar uma strin" (ue nos permite
determinar o nome do .nvironment (ue est/ rodando atualmente no )erver Protheus.
Em eemplo interessante da funo (uando dese&amos rodar um pro"rama e nao
sabemos em (ual environment estaremos.
)tart4ob6_Teste_0 :etE".Ser.er560 .T.0 _??_0 _F@_ 7
)intae
5.T8.'3T.T^P. 6 7 TTK n8mtTPpe
8etorno
Tipo Descrio
Numrico n8mtTPpe corresponde io n%mero correspondente i interface utilizada.
Descrio
Atravs da funo 5et8emoteTPpe670 poss$vel identificar sob (ual interface o
pro"rama atual est/ em eecuo.
.sta funo est/ dispon$vel a partir do Protheus >0 -uild =.FF.FHFGF>a
PodeTse utilizar as constantes abaio0 para avaliar o retorno da funo.
N3k8.'3T. T@ DD 4ob0 !eb ou !or2in" Thread 6 )em remote 7
8.'3T.kZTk!9NGA @ DD 8emote em ambiente !indo*s
8.'3T.kZTkL9NE] A DD 8emote em ambiente EniDLinu
)intae
5.T)C8..N8.) 6 7 TTK 8esoluo:A;
8etorno
Tipo Descrio
ArraP 8etorno da funo ondeM
8esoluo:@; N 8esoluo horizontal
8esoluo:A; N 8esoluo vertical
Descrio
8etorna ArraP com a resoluo de tela da m/(uina eecutando o Protheus 8emote
)intae
9PCCount 6 L c)emaforo K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
c)emaforo Caracter
9ndica o local ou )emafora em (ue as Threads foram
iniciados.
8etorno
Tipo Descrio
Numrico
A funo retorna um inteiro indicando oo numero de Threads L918.) de
acordo com o semaforo indicado por parametro.
Descrio
A funo 9PCCount tem como ob&etivo obter todas as Threads (ue esto no ar em um
determinado ambiente indicado pelo semaforo.
A funo ir/ retornar um inteiro indicando o total de threads livres (ue esto esperando
um 9PC5o.
)intae
9PC5o 6 L c)emaforo K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
c)emaforo Caracter
9ndica o local ou )emaforo em (ue as Threads foram
iniciados.
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo 9PC5o tem como ob&etivo mandar uma chamada para uma Thread0 na (ual
nao precisa ser necessariamente em mesmos ambientes0 (ue este&a em !ait0
A 9PC5o devemos atravs de um primeiro ar"umento da funo0 especificar o semaforo
(ue dese&amos0 a funo ir/ pe"ar a pri,eira Tread Li.re (ue encontrar em
9PC!ait.
A funo recebe mais @B ar"umentos opcionais para passa"em de dados0 porm este
valor ")o pode ser um Boo$ea" ou u, CodeB$oc>0
)intae
9PC!ait 6 L nTime3ut K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
nTime3ut Numrico
Numerico (ue 9ndica um tempo de time3ut em
milisse"undos0 para a thread sair do ar.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha recebido uma chamada da 9PC5o0 false caso nao
recebeu nehuma chamada ou saiu por time3ut.
Descrio
A funo 9PC!ait67 tem como ob&etivo colocar em modo de espera uma Thread (ue
acabou de ser carre"ada e fica a"uardando oo chamado de uma 9PC5o67. A funo
recebe um parametro numrico (ue indica o ti,eOut em ,i$isse3u"dos de tempo para
(ue a Thread se&a derrubada.
A 9PC!ait67 recebe mais @B parametros opcionais T (ue indica os parametros passados
pela 9PC5o67 T
8etorna true caso tenha che"ado um chamado da 9PC5o670 false no recebeu nenhum
9PC5o ou saiu por time3ut.
o#s2 "ote 1ue "ao &oi i"dicado u, .a$or de se,a&oro para a &u"()o9 pois est?
i,p$icito o pro3ra,a 1ue i"iciou a Tread0
)intae
9PC!ait. 6 L c)emaforo K 0 L nTime3ut K 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
c)emaforo Caracter 9ndica o nome do )emaforo (ue estamos trabalhando.
nTime3ut Numrico
Numerico (ue 9ndica um tempo de time3ut em
milisse"undos0 para a thread sair do ar.
8etorno
Tipo Descrio
L+"ico
8etorna true caso tenha recebido uma chamada da 9PC5o0 false caso nao
recebeu nehuma chamada ou saiu por time3ut.
Descrio
A funo 9PC!ait.67 tem como ob&etivo colocar em modo de espera uma Thread (ue
acabou de ser carre"ada e fica a"uardando oo chamado de uma 9PC5o67. Na
9PC!ait.67 devemos indicar o nome do semaforo (ue (ueremos.
A funo recebe como se"undo parametro numrico (ue indica o ti,eOut em
,i$isse3u"dos de tempo para (ue a Thread se&a derrubada.
A 9PC!ait.67 recebe mais @B parametros opcionais T (ue indica os parametros
passados pela 9PC5o67 T
8etorna true caso tenha che"ado um chamado da 9PC5o670 false no recebeu nenhum
9PC5o ou saiu por time3ut.
O#s2 "ote 1ue "a IPC@aitE* &oi i"dicado u, .a$or de se,a&oro para a &u"()o0
)intae
9))81EN9] 6 7 TTK lisEni
8etorno
Tipo Descrio
L+"ico
)e .T. o servidor est/ sendo eecutado em ambiente Eni6r7 ou Linu6r7
)e .,. o servidor est/ sendo eecutado em ambiente !indo*s6r7
Descrio
9nforma se o servidor Advanced Protheus est/ sendo eecutado em ambiente EN9] ou
Linu.
E*e,p$o das &u"(Aes IsSr.U"i* e
:etRe,oteI"i'a,e
8evisoM @ADF<DAFFG
Abran"ancia
1erso <.F? 1erso =.@F 1erso >.@@
Atravs do eemplo abaio0 podemos obter o path de eecuo do AP 8emote.
#include "protheus.ch"
Function TstRmtPath()
Local cIniName:= GetRemoteIniName()
Local lUnix:= ISSRVUNIX()
Local nPos:= Rat( IIf(lUnix,"/","\"),cIniName )
Local cPathRmt

if nPos!=0
cPathRmt:= Substr( cIniName,1,nPos-1 )
else
cPathRmt:=""
endif
QOut( cPathRmt )
Return
)intae
b9LLAPP 6 : lbill ; 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
lbill L+"ico
Parametro opcional indicando se Thread corrente deve ser
finalizada.
8etorno
Tipo Descrio
L+"ico
retorna se thread corrente &/ recebeu al"um aviso para ser finalizada6true70
caso contr/rio retorna false.
Descrio
A funo billApp pode ser usada com dois ob&tivos diferentes de acordo com a
passa"em de parametro.
Zuando for feita uma chamada da funao billApp sem valor de parametro nenhum
informado0 a funo tem como ob&etivo retornar se a thread recebeu uma chamada para
ser finalizada. Em eemplo dessa situao (uando atravs do monitor de tarefas do
Protheus (ueremos derrubar uma determinada Thread porm esperamos o final da sua
utilizao.
.emploM
DDThread ir/ ser finalizada
9f billApp67
DVtratamento de finalizaoVD
.ndif
Zuando for realizada a chamada da ,uno0 passando um parametro booleano0 ela tem
como ob&etivo finalizar a Thread no (ual foi realizada a chamada da billApp.
billApp6 .T. 7
')APP-89N5T3,83NT 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
)e o Protheus 8emote est/ sendo eecutado em bac2"round 6abaio de outras &anelas de
outros pro"ramas no des2top do usu/rio70 a funo ')APP-89N5T3,83NT6 7 pode
ser utilizada para avisar ao sistema operacional para (ue mude a disposio das &anelas
ativas no des2top para (ue eiba a &anela do Protheus 8emote acima de todas as &anelas
das outras aplicaYes em eecuo.
Nos sistemas operacionais !indo*s0 se o sistema operacional no conse"uir eecutar o
comando para movimentar as &anelas0 a barras de &anelas do !indo*s ficar/ piscando
sobre a ocorrancia do Protheus 8emote para avisar o usu/rio sobre a inteno do
pro"rama 6Protheus 8emote7 ser visualizado.
)intae
')C8CGA 6 L c)trin" K 7 TTK nC8C
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
)trin" de onde ser/ calculado um C8CGA0 "arantido (ue
para a mesma strin" sempre se obter/ um mesmo n%mero0
porm0 no "arantido (ue para strin"s diferentes0 os
n%meros se&am sempre diferentes.
8etorno
Tipo Descrio
Numrico
Em n%mero inteiro 0 com at @F 6dez7 d$"itos 0 correspondente ao C8C da
strin" informada como parCmetro.
Descrio
Calcula um C8C de uma strin". A funo ')C8CGA67 calcula um C8C de uma strin"
informada e retorna um n%mero com esse c/lculo.
Note (ue strin"s i"uais retornam C8C i"uais0 porm0 nem sempre strin"s diferentes
retornam C8C diferentes.
Atravs do eemplo abaio 0 calculamos o C8C das strin"s informadas.
// Le o arquivo lista.txt no ambiente do servidor
// e calcula o CRC do mesmo.
cString := memoread('\lista.txt')
nCRC1 := MSCRC32(cString)
MsgStop('CRC = '+str(nCRC1,10))
)intae
')C8CGA)T8 6 L c)trin" K 7 TTK cC8CGA
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
)trin" a partir da (ual ser/ calculado o C8CGA. X "arantido
(ue para a mesma strin" sempre ser/ obtido um mesmo
C8C 0 mas no "arantido (ue para strin"s diferentes os
C8Cs se&am sempre diferentes.
8etorno
Tipo Descrio
Caracter Ema strin" com o C8C da strin" informada.
Descrio
')C8CGA)T867 calcula um C8C de uma strin" informada 0 retornando uma strin" com
esse c/lculo.
Note (ue strin"s i"uais retornam C8C i"uais0 porm nem sempre strin"s diferentes
retornam C8C diferentes.
Atravs do eemplo abaio 0 calculamos o C8C das strin" informada.
// Le o arquivo lista.txt no ambiente do servidor
// e calcula o CRC32 do mesmo.
cString := memoread('\lista.txt')
cCRC32 := MSCRC32STR(cString)
MsgStop('CRC = ['+cCRC32+']')
)intae
P83C.))'.))A5.) 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
'uitas vezes desenvolvemos rotinas de durao lon"a (ue (uando chamadas atravs de
uma ao no Protheus 8emote 6.emploM 3po acionada no menu7 provocam um
_con"elamento_ tempor/rio nas telas do Protheus 8emote.
Para minimizar esse efeito0 podemos utilizar a funo P83C.))'.))A5.)6 7 para
(ue o Protheus 8emote possa renovar a pintura de suas &anelas ou rea"ir a ao do
mouse durante um processamento lon"o sendo eecutado no Protheus )erver. Como o
eemplo a se"uir M
*hile n8ecsL@FFF
Process'essa"es6 7
DD Processo Lon"o
Do)omethin"Lon"Time6 7
n8ecTT
enddo
Cuidado2 O uso i"te"si.o da &u"()o ProcessMessa3es5 6 pro.ocar? tr?&e3o e$e.ado
de rede e"tre o Proteus Re,ote e Proteus Ser.er co,pro,ete"do o uso dos
recursos de rede "a rede i"teira da E,presa0 Porta"to a &u"()o de.e ser uti$i7ada
co, ,uita caute$a0 CBdi3o co,o o a#ai*o de.e ser e.itado2
&or i2=C to CD
ProcessMessa3es5 6
"e*t i
)intae
8AND3'9\. 6 L n'inimo K 0 L n'aimo K 7 TTK nAleatorio
ParCmetros
Ar"umento Tipo Descrio
n'inimo Numrico Corresponde ao menor numero a ser "erado pela funo.
n'aimo Numrico
Corresponde ao maior n%mero 6 menos um 7 a ser "erado
pela funo.
8etorno
Tipo Descrio
Numrico
Numero randdmico 0 compreendido no intervalo entre 6n'inimo7 e
6n'aimoT@7 M 3 numero "erado pode ser maior ou i"ual i n'inimo e
menor ou i"ual a n'aimoT@ .
Descrio
Atravs da funo randomize67 0 "eramos um numero inteiro aleat+rio0 compreendido
entre a faia inferior e superior recebida atravs dos parCmetros n'inimo e n'aimo0
respectivamente.
Observa$o #
3 limite inferior recebido atravs do parCmetro n'inimo fmaior ou i"ual a f0 podendo
ser sorteado e fazer parte do retorno[ porm o limite superior fmenor (uef0 de modo a
nunca ser/ atin"ido ou devolvido no resultado. Por eemplo 0 a chamada da funo
randomize6@0A7 sempre retornar/ @ .
)intae
).NDT3,38. 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 .sta funo no retorna valor
Descrio
.sta funo torna a aplicao do 8emote fore"round na estao em (ue est/ sendo
eecutado.
,az com (ue a &anela ativa do 8emote fi(ue acima de todas as &anelas de outras
aplicaYes eecutadas na estao.
.tremamente dependente do sistema operacional em uso0 as vezes pode falhar devido
ao sistema operacional no suportar o comando ou devido a car"a ecessiva do sistema0
o sistema operacional pode i"norar o comando.
)intae
)3Cb.TC3NN 6 L c9P K 0 L nPort K 0 L c8e( K 0 L nTime3ut K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
c9P Caracter
8epresenta uma )trin" com o endereo 9P ou nome da
m/(uina do destino dese&ado.
nPort Numrico
9ndica o n%mero da porta pelo (ual ser/ realizada a
coneo.
c8e( Caracter
8epresenta a re(uisio (ue ser/ feita para a ma(uina
dese&ada0 assim (ue a coneo for estabelecida.
nTime3ut Numrico
9ndica o valor de tempo em se"undos no (ual a coneo
ser/ encerrada por tempo de inatividade6time out7.
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo )oc2etConn usada para criar uma coneo com um determinado destino0
atravs da coneo de um )oc2et Client.
Para 8ealizar esta coneo informamos o destino0 no (ual pode ser informado em forma
de 9P ou atravs de um nome de m/(uina. .m se"uida informamos o numero de
porta na (ual ser/ realizado um bind atravs dessa porta.
.m se"uida informamos atravs de strin" o tipo de re(uisio (ue iremos realizar0 pois
(uando a coneo ao soc2et destino completada com sucesso0 a funo ir/ enviar e
receber dados de acordo com a re(uisio (ue fizemos.
Por %ltimo informamos o total de tempo em se"undos (ue a funo ir/ ficar esperando
por uma resposta do destino informado.
)intae
]'L.8838 6 7 TTK n]ml)tatus
8etorno
Tipo Descrio
Caracter
8etorna o status da ultima operao de Criao de 3b&eto ]'L realizado
pelo comando C8.AT. o]ml ...
Descrio
A funcao ]ml.rror67 retorna um status da eecuo da ultima rotina de criao de
3b&eto ]'L realizada pelo comando C8.AT. o]'L. Podemos utilizarTnos das
constantes definidas no ar(uivo l9NCLED. f]ml,un.C#f para realizar o tratamento
de erro. 1ide tabelas de constantes abaio M
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
Constante 1alor
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
].8838k3NL^,98)TN3D. T@
].8838k)ECC.)) F
].8838k,9L.kN3Tk,3END @
].8838k3P.Nk.8838 A
].8838k9N1AL9Dk]'L G
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
#INCLUDE "XmlXFun.xh"
Local oXml , nXmlStatus
CREATE oXML XMLFILE "\exemplo.xml"
nXmlStatus := XMLError()
If ( nXmlStatus != XERROR_SUCCESS )
Alert("Falha ("+str(nXmlStatus,3)+") na criao do XMLl")
Else
//processamento dop XML ....
Endif
)intae
compress 6 L cc-uffer3ut K 0 L cnLen"ht3ut K 0 L cc-uffer9n K 0 L cnLen"th9n K 7
TTK b32
ParCmetros
Ar"umento Tipo Descrio
c-uffer3ut Caracter
8etorna o buffer compactado0 a vari/vel dever/ ser do
tipo caracter. 3 8etorno compactado conter/ caracteres
bin/rios0 incluindo zero bin/rio.
nLen"ht3ut Numrico
8etorna o tamanho do buffer compactado0 (uando os
dados compactados so pe(uenos0 o buffer de sa$da pode
ser maior (ue o buffer ori"inal.
c-uffer9n CodeT-loc2
-uffer (ue dever/ ser compactado0 podem conter
caracteres bin/rios0 o buffer pode ter no m/imo @'b.
nLen"th9n Numrico Tamanho do buffer a ser compactado.
8etorno
Tipo Descrio
L+"ico
8etorna .T.0 caso o buffer foi compactado com sucesso.
8etorna .,.0 caso no se&a poss$vel compactar o buffer.
Descrio
Compacta um buffer recebido0 atravs do al"oritmo propriet/rio.
Na maioria dos casos o buffer recebido ser/ menor do (ue o buffer ori"inal0 em casos
onde o buffer ori"inal muito pe(ueno0 menos de @A> bPtes0 o buffer de sa$da poder/
ser maior do (ue o o buffer ori"inal.
.ssa funo aceita e retorna caracteres bin/rios de v/rios tipos0 incluindo o zero bin/rio.
3 8esultado dessa funo no dever/ ser "ravado em banco de dados0 especialmente
TopConnect.

.emplos
user function TSTComp
Local cNaoComp := replicate( 'A', 1024 )
Local cComp := '', cResult := ''
Local nTamNaoComp := len( cNaoComp )
Local nTamComp := 0
Local bResp

bResp := compress( @cComp, @nTamComp, cNaoComp, nTamNaoComp )
If( bResp )
Alert( "Buffer Compactado - Tamanho Compactado" + str( nTamComp
) )
else
Alert( "Falha ao compactar o Buffer!" )
return
endif

bResp := uncompress( @cResult, @nTamNaoComp, cComp, nTamComp )
If( !bResp )
Alert( "Falha ao descompactar o Buffer!" )
return
endif
if( cResult != cNaoComp )
Alert( "Buffer descompactado diferente do buffer original" )
else
Alert( "Buffer descompactado igual ao buffer original" )
endif
return .t.
)intae
uncompress 6 L cc-uffer3ut K 0 L cnLen"th3ut K 0 L c-uffer9n K 0 L cnLen"th9n K 7
TTK b3b
ParCmetros
Ar"umento Tipo Descrio
c-uffer3ut Caracter
-uffer descompactado0 eatamente o buffer (ue foi
passado pela funo compress.
nLen"th3ut Numrico Tamanho do buffer descompactado
c-uffer9n Caracter -uffer compactado pela funo compress.
nLen"th9n Numrico
Tamanho do buffer compacto0 informao fundamental
para a correta descompactao do buffer.
8etorno
Tipo Descrio
L+"ico
8etorna .t.0 caso o buffer foi descompacto com sucesso.
8etorna .,.0 caso no se&a poss$vel descompactar o buffer.
Descrio
Descompacta um buffer recebido0 atravs do al"oritmo propriet/rio.
.ste buffer devera ser "erado pela funo compress.
.ssa funo aceita e retorna caracteres bin/rios de v/rios tipos0 incluindo o zero bin/rio.
FUNES DE IMPRESSO
)intae
5.T9'P!9ND3!) 6 L l)erver K 7 TTK aPrinters
ParCmetros
Ar"umento Tipo Descrio
l)erver L+"ico
9nformar .T. se a lista de impressoras deve ser obtida do
Protheus )erver ou .,. para obter lista de imporessoras da
estao 8emota. .ste parCmetro obri"at+rio.
8etorno
Tipo Descrio
ArraP
ArraP com nome das impressoras dispon$veis. 1ale lembrar (ue esta
funo no verifica o status atual da6s7 impressora6s7 encontrada6s7.
Descrio
5.T9'P!9ND3!)6 7 retorna uma lista de impressoras dispon$veis no spool do )erver
ou 8emote. )e o )erver est/ em ambiente Eni0 a 5.T9'P!9ND3!)67 retornar/ a
lista com os nomes de impressoras cadastradas na chave P89NT.8)NA'. do ar(uivo
de confi"urao do Protheus )erver.
Caso no se&a encontrada nenhuma impressora 0 retornado um arraP com @ elemento 0
contendo a )trin" fNenhuma 9mpressora Disponivelf.
O#ser.a()o 2 Caso a &u"()o se4a passada co, o ar3u,e"to 0F0 5 #uscar
i,pressoras da esta()o Re,ote 6 9 por, a &u"()o se4a e*ecutada a partir de u,
JOB 5 pro3ra,a se, a i"ter&ace Re,ota 6 9 o arra- retor"ado ter? ape"as C
e$e,e"to 9 co"te"do a Stri"3 E'e"u,a I,pressora %ispo"i.e$E0
.emplos
No eemplo abaio 0 determinamos as impressoras dispon$veis na estao 8emote e no
)erver 0 respectivamente. . 0 mostramos no Console do )erver a6s7 impressora6s7
encontrada6s7.
aImpRemote := GetImpWindows(.F.)
conout('Impressoras na estao remota')
aeval(aImpRemote , { |x| conout(x) })
aImpServer := GetImpWindows(.T.)
conout('Impressoras no Servidor')
aeval(aImpServer , { |x| conout(x) })
)intae
5.TP38TACT91. 6 L l)erver K 7 TTK aPort9mp
ParCmetros
Ar"umento Tipo Descrio
l)erver L+"ico
CAso especificado .T. 0 a lista de impressoras ser/ obtida do
)erver0 caso .,. a lista ser/ obtida da estao 68emote7.
8etorno
Tipo Descrio
ArraP ArraP com as portas de impresso dispon$veis.
Descrio
8etorna lista de portas de impresso dispon$veis. A funo 5.TP38TACT91.6 7
retorna uma lista de portas de impresso dispon$veis do Protheus )erver ou 8emote. )e
o Protheus )erver est/ em ambiente Eni0 a 5.TP38TACT91.67 retornar/ uma lista
com os nomes de devices poss$veis para impresso.
Caso no se&am encontradas portas para impresso 0 retornado um arraP com apenas
um elemento 0 contendo a strin" fNao eistem portas disponiveisf.
O#ser.a()o 2 Caso a &u"()o se4a ca,ada co, o par+,etro 0F0 9 para o#ter as
portas de i,press)o da esta()o re,ota 9 por, a &u"()o se4a ca,ada atra.s de
u, JOB 5 pro3ra,a se, a i"ter&ace Re,ote 6 9 a ,es,a retor"ar? u, arra- co,
u, e$e,e"to 9 co"te"do a stri"3 E'ao e*iste, portas dispo"i.eisE0
%&!'!(S!) Builds superiores a *+,,+,-../,p
Ao verificar os devices de impresso dispon$veis no ).81.80 os devices especificados
na confi"urao de blo(ueio de portas de impresso 6 D#$a%&"D"v#c"Po' 7 no server
no so listados por esta funo.
Zuando eecutada em ambiente Linu0 os devices de impresso dispon$veis no
).81.80 a funo deia de retornar os devices como DdevDlpF e DdevDttPsF ... e passa a
retorn/Tlos a nomenclatura LPT@M...C3'@M... 0 limitando o retorno em no m/imo
H portas paralelas e H portas seriais.
.emplos
No eemplo abaio0 determinamos as portas de impresso dispon$veis na estao
8emote e no )erver0 respectivamente. . mostramos no Console do )erver a6s7 porta6s7
encontrada6s7.
aPortRemote := GetPortActive(.F.)
conout('Impressoras na estao remota')
aeval(aPortRemote , { |x| conout(x) })
aPortServer := GetPortActive(.T.)
conout('Impressoras no Servidor')
aeval(aPortServer , { |x| conout(x) })
1e&a abaio um eemplo do (ue foi mostrado no console do Protheus )erver0 apos a
eecuo da rotina.
Impressoras na estao remota
COM1:
COM2:
COM3:
COM4:
FILE:
LPT1:
LPT2:
LPT3:
\\prnserver\prx-lp1
Impressoras no Servidor
COM1:
COM2:
COM3:
COM4:
FILE:
LPT1:
LPT2:
LPT3:
FUNES INTERFACE http
.NC8^PT8)A 6 L c,ilebeP K 0 L c9nfo K 0 : l.ncode<H ; 7 TTK c8et
ParCmetros
Ar"umento Tipo Descrio
c,ilebeP Caracter
8epresenta o nome do ar(uivo0 (ue contm a chave para
cripto"rafar a informao0 o ar(uivo deve ser do tipo .pem
c9nfo Caracter
8epresenta a informao (ue dese&amos ser cripto"rafada
usando 8)A.
l.ncode<H L+"ico
Caso dese&amos (ue a sa$da dos dados venha encodado em
base <H informamos true0 caso contr/rio false.
8etorno
Tipo Descrio
Caracter
8etorna as informaYes passadas atravs do ar"umento0 cripto"rafadas em
8)A.
Descrio
A funo .ncrPpt8)A tem como ob&etivo realizar a cripto"rafia de dados0 para isso usa
um tipo de cripto"rafia denominada 8)A.
3 8)A um al"oritmo de Cripto"rafia Assimtrica0 isto si"nifica (ue possu$mos uma
chave p%blica e privada0 8)A o mais usado al"oritmo de chave p%blica0 pois prova
confidencialidade e assinatura di"ital.
A chave p%blica a (ue serve para cifrar a mensa"em 6Confidencialidade7 e decifrar a
mensa"em 6Autenticidade7. Todos (ue dese&arem lhe enviar uma mensa"em devem
conhecaTla.
Chave privada0 (ue serve para decifrar a mensa"em 6Confidencialidade7 e cifrar a
mensa"em 6Autenticidade7. )omente uma pessoa deve conhecaTla.
.m nossa funo informamos o local onde se encontra a chave (ue ser/ usada0 em
se"uida passamos como strin" os dados (ue (ueremos cripto"rafar0 podemos ainda
informar se dese&amos o retorno em base <H ou nao.
)intae
5.T!.-43- 6 7 TTK c4obName
8etorno
Tipo Descrio
Caracter
c4obName corresponde io nome do &ob (ue confi"ura a *or2in" Thread
atual em uso. Caso a chamada da funo se&a realizada a partir de uma
thread (ue no se&a uma !or2in" Thread 6 como por eemplo 0 uma thread
iniciada a partir de um Ap8emote 7 0 a funo 5et!eb4ob67 retornar/
uma strin" vazia 6ff7.
Descrio
Atravs desta funo 0 poss$vel recuperar o nome da confi"urao de !or2in"
Threads 6 4ob 7 (ue est/ sendo utilizada pela !or2in" Thread atual.
O#ser.a()o 2 Esta &u"()o est? dispo".e$ a partir dos Bui$d;s ApF 3erados a partir
de DGHDIHJDDJ0
)intae
5et.nv#ost 6 7 TTK c#ost
8etorno
Tipo Descrio
Caracter
Zuando em ambiente *eb retorna o host (ue foi utilizado para chamar a
funo.
Descrio
8etorna (uando em ambiente *eb0 por (ual host a p/"ina foi chamada.
.emploM
*eb function ret#ost
return "etenvhost67 DD 8etorna o nome do host (ue chamou essa funcao 6 .M
***.microsi"a.com.br 7

)intae
#TTPCAC#. 6 L cCacheControl K 7 TTK cLastCache
ParCmetros
Ar"umento Tipo Descrio
cCacheControl Caracter
Define o novo conte%do da eti(ueta do #eader de 8etorno
#TTP CacheTControl.
8etorno
Tipo Descrio
Caracter
.sta funo retorna a definio atualmente utilizada para a eti(ueta CacheT
Control do #eader #TTP.
Descrio
Atravs desta funo 0 podemos redefinir a eti(ueta CAC#.TC3NT83L do #eader de
8esposta de re(uisio #TTP 0 sobrepondo i definio defaut de retorno CAC#.T
C3NT83L 0 opcionalmente definida na confi"urao do #3)T #TTP no Ar(uivo de
confi"urao do Protheus )erver.
Tabela A - Definies CACHE-CONTROL
Conte%do Aplicao
noTstore
Nenhuma informao deve ser "uardada em Cache pelo servidor eDou
proie6s7.
Obs!"#$%o & A '()*)$%o ' +, *o"o -o*t.'o p#!# o CAC/E0CONTRO1 'o
/#'! /TTP #p*#s s!2 poss3"4 -#so st# (+*$%o A'"p4 s5# 6-+t#'#
#*ts ' 7+#47+! *")o p#!-)#4 ' ht,4 #o b!o8s! 9 !#4):#'o p4#
(+*$%o /ttpS*';<=
)intae
#TTPC3ENT).))93N 6 7 TTK nCount
8etorno
Tipo Descrio
Numrico
nCount corresponde ao n%mero de usu/rios (ue possuem vari/veis de
session em uso no )erver P8otheus.
Descrio
.sta funo retorna o n%mero de )essions de usu/rios (ue esto atualmente em uso na
mem+ria.
KK ATE'L/O 2 %e.e,os ate"tar ao &ato 1ue esta &u"()o ape"as ter? o e&eito
dese4ado caso o a,#ie"te atua$ e, uso pe$o Pro4eto @EB se4a @EBEM 5 @e#
E*te"ded 6 KK
3-).81Agh3 M .sta funo foi implementada na ,erramenta Ap< )erver 0 sendo
necess/rio ad(uirir um -uild de Protheus )erver com data i"ual ou superior a
AADFHDAFFA.
)intae
#TTPCTD9)P 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo tem o ob&etivo de prover informaYes sobre como apresentar uma mensa"en
ou como parte de um pacote.
Zuando uma parte de um pacote #ttp para ser tratada como um ar(uivo atachado0 a
funo ir/ setar essa parte do cabealho http6ContentTDisposition7 como um nome de
ar(uivo su"erido de acordo com o parCmetro.
3bs.M Caso ocorra a necessidade de verificar os tipos de parCmetros usados pelo
protocolo #ttp das opYes poss$veis para ContentTDispositionM
httpMDDhttpMDD***.ietf.or"DrfcDrfcA@>G.tt
O#s02 A &u"()o &ucio"a so,e"te e, Li">s AP@
.emplos
Neste eemplo criamos uma funo )TAT9C "et,ile67. Para usarmos a funo devemos
apenas informar o endereo fisico em disco de um a(uivo.
Criamos um pe(ueno buffer0 para ir mandando o pacote ao bro*ser0 em se"uida
abrimos o ar(uivo com a funo ,3pen67 e pe"amos o tamanho do ar(uivo com a
funo ,)ee267.
Definimos com a funo HttpCTT-pe o tipode ar(uivo (ue iremos carre"ar0 em nosso
eemplo apenas ar(uivos teto. Esamos a HttpCT%isp informando ao bro*ser (ue
estamos carre"ando um attac,e"t0 no caso est/ linha ir/ fazer aparecer a tela de
do*nload de um a(uivo do seu Bro!ser de&au$t e informamos o local do ar(uivo.
.m se"uida informamos ao bro*ser (ual o tamanho desse ar(uivo0 retornado da funo
,)ee2670 e comeamos a enviar o ar(uivo em pe(uenos pedaos de @FAHbPtes.
static Function GetFile( cFile )
Local cHtml := ''
Local cBuffer := space(1024)
Local hArq
Local nTam
If !file(cFile)
cHtml += '
Arquivo '+cFile+' no encontrado.
'
ElseIf (hArq := FOpen(cFile)) < 0
cHtml += '
Falha na Abertura do Arquivo '+cFile+' ( FERROR '+str(ferror(),4)+' )
'
Else
// Le o arquivo e manda p/ o browse
nTam := FSeek(hArq, 0, 2)
FSeek(hArq, 0, 0 )
HttpSetPart(.T.)
HttpCTType("text/plain")
HttpCTDisp('attachment; filename="'+cFile+'"')
HttpCTLen(nTam)
While FRead(hArq, @cBuffer, 1024)>0
HttpSend(cBuffer)
EndDo
FClose(hArq)
Endif
Return cHtml
)intae
#TTP.]9TP83C 6 L c,unction K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
c,unction Caracter
)trin" (ue indica o nome da funo a ser chamada (uando
a )ession for finalizada por timeTout.
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A http.itProc tem o ob&etivo de setar uma funo (ue ser/ chamada (uando uma
)ession for ,inalizada por TimeT3ut.
A funo (ue ser/ chamada para tratamento da session finalizada0 deve estar compilada
no reposit+rio de dados corrente.
'uito %til (uando se dese&a encaminhar todas _(uedas_ de )ession para uma %nica
funo de tratamento.
)intae
#TTP,8..).))93N 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 .sta funo sempre retorna N9L
Descrio
Atravs da funo #ttp,ree)ession 0 eliminamos da mem+ria do )ervidor Protheus
todas as vari/veis de )ession do usu/rio atual. Normalmente utilizamos esta funo em
operaYes de L353,, 0 onde necessitamos limpar todas os conteudos relacionados i
)ession deste usu/rio.
KK ATE'L/O 2 %e.e,os ate"tar ao &ato 1ue esta &u"()o ape"as ter? o e&eito
dese4ado caso o a,#ie"te atua$ e, uso pe$o Pro4eto @EB se4a @EBEM 5 @e#
E*te"ded 6 KK
3-).81Agh3 M .sta funo foi implementada na ,erramenta Ap< )erver 0 sendo
necess/rio ad(uirir um -uild do )ervidor Protheus )erver com data i"ual ou superior a
AADFHDAFFA.
)intae
#TTP5.T 6 L cErl K 0 : c5.TParms ; 0 : nTime3ut ; 7 TTK c#ttp
ParCmetros
Ar"umento Tipo Descrio
cErl Caracter
cErl corresponde ao endereo http 0 &untamente com a
pasta e o documento solicitados.
c5.TParms Caracter
c5.TParms corresponde i )trin"List de parCmetros a
serem enviados ao servidor http atravs da E8l . Caso no
especificado 0 este parCmetro considerado vazio 6ff7
nTime3ut Numrico
.m nTime3ut especificamos o tempo em se"undos
m/imo de inatividade permitido durante a recepo do
documento . Caso no especificado 0 o valor default
assumido @AF se"undos 6 A minutos7.
8etorno
Tipo Descrio
Caracter )trin" #tml correspondendo ao documento solicitado.
Descrio
A funo #ttp5et67 permite a emulao de um Client #TTP atravs de uma funo
Advpl0 acessando um determinado documento html publicado em um servidor !eb0
utiliando o mtodo 5.T 0 permitindo a passa"em de parCmetros via E8L0 a"uardando
por um tempo determinado 6timeTout7 pela resposta do servidor solicitado.
3bservaYes M
TTT Na passa"em de parCmtros 5.T 0 devemos atentar ao formato da strin" a ser passada
como parCmetros 0 pois a mesma se"ue o formato E89 6Eniform 8esource 9dentifiers7 M
ZuerP Component.
TTT Caso nao se&a retornado o documento antes do trmino do TimeTout especificado na
chamada da funo[ ou caso no se&a poss$vel localizar o servidor [ se&a por falha de
resoluo de DN) 0 ou por erro de sintae ao especificar a E8L 0 a funo retornar/
Nulo 6N9L7.
TTT Caso nao se&a poss$vel o acesso ao documento 0 como por eemplo o documento no
eista 0 ser/ retornado uma strin" html com a mensa"em de erro html enviada pelo
servidor correspondente.
3-).81ACA3 M .sta funco est/ disponivel apenas em -uilds Ap< "erados a partir de
@FDF=DAFFA
)intae
#TTP5.TPA8T 6 7 TTK bPart.nabled
8etorno
Tipo Descrio
L+"ico 8etorna .t. se o envio parcial do conte%do #T'L est/ habilitado.
Descrio
.sta funo retorna se o envio parcial de conte%do ao bro*ser est/ ou no habilitado.
)intae
#TTP5.T)TATE) 6 7 TTK n)tatus
8etorno
Tipo Descrio
Numrico 8etorna o status da coneo #TTP atual re(uerida
Descrio
A funo tem o ob&etivo de retornar (ual o status da coneo #TTP re(uisitada.
Para tal tarefa a funo retorna valores de acordo com o protocolo #TTP0 entre eles os
mais comuns e importantes soM
.rror codes
BFF T _9nternal )erver .rror_
BF@ T _Not 9mplemented_
BFA T _-ad 5ate*aP_
HFG[@H T _,orbidden T DirectorP Listin" Denied_
AFF T _)ucess Connection_
.emplos
Neste eemplo usamos a funo #ttp5et)tatus para termos certeza de (ue no temos
uma coneo #TTP v/lida0 para isto verificamos o c+di"o retornado pela funo.
.stando tudo correto0 realizamos uma emulao de post para a funo no inicio do fonte
T .#TTPPost67 T retornando uma simples tabela com os dados postados.
.m se"uida ainda verificamos a coneo ap+s o Post.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
Web Function ExHTTPPost()
Local cHtml := ""
if (HttpPost->login != Nil .AND. HttpPost->pass != Nil)
conout("Post com Sucesso\nlogin: "+HttpPost->login +
"\nPass: "+ HttpPost->pass)
cHtml := "<h3>HttpPost</h3><br><br>"
cHtml += "<table width=200 border=1>"
cHtml += "<tr><td>Login</td><td>"+HttpPost-
>login+"</td></tr>"
cHtml += "<tr><td>Senha</td><td>"+HttpPost-
>pass+"</td></tr>"
cHtml += "</table>"
endif
Return cHtml
web Function loginMK()

Local cHtml := ""
if HttpGetStatus() == 0
cHtml := HTTPPOST( "http://ricardo/w_ExHTTPPost.apw", "",
"login=Teste&pass=123", 120 , NIL )
conout( HttpGetStatus() )
if HttpIsConnected()
conout("isConnected")
endif
endif
Return cHtml
)intae
#TTPL.A1.).))93N 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 A funo #ttpLeave)ession67 sempre retorna N9L
Descrio
.sta funo 0 uma vez eecutada 0 libera o processamento de re(uisio de atualizo
de conte%dos de vari/veis tipo #ttp)ession para re(uisiYes de consulta eDou
atualizaYes simultCneas para o usu/rio atual.
KK ATE'L/O 2 %e.e,os ate"tar ao &ato 1ue esta &u"()o ape"as ter? o e&eito
dese4ado caso o a,#ie"te atua$ e, uso pe$o Pro4eto @EB se4a @EBEM 5 @e#
E*te"ded 6 KK
3-).81Agh3 M .sta funo foi implementada na ,erramenta Ap< )erver 0 sendo
necess/rio ad(uirir um build de )erver P8otheus com data i"ual ou superior a
AADFHDAFFA.
)intae
#TTPL353NE).8 6 7 TTK cLo"onEser
8etorno
Tipo Descrio
Caracter
)trin" contendo o lo"in do usu/rio0 no formato D3'9N93`lo"in. Caso a
funo no se&a eecutada em uma thread iniciada em uma interface http 0
ou o acesso andnimo io site no 99) este&a habilitado 0 a funo retornar/
uma strin" em branco 6ff7.
Descrio
Atravs da ,uno #ttpLo"onEser67 0 (uando utilizamos o AP )erver 9)AP9
6 Advpl9sapi.dll7 0 em con&unto com o 'icrosoft 99) 69nternet 9nformation )ervices 7 0
obtemos o lo"in do usu/rio atual.
O#ser.a()o 2 Para 1ue o usu?rio se4a o#ri3ado a i"&or,ar u, $o3i" i"di.idua$ 9
de.e ser desa#i$itado "o IIS a co"&i3ura()o 1ue per,ite acesso a"N"i,o ao site0
Caso esta co"&i3ura()o ")o se4a a$terada 9 todos os usu?rios ser)o ide"ti&icados
co,o Ea"N"i,osE pe$o IIS9 e a &u"()o retor"ar? u,a Stri"3 e, #ra"co0
)intae
#TTP3T#.8C3NT.NT 6 7 TTK cContent
8etorno
Tipo Descrio
Caracter
cContent a strin" correspondendo ao conte%do do corpo do pacote
#T'L postado no )erver.
Descrio
A funo #ttp3therContent67 0 (uando utilizada em uma thread montada eDou
inicializada para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do do
pacote html proveniente de uma operao de P3)Ta"em de dados0 se e somente se a
operaco de P3)Ta"em especificou no #.ader #TTP um contentTdisposition ou
contentTtPpe no tratados automaticamente pelo )erver P8otheus.
Caso a re(uisio no tenha sido realizada por um client #TTP atravs do mtodo de
posta"em 0 ou a posta"em &/ possua tratamento nativo no )erver Protheus 0 ou a funo
se&a chamada em um ambiente (ue no este&a atendendo i uma re(uisio #ttp 6 como
um 43- 0 por eemplo7 0 a funo retornar/ uma strin" em branco 6ff7.
)intae
#TTPP3)T 6 L cErl K 0 : c5.TParms ; 0 : cP3)TParms ; 0 : nTime3ut ; 0
: a#ead)tr ; 7 TTK c#tml
ParCmetros
Ar"umento Tipo Descrio
cErl Caracter
cErl corresponde ao endereo http 0 &untamente com a
pasta e o documento solicitados.
c5.TParms Caracter
c5.TParms corresponde i )trin"List de parCmetros a
serem enviados ao servidor http atravs da E8l . Caso no
especificado 0 este parCmetro considerado vazio 6ff7
cP3)TParms Caracter
cPostParms corresponde i )trin"List de parCmetros a
serem enviados ao servidor http atravs do pacote #TTP .
Caso no especificado 0 este parCmetro considerado
vazio 6ff7
nTime3ut Numrico
.m nTime3ut especificamos o tempo em se"undos
m/imo de inatividade permitido durante a recepo do
documento . Caso no especificado 0 o valor default
assumido @AF se"undos 6 A minutos7.
a#ead)tr ArraP
Atravs deste parametro 0 podemos especificar um arraP
com strin"s a serem acrescentadas ao #eader da re(uisio
#TTP a ser realizada.
8etorno
Tipo Descrio
Caracter
Atravs de c#tml ser/ retornada a )trin" #tml correspondendo ao
documento solicitado.
Descrio
A funo #ttpPost67 permite a emulao de um Client #TTP atravs de uma funo
Advpl0 postando um bloco de informaYes para um determinado documento publicado
em um servidor !eb0 utiliando o mtodo P3)T 0 permitindo a passa"em de parCmetros
adicionais via E8L e a"uardando por um tempo determinado 6timeTout7 pela resposta
do servidor solicitado.
3bservaYes M
Na passa"em de parCmtros 5.T e P3)T 0 devemos atentar ao formato da strin"
a ser passada como parCmetros 0 pois a mesma se"ue o formato E89 6Eniform
8esource 9dentifiers7 M ZuerP Component.
Caso nao se&a retornado o documento antes do trmino do TimeTout especificado
na chamada da funo[ ou caso no se&a poss$vel localizar o servidor [ se&a por
falha de resoluo de DN) 0 ou por erro de sintae ao especificar a E8L 0 a
funo retornar/ Nulo 6N9L7.
Caso nao se&a poss$vel o acesso ao documento 0 como por eemplo o documento
no eista 0ser/ retornado uma strin" html com a mensa"em de erro html
enviada pelo servidor correspondente.
Zuando utilizamos a funo #ttpPost67 0 podemos especificar um ContentTTPpe
diferenciado para o conte%do postado. Caso no se&a especificado um ContentT
TPpe 0 al"uns servidores tratam a informao postada como sendo um dado do
tipo _applicationDT***TformTurl_ 0 seria o e(uivalente a um formul/rio #T'L
postado via -ro*ser0 outros servidores podero no reconhecer tal informao
postada dessa forma. Para especificar (ue o conte%do postado deve ser tratado
como um P3)T de formul/rio #TTP 0 devemos passar no parCmetro a#ead)tr 0
um elemento contendo _ContentTTPpeM applicationDT***TformTurl_.
ATE'L/O
@. .sta funco est/ disponivel apenas em -uilds Ap< "erados a partir de
@FDF=DAFFA .
A. 3 parametro a#ead)tr apenas est/ dispon$vel em -uild_s Ap< e posteriores
"erados apos F@D@FDAFFA.

.emplos
Neste eemplo usamos a funo #ttp5et)tatus para termos certeza de (ue no temos
uma coneo #TTP v/lida0 para isto verificamos o c+di"o retornado pela funo.
.stando tudo correto0 realizamos uma emulao de post para a funo no inicio do fonte
T .#TTPPost67 T retornando uma simples tabela com os dados postados.
.m se"uida ainda verificamos a coneo ap+s o Post.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
Web Function ExHTTPPost()
Local cHtml := ""
if (HttpPost->login != Nil .AND. HttpPost->pass != Nil)
conout("Post com Sucesso\nlogin: "+HttpPost->login +
"\nPass: "+ HttpPost->pass)
cHtml := "<h3>HttpPost</h3><br><br>"
cHtml += "<table width=200 border=1>"
cHtml += "<tr><td>Login</td><td>"+HttpPost-
>login+"</td></tr>"
cHtml += "<tr><td>Senha</td><td>"+HttpPost-
>pass+"</td></tr>"
cHtml += "</table>"
endif
Return cHtml
web Function loginMK()

Local cHtml := ""
if HttpGetStatus() == 0
cHtml := HTTPPOST( "http://ricardo/w_ExHTTPPost.apw", "",
"login=Teste&pass=123", 120 , NIL )
conout( HttpGetStatus() )
if HttpIsConnected()
conout("isConnected")
endif
endif
Return cHtml
)intae
#TTPP3)T]'L 6 L cE8L K 0 : cParam ; 0 L c,ile K 0 L nTime3ut K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
cE8L Caracter 9ndica o endereo para (ual ser/ feito o P3)T dos dados.
cParam Caracter
bloco de informaYes0 (ue utiliando o mtodo P3)T ser/
feita a passa"em de parCmetros adicionais.
c,ile Caracter 9ndica um path de um ar(uivo local armazenado em disco.
nTime3ut Numrico
8epresenta o tempo6timeout7 de inatividade em (ue a
re(uisio ir/ a"uardar em se"undos.
8etorno
Tipo Descrio
L+"ico
8etorna se foi poss$vel realizar o Post]ml. Caso se&a realizado retorna
true0 caso contr/rio false.
Descrio
A funo #ttpPost]ml67 permite a emulao de um Client #TTP atravs de uma funo
Advpl.
Postando um bloco de informaYes e um documento ]'L indicado por uma
strin" path0 para um determinado documento publicado em um servidor !eb0 utiliando
o mtodo P3)T 0 permitindo a passa"em de parCmetros adicionais e a"uardando por um
tempo determinado 6timeTout7 pela resposta do servidor solicitado.
)intae
#TTPP8A5'A 6 L cPra"ma K 7 TTK c3ldPra"ma
ParCmetros
Ar"umento Tipo Descrio
cPra"ma Caracter
cPra"ma corresponde ao conteudo do P8A5'A a ser
definido no #eader de retorno #TTP. 1e&a tabela fAf de
definiYes P8A5'A.
8etorno
Tipo Descrio
Caracter
A funo #ttpPra"ma retornar/ a definio anterior de P8A5'A
utilizada.
Descrio
Atravs desta funo 0 podemos redefinir a eti(ueta P8A5'A do #eader de 8esposta
de re(uisio #TTP 0 sobrepondo i definio defaiut de retorno P8A5'A 0
opcionalmente definida na confi"urao do #3)T #TTP no Ar(uivo de confi"urao
do Protheus )erver.
Tabela A - Definies Pragma
Conte%do Aplicao
noTcache
9nforma ao Client #TTP 6 -ro*ser 7 (ue a p/"ina retornada no deve ser
colocada em Cache0 independente da confi"urao de Cache do -ro*ser.
Obs!"#$%o & A '()*)$%o ' +, *o"o -o*t.'o p#!# o PRAGMA 'o /#'!
/TTP #p*#s s!2 poss3"4 -#so st# (+*$%o A'"p4 s5# 6-+t#'# #*ts
' 7+#747+! *")o p#!-)#4 ' ht,4 #o b!o8s! 9 !#4):#'o p4# (+*$%o
/ttpS*';<=
)intae
#TTP8CTD9)P 6 7 TTK cCtDisp
8etorno
Tipo Descrio
Caracter
cCtDisp corresponde io conteudo do identificador ContentTdisposition 0
recebido (uando um !eb -ro*ser realiza uma re(uisio via #TTP ao
servidor.
Descrio
A funo #ttp8CtDisp67 0 (uando utilzada em uma thread montada eDou inicializada
para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do do identificador
ContentTdisposition do #eader #TTP .
Caso a re(uisio tenha sido realizada por um client #TTP (ue no enviou este
identificador no #eader #TTP 0 ou a funo se&a chamada em um ambiente (ue no
este&a atendendo i uma re(uisio #ttp 6 como um 43- 0 por eemplo7 0 a funo
retornar/ uma )trin" em branco 6ff7.
)intae
#TTP8CTL.N 6 7 TTK nCtLen
8etorno
Tipo Descrio
Numrico
nCtLen corresponde io conteudo do identificador ContentTlen"th 0
recebido (uando um !eb -ro*ser realiza uma re(uisio via #TTP ao
servidor.
Descrio
A funo #ttp8CtLen67 0 (uando utilizada em uma thread montada eDou inicializada
para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do do identificador
ContentTlen"th do #eader #TTP 0 como um dado numrico .
Caso a re(uisio tenha sido realizada por um client #TTP (ue no enviou este
identificador no #eader #TTP 0 ou a funo se&a chamada em um ambiente (ue no
este&a atendendo i uma re(uisio #ttp 6 como um 43- 0 por eemplo7 0 a funo
retornar/ F 6 \ero 7 .
)intae
#TTP8CTT^P. 6 7 TTK cCtTPpe
8etorno
Tipo Descrio
Caracter
cCtTPpe corresponde io conteudo do identificador ContentTtPpe 0 recebido
(uando um !eb -ro*ser realiza uma re(uisio via #TTP ao servidor.
Descrio
A funo #ttp8CtTPpe67 0 (uando utilzada em uma thread montada eDou inicializada
para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do do identificador
ContentTtPpe do #eader #TTP .
Caso a re(uisio tenha sido realizada por um client #TTP (ue no enviou este
identificador no #eader #TTP 0 ou a funo se&a chamada em um ambiente (ue no
este&a atendendo i uma re(uisio #ttp 6 como um 43- 0 por eemplo7 0 a funo
retornar/ uma )trin" em branco 6ff7.
)intae
#TTP8CTT^P. 6 7 TTK cCtTPpe
8etorno
Tipo Descrio
Caracter
cCtTPpe corresponde io conteudo do identificador ContentTtPpe 0 recebido
(uando um !eb -ro*ser realiza uma re(uisio via #TTP ao servidor.
Descrio
A funo #ttp8CtTPpe67 0 (uando utilzada em uma thread montada eDou inicializada
para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do do identificador
ContentTtPpe do #eader #TTP .
Caso a re(uisio tenha sido realizada por um client #TTP (ue no enviou este
identificador no #eader #TTP 0 ou a funo se&a chamada em um ambiente (ue no
este&a atendendo i uma re(uisio #ttp 6 como um 43- 0 por eemplo7 0 a funo
retornar/ uma )trin" em branco 6ff7.
)intae
#TTP).ND 6 L c#tml)tr K 7 TTK c#tmlNo)end
ParCmetros
Ar"umento Tipo Descrio
c#tml)tr Caracter
c#tml)tr corresponde i strin" a ser enviada ao -ro*ser
solicitante de um processamento .
8etorno
Tipo Descrio
Caracter
Caso a funo obtenha sucesso em enviar a )trin" c#tml)tr para o -ro*se
solicitante 0 o retorno ser/ uma strin" vazia 6ff7.
Caso no se&a poss$vel o envio da strin" 0 devido io recurso de envio
simultCneo estar desabilitado [ ou ocorra uma falha de comunicao0 ou a
funo #ttp)end67 se&a eecutada a partir de uam thread (ue no uma
!or2in" Thread 0 a funo ir/ retornar a strin" passada como parCmetro.
Descrio
Atravs desta funo0 possivel retornar uma strin" #tml i um bro*ser durante o
processamento de uma re(uisio realizada atravs de um lin2 .AP! 0 utilizando
!or2in" Threads 0 durante o processamento da mesma.
O#ser.a()o 2 Este recurso ")o &u"cio"a e, re1uisi(Aes de procesa,e"to
rea$i7adas a partir de u, $i"> 0ap$ 0 O "ecess?rio 1ue a re1uisi()o se4a para u,
$i"> 0ap! 9 ate"dida por u,a @or>i"3 Tread0
)intae
#TTP).TPA8T 6 L l#ttp)end K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
l#ttp)end L+"ico
l#ttp)end um valor booleano (ue habilita o envio parcial
6 caso .T. 7 ou desabilita o envio parcial de #T'L 6 .,. 7
8etorno
Tipo Descrio
6NEL37 .sta funo sempre retorna N9L
Descrio
.ssa funo permite desabilitar o envio parcial do #T'L0 esse um recurso disponivel
para os pro"ramas escritos para AP! 6 Etilizando !or2in" Thread 7.
.sse recurso util para comearmos a mandar conte%do ao bro*ser antes de
terminarmos de processar totalmente a p/"ina0 ele pode aumentar em muito o
desempenho do transmisso da p/"ina em caso de p/"inas "randes.
A ,uno #TTP)end utilizada para esse envio tempor/rio.
)intae
#TTP).TPA)) 6 L cEser K 0 L cPass K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
cEser Caracter
Cadeia de caracteres (ue representa o usu/rio a ser setado
uma senha.
cPass Caracter
9ndica a senha informada para autenticao de acordo com
o usu/rio informado.
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
.m al"uns momentos trabalhamos com protocolo #ttp autenticado0 isso nos indica (ue
para nos conectar a determinada E8L devemos informar um usu/rio e senha (ue
tenham permiso para coneo com a E8L.
A funo #ttp)etPass67 tem o ob&etivo de setar uma senha para um determinado
usu/rio0 (uando uma re(uisio #TTP necessita de autenticao.
9nformando atravs de parametro o usu/rio e a senha (ue dever/ ser usada para
autenticao do usu/rio infromado.
)intae
#ttpCount)ession 6 7 TTK nZtde
8etorno
Tipo Descrio
Numrico Zuantidade de usu/rios com sessYes *eb etended ativas
Descrio
.sta funo retorno o n%mero de sessYes de usu/rios ativas no servidor0 util para saber
(uantos usu/rios de !eb esto utilizando os servidores neste momento.
)intae
#ttp,ree)ession 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
Libera a sesso do usu/rio corrente0 todos os dados armazenado nas sessYes deste
usu/rio ser/ perdida.
,uno utilizada para efetuar o lo" off do usu/rio do site.

)intae
#ttp9sAP! 6 7 TTK b9sAP!
8etorno
Tipo Descrio
L+"ico
8etorna .T. no caso do ambiente em eecuo ser um AP!0 .,. em todas
as outras situaYes.
Descrio
9nforma se o ambiente *eb em eecuo um AP!0 caso no se&a retorna .,.
.ssa funo util na criao de funYes "enricas ou na consistancia da confi"urao
do ambiente.
)intae
#ttp9sConnected 6 7 TTK bConnected
8etorno
Tipo Descrio
L+"ico 8etorna .t. se o bro*ser ainda est/ conectado a"uardando a resposta.
Descrio
9nforma se o bro*ser est/ conectado ainda esperando a resposta do Protheusm
,uncionalidade no dispon$vel (uando utilizado o 9)AP9 para inte"rao com 99)
)intae
9)).CE8. 6 7 TTK l8et
8etorno
Tipo Descrio
6NEL37 true caso a coneo uma coneo ))L0 false caso contr/rio.
Descrio
A funo 9s)ecure67 tem como ob&etivo retornar um valor booleano informando se a
coneo #TTP corrente0 uma coneo se3ura9 ou no.
Ema coneo #TTP se3ura9 uma coneo (ue usa cripto"rafia ))L0 podemos
observar esse tipo de coneo (uando a E8L modificaTse de #TTP para #TTP) em um
bro*ser.
)intae
)3AP8ACT93N 6 7 TTK c)oapAction
8etorno
Tipo Descrio
Caracter
c)oapAction corresponde io conteudo do identificador soapaction 0
recebido (uando um !eb -ro*ser realiza uma re(uisio via #TTP ao
servidor.
Descrio
A funo )oap8Action67 0 (uando utilizada em uma thread montada eDou inicializada
para atender i uma re(uisio #ttp 6 .apl 0 .ap* 7 0 retorna o conte%do strin" do
identificador soapaction do #eader #TTP .
Caso a re(uisio tenha sido realizada por um client #TTP (ue no enviou este
identificador no #eader #TTP 0 ou a funo se&a chamada em um ambiente (ue no
este&a atendendo i uma re(uisio #ttp 6 como um 43- 0 por eemplo7 0 a funo
retornar/ uma strin" em branco 6ff7.
FUNO DE DISCO E AR>UIVO
)intae
AD98 6 : ; 0 : ; 0 : ; 0 : ; 0 : ; 0 : ; 7 TTK nAr(uivos
ParCmetros
Ar"umento Tipo Descrio
Lc.specAr(K Caracter
Lc.specAr(K a especificaao dos ar(uivos a serem
incluidos na pes(uisa do diret+rio padrao. X uma
especificaao de ar(uivo padrao (ue pode incluir os
caracteres corin"a do tipo V e n0 bem como referancia a
diret+rio e path. Caso nao se&a especificado0 o padrao
assumido V.V.
LaNomesAr(K ArraP
LaNomesAr(K o vetor a ser preenchido com os nomes de
ar(uivo (ue correspondem a Lc.specAr(K. Cada elemento
contm o nome do ar(uivo e etensao na forma de uma
cadeia de caracteres em letras mai%sculas.
LaTamanhosK ArraP
LaTamanhosK o vetor a ser preenchido com os tamanhos
dos ar(uivos correspondentes no vetor LaNomesAr(K.
Cada elemento numrico.
LaDatasK ArraP
LaDatasK o vetor a ser preenchido com as datas dos
ar(uivos correspondentes no vetor LaNomesAr(K. Cada
elemento uma data.
La#orasK ArraP
La#orasK o vetor a ser preenchido com as horas dos
ar(uivos correspondentes no vetor LaNomesAr(K. Cada
elemento preenchido contm uma cadeia de caracteres da
formaM hhMmmMss.
LaAtributosK ArraP
LaAtributosK o vetor a ser preenchido com os atributos
dos ar(uivos correspondentes no vetor La,ilenamesK. Cada
elemento uma cadeia de caracteres. Caso LaAtributosK
se&a especificado0 os ar(uivos de diret+rio0 sistema0 e
escondidos sao incluidos0 assim como os ar(uivos normais.
)e LaAtributosK nao for especificado0 somente os ar(uivos
normais sao incluidos.
8etorno
Tipo Descrio
Numrico
AD9867 retorna a (uantidade de ar(uivos (ue correspondem ao es(ueleto
de diret+rio especificado.
Descrio
AD9867 uma funao de tratamento de vetor (ue eecuta duas operaoes b/sicas.
Primeiro0 ele retorna a (uantidade de ar(uivos (ue correspondem i especificaao de
ar(uivo. )e"undo0 preenche uma srie de vetores com nomes de ar(uivos0 tamanhos0
datas0 horas e atributos.
AD9867 uma funao de compatibilidade e portanto desaconselhada. .le est/ superado
pela funao D98.CT38^670 (ue retorna todas as informaoes de ar(uivo em um vetor
multiTdimensional.
3-).81Agh3
Diret+riosM Caso o ar"umento LaAtributosK se&a especificado e Lc.specAr(K se&a
especificado como V.V0 os diret+rios serao incluidos em LaNomesAr(K. No vetor
LaAtributosK0 os diret+rios sao indicados com um valor atributo de fD.f )e AD9867 for
eecutado dentro de um subdiret+rio0 as duas primeiras entradas do vetor
LaNomesAr(K sao f.f e f..f0 os faliasf dos diret+rios corrente e raiz. A data e hora da
%ltima atualizaao sao informadas para diret+rios0 mas o tamanho de um diret+rio
sempre zero.
.emplos
.ste eemplo cria um vetor (ue conter/ os nomes de todos os ar(uivos 6.tt7 no
diret+rio D.,AELT corrente0 e os relaciona no console utilizando a funao A.1AL67 M
LOCAL aFiles[ADIR("*.TXT")]
ADIR("*.TXT", aFiles)
AEVAL(aFiles, { |element| conout(element) })
)intae
CP^)AT 6 L c3ri"em K 0 L cDestino K 0 : lCompacta ; 7 TTK l)ucess
ParCmetros
Ar"umento Tipo Descrio
c3ri"em Caracter
Nome6s7 dos ar(uivos a serem copiados0 aceita apenas
ar(uivos
no servidor0 !ildCards 6 V e n 7 so aceitos normalmente.
cDestino Caracter Diret+rio com o destino dos ar(uivos no Client 6 8emote 7
lCompacta L+"ico
9ndica se a c+pia deve ser feita compactando o ar(uivo
antes do envio.
8etorno
Tipo Descrio
L+"ico
l)ucess retorna .T. caso o ar(uivo se&a copiado com sucesso 0 ou .,. em
caso de falha na c+pia.
Descrio
Copia um ar(uivo0 do servidor para o cliente 6 8emote 7. .Caso a compactao se&a
habilitada 6lCompacta 70 os dados sero transmitidos de maneira compactada e
descompactados antes do uso.
.emplo M
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. ) // Copia arquivos do
servidor para o remote local, compactando antes de transmitir
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. ) // Copia arquivos do
servidor para o remote local, sem compactar antes de transmitir
)intae
CP^TA) 6 L c3ri"em K 0 L cDestino K 0 : lCompacta ; 7 TTK l)ucess
ParCmetros
Ar"umento Tipo Descrio
c3ri"em Caracter
Nomes dos ar(uivos a serem copiados0 aceita apenas
ar(uivos locais 6 Cliente 70 !ildCards 6 V e n 7 so aceitos
normalmente.
cDestino Caracter Diret+rio com o destino dos ar(uivos no )ervidor
lCompacta L+"ico
lCompacta indica se o6s7 ar(uivo6s7 deve6m7 ser enviados
em formato compactado.
8etorno
Tipo Descrio
L+"ico
l)ucess indica 0 caso verdadeiro 0 (ue a c+pia foi realizada com sucesso.
Caso retorne .,. 0 houve erro na copia do ar(uivo.
Descrio
Copia um ar(uivo0 do cliente 6 8emote 7 para o servidor0. Caso a compactao se&a
habilitada 6 lCompacta 70 os dados sero transmitidos de maneira compacta e
descompactados antes do uso.
.emplo
CpyT2S( "C:\TEMP\MANUAL.DOC","\BKP", .T. ) // Copia arquivos do
cliente( remote ) para o Servidor compactando antes de transmitir
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP" ) // Copia arquivos do
cliente( remote ) para o Servidor sem compactar.
)intae
CE8D98 6 : cNovoPath ; 7 TTK cPathAtual
ParCmetros
Ar"umento Tipo Descrio
cNovoPath Caracter
Caminho relativo 0 com o novo diret+rio (ue ser/ a&ustado
como corrente.
8etorno
Tipo Descrio
Caracter Diret+rio corrente0 sem a primeira barra.
Descrio
8etorna o diret+rio corrente do servidor. 3 caminho retornado sempre relativo io
8ootPath definido na confi"urao do .nvironment no .9N9 do Protheus )erver.
9nicialmente 0 o diret+rio atual da aplicao o constante na chave )tartPath 0 tambm
definido na confi"urao do .nvironment no .9N9 do Protheus )erver.
Caso se&a passado o parCmetro cNovoPath 0 este path assumido como sendo o Path
atual. Caso o path recebido como parometro no eista 0 se&a inv/lido 0 ou se&a um path
absoluto 6 iniciado com uma letra de drive ou caimnho de rede 7 0 a funo no ir/ setar
o novo path 0 mantendo o atual .
No eemplo abaio 0 conferimos o path atual e tentamos setar um novo path atual 0
verificando se a operao foi realizada com sucesso.
cOldDir := curdir()
cNewDir := '\webadv\xis'
curdir(cNewDir) // Troca o path
If cNewDir <> '\'+curdir() // E verifica se trocou mesmo
conout('Falha ao Trocar de Path de '+cOldDir + ' para '+cNewDir)
Else
conout('Path de '+cOldDir + ' trocado para '+cNewDir+' com
sucesso.')
Endif
)intae
D98.CT38^ 6 L cDir)pec K 0 : ; 7 TTK aDiretorio
ParCmetros
Ar"umento Tipo Descrio
cDir)pec Caracter
LcDir)pecK especifica o drive0 diret+rio e ar(uivo para a
pes(uisa no diret+rio. Caracteres do tipo corin"a sao
permitidos na especificaao de ar(uivos. Caso LcDir)pecK
se&a omitido0 o valor padrao V.V.
3 caminho especificado pode estar na estao 6remote7 0 ou
no servidor 0 obedecendo is definicYes de Path Absoluto D
8elativo de acesso
LcAtributosK Caracter
LcAtributosK especifica (ue ar(uivos com atributos
especiais devem ser incluidos na informaao retornada.
LcAtributosK consiste em uma cadeia de caracteres (ue
contm um ou mais dos se"uintes caracteres0 contidos na
tabela adicional A 0 especificada abaioM
8etorno
Tipo Descrio
ArraP
D98.CT38^67 retorna um vetor de subTvetores0 sendo (ue cada subTvetor
contm informaoes sobre cada ar(uivo (ue atenda a LcDir)pecK.1e&a
maiores detalhes na Tabela -0 abaio discriminada.
Descrio
D98.CT38^67 uma funao de tratamento de ambiente (ue retorna informaoes a
respeito dos ar(uivos no diret+rio corrente ou especificado. X semelhante a AD98670
porm retorna um %nico vetor ao invs de adicionar valores a uma srie de vetores
eistentes passados por referancia.
D98.CT38^67 pode ser utilizada para realizar operaoes em con&untos de ar(uivos.
.m combinaao com A.1AL670 voca pode definir um bloco (ue pode ser aplicado a
todos os ar(uivos (ue atendam a LcDir)pecK especificada.
Para tornar as referancias aos v/rios elementos de cada subTvetor de ar(uivo mais
le"$veis0 fornecido o ar(uivo header DirectrP.ch0 (ue contm os ldefines para os
subarraP subscripts.
TABELA A: Atributos e D!RECTOR"#$
Atributo )i"nificado
# 9ncluir ar(uivos ocultos
) 9ncluir ar(uivos de sistema
D 9ncluir diret+rios
1 Procura pelo volume D3) e eclui outros ar(uivos
Ar(uivos normais sao sempre incluidos na pes(uisa0 a nao ser (ue 1 se&a especificado.
TABELA B: Estrutura os %ub&etores e D!RECTOR"#$
Posiao 'etas$mbolo DirectrP.ch
@ cNome ,kNA'.
A cTamanho ,k)9\.
G dData ,kDAT.
H c#ora ,kT9'.
B cAtributos ,kATT
.emplos
Atravs do eemplo abaio 0 obtemos no arraP aDirectorP todos os diret+rios no
ambiente do servidor a partir do path atual.
#INCLUDE "Directry.ch"
aDirectory := DIRECTORY("*.*","D")
AEVAL( aDirectory, {|aFile| CONOUT(aFile[F_NAME])} )
)intae
D988.'31. 6 L cDiretorio K 7 TTK l)ucesso
ParCmetros
Ar"umento Tipo Descrio
cDiretorio Caracter Nome do diret+rio a ser removido.
8etorno
Tipo Descrio
L+"ico
l)ucesso ser/ .T. caso o diret+rio tenha sido eliminado 0 ou .,. caso no
se&a poss$vel ecluir o diret+rio. Zuando a funo Dir8emove retornar .,. 0
poss$vel obter mais detalhes da ocorrancia recuperando o c+di"o do .rro
atravs da funo ,.rror67.
Descrio
D988.'31.67 elimina um diret+rio especifico. Caso especifi(uemos um path sem a
unidade de disco 0 ele ser/ considerado no ambiente do )ervidor 0 a partir do 8ootPath
do ambiente 6 caso o path comee com ` 7 0 ou a partir do diret+rio corrente 6 caso o path
no se&a iniciado com ` 7 . . 0 (uando especificado um path absoluto 6 com unidade de
disco preenchida 7 0 a funo ser/ eecutada na estao onde est/ sendo eecutado o
Protheus 8emote. Zuando eecutamos a funo Dir8emove67 em 43- 6 processo
isolado no )erver 0 sem interface 7 0 no poss$vel especificar um Path absoluto de
disco. Caso isto se&a realizado 0 a funo retornar/ .,. e ,.rror67 retornar/ T@ 6 )Pnta
.rror 7 .
'ote 1ue "ecess?rio ter direitos su&icie"tes para re,o.er u, diretBrio9 e o
diretBrio a ser e$i,i"ado precisa estar .a7io9 se, su#diretBrios ou ar1ui.os de"tro
do ,es,o0
.emplos
No eemplo abaio 0 eecutado a partir do Protheus 8emoite 0 tentamos ecluir a pasta
cM`Tmp,iles 0 verificando se houve sucesso nesta operao.
cDelPath := 'c:\TmpFiles'
lRemoveOk := DIRREMOVE(cDelPath)
IF !lRemoveOk
MsgStop('Falha ao remover a pasta '+cDelPath+' ( File Error
'+str(Fewrror(),4)+' ) ')
Else
MsgStop('Pasta '+cDelPath+' removida com sucesso.')
Endif
)intae
D9)b)PAC. 6 : nDrive ; 7 TTK n-Ptes,ree
ParCmetros
Ar"umento Tipo Descrio
nDrive Numrico
N%mero do drive0 onde F o espao na unidade de disco
corrente0 e @ o drive AM do cliente0 A o drive -M do
cliente0 etc.
8etorno
Tipo Descrio
Numrico N%mero de bPtes dispon$veis no disco informado como parCmetro.
Descrio
D9)b)PAC.67 uma funo de ambiente (ue determina (uantos bPtes esto
dispon$veis em uma determinada uinidade de disco. .sta funo obtm a informao
sempre relativa i estao onde est/ sendo eecutado o Protheus 8emote. Atravs do
parCmetro nD8ive 0 selecionamos (ual a unidade de disco (ue dese&amos obter a
informao do espao livre 0 ondeM
F M Enidade de disco atual da estao 6D.,AELT7.
@ M Drive AM da estao remota.
A M Drive -M da estao remota.
G M Drive CM da estao remota.
H M Drive DM da estao remota ... e assim por diante.
Caso a &u"()o %is>Space se4a e*ecutada atra.s de u, Jo# 5 processo iso$ado "o
Ser.idor 9 se, i"ter&ace Re,ota 6 9 ou se4a passado u, ar3u,e"to de u"idade de
disco i"e*iste"te ou i"dispo".e$ 9 a &u"()o %ISPSPACE56 retor"ar? <C
E*e,p$o da &u"()o %ISPSPACE
8evisoM F@DFBDAFFG
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
No eemplo abaio 0 obtemos os espaos em disco da unidade de disco da estao local
e do drive AM da estao local0 verificando se houve sucesso na operao.
nBytesLocal := DIS?SPACE( ) // Retorna o espao disponivel na unidade
de disco local ( remote ).
IF nBytesLocal < 1048576
MsgStop('Unidade de Disco local possui menos de 1 Mb livre.')
Else
MsgStop('Unidade de disco local possui '+str(nBytes_A,12)+' bytes
livres.')
Endif
nBytes_A := DIS?SPACE( 1 ) // Retorna o espao disponivel no drive A:
local ( remote ).
If nBytes_A == -1
MsgStop('Unidade A: no est disponvel ou no h disco no Drive')
ElseIf nBytes_A < 8192
MsgStop('No h espao disponvel no disco. Substitua o disco na
Unidade A:')
Else
MsgStop('Unidade A: Verificada . '+str(nBytes_A,12)+' bytes
livres.')
Endif
)intae
,CL3). 6 L n#andle K 7 TTK l.rror
ParCmetros
Ar"umento Tipo Descrio
n#andle Numrico
Ln#andleK o handle do ar(uivo obtido previamente
atravs de ,3P.N67 ou ,C8.AT.67.
8etorno
Tipo Descrio
L+"ico
,CL3).67 retorna falso 6.,.7 se ocorre um erro en(uanto os buffers estao
sendo escritos[ do contr/rio0 retorna verdadeiro 6.T.7.
Descrio
,CL3).67 uma funao de tratamento de ar(uivos de baio n$vel utilizada para fechar
ar(uivos bin/rios e forar (ue os respectivos buffers do D3) se&am escritos no disco.
Caso a operaao falhe0 ,CL3).67 retorna falso 6.,.7. ,.883867 pode entao ser usado
para determinar a razao eata da falha. Por eemplo0 ao tentarTse usar ,CL3).67 com
um handle 6tratamento dado ao ar(uivo pelo sistema operacional7 inv/lido retorna falso
6.,.7 e ,.883867 retorna erro < do D3)0 invalid handle. Consulte ,.883867 para
obter uma lista completa dos c+di"os de erro.
A.iso
.sta funao permite acesso de baio n$vel aos ar(uivos e dispositivos do D3). .la deve
ser utilizada com etremo cuidado e ei"e (ue se conhea a fundo o sistema operacional
utilizado.
.emplos
3 eemplo a se"uir utiliza ,CL3).67 para fechar um ar(uivo bin/rio recm criado e
eibe uma mensa"em de erro caso o fechamento falheM
#include "Fileio.ch"
nHandle := FCREATE("Testfile", FC_NORMAL)
If !FCLOSE(nHandle)
conout( "Erro ao fechar arquivo, erro numero: ", FERROR() )
EndIf
)intae
,C8.AT. 6 L cAr(uivo K 0 : nAtributo ; 7 TTK n#andle
ParCmetros
Ar"umento Tipo Descrio
cAr(uivo Caracter
Nome do ar(uivo a ser criado 0 podendo ser especificado
um path absoluto ou relativo 0 para criar ar(uivos no
ambiente local 6 8emote 7 ou no )ervidor 0
respectivamente .
nAtributo Numrico
Atributos do ar(uivo a ser criado 61ide Tabela de
atributos abaio7. Caso no especificado 0 o D.,AELT
,CkN38'AL.
8etorno
Tipo Descrio
Numrico
A funo retornar/ o #andle do ar(uivo para ser usado nas demais funYes
de manuteno de ar(uivo. 3 #andle ser/ maior ou i"ual a zero. Caso no
se&a poss$vel criar o ar(uivo 0 a funo retornar/ o handle T@ 0 e ser/
poss$vel obter maiores detalhes da ocorrencia atravs da funo ,.8ror67
Descrio
,C8.AT.67 uma funo de baioTn$vel (ue permite a manipulao direta dos
ar(uivos tetos como bin/rios. Ao ser eecutada ,C8.AT.67 cria um ar(uivo ou
elimina o seu conte%do0 e retorna o handle 6manipulador7 do ar(uivo0 para ser usado nas
demais funYes de manuteno de ar(uivo. Ap+s ser utilizado 0 o Ar(uivo deve ser
fechado atravs da funo ,CL3).67.
Na tabela abaio 0 esto descritos os atributos para criao do ar(uivo 0 definidos no
ar(uivo header &i$eio0c
Constante 1alor Descrio
,CkN38'AL F Criao normal do Ar(uivo 6defaultDpadro7.
,Ck8.AD3NL^ @ Cria o ar(uivo prote"ido para "ravao.
,Ck#9DD.N A Cria o ar(uivo como oculto.
,Ck)^)T.' H Cria o ar(uivo como sistema.
Caso dese&emos especificar mais de um atributo 0 basta som/Tlos . Por eemplo 0 para
criar um ar(uivo prote"iro contra "ravao e escondido 0 passamos como atributo
,Ck8.AD3NL^ j ,Ck#9DD.N .
ATE'L/O 2 Caso o ar1ui.o 4? e*ista 9 o co"teQdo do ,es,o ser? ELIMI'A%O 9
e seu ta,a"o ser? tru"cado para D 5 RERO 6 #-tes0
)intae
,.8A). 6 L cAr(uivo K 7 TTK n)tatus
ParCmetros
Ar"umento Tipo Descrio
cAr(uivo Caracter
Nome do ar(uivo a ser apa"ado . Pode ser especificado um
path absoluto ou relativo 0 para apa"ar ar(uivos na estao
local 6 8emote 7 ou no )ervidor 0 respctivamente .
8etorno
Tipo Descrio
Numrico
A funo retornar/ F caso o ar(uivop se&a apa"ado com sucesso 0 e T@ caso
no se&a poss$vel apa"ar o ar(uivo. Caso a funo retorne T@ 0 poss$vel
obter mauires detalhes da ocorrancia atravs da funo f.rror67
Descrio
Atravs da funo ,erase 0 poss$vel apa"ar um ar(uivo no disco . 3 Ar(uivo pode
estar no )ervidor ou na estao local 68emote7.
3 Ar(uivo para ser apa"ado deve estar fechado. No permitido a utilizao de
caracteres corin"a 6*ildcards7.
.emplos
DD .ste eemplo apa"a todos os ar(uivos .-Ab do diret+rio corrente no )ervidor
#include 'DIRECTRY.CH'
aEval(Directory("*.BAK"), { |aFile| FERASE(aFile[F_NAME]) })
DD .ste eemplo apa"a um ar(uivo no cliente 6 8emote 7 0 informando o status da
operao
IF FERASE("C:\ListaTXT.tmp") == -1
MsgStop('Falha na deleo do Arquivo ( FError'+str(ferror(),4)+
')')
Else
MsgStop('Arquivo deletado com sucesso.')
ENDIF
)intae
,9L. 6 L cAr(uivo K 7 TTK l.iste
ParCmetros
Ar"umento Tipo Descrio
cAr(uivo Caracter
Nome do ar(uivo 0 podendo ser especificado um path
6caminho 7 . Caminhos locais 68emote7 ou caminhos de
servidor so aceitos 0 bem como *ildcards 6 Caracteres V
e n 7
8etorno
Tipo Descrio
L+"ico
3 retorno ser/ .T. caso o ar(uivo especificado eista. Caso o mesmo no
eista no path especificado 0 a funo retorna .,.
Descrio
1erifica se eiste um ar(uivo ou um padro de ar(uivos0 no diret+rio. Pordemos
especificar caminhos absolutos 6 ar(uivos na estao T 8emote 7 ou relativos 6 A partir
do 8ootPath do Protheus )erver7 . 3s caracteres V e n 6 *ildcards7. so aceitos.
.emplos
FILE("teste.dbf") // Verifica no diretrio corrente do servidor se
existe o arquivo teste.dbf
FILE("\SIGAADV\TESTE.dbf") // Verifica no diretrio Sigaadv do
servidor se existe o arquivo teste.dbf
FILE("C:\TEMP\TESTE.dbf") // // Verifica no diretrio Temp do cliente
(Remote) se existe o arquivo teste.dbf
O#ser.a()o 2 Caso a &u"()o Fi$e56 se4a e*ecutada e, Jo# 5 pro3ra,a se, i"ter&ace
re,ota 6 9 se"do passado u, ca,i"o a#so$uto de ar1ui.o 5 e*e,p$o c2Steste0t*t6 9 a
&u"()o retor"ar? 0F0 e FERROR56 retor"ar? <C 6
)intae
,3P.N 6 L cAr( K 0 : n'odo ; 7 TTK n8et
ParCmetros
Ar"umento Tipo Descrio
cAr( Caracter
Nome do ar(uivo a ser aberto (ue inclui o path caso ha&a
um.
n'odo Numrico
'odo de acesso D3) solicitado (ue indica como o
ar(uivo aberto deve ser acessado. 3 acesso de uma das
cate"orias relacionadas na tabela A e as restriYes de
compartilhamento relacionada na Tabela -. 3 modo
padrao zero0 somente para leitura0 com
compartilhamento por Compatibilidade. Ao definirmos o
modo de acesso 0 devemos somar um elemento da Tabela
A com um elemento da Tabela -.
8etorno
Tipo Descrio
Numrico
,3P.N67 retorna o handle de ar(uivo aberto na faia de zero a <B.BGB.
Caso ocorra um erro0 ,3P.N67 retorna T@.
Descrio
Abre um ar(uivo bin/rio.
,3P.N67 uma funao de tratamento de ar(uivo de baio n$vel (ue abre um ar(uivo
bin/rio eistente para (ue este possa ser lido e escrito0 dependendo do ar"umento
Ln'odoK. Toda vez (ue houver um erro na abertura do ar(uivo0 ,.883867 pode ser
usado para retornar o c+di"o de erro do )istema 3peracional. Por eemplo0 caso o
ar(uivo nao eista0 ,3P.N67 retorna T@ e ,.883867 retorna A para indicar (ue o
ar(uivo nao foi encontrado. 1e&a ,.883867 para uma lista completa dos c+di"os de
erro.
Caso o ar(uivo especificado se&a aberto0 o valor retornado o handle 6manipulador7 do
)istema 3peracional para o ar(uivo. .ste valor semelhante a um alias no sistema de
banco de dados0 e ele ei"ido para identificar o ar(uivo aberto para as outras funoes
de tratamento de ar(uivo. Portanto0 importante sempre atribuir o valor (ue foi
retornado a uma vari/vel para uso posterior0 como mostra o eemplo desta funo.
(viso
.sta funao permite acesso de baio n$vel a ar(uivos e dispositivos. .la deve ser
utilizada com etremo cuidado e ei"e (ue se conhea a fundo o sistema operacional
utilizado.
'otas
,3P.N procura o ar(uivo no diret+rio corrente e nos diret+rios confi"urados na
vari/vel de pes(uisa do )istema 3peracional0 a nao ser (ue um path se&a
declarado eplicitamente como parte do ar"umento LcAr(K.
Por serem eecutadas em um ambiente clienteTservidor0 as funYes de
tratamento de ar(uivos podem trabalhar em ar(uivos localizados no cliente
6estao7 ou no servidor. 3 AD1PL identifica o local onde o ar(uivo ser/
manipulado atravs da eistancia ou no da letra do drive no nome do ar(uivo
passado em LcAr(K. 3u se&a0 se o ar(uivo for especificado com a letra do drive0
ser/ aberto na estao. Caso contr/rio0 ser/ aberto no servidor com o diret+rio
confi"urado como rootpath sendo o diret+rio ra$z para localizao do ar(uivo.
Ta#e$a A2 Modos de Acesso a Ar1ui.os Bi"?rios
'odo Constante 6fileio.ch7 3perao
F ,3k8.AD Aberto para leitura 6padro assumido7
@ ,3k!89T. Aberto para "ravao
A ,3k8.AD!89T. Aberto para leitura e "ravao
Ta#e$a B2 Modos de Acesso de Co,parti$a,e"to a Ar1ui.os Bi"?rios
'odo
Constante
6fileio.ch7
3perao
F ,3kC3'PAT 'odo de Compatibilidade 6Default7
@< ,3k.]CLE)91. Acesso total eclusivo
GA ,3kD.N^!89T.
Acesso blo(ueando a "ravao de outros processos ao
ar(uivo.
H> ,3kD.N^8.AD Acesso blo(ueando a leitura de outros processos ao ar(uivo.
<H ,3kD.N^N3N.
Acesso compartilhado. Permite a leitura e "ravao por
outros processos ao ar(uivo..
<H ,3k)#A8.D 9"ual i ,3kD.N^N3N.
No eemplo abaio 0 tentamos abrir o ar(uivo error.lo" para escrita e "ravao
compartilhada.
#include 'fileio.ch'
...
nH := fopen('\sigaadv\error.log' , FO_READWRITE + FO_SHARED )
If nH == -1
MsgStop('Erro de abertura : FERROR '+str(ferror(),4))
Else
MsgStop('Arquivo aberto com sucesso.')
...
fclose(nH)
Endif
...
)intae
,8.AD 6 L n#anvle K 0 L c-uffer K 0 L nZtd-Ptes K 7 TTK n-PtesLidos
ParCmetros
Ar"umento Tipo Descrio
n#anvle Numrico
X o manipulador 6#andle7 retornado pelas funYes
,3P.N670
,C8.AT.670 ,3P.NP38T670 (ue faz referancia ao
ar(uivo a ser lido.
c-uffer Caracter
X o nome de uma vari/vel do tipo )trin" 0 a ser utilizada
como buffer de leitura 0 onde os dados lidos
devero ser armazenados. 3 tamanho desta vari/vel deve
ser maior ou i"ual ao tamanho informado em nZtd-Ptes.
.sta vari/vel deve ser sempre passada por referancia. 6 c
antes do nome da vari/vel 70 caso contr/rio os dados lidos
no sero retornados.
nZtd-Ptes Numrico
Define a (uantidade de -Ptes (ue devem ser lidas do
ar(uivo a partor posicionamento do ponteiro atual.
8etorno
Tipo Descrio
Numrico
Zuantidades de bPtes lidos. Caso a (uantidade se&a menor (ue a solicitada0
isto indica erro de leitura ou final de ar(uivo0 1erifi(ue a funo
,.883867 para maiores detalhes.
Descrio
,8.AD67 la os dados a partir um ar(uivo aberto0 atravs de ,3P.N670 ,C8.AT.67
eDou ,3P.NP38T670 e armazena os dados lidos por referancia no buffer informado.
,8.AD67 ler/ at o n%mero de bPtes informado em nZtd-Ptes[ caso acontea al"um
erro ou o ar(uivo che"ue ao final0 ,8.AD67 retornar/ um n%mero menor (ue o
especificado em nZtd-Ptes. ,8.AD67 la normalmente caracteres de controle 6A)C @A>0
A)C F0 etc.7.
A vari/vel )trin" a ser utiilzada como buffer de leitura deve ser sempre prTalocado e
passado como referancia. Caso contr/rio0 os dados no podero ser retornados.
,8.AD67 la a partir da posio atual do ponteiro atual do ar(uivo 0 (ue pode ser
a&ustado ou modificado pelas funYes ,)..b67 0 ,!89T.67 ou ,8.AD)T867.
)intae
,8.AD)T8 6 L n#andle K 0 L nZtd-Ptes K 7 TTK cLidos
ParCmetros
Ar"umento Tipo Descrio
n#andle Numrico
X o manipulador retornado pelas funYes ,3P.N670
,C8.AT.670 ,3P.NP38T67.
nZtd-Ptes Numrico N%mero m/imo de bPtes (ue devem ser lidos.
8etorno
Tipo Descrio
Caracter
8etorna uma strin" contendo os caracteres
lidos.
Descrio
La caracteres de um ar(uivo bin/rio.
,8.AD)T867 la de um ar(uivo aberto0 atravs de ,3P.N670 ,C8.AT.670
,3P.NP38T67.
,8.AD)T867 ler/ at o n%mero de bPtes informado em nZtd-Ptes ou at encontrar um
C#86F7. Caso acontea al"um erro ou o ar(uivo che"ue ao final0 ,8.AD)T867
retornar/ uma strin" menor do (ue nZd-Ptes e colocar/ o erro em ,.883867.
,8.AD)T867 la a partir da posio atual do ponteiro0 (ue pode ser a&ustado pelo
,)..b670 ,!89T.6 7 ou ,8.AD67.
)intae
,8.NA'. 6 L c3ld,ile K 0 L cNe*,ile K 7 TTK n)tatus
ParCmetros
Ar"umento Tipo Descrio
c3ld,ile Caracter
Nome do ar(uivo ser/ renomeado0 aceita caminhos do
servidor e caminhos do cliente. Caso no se&a especificado
nenhuma unidade de disco e path0 considerado o path
atual no servidor.
cNe*,ile Caracter
Novo nome do ar(uivo0 aceita tambm caminho do
servidor0 e caminho do cliente.
8etorno
Tipo Descrio
Numrico
)e o status retornado for T@ 0 ocorreu al"um erro na mudana de nome M
1erifi(ue se os dois caminhos esto no mesmo ambiente0 verifi(ue a
eistancia do ar(uivo de ori"em0 se ele no est/ em uso no momento por
outro processo 0 e verifi(ue se o nome do ar(uivo de destino &/ no eiste
no path de destino especificado.
Descrio
Atravs da funo ,8.NA'.67 poss$vel renomear um ar(uivo para outro nome0 tanto
no servidor como na estao. Ao renomear um ar(uivo no es(uea (ue esta ar(uivo
dever/
estar fechado 6 isto 0 no pode estar em uso por nenhum outro processo ou estao7.
Caso o ar(uivo este&a aberto por outro processo 0 a operao de renomear o ar(uivo no
poss$vel. A funo f8ename67 no aceita *ildcards 6 V eDou n 7.
1ale lembrar (ue no poss$vel renomear um ar(uivo especificando nos parCmetros
simultaneamente um caminho de servidor e um de estao remota0 bem como
especificar dois ar(uivos remotos e eecutar a funo fername67 atravs de um 43-.
Caso isto ocorra0 a funo retornar/ T@ 0 e f.rror67 retornar/ tambm T@.
I,porta"te 2 Tua"do especi&ica,os u, pat di&ere"te "os ar1ui.os de ori3e, e
desti"o 9 a &u"()o &Re"a,e56 rea$i7a a &u"cio"a$idade de MOVER o ar1ui.o para o
Pat especi&icado0
.emplos
// Renomeando um arquivo no Client de origem.txt para destino.txt , na
pasta c:\Temp
nStatus1 := frename('c:\Temp\Origem.txt' , 'c:\Temp\Destino.txt' )
IF nStatus1 == -1
MsgStop('Falha na operao 1 : FError '+str(ferror(),4))
Endif
// Renomeando um arquivo no Server, na pasta sigaadv , de error.log
para error.old
nStatus2 := frename('\sigaadv\error.log' , '\sigaadv\error.old' )
IF nStatus2 == -1
MsgStop('Falha na operao 2 : FError '+str(ferror(),4))
Endif
// Movendo um arquivo no client , da pasta Raiz para a pasta c:\Temp ,
alterando tambm o nome do arquivo.
nStatus3 := frename('c:\Lista.txt','c:\Temp\OldLista.txt')
IF nStatus3 == -1
MsgStop('Falha na operao 3 : FError '+str(ferror(),4))
Endif
)intae
,)..b 6 L n#andle K 0 : n3ff)et ; 0 : n3ri"em ; 7 TTK nPos
ParCmetros
Ar"umento Tipo Descrio
n#andle Numrico
'anipulador obtido atravs das funYes
,C8.AT.0,3P.N.
n3ff)et Numrico
n3ff)et corresponde ao n%mero de bPtes no ponteiro de
posicionamento do ar(uivo a ser movido. Pode ser um
numero positivo 0 zero ou ne"ativo0 a ser considerado a
partir do parCmetro passado em n3ri"em.
n3ri"em Numrico
9ndica a partir de (ual posio do ar(uivo0 o n3ffset ser/
considerado.
8etorno
Tipo Descrio
Numrico
,)..b67 retorna a nova posiao do ponteiro de ar(uivo com relaao ao
in$cio do ar(uivo 6posiao F7 na forma de um valor numrico inteiro. .ste
valor nao leva em conta a posiao ori"inal do ponteiro de ar(uivos antes da
eecuo da funo ,)..b67.
Descrio
,)..b67 posiciona o ponteiro do ar(uivo para as pr+imas operaYes de leitura ou
"ravao. As movimentaYes de ponteiros so relativas i n3ri"em (ue pode ter os
se"uintes valores0 definidos em fileio.chM
Ta#e$a A2 Ori3e, a ser co"siderada para a ,o.i,e"ta()o do po"teiro de
posicio"a,e"to do Ar1ui.o0
3ri"em Constante 3perao
F ,)k).T A&usta a partir do inicio do ar(uivo. 6Default7
@ ,)k8.LAT91. A&uste relativo a posio atual do ar(uivo.
A ,)k.ND A&uste a partir do final do ar(uivo.
)intae
,Tk,.3, 6 7 TTK l8et
8etorno
Tipo Descrio
L+"ico
8etorna true caso o ponteiro do ar(uivo tenha che"ado ao final0 false caso
contr/rio.
Descrio
9ndica se o ponteiro esta posicionado no fim do ar(uivo teto.
A funo ,Tk,.of67 retorna verdadeiro 6.t.7 se o ar(uivo teto aberto pela ,Tk,E).
estiver posicionado no final do ar(uivo0 similar i funo .of 670 usada em tabelas de
dados.


.emplos
3 eemplo abaio realiza a leitura de um ar(uvio teto0 utilizandoTse das funYes
,Tk,V
FT_FUse('teste.txt') // Abre o arquivo
conout("Linhas no arquivo ["+str(ft_flastrec(),6)+"]")
FT_FGOTOP()
While !FT_FEof()
conout("Ponteiro ["+str(FT_FRECNO(),6)+"] Linha ["+FT_FReadln()
+"]")
FT_FSkip()
Enddo
FT_FUse() // Fecha o arquivo
)intae
,Tk,53T3 6 L nPos K 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
nPos Numrico
9ndica a posio (ue ser/ colocado o ponteiro para leitura
dos dados no ar(uivo.
8etorno
Tipo Descrio
6NEL37 .sta funo sempre retorna N9L
Descrio
A funo tem como ob&etivo mover o ponteiro0 (ue indica a leitura do ar(uivo teto0
para a posio absoluta especificada pelo ar"umento LnPosK.
)intae
,Tk,53T3P 6 7 TTK N9L
8etorno
Tipo Descrio
6NEL37 .sta funo sempre retorna N9L
Descrio
A funo ,Tk,5oTop tem como ob&etivo posicionar o ar(uivo teto aberto pela
,Tk,Ese na
posio inicial do ar(uivo.
.ntendeTse como posio inicial do ar(uivo0 o primeiro caracter da primeira linha do
ar(uivo teto.
)intae
,Tk,LA)T8.C 6 7 TTK n8et
8etorno
Tipo Descrio
Numrico
8etorna a (uantidade de linhas eistentes no ar(uivo. Caso o ar(uivo este&a
vazio0 ou no eista ar(uivo aberto0 a funo retornar/ F 6zero7
Descrio
A funo tem o ob&etivo de retornar o n%mero de linhas eistentes do ar(uivo teto.
A funo ,Tk,Last8ec retorna o n%mero total de linhas do ar(uivo teto aberto pela
,Tk,Ese. As linhas so delimitadas pela se(uancia de caracteres C8L, ou L, 6V7.
6V7 1erifi(ue maiores informaYes sobre formato do ar(uivo e tamanho m/imo da
linha de teto na funo ,Tk,8.ADLN67
.emplos
3 eemplo abaio realiza a leitura de um ar(uvio teto0 utilizandoTse das funYes
,Tk,V
FT_FUse('teste.txt') // Abre o arquivo
conout("Linhas no arquivo ["+str(ft_flastrec(),6)+"]")
FT_FGOTOP()
While !FT_FEof()
conout("Ponteiro ["+str(FT_FRECNO(),6)+"] Linha ["+FT_FReadln()
+"]")
FT_FSkip()
Enddo
FT_FUse() // Fecha o arquivo
)intae
,Tk,8.ADLN 6 7 TTK c8et
8etorno
Tipo Descrio
Caracter
8etorna a linha inteira na (ual est/ posicionado o ponteiro para leitura de
dados.
Descrio
A funo tem como ob&etivo ler uma linha do ar(uivo teto.
A funo ,Tk,8.ADLN67 retorna uma linha de teto do ar(uivo aberto pela ,Tk,Ese.
As linhas so delimitadas pela se(uancia de caracteres C8L, 6 c(()*) + c((),) 7 0 ou
apenas L, 6 c((), 70 e o tamanho m/imo de cada linha @FAA bPtes
Observaes
A utilizao desta funo no altera a posio do ponteiro para leitura dos
dados0 o ponteiro do ar(uivo no movido. A movimentao do ponteiro
realizada atravs da funo ,Tk,)b9P67
3 limite de @FAA bPtes por linha inclui os caracteres delimitadores de final de
linha. Deste modo0 (uando utilizados os separadores C8L,0 isto nos deia @FAF
bPtes de teto0 e utilizando L,0 @FA@ bPtes. A tentativa de leitura de ar(uivos
com linhas de teto maiores do (ue os valores especificados acima resultar/ na
leiitura dos @FAG primeiros bPtes da linha0 e incorreta identificao das (uebras
de linha posteriores.
As funYes ,Tk,V foram pro&etadas para ler ar(uivos com conte%do teto
apenas. A utilizao das mesmas em ar(uivos bin/rios pode "erar
comportamentos inesperados na movimentao do ponteiro de leitura do
ar(uivo0 e incorretas identificaYes nos separadores de final de linha.
&elease
Zuando utilizado um Protheus )erver0 com build superior a =.FF.FBF=@GP0 a funo
,Tk,8.ADLN67 tambm capaz de ler ar(uivos teto D A)C990 (ue utilizam tambm o
caractere L, 6 c((),) 7 como separador de linha.

.emplos
)intae
,Tk,8.CN3 6 7 TTK c8et
8etorno
Tipo Descrio
Caracter 8etorna a posio corrente do ponteiro do ar(uivo teto.
Descrio
A funo tem o ob&etivo de retornar a posio do ponteiro do ar(uivo teto.
A funo ,Tk,8ecno retorna a posio corrente do ponteiro do ar(uivo teto aberto
pela ,Tk,Ese.
)intae
,Tk,)b9P 6 : nLinhas ; 7 TTK N9L
ParCmetros
Ar"umento Tipo Descrio
nLinhas Numrico
nLinhas corresponde ao n%mero de linhas do ar(uivo T]T
ref. movimentao do ponteiro de leitura do ar(uivo.
8etorno
Tipo Descrio
6NEL37 .sta funo sempre retorna N9L.
Descrio
'ove o ponteiro do ar(uivo teto para uma nova posio.
A funo ,Tk,)2ip move o ponteiro do ar(uivo teto aberto pela ,Tk,Ese para a
pr+ima linha0 similar ao Db)2ip usado para tabelas de dados.

)intae
,Tk,E). 6 : cT]T,ile ; 7 TTK n#nd
ParCmetros
Ar"umento Tipo Descrio
cT]T,ile Caracter
Corresponde io nome do ar(uivo T]T a ser aberto. Caso o
nome no se&a passado0 e &/ eisa um ar(uivo aberto. o
mesmo fechado.
8etorno
Tipo Descrio
Numrico
A funo retorna o #andle de controle do ar(uivo. .m caso de falha de
abertura0 a funo retornar/ T@
Descrio
Abre ou fecha um ar(uivo teto para uso das funcoes ,Tk,V
As funYes ,Tk,V so usadas para para ler ar(uivos teto0 onde as linhas so
delimitadas pela se(uancia de caracteres C8L, ou L, 6V7 e o tamanho m/imo de cada
linha @FAA bPtes.. 3 ar(uivo aberto em uma /rea de trabalho0 similar i usada pelas
tabelas de dados.
6V7 'aiores detalhes sobre a especificao do ar(uivo na funo ,Tk,8.ADLN67
)intae
,!89T. 6 L n#andle K 0 L c-uffer K 0 : nZtd-Ptes ; 7 TTK n-Ptes.scritos
ParCmetros
Ar"umento Tipo Descrio
n#andle Numrico
X o manipulador de ar(uivo ou device retornado pelas
funYes ,3P.N670 ,C8.AT.670 ou ,3P.NP38T67.
c-uffer Caracter
Lc-ufferK a cadeia de caracteres a ser escrita no ar(uivo
especificado. 3 tamanho desta vari/vel deve ser maior ou
i"ual ao tamanho informado em nZtd-Ptes 6caso
se&a informado o tamanho7.
nZtd-Ptes Numrico
LnZtd-PtesK indica a (uantidade de bPtes a serem
escritos a partir da posiao corrente do ponteiro de
ar(uivos. Caso se&a omitido0 todo o conte%do de
Lc-ufferK escrito.
8etorno
Tipo Descrio
Numrico
,!89T.67 retorna a (uantidade de bPtes escritos na forma de um valor
numrico inteiro. Caso o valor retornado se&a i"ual a LnZtd-PtesK0 a
operaao foi bem sucedida. Caso o valor de retorno se&a menor (ue
Ln-PtesK ou zero0 ou o disco est/ cheio ou ocorreu outro erro. Neste caso 0
utilize a funo ,.883867 para obter maiores detalhes da ocorrancia.
Descrio
1oca pode escrever todo ou parte do conte%do do buffer 0 limitando a (uantidade de
-Ptes atravs do parCmetro nZtd-Ptes. A escrita comea a partir da posio corrente do
ponteiro de ar(uivos0 e a funo ,!89T. retornar/ a (uantidade real de bPtes escritos.
Atravs das funYes ,3P.N670 ,C8.AT.670 ou ,3P.NP38T670 podemos abrir ou
criar um ar(uivo ou abrir uma porta de comunicao 0 para o (ual sero "ravados ou
enviados os dados do buffer informado. Por tratarTse de uma funo de manipulao de
conte%do bin/rio 0 so suportados na )trin" c-uffer todos os caracteres da tabela
A)C99 0 inclusive caracteres de controle 6 A)C F 0 A)C @A 0 A)C @A> 0 etc... 7.
Caso acontea al"uma falha na "ravao 0 a funo retornar/ um n%mero menor (ue o
nZtd-Ptes. Neste caso 0 a funo ,.883867 pode ser utilizada para determinar o erro
espec$fico ocorrido. A "ravao no ar(uivo realizada a partir da posio atual do
ponteiro 0 (ue pode ser a&ustado atravs das funYes ,)..b67 0 ,8.AD67 ou
,8.AD)T867.
E*e,p$o da &u"()o F@RITE
8evisoM A=DFBDAFFG
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
.ste eemplo realiza uma c+pia de um ar(uivo Teto chamado 3895.'.T]T 0 para
um ar(uivo chamado D.)T9N3.T]T 0 no ambiente do Protheus )erver.
#INCLUDE "FILEIO.CH"
#DEFINE F_BLOCK 1024 // Define o bloco de Bytes a serem lidos
/ gravados por vez
User Function TestCopy()
Local cBuffer := SPACE(F_BLOCK)
Local nHOrigem , nHDestino
Local nBytesLidos , nBytesFalta , nTamArquivo
Local nBytesLer , nBytesSalvo
Local lCopiaOk := .T.
// Abre o arquivo de Origem
nHOrigem := FOPEN("ORIGEM.TXT", FO_READ)
// Testa a abertura do Arquivo
If nHOrigem == -1
MsgStop('Erro ao abrir origem. Ferror =
'+str(ferror(),4),'Erro')
Return .F.
Endif
// Determina o tamanho do arquivo de origem
nTamArquivo := Fseek(nHOrigem,0,2)
// Move o ponteiro do arquivo de origem para o inicio do arquivo
Fseek(nHOrigem,0)
// Cria o arquivo de destino
nHDestino := FCREATE("DESTINO.TXT", FC_NORMAL)
// Testa a criao do arquivo de destino
If nHDestino == -1
MsgStop('Erro ao criar destino. Ferror =
'+str(ferror(),4),'Erro')
FCLOSE(nHOrigem) // Fecha o arquivo de Origem
Return .F.
Endif
// Define que a quantidade que falta copiar o prprio tamanho do
Arquivo
nBytesFalta := nTamArquivo
// Enquanto houver dados a serem copiados
While nBytesFalta > 0
// Determina quantidade de dados a serem lidos
nBytesLer := Min(nBytesFalta , F_BLOCK )
// l os dados do Arquivo
nBytesLidos := FREAD(nHOrigem, @cBuffer, nBytesLer )
// Determina se no houve falha na leitura
If nBytesLidos < nBytesLer
MsgStop( "Erro de Leitura da Origem. "+;
Str(nBytesLer,8,2)+" bytes a
LER."+;
Str(nBytesLidos,8,2)+" bytes
Lidos."+;
"Ferror =
"+str(ferror(),4),'Erro')
lCopiaOk := .F.
Exit
Endif
// Salva os dados lidos no arquivo de destino
nBytesSalvo := F@RITE(nHDestino, cBuffer,nBytesLer)
// Determina se no houve falha na gravao
If nBytesSalvo < nBytesLer
MsgStop("Erro de gravao do Destino. "+;
Str(nBytesLer,8,2)+" bytes a
SALVAR."+;
Str(nBytesSalvo,8,2)+" bytes
gravados."+;
"Ferror =
"+str(ferror(),4),'Erro')
lCopiaOk := .F.
EXIT
Endif
// Elimina do Total do Arquivo a quantidade de bytes copiados
nBytesFalta -= nBytesLer
Enddo
// Fecha os arquivos de origem e destino
FCLOSE(nHOrigem)
FCLOSE(nHDestino)
If lCopiaOk
MsgStop('Cpia de Arquivos finalizada com sucesso. '+;
str(nTamArquivo,12,0)+' bytes
copiados.','Final')
Else
MsgStop( 'Falha na Cpia. Arquivo de Destino incompleto. '+;
'Do total de '+str(nTamArquivo,12,0)+'
bytes, faltaram '+str(nBytesFalta,12,0)+' bytes.','Final')
Endif
Return
)intae
5.TCL9.NTD98 6 7 TTK cPath
8etorno
Tipo Descrio
Caracter 8etona o path onde est/ instalado o Protheus 8emote.
Descrio
8etorna o diret+rio completo onde o 8emote est/ instalado0 informando inclusive a
unidade de disco.
O#ser.a()o 2 Esta &u"()o ape"as retor"ar? u, resu$t?do .?$ido caso se4a
e*ecutada e, u, pro3ra,a atra.s do Proteus Re,ote 0 Caso esta &u"()o se4a
ca,ada e, JOB 9 a ,es,a ocasio"ar? u, erro de e*ecu()o 5 Error to
co,u"icate !it Re,ote 6 0
.emplos
No eemplo abaio 0 obtemos o drive e diret+rio onde esto instalados o 8emote .
MsgStop('Protheus Remote instalado em '+ GetClientDir())
)intae
5.T8.'3T.9N9NA'. 6 7 TTK cAr(Conf
8etorno
Tipo Descrio
Caracter Path e nome do ar(uivo de confi"urao
Descrio
8etorna o nome do ar(uivo de confi"urao do AP 8emote.
E*e,p$o das &u"(Aes IsSr.U"i* e
:etRe,oteI"i'a,e
8evisoM @ADF<DAFFG
Abran"ancia
1erso <.F? 1erso =.@F 1erso >.@@
Atravs do eemplo abaio0 podemos obter o path de eecuo do AP 8emote.
#include "protheus.ch"
Function TstRmtPath()
Local cIniName:= GETREMOTEININAME()
Local lUnix:= IsSrvUnix()
Local nPos:= Rat( IIf(lUnix,"/","\"),cIniName )
Local cPathRmt

if nPos!=0
cPathRmt:= Substr( cIniName,1,nPos-1 )
else
cPathRmt:=""
endif
QOut( cPathRmt )
Return
)intae
5.T)81P83,)T89N5 6 L cChave K 0 L cDefault K 7 TTK cConteudo
ParCmetros
Ar"umento Tipo Descrio
cChave Caracter Chave do 9N9 do environment a ser lida0
cDefault Caracter
cDefault o conteudo da chave a ser retornado caso a
chave no se&a encontrada no .ini
8etorno
Tipo Descrio
Caracter Conteudo da chave especificada
Descrio
Atravs da funo 5et)rvProf)trin" 0 podemos obter o conte%do de uma chave de
confi"urao do environment atual em uso no ar(uivo de 9nicializao do )erver
Protheus 6 AP)rv.ini 7 .
)intae
'Ab.D98 6 L cNovoDir K 7 TTK n8esultado
ParCmetros
Ar"umento Tipo Descrio
cNovoDir Caracter
Nome do diret+rio a ser criado0 incluindo opcionalmente o
caminho 6path7.
8etorno
Tipo Descrio
Numrico
8etorno zero 6 F 70o diret+rio foi criado com sucesso. Caso contr/rio0
houve erro na criao do diret+rio.
Descrio
Cria um diret+rio na estao ou no servidor AP.
Caso o diret+rio comece com um drive 6 .M CM0 ]M 7 o diret+rio ser/ criado na estao0
caso contr/rio ser/ criado no servidor.
MAKEDIR("c:\teste\um") // Cria um diretrio na estacao
nResult := MAKEDIR("\teste\um") // Cria o diretorio no servidor
Advanced protheus
IF nResult != 0
Conout( "Impossivel Criar o diretrio no servidor Protheus", nResult
)
ENDIF
MAKEDIR( "teste" ) // Exemplo tambm vlido ( Criando o diretrio no
servidor ) dentro do diretrio corrente
)intae
')C3'P8.)) 6 L cAr( J aAr(uivos K 0 : cDestino ; 0 : c)enha ; 7 TTK c,ileName
ParCmetros
Ar"umento Tipo Descrio
cAr( J aAr(uivos 6Zual(uer7
Ar(uivo6s7 a ser6em7 compactado6s7. Pode ser do tipo
)trin" 0 para especificar um %nico ar(uivo 0 ou do tipo
ArraP 0 contendo um ou mais ar(uivo6s7 a ser6em7
compatado6s7.
cDestino Caracter
Nome do Ar(uivo destino0 caso a etenso se&a omitida
ser/ assumido .'\P0 se no for informado assumir/ o
mesmo nome do cAr( com etenso .'\P ou o nome do
@e. Ar(uivo no ArraP LaAr(uivosK.
c)enha Caracter
)enha a ser utilizada para cripto"rafar o ar(uivo
compactado.
8etorno
Tipo Descrio
Caracter
Caso a compactao se&a eecutada com sucesso 0 a funo retornar/ uma
srin" contendo o nome do ar(uivo "erado . Caso no se&a poss$vel a
compactao 0 por falta de espao em disco ou erro de acesso a al"um dos
ar(uivos a ser6em7 compactado6s70 a funo retornar/ uma strin" em
branco 6ff7.
Descrio
Compacta um ou v/rios ar(uivos em um %nico ar(uivo com etenso .'\P.
')C3'P8.))67 compacta os ar(uivos informados em um %nico ar(uivo com
etenso default .'\P. 3 formato propriet/rio e multiplataforma.
Caso a senha se&a informada apenas com a senha poderemos descompactar os ar(uivos.
Tanto ar(uivos no local 6 8emote 7 como no )ervidor so aceitos.
.emplos
// Exemplo 1 Compacta apenas um arquivo
lRes := MSCOMPRESS( "AP6SRV.EXE", "AP6SRV.MZP" )
// Exemplo 2 Compacta um diretrio com senha
aNome := {}
ADIR( "*.DBF", aNome )
lRes := MSCOMPRESS( aNome, "ArqComp.MZP", "SENHA" )
)intae
')D.C3'P 6 L cAr( K 0 : cPathDestino ; 0 : c)enha ; 7 TTK l)ucess
ParCmetros
Ar"umento Tipo Descrio
cAr( Caracter Nome do Ar(uivo no formato '\P a ser descompactado.
cPathDestino Caracter
Path de destino onde sero "ravados o6s7 ar(uivo6s7
descompactado6s7. Note (ue podem ser inclu$dos caminhos
do servidor como caminhos locais.
c)enha Caracter
Caso o ar(uivo tenha sido compactado com senha 0 esta
deve ser especificada peste parCmetro para ser poss[ivel a
descompactao do ar(uivo.
8etorno
Tipo Descrio
L+"ico
Caso a descompactao foi eecutada com sucesso0 a funo retornar/ .T. 0
.m caso de erro durante a descompactao0 a funo retrornar/ .,.
1erifi(ue o espao dispon$vel na unidade de disco para descompactar o6s7
ar(uivo6s7 eDou se eiste am"um ar(uivo a ser descompactado no pacote
(ue &/ eista na unidade de disco 0 atribu$do como f8.adT3nlPf.
Descrio
')D.C3'P67 descompacta o ar(uivo informado em um diret+rio. 3 ,ormato
propriet/rio0 e multiTplataforma0 suporta apenas ar(uivos compactados pela funo
')C3'P8.))67.
Caso o ar(uivo se&a prote"ido por senha0 apenas com a senha poderemos descompact/T
lo.
Tanto ar(uivos no local 6 8emote 7 como no )ervidor so aceitos.
)intae
')D.C3'P 6 L cAr( K 0 : cPathDestino ; 0 : c)enha ; 7 TTK l)ucess
ParCmetros
Ar"umento Tipo Descrio
cAr( Caracter Nome do Ar(uivo no formato '\P a ser descompactado.
cPathDestino Caracter
Path de destino onde sero "ravados o6s7 ar(uivo6s7
descompactado6s7. Note (ue podem ser inclu$dos caminhos
do servidor como caminhos locais.
c)enha Caracter
Caso o ar(uivo tenha sido compactado com senha 0 esta
deve ser especificada peste parCmetro para ser poss[ivel a
descompactao do ar(uivo.
8etorno
Tipo Descrio
L+"ico
Caso a descompactao foi eecutada com sucesso0 a funo retornar/ .T. 0
.m caso de erro durante a descompactao0 a funo retrornar/ .,.
1erifi(ue o espao dispon$vel na unidade de disco para descompactar o6s7
ar(uivo6s7 eDou se eiste am"um ar(uivo a ser descompactado no pacote
(ue &/ eista na unidade de disco 0 atribu$do como f8.adT3nlPf.
Descrio
')D.C3'P67 descompacta o ar(uivo informado em um diret+rio. 3 ,ormato
propriet/rio0 e multiTplataforma0 suporta apenas ar(uivos compactados pela funo
')C3'P8.))67.
Caso o ar(uivo se&a prote"ido por senha0 apenas com a senha poderemos descompact/T
lo.
Tanto ar(uivos no local 6 8emote 7 como no )ervidor so aceitos.
)intae
)PL9TPAT# 6 L cAr( K 0 : ccDrive ; 0 : ccCaminho ; 0 : ccNome ; 0 : cc.t ; 7 TTK
N9L
ParCmetros
Ar"umento Tipo Descrio
cAr( Caracter
Nome do Ar(uivo a ser (uebrado. 3pcionalmente0 pode
incluir caminho e drive.
cDrive Caracter
Nome do Drive. .emplo 6 CM 7. Caso o Ar(uivo
informado no possua drive ou o caminho refiraTse ao
servidor0 o retorno ser/ uma strin" em branco.
cCaminho Caracter
Nome do Caminho. Caso o Ar(uivo informado no possua
caminho0 ser/ uma strin" em branco.
cNome Caracter
Nome do Ar(uivo sem a etenso. Caso em cAr( no se&a
especificado um nome do Ar(uivo0 ser/ retornada uma
strin" em branco.
c.t Caracter
.tenso do ar(uivo informado em cAr( 0 prefizada com
um ponto f.f. Caso a etenso em cAr( no se&a
especificada 0 o retorno ser/ uma strin" em branco.
8etorno
Tipo Descrio
Caracter .sta funo sempre retorna N9L.
Descrio
A funo )plitPath67 divide um caminho completo em todas as suas subpartes 6 Drive 0
Caminho 0 Nome e .tenso 7 .
Tanto ar(uivos locais 6 8emote 7 (uanto ar(uivos no servidor0 podem ser informados.
3 caminho0 caso informado0 incluir/ uma barra como %ltimo caracter. A etenso 0
(uando retornada 0 inclui sempre o ponto 6 . 7 antes da etenso.
Todos os parCmetros 0 a partir do se"undo 0 (uando passados devem ser por referancia.
O#ser.a()o 2 Va$e $e,#rar 1ue a &u"()o Sp$itPat ")o .a$ida a si"ta*e do ca,i"o
eHou ar1ui.o di3itados 9 "e, a e*istU"cia do ,es,o 0 Esta &u"()o uti$i7ada para
deter,i"ar e, u,a stri"3 os e$e,e"tos 1ue co,pAe u, ca,i"o para a
$oca$i7a()o de u, ar1ui.o0
.emplos
No eemplo abaio 0 eemplificamos o funcionamento da funo )plitPath 0 usando
combinaYes de nomes de ar(uivos com ou sem drive 0 caminho 0 nome de ar(uivo eDou
etenso.
User Function TSTSplit()
Local aArq := {} , cDrive, cDir, cNome, cExt
aadd(aArq,'c:\path\arquivo.ext')
aadd(aArq,'c:\path\arquivo')
aadd(aArq,'c:\path\')
aadd(aArq,'c:\arquivo')
aadd(aArq,'\path\arquivo.ext')
aadd(aArq,'path\arquivo')
aadd(aArq,'\\servidor\pasta\')
aadd(aArq,'\\servidor\pasta\arquivo.ext')
aadd(aArq,'')
For nI := 1 to len(aArq)
SplitPath( aArq[nI], @cDrive, @cDir, @cNome, @cExt )
conout( aArq[nI] + ' ['+cDrive+'] ['+ cDir +'] ['+ cNome +'] ['+
cExt + ']')
Next
Ap+s eecutado o pro"rama acima0 deve ser eibido no console do Protheus )erver o
teto abaio M
c:\path\arquivo.ext [c:] [\path\] [arquivo] [.ext]
c:\path\arquivo [c:] [\path\] [arquivo] []
c:\path\ [c:] [\path\] [] []
c:\arquivo [c:] [\] [arquivo] []
\path\arquivo.ext [] [\path\] [arquivo] [.ext]
path\arquivo [] [path\] [arquivo] []
\\servidor\pasta\ [] [\\servidor\pasta\] [] []
\\servidor\pasta\arquivo.ext [] [\\servidor\pasta\] [arquivo] [.ext]
[] [] [] []
)intae
!89T.PP83)T89N5 6 L c)ecao K 0 L cChave K 0 L cConteudo K 0 L cAr(9ni K 7 TTK
l)ucess
ParCmetros
Ar"umento Tipo Descrio
c)ecao Caracter
c)ecao corresponde io nome da seo do $ni a ser
utilizada. Caso a seo no eista 0 a mesma ser/ criada.
cChave Caracter
Chave da seo do ini a ter seu conte%co alterado . Caso a
chave no esista na seo especificada0 a mesma ser/
criada.
cConteudo Caracter
cConteudo corresponde io conte%do da chave a ser
atualizado.
cAr(9ni Caracter
cAr(9ni corresponde ao nome do ar(uivo de inicializao a
ser alterado. Caso o ar(uivo no eista 0 ele ser/ criado .
Caso o path do ar(uivo no se&a informado 0 o mesmo ser/
criadoDatualizado no diret+rio onde est/ instalado o
Protheus )erver0 no servidor. Caso especificado um path
absoluto 0 com unidade de disco 0 o ar(uivo .ini ser/ criado
eDou atualizado na estao remota 0 no path informado.
8etorno
Tipo Descrio
L+"ico Caso a chave se&a incluida eDou alterada com sucesso 0 a funo
retornat/ .T. 6true7 0 e caso ocorra al"uma falha ou impossibilidade de
acesso ao ar(uivo .ini 0 a funo retornar/ .,. 6false7. Dentre as causas mais
comuns de falha 0 podemos citar erro de sintae no nome do ar(uivo eDou
path ineistente ou inacess$vel.
Descrio
Atravs da funcao !ritePPro)trin"67 0 poss$vel criar eDou alterar uma seo D chave de
confi"urao em um ar(uivo .ini . Caso o ar(uivo no eista 0 o mesmo ser/ criado . No
nome do ar(uivo 0 podemos opcionalmente definir um path absoluto 0 com unidade de
disco 0 de modo (ue o ar(uivo .ini ser/ atualizado na estao remota 6 onde est/ sendo
eecutado o Protheus 8emote 7 . Caso no se&a especificado nenhum path ou caminho
do ar(uivo .ini 0 o caminho de disco considerado ser/ o path no )ervidor onde est/
instalado o Protheus )erver .
FUNO DE TRATAMENTO DE CARACTERES
)intae
ALLT89' 6 L c)trin" K 7 TTK cTrim)trin"
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
Lc)trin"K a epressao caractere cu&os espaos em branco
serao eliminados.
8etorno
Tipo Descrio
Caracter
ALLT89'67 retorna uma cadeia de caracteres cu&os espaos em branco i
direita e i es(uerda foram removidos.
Descrio
ALLT89'67 uma funo de tratamento de dados do tipo caractere (ue remove os
espaos em branco i direita e i es(uerda de uma cadeia de caracteres. X relacionada a
LT89'67 e 8T89'670 (ue removem espaos em branco i es(uerda e i direita de uma
cadeia de caracteres0 respectivamente. 3 inverso de ALLT89'670 LT89'670 e 8T89'67
sao as funoes PADC670 PAD8670 e PADL670 as (uais centralizam0 alinham i direita0 ou
alinham i es(uerda cadeias de caracteres atravs da insero de caracteres de
preenchimento.
)intae
D.)C.ND 6 L c)trin" K 7 TTK cDescend
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
Lc)trin"K corresponde i se(uancia de caracteres a ser
analisada.
8etorno
Tipo Descrio
Caracter
D.)C.ND67 retorna a strin" especificada como parCmetro de uma forma
complementada. Em D.)C.ND67 de C#86F7 sempre retorna C#86F7.
Descrio
D.)C.ND67 uma funo de converso (ue retorna a forma complementada da
epresso strin" especificada. .sta funo normalmente utilizada para a criao de
indeadores em 3rdem Decrescente.
.emplos
.ste eemplo utiliza D.)C.ND67 em uma epressao 9ND.] para criar um $ndice de
datas de ordem descendenteM
USE Sales NEW
INDEX ON DESCEND(DTOS(OrdDate)) TO SalesDate
Depois0 D.)C.ND67 pode ser utilizado para fazer uma pes(uisa 6)..b7 no $ndice
descendenteM
DbSEEK(DESCEND(DTOS(dFindDate)))
O#ser.a()o 2 Fa7<se "ecess?ria a co".ers)o da %ata para Stri"3 , atra.s da
&u"()o %TOS569 pois a &u"()o %ESCE'% ape"as tra#a$a co, Stri"3s0
)intae
LT89' 6 L c)trin" K 7 TTK c)trin"8esult
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
Lc)trin"K a cadeia de caracteres a ser copiada sem os
espaos em branco i es(uerda.
8etorno
Tipo Descrio
Caracter
LT89'67 retorna uma c+pia de Lc)trin"K0 sendo (ue os espaos em branco
i es(uerda foram removidos. Caso Lc)trin"K se&a uma cadeia de caracteres
nula 6ff7 ou toda composta de espaos em branco0 LT89'67 retorna uma
cadeia de caracteres nula 6ff7.
Descrio
LT89'67 uma funao de tratamento de caracteres utilizada para ,ormatar cadeias de
caracteres (ue possuam espaos em branco i es(uerda. Pode ser o caso de0 por eemplo0
n%meros convertidos para cadeias de caracteres atravs da funao )T867.
LT89'67 relacionada a 8T89'670 a (ual remove espaos em branco i direita0 e a
ALLT89'670 (ue remove espaos tanto i es(uerda (uanto i direita. 3 contr/rio de
ALLT89'670 LT89'670 e 8T89'67 sao as funoes PADC670 PAD8670 e PADL670 as
(uais centralizam0 alinham i direita0 ou alinham i es(uerda as cadeias de caracteres0
atravs da inserao de caracteres de preenchimento.
)intae
PADL D PAD8 D PADC 6 L ep K 0 L nTamanho K 0 : cCaracPreench ; 7 TTK
c)trin"Preench
ParCmetros
Ar"umento Tipo Descrio
ep Caracter
LepK um valor caractere0 data0 ou numrico no (ual
serao inseridos caracteres de preenchimento.
nTamanho Numrico
LnTamanhoK o tamanho da cadeia de caracteres a ser
retornada.
cCaracPreench Caracter
LcCaracPreenchK o caractere a ser inserido em LepK.
Caso nao se&a especificado0 o padrao o espao em
branco.
8etorno
Tipo Descrio
Caracter
PADC670 PADL670 e PAD867 retornam o resultado de LepK na forma de
uma cadeia de caracteres preenchida com LcCaracPreenchK0 para totalizar
o tamanho especificado por LnTamanhoK.
Descrio
PADC670 PADL670 e PAD867 sao funoes de tratamento de caracteres (ue inserem
caracteres de preenchimento em valores caractere0 data ou numricos a fim de criar uma
nova cadeia de caracteres de tamanho especificado. PADC67 centraliza LepK0
adicionando caracteres de preenchimento i direita e i es(uerda[ PADL67 adiciona
caracteres de preenchimento i es(uerda[ e PAD867 adiciona caracteres de
preenchimento i direita. Caso o tamanho de LepK eceda o ar"umento LnTamanhoK0
todas as funoes PAD67 truncam c)trin"Preench ao LnTamanhoK especificado.
PADC670 PADL670 e PAD867 sao utilizadas para eibir cadeias de caracteres de tamanho
vari/vel em uma /rea de tamanho fio. .las podem ser usadas0 por eemplo0 para
asse"urar o alinhamento com comandos nn consecutivos. 3utra utilizaao eibir tetos
em uma tela de tamanho fio0 para certificarTse de (ue o teto anterior foi
completamente sobreescrito.
PADC670 PADL670 e PAD867 sao o contr/rio das funoes ALLT89'670 LT89'670 e
LT89'670 as (uais eliminam espaoes em branco i es(uerda e i direita de cadeias de
caracteres.
)intae
8T89' 6 L c)trin" K 7 TTK cTrim)trin"
ParCmetros
Ar"umento Tipo Descrio
c)trin" Caracter
Lc)trin"K a cadeia de caracteres a ser copiada sem os
espaos em branco i direita.
8etorno
Tipo Descrio
Caracter
8T89'67 retorna uma c+pia de Lc)trin"K0 sendo (ue os espaos em
branco i direita foram removidos. Caso Lc)trin"K se&a uma cadeia de
caracteres nula 6ff7 ou totalmente composta por espaos0 8T89'67 retorna
uma cadeia de caracteres nula 6ff7.
Descrio
8T89'67 uma funao de tratamento de caracteres utilizada para ,ormatar cadeias de
caracteres (ue contenham espaos em branco i direita. .la %til (uando voca dese&a
eliminar espaos em branco i direita ao se concatenar cadeias de caracteres. X o caso
t$pico com campos de banco de dados (ue sao armazenados em formato de tamanho
fio. Por eemplo0 voca pode usar 8T89'67 para concatenar o primeiro e o %ltimo
campos de nome para formar uma cadeia de caracteres de nome.
LT89'67 relacionada a 8T89'670 (ue remove espaos em branco i direita0 e a
ALLT89'670 (ue remove espaos em branco i direita e i es(uerda. 3 contr/rio de
ALLT89'670 LT89'670 e 8T89'67 sao as funoes PADC670 PAD8670 e PADL670 as
(uais centralizam0 alinham i direita0 ou alinham i es(uerda cadeias de caracteres0
inserindo caracteres de preenchimento.
)intae
CD3! 6 L d.p K 7 TTK cNomeDia
ParCmetros
Ar"umento Tipo Descrio
d.p Data Ld.pK o valor data a ser convertido.
8etorno
Tipo Descrio
Caracter
CD3!67 retorna o nome do dia da semana na forma de uma cadeia de
caracteres. A primeira letra ser/ mai%scula e o resto dos caracteres vir/ em
min%sculas. Para um valor de data nulo ou inv/lido0 CD3!67 retorna uma
cadeia de caracteres vazia 6ff7.
Descrio
CD3!67 uma funo utilizada para obter0 a partir de uma data0 a cadeia de caracteres
contendo o dia da semana correspondente.
.emplos
3s eemplos a se"uir ilustram o funcionamento da funao CD3!67M
conout( DATE() ) // Resulta: 08/04/02
conout( CDOW(DATE()) ) // Resulta: Sunday
conout( CDOW(DATE() + 7) ) // Resulta: Sunday
conout( CDOW(CTOD("12/06/90")) ) // Resulta: Thursday
)intae
C'3NT# 6 L dData K 7 TTK c'as
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK a data a converter.
8etorno
Tipo Descrio
Caracter
C'3NT#67 retorna o nome do mas a partir de uma data como sendo uma
cadeia de caracteres com a primeira letra mai%scula e o restante da strin"
em letras min%sculas. Para uma data nula0 C'3NT#67 retornar/ uma
strin" nula 6ff7.
Descrio
C'3NT#67 uma funo de converso de datas (ue 0 a partir de uma data 0 retorna
uma cadeia de caracteres correspondendo ao nome do mas correspondente.
.emplos
3s eemplos se"uintes ilustram a utilizaao da funao C'3NT#67M
conout( CMONTH(DATE()) ) //
Resulta: August
conout( CMONTH(DATE() + 45) ) //
Resulta: September
conout( SUBSTR(CMONTH(DATE()), 1, 3) + STR(DAY(DATE()),3)) //
Resulta: Aug 4
)intae
DAT. 6 7 TTK d)istema
8etorno
Tipo Descrio
Data DAT.67 retorna a data do sistema como sendo um valor do tipo data.
Descrio
8etorna a data do sistema.
DAT.67 a funo (ue retorna a data do atual sistema. 3 formato de
sa$da controlado pelo comando ).T DAT.. 3 formato padro mmDddDPP.
.emplos
conout( DATE() ) // Resulta: 08/04/02
conout( DATE() + 30 ) // Resulta: 09/03/02
conout( DATE() - 30 ) // Resulta: 07/05/02
dDate = DATE()
conout( CMONTH(dDate) ) // Resulta: August
)intae
DA^ 6 L dData K 7 TTK nDia
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK a data a converter.
8etorno
Tipo Descrio
Numrico
DA^67 retorna um n%mero na faia de F at G@0 sendo este um valor
numrico inteiro. Caso o mas se&a ,evereiro0 os anos bissetos sao
considerados. )e o ar"umento de data A? de ,evereiro e o ano nao
bisseto0 DA^67 retornar/ zero. )e o ar"umento de data vazio0 DA^67
tambm retornar/ zero.
Descrio
8etorna o dia do mas como valor numrico. DA^67 uma funao de conversao de datas
utilizada para converter um valor do tipo data para o dia do mas correspondente. .sta
funo usada em con&unto com C'3NT#67 e ^.A867 para formatar datas. Alm
disso0 "eralmente usada em c/lculos (ue envolvam datas.
.emplos
3s eemplos se"uintes mostram a funao DA^67 sendo utilizada
de diversas maneirasM
conout( DATE() ) // Resulta: 09/01/90
conout( DAY(DATE()) ) // Resulta: 1
conout( DAY(DATE()) + 1) // Resulta: 2
conout( DAY(CTOD("")) ) // Resulta: 0
.ste eemplo utiliza DA^67 em con&unto com C'3NT#67 e ^.A867
para formatar um valor do tipo dataM
conout( CMONTH(DATE()) + STR(DAY(DATE())) +;
"," + STR(YEAR(DATE())) ) // Resulta: June 15, 1990
)intae
D3! 6 L dData K 7 TTK nDia
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK o valor data (ue ser/ convertido.
8etorno
Tipo Descrio
Numrico
D3!67 retorna o dia da semana na forma de um n%mero entre zero e sete.
3 primeiro dia da semana um 6Domin"o7 e o %ltimo sete 6)/bado7. )e
LdDataK estiver vazio0 D3!67 retorna zero.
Descrio
D3!67 uma funao de conversao de datas (ue converte um valor data para um
n%mero (ue identifica o dia da semana. .la %til (uando voca dese&a c/lculos de data
em uma base semanal. D3!67 semelhante a CD3!670 a (ual retorna o dia da semana
na forma de uma cadeia de caracteres ao invs de um n%mero.
.emplos
3s eemplos a se"uir ilustram CD3!67 e seu relacionamento com D3!67M
conout( DATE() ) // Resulta: 09/01/89
conout( DOW(DATE()) ) // Resulta: 3
conout( CDOW(DATE()) ) // Resulta: Terca-feira
conout( DOW(DATE() - 2) ) // Resulta: 1
conout( CDOW(DATE() - 2) ) // Resulta: Domingo
A se"uir est/ uma funao definida por usu/rio (ue utiliza D3!67 para calcular a data da
%ltima se"undaTfeira a partir de (ual(uer outra dataM
USER FUNCTION LastMonday(dData)
Return (dData - DOW(dData) + 2)
)intae
DT3C 6 L dData K 7 TTK cData
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK o valor data (ue ser/ convertido.
8etorno
Tipo Descrio
Caracter DT3C67 retorna uma cadeia de caracteres (ue representa uma data. 3 valor
de retorno formatado de acordo com o formato de datas corrente. 3
formato padrao mmDddDaa. Ema data nula retorna uma cadeia de
caracteres em branco i"ual em tamanho ao formato de data corrente.
Descrio
DT3C67 uma funao de conversao de datas utilizada por motivos de ,ormataao
(uando voca dese&a eibir a data no formato ).T DAT. e necess/ria uma epressao
caractere. Caso voca precise de um formato de data espec$fico0 voca pode utilizar
T8AN),38'67 ou uma epressao customizada.
)e voca estiver 9ND.]ando uma data &untamente com uma cadeia de caracteres0 use
DT3)67 ao invs de DT3C67 para converter o valor data para uma cadeia de caracteres.
.emplos
3s eemplos a se"uir demonstram utilizaoes "erais de DT3C67M
conout( DATE() ) // Resulta: 09/01/90
conout( DTOC(DATE()) ) // Resulta: 09/01/90
conout( "Hoje e " + DTOC(DATE()) ) // Resulta: Hoje e 09/01/90
)intae
DT3) 6 L dData K 7 TTK cData
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK o valor data (ue ser/ convertido.
8etorno
Tipo Descrio
Caracter
DT3)67 retorna uma cadeia com oito caracteres no formato0 aaaammdd.
Zuando LdDataK for uma data nula 6CT3D6ff770 DT3)67 retorna uma
cadeia de oito caracteres em branco. 3 valor de retorno nao afetado pelo
,ormato de data corrente.
Descrio
DT3)67 uma funao de conversao de datas utilizada para criar epressoes de $ndice
(ue consistem em um valor data e uma epressao caractere. DT3)67 converte um valor
data para uma cadeia de caracteres (ue pode ser concatenada a (ual(uer outra epressao
caractere. 3 valor de retorno estruturado para preservar a ordem de data 6ano0 mas0 e
dia7.
.emplos
3s eemplos a se"uir ilustram DT3)67 em con&unto com v/rias outras funoesM
conout( DATE() ) // Resulta: 09/01/90
conout( DTOS(DATE()) ) // Resulta: 19900901
conout( LEN(DTOS(CTOD(""))) ) // Resulta: 8
.ste eemplo demonstra como criar um $ndice com uma data
composta e chave de caractere utilizando DT3)67M
USE Vendas NEW
INDEX ON DTOS(Data) + Vendedor TO DataVend
)intae
.LAPT9'. 6 L c#ora9nicial K 0 L c#ora,inal K 7 TTK c9ntervalo
ParCmetros
Ar"umento Tipo Descrio
c#ora9nicial Caracter
9nforme a hora inicial no formato hhMmmMss0 onde hh a
hora 6 @ a AH 70 mm os minutos e ss os se"undos
c#ora,inal Caracter
9nforme a hora final no formato hhMmmMss0 onde hh a
hora 6 @ a AH 70 mm os minutos e ss os se"undos.
8etorno
Tipo Descrio
Caracter
A diferena de tempo no formato hhMmmMss0 onde hh a hora 6 @ a AH 70
mm os minutos e ss os se"undos
Descrio
.lapTime67 retorna uma cadeia de caracteres contendo a diferena de
tempo entre c#ora,inal T c#ora9nicial 0 no formato hhMmmMss.
3s dois parCmetros 0 c#ora9nicial e c#ora,inal 0 devem ser especificados no formato
hhMmmMss 0 com tamanho de > bPtes . Caso um dos parCmetros tenha tamanho diferente
de > -Ptes0 "erada uma ocorrancia de .rro ,atal finvalid lenf. Zual(uer caracter
invalido nas posicYes referentes i hora 6hh7 0 minuto 6mm7 e se"undo 6ss7 0 sero
i"norados na composio de numeros para o c/lculo. Caso o hor/rio inicial se&a maior
(ue o hor/rio final 0 retornada a diferena entre os hor/rios acrescidos de AHh. Para
maiores detalhes 0 consulte o eemplo da funo .lapTime67
.emplos
.ste eemplo utiliza a funo .lapTime67 para calcular o tempo necess/rio para um
determinado processamento.
cHoraInicio := TIME() // Armazena hora de inicio do processamento
.
. <instrucoes>
.
cElapsed := ELAPTIME(TIME(),cHoraInicio) // Calcula a diferena de
tempo
)intae
'3NT# 6 L dData K 7 TTK n'as
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK o valor data a ser convertido.
8etorno
Tipo Descrio
Numrico
'3NT#67 retorna um valor numrico inteiro na faia de F 6zero7 a @A.
Ema data nula 6CT3D6ff77 retorna zero.
Descrio
'3NT#67 uma funao de conversao de datas (ue %til (uando voca precisa de um
valor de mas numrico durante c/lculos para0 por eemplo0 relat+rios peri+dicos.
'3NT#67 faz parte de um "rupo de funoes (ue retornam componentes de um valor
data na forma de valores numricos. 3 "rupo inclui DA^67 e ^.A8670 (ue retornam os
valores de dia e ano na ,orma de n%mericos. C'3NT#67 uma funao relacionada0
(ue permite a voca retornar o nome do mas a partir de um valor data.
.emplos
.stes eemplos ilustram o retorno do mas da data do sistemaM
conout( DATE() ) // Resulta: 09/01/90
conout( MONTH(DATE()) ) // Resulta: 9
conout( MONTH(DATE()) + 1 ) // Resulta: 10
.ste eemplo demonstra a funao '3NT#67 atuando em uma data nulaM
conout( MONTH(CTOD("")) ) // Resulta: 0
)intae
).C3ND) 6 7 TTK n)e"undos
8etorno
Tipo Descrio
Numrico
).C3ND)67 retorna a hora do sistema como um valor numrico na forma
se"undos.centsimos. 3 valor numrico retornado a (uantidade de
se"undos decorridos desde a meiaTnoite0 e tem base em um rel+"io de
vinte e (uatro horas em uma faia de zero a ><G??.
Descrio
).C3ND)67 uma funao de horas utilizada para fornecer um mtodo simples de
calcular o tempo decorrido0 com base no rel+"io do sistema0 durante a eecuao do
pro"rama. X relacionado i funao T9'.670 a (ual retorna a hora do sistema como uma
cadeia de caracteres na forma hhMmmMss.
.emplos
.ste eemplo compara o valor de T9'.67 com o de ).C3ND)67M
conout( TIME() ) // Resulta: 10:00:00
conout( SECONDS() ) // Resulta: 36000.00
.ste eemplo demonstra como utilizar ).C3ND)67 para informar o tempo decorrido
em se"undosM
LOCAL nStart, nElapsed
nStart = SECONDS()
.
. <processamentos...etc....>
.
nElapsed = SECONDS() - nStart
conout( "Decorridos: " + LTRIM(STR(nElapsed)) + " segundos" )
)intae
T9'. 6 7 TTK c)trin"#ora
8etorno
Tipo Descrio
Caracter
T9'.67 retorna a hora do sistema como uma cadeia de caracteres na forma
hhMmmMss. hh indica a hora no formato de AH horas0 mm indica os minutos0
e ss indica os se"undos. #oras0 minutos e se"undos sao separadas por dois
pontos.
Descrio
T9'.67 uma funao de tratamento de tempo0 utilizada para eibir ou imprimir a hora
do sistema em um relat+rio ou na tela. T9'.67 est/ relacionada a ).C3ND)670 (ue
retorna a (uantidade de se"undos decorridos desde a meiaTnoite. ).C3ND)67
"eralmente utilizada em lu"ar de T9'.67 para c/lculos sobre o tempo.
.emplos
.stes eemplos mostram a funo T9'.67 utilizada em con&unto com )E-)T867
para etrair a hora0 os minutos e os se"undosM
cTime := TIME() // Resultado: 10:37:17
cHora := SUBSTR(cTime, 1, 2) // Resultado: 10
cMinutos := SUBSTR(cTime, 4, 2) // Resultado: 37
cSegundos := SUBSTR(cTime, 7, 2) // Resultado: 17
)intae
^.A8 6 L dData K 7 TTK nAno
ParCmetros
Ar"umento Tipo Descrio
dData Data LdDataK o valor data a ser convertido.
8etorno
Tipo Descrio
Numrico
^.A867 retorna o ano do valor data especificado0 inclusive d$"itos
indicativos de sculo0 na forma de um valor numrico de (uatro d$"itos. 3
valor retornado nao influenciado pelo formato de DAT. ou C.NTE8^
corrente. A especificaao de uma data nula 6CT3D6ff77 retorna zero.
Descrio
^.A867 uma funao de conversao de datas utilizada para converter um valor data para
um valor numrico indicativo do ano. Pode ser utilizada em c/lculos de0 por eemplo0
relat+rios peri+dicos0 ou para ,ormataao de eibioes de data.
^.A867 membro de um "rupo de funoes (ue retornam componentes de um valor
data na forma de valores numricos. .ste "rupo inclui DA^67 e '3NT#670 (ue
retornam valores de dia e mas na forma de valores numricos.
.emplos
3s eemplos a se"uir ilustram ^.A867 usando a data do
sistemaM
conout( DATE() ) // Resulta: 09/01/90
conout( YEAR(DATE()) ) // Resulta: 1990
conout( YEAR(DATE()) + 11 ) // Resulta: 2001
.ste eemplo cria uma funao definida pelo usu/rio usando
^.A867 para formatar um valor data na forma M mas dia0 anoM
conout( U_Mdy(DATE()) ) // Resulta: September 20,
1990
USER FUNCTION Mdy( dDate )
Return CMONTH(dDate) + " " + LTRIM(STR(DAY(dDate)));
+ "," + STR(YEAR(dDate))
FU'LVES %E TRATAME'TO %E MATRIR
)intae
AADD 6 L aDestino K 0 : ep1alor ; 7 TTK 1alor
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP X o arraP ao (ual o novo elemento ser/ adicionado.
ep1alor 6Zual(uer7
X uma epresso v/lida (ue ser/ o valor do
novo elemento.
8etorno
Tipo Descrio
6Zual(uer7
Avalia ep1alor e retorna seu 1alor. )e ep1alor no for especificado0
AADD67 retorna N9L.
Descrio
AADD67 uma funo de tratamento de vetor (ue adiciona um elemento ao vetor. Ao
elemento de vetor recm criado atribuido o valor especificado por Lep1alorK.
AADD67 utilizado para aumentar o tamanho de um vetor dinamicamente. X %til na
construo de filas ou listas dinCmicas.
AADD67 semelhante i funo A)9\.670 mas adiciona apenas um elemento por vez[
A)9\.67 pode aumentar ou diminuir um vetor a um tamanho especificado. AADD670
porm0 possui a vanta"em de poder atribuir um valor ao novo elemento0 en(uanto (ue
A)9\.67 nao pode. AADD67 pode tambm parecer ser i"ual a A9N)670 mas isso nao
verdadeM A9N)67 move elementos dentro de um vetor0 mas nao modifica o tamanho do
vetor.
OBSERVAL/O 2 Caso Lep1alorK se&a um outro vetor0 o novo elemento no vetor
destino conter/ uma referancia ao vetor especificado por Lep1alorK.
3s eemplos a se"uir demonstram os efeitos de chamadas m%ltiplas da funo AA%%67
para um vetorM
aArray := {} // Resulta: aArray e um vetor vazio
AADD(aArray, 5) // Resulta: aArray e { 5 }
AADD(aArray, 10) // Resulta: aArray e { 5, 10 }
AADD(aArray, { 12, 10 }) // Resulta: aArray e { 5, 10, { 12,
10 } }
)intae
ACL3N. 6 L a,onte K 7 TTK aDuplica
ParCmetros
Ar"umento Tipo Descrio
a,onte ArraP La,onteK o vetor a ser duplicado.
8etorno
Tipo Descrio
ArraP ArraP idantico ao a,onte 0 porem sem nenhuma referancia ao mesmo.
Descrio
ACL3N.67 uma funao de vetor (ue cria uma duplicata completa do vetor de
La,onteK. Caso La,onteK contenha subTvetores0 ACL3N.67 cria subTvetores
correspondentes e os preenche com c+pias dos valores contidos nos subTvetores de
La,onteK.
Ao i"ualarmos dois arraPs0 eles ficam associados por referancia0 utilizando
aClone67 no eiste referancia. ACL3N.67 semelhante a AC3P^670 porm AC3P^67
nao duplica vetores aninhados.
)intae
AC3P^ 6 L a,onte K 0 L aDestino K 0 : n9nicio ; 0 : nCont ; 0 : nPosDestino ; 7 TTK
aDestino
ParCmetros
Ar"umento Tipo Descrio
a,onte ArraP La,onteK o vetor de onde serao copiados os elementos.
aDestino ArraP
LaDestinoK o vetor para onde serao copiados os
elementos.
n9nicio Numrico
Ln9nicioK a posiao do elemento inicial no vetor
La,onteK. )e nao for especificado0 o valor assumido um
6F@7.
nCont Numrico
LnContK a (uantidade de elementos a serem copiados do
vetor La,onteK a partir da posiao Ln9nicioK. Caso
LnContK nao se&a especificado0 todos os elementos em
La,onteK (ue comeam com o elemento inicial sao
copiados.
nPosDestino Numrico
LnPosDestinoK a posiao do elemento inicial no vetor
LaDestinoK (ue receber/ os elementos de La,onteK. )e
nao for especificado0 o valor padrao um 6F@7.
8etorno
Tipo Descrio
ArraP AC3P^67 retorna uma referancia ao vetor destino0 LaDestinoK.
Descrio
AC3P^67 uma funao de tratamento de vetor (ue copia elementos do vetor La,onteK
para o vetor LaDestinoK. 3 vetor LaDestinoK &/ deve eistir e ser "rande o suficiente
para conter os elementos copiados. Caso o vetor La,onteK tenha mais elementos0 al"uns
elementos nao serao copiados.
AC3P^67 copia valores de todos os tipos de dados0 inclusive N9L e blocos de c+di"o.
)e um elemento do vetor La,onteK for um subTvetor0 o elemento correspondente no
vetor LaDestinoK conter/ uma referancia ao subTvetor. Conse(uentemente0 AC3P^67
nao cria duplicatas completas de vetores multiTdimensionais. Para fazer isto0 use a
funao ACL3N.67.
.emplos
.ste eemplo cria dois vetores0 cada um deles preenchido com um valor. 3s dois
primeiros elementos do vetor fonte sao entao copiados para o vetor destinoM
LOCAL nCount := 2, nStart := 1, aOne, aTwo
aOne := { 1, 1, 1 }
aTwo := { 2, 2, 2 }
ACOPY(aOne, aTwo, nStart, aCont) // Resulta: aTwo e agora { 1, 1,
2 }
)intae
AD.L 6 L a,onte K 0 L nPosicao K 7 TTK a,onte
ParCmetros
Ar"umento Tipo Descrio
a,onte ArraP
La,onteK o vetor (ue contm um elemento a ser
eliminado.
nPosicao Numrico
LnPosiaoK a posiao do elemento de vetor 0 a partir do
primeiro 0 (ue ser/ eliminado.
8etorno
Tipo Descrio
ArraP AD.L67 retorna uma referancia ao vetor destino0 La,onteK.
Descrio
AD.L67 uma funao de tratamento de vetor (ue elimina um elemento de um vetor. 3
conte%do do elemento de vetor especificado perdido0 e todos os elementos a partir
da(uela posiao at o final do elemento sobem uma posiao. 3 %ltimo elemento no
vetor tornaTse N9L.
A19)3 M .m Advpl0 vetores multiTdimensionais sao implementados atravs do
aninhamento de vetores dentro de outros vetores. Caso o vetor La,onteK se&a um vetor
multiTdimensional0 AD.L67 eliminar/ todo o subTvetor especificado por LnPosiaoK0
forando La,onteK a nao mais ter dimensoes re"ulares.
.ste eemplo cria um vetor constante de tras elementos0 e depois
elimina o se"undo elemento. 3 terceiro elemento sobe uma posiao0 e ao
novo terceiro elemento atribuido N9LM
LOCAL aArray
aArray := { 1, 2, 3 } // Resulta: aArray e agora { 1, 2, 3 }
ADEL(aArray, 2) // Resulta: aArray e agora { 1, 3,
NIL }
)intae
A.1AL 6 L a1etor K 0 L b-loco K 0 : n9nicio ; 0 : nCont ; 7 TTK a1etor
ParCmetros
Ar"umento Tipo Descrio
a1etor ArraP La1etorK o vetor a ser varrido.
b-loco CodeT-loc2
Lb-locoK um bloco de c+di"o a ser eecutado para
cada elemento encontrado.
n9nicio Numrico
Ln9nicioK o elemento inicial. Caso nao se&a
especificado0 o padrao assumido o elemento um.
nCont Numrico
LnContK a (uantidade de elementos a serem
processados a partir de Ln9n$cioK. )e nao for
especificado0 o padrao todos os elementos no vetor.
8etorno
Tipo Descrio
ArraP A.1AL67 retorna uma referancia a La1etorK.
Descrio
A.1AL67 uma funao de tratamento de vetor (ue avalia um bloco de c+di"o uma vez
para cada elemento de um vetor0 passando o valor do elemento como um parCmetro de
bloco. 3 valor de retorno do bloco i"norado. Todos os elementos no La1etorK sao
processados a nao ser (ue o ar"umento Ln9nicioK ou LnContK se&a especificado.
A.1AL67 nao faz suposioes sobre o conte%do dos elementos de vetor (ue ele est/
passando para o bloco. X assumido (ue o bloco sabe (ual o tipo de dados haver/ em
cada elemento.
A.1AL67 semelhante a D-.1AL670 (ue aplica um bloco para cada re"istro de um
ar(uivo de banco de dados. Da mesma forma (ue D-.1AL670 A.1AL67 pode ser
utilizado como base para a construao de comandos de interaao tanto para estruturas de
vetor compleas como simples.
Consulte a seao -locos de C+di"o no na seo A Lin"ua"em Advpl para maiores
informaYes sobre CodeT-loc2s.
.emplos
Local aArray := { "Teste" , 123 }
Local bBlock := { |x,y| conout(valtype(x)) , conout(y) }
aEval(aArray,bBlock)
No eemplo acima 0 criamos um arraP com A elementos M 3 primeiro um Caracter 0 e o
se"undo um n%mero [ e criamos um codeTbloc2 (ue receber/ em 6 primeiro
parametro fornecido pela funo a.val7 cada elemento do arraP 0 e P 6 se"undo
parametro fornecido pela a.val 7 o n%mero do elemento do arraP (ue est/ sendo
processado nesta eecuo.
3 resultado de tela no console do Protheus )erver dever/ ser M
Teste DD Conteudo do primeiro elemento
C DD Tipo do conteudo
@ DD Numero do elemento processado
@AG DD Conteudo do se"undo elemento
N DD Tipo do )e"undo .lemento
A DD Numero do elemento processado
Caso o arraP passado como parCmetro se&a um arraP multiTDimensional 0 sero passados
como parCmetros os arraPs de primeiro nivel para o codeT-Loc2.
1e&amos uma aplicao mais complea M Em arraP multiTdimensional temos Acolunas 0
uma de c+di"o 6strin"7 e uma de valor 6 numrica 7 0 e se&a necess/rio realizar um
c/lculo de totalizao da coluna numrica M
aItens := {}
aadd(aItens,{"Branco",10})
aadd(aItens,{"Preto",15})
aadd(aItens,{"Cinza",12})
DD Podemos realizar a totalizao pelo metodo tradicional M
nTotal := 0
For nI := 1 to len(aItens)
nTotal := nTotal + aItens[nI][2]
Next
conout(nTotal) // 37
DD 3u utilizando a ,unco a.val M
nTotal := 0
aeval(aItens , {|x| nTotal += x[2] } )
conout(nTotal)
)intae
A,9LL 6 L aDestino K 0 L 1alor.p K 0 : n9nicio ; 0 : nCont ; 7 TTK aDestino
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP LaDestinoK o vetor a ser preenchido.
1alor.p 6Zual(uer7
L1alor.pK o valor a ser alocado em cada elemento de
vetor. Pode ser uma epressao de (ual(uer tipo de dados
v/lido.
n9nicio Numrico
Ln9nicioK a posiao do primeiro elemento a ser
preenchido. Caso este ar"umento se&a omitido0 o valor
padrao um.
nCont Numrico
LnContK a (uantidade de elementos a serem
preenchidos iniciando com o elemento Ln9nicioK. )e este
ar"umento for omitido0 os elementos sao preenchidos a
partir da posiao do elemento inicial at o final do vetor.
8etorno
Tipo Descrio
ArraP A,9LL67 retorna uma referancia ao LaDestinoK.
Descrio
A,9LL67 uma funao de vetor (ue preenche um vetor especificado com um %nico
valor de (ual(uer tipo de dados 6inclusive vetores0 blocos de c+di"o ou N9L7 atribuindo
L1alor.pK a cada elemento de vetor na faia especificada.
AT.Ngh3 M A,9LL67 nao pode ser utilizado para preencher vetores multiT
dimensionais. .ste tipo de vetores em Clipper sao implementados aninhandoTse vetores
dentro de outros vetores. A utilizaao de A,9LL67 com vetores multiTdimensionais
sobreTescrever/ vetores para as outras dimensoes do vetor.
.emplos
Neste eemplo0 criado um vetor com tras elementos. 3 vetor depois preenchido com
falso 6.,.7. Ao final0 aos elementos nas posioes dois e tras atribuido o novo valos de
verdadeiro 6.T.7M
LOCAL aLogic[3] // Resulta: aLogic e { NIL, NIL, NIL }
AFILL(aLogic, .F.) // Resulta: aLogic e { .F., .F., .F. }
AFILL(aLogic, .T., 2, 2) // Resulta: aLogic e { .F., .T., .T. }
)intae
A9N) 6 L aDestino K 0 L cnPos K 7 TTK aDestino
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP X o arraP de onde ser/ inserido um item N9L.
nPos Numrico
X a posio0 a partir da @0 na (ual ser/ inserido um
elemento N9L
8etorno
Tipo Descrio
ArraP 8etorna uma referancia ao vetor aDestino
Descrio
A9N)67 uma funo de vetor (ue insere um novo elemento em um vetor especificado.
3 elemento recm inserido N9L at (ue um novo valor se&a atribuido a ele. Ap+s a
insero0 o %ltimo elemento no vetor descartado0 e todos os elementos depois do novo
elemento descem uma posio.
q A19)3 M A9N)67 deve ser utilizado com cuidado (uando se tratar de vetores multiT
dimensionais. 1etores multiTdimensionais em Advpl sao implementados atravs do
aninhamento de vetores dentro de outros vetores. Etilizar A9N)67 com um vetor multiT
dimensional descarta o %ltimo subTvetor no vetor destino especificado0 o (ue causa a
perda de uma ou mais dimensoes. Para inserir uma nova dimensao em um vetor0
primeiramente adicione um novo elemento ao final do vetor utilizando AADD67 ou
A)9\.67 antes de usar A9N)67.
.emplos
.ste eemplo demonstra o efeito da utilizao de A9N)67 em um vetorM
LOCAL aArray
aArray := { 1, 2, 3 } // Resulta: aArray e agora { 1, 2, 3 }
AINS(aArray, 2) // Resulta: aArray e agora { 1, NIL,
2 }
)intae
A88A^ 6 L n.lementos0... K 7 TTK a1etor
ParCmetros
Ar"umento Tipo Descrio
n.lementos0... Numrico
Ln.lementosK a (uantidade de elementos na dimensao
especificada.3s vetores em Advpl podem ter um n%mero
ilimitado de dimensoes.
8etorno
Tipo Descrio
ArraP A88A^67 retorna um vetor de dimensoes especificadas.
Descrio
A88A^67 uma funao de tratamento de vetor (ue retorna um vetor nao inicializado
com a (uantidade especificada de elementos e dimensoes. )e for especificado mais de
um ar"umento Ln.lementosK0 criado um vetor multiTdimensional ou aninhado0 sendo
(ue a (uantidade de dimensoes i"ual i (uantidade de ar"umentos Ln.lementosK
especificada.
No Advpl0 h/ v/rias formas de se criar um vetor. 1oca pode declarar um vetor
utilizando L3CAL ou )TAT9C[ voca pode criar um vetor utilizando P891AT. ou
PE-L9C[ voca pode atribuir um vetor literal a uma vari/vel eistente[ ou voca pode
usar a funao A88A^67. A88A^67 tem a vanta"em de possibilitar a voca a criaao de
vetores dentro de epressoes ou blocos de c+di"o.
.emplos
.ste eemplo cria um vetor unidimensional de cinco elementos utilizando a funao
A88A^670 e depois eibe a aao e(uivalente atribuindo um vetor literal de valores N9LM
aArray := ARRAY(5)
aArray := { NIL, NIL, NIL, NIL, NIL }
.ste eemplo ilustra tras declaraoes diferentes (ue criam o mesmo vetor multiT
dimensionalM
aArray := ARRAY(3, 2)
aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} }
aArray := { ARRAY(2), ARRAY(2), ARRAY(2) }
)intae
A)CAN 6 L aDestino K 0 L Procura.p K 0 : n9nicio ; 0 : nCont ; 7 TTK nParou.m
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP LaDestinoK o vetor a ser varrido.
Procura.p 6Zual(uer7
LProcura.pK pode ser um valor simples a ser procurado0
ou um bloco de c+di"o. Caso LProcura.pK se&a um valor
simples0 este poder/ ser do tipo numrico0 l+"ico0 data0 ou
caractere.
n9nicio Numrico Ln9nicioK o elemento a partir do (ual ter/ in$cio a
pes(uisa. )e este ar"umento nao for especificado0 a
posiao inicial padrao um.
nCont Numrico
LnContK a (uantidade de elementos (ue serao varridos a
partir da posiao inicial. Caso este ar"umento nao se&a
especificado0 todos os elementos0 desde o elemento inicial
at o final do vetor0 serao varridos.
8etorno
Tipo Descrio
Numrico
A)CAN67 retorna um valor numrico (ue representa a posiao ocupada no
vetor pelo %ltimo elemento varrido. )e LProcura.pK for um valor
simples0 A)CAN67 retorna a posiao do primeiro elemento (ue
corresponder ao valor procurado0 ou zero caso nao ha&a correspondancia.
)e LProcura.pK for um bloco de c+di"o0 A)CAN67 retorna a posiao do
elemento onde o bloco retornou verdadeiro 6.T.7.
Descrio
A)CAN67 uma funao de tratamento de vetor (ue varre um vetor procurando um valor
especificado e opera da mesma forma (ue o comando )..b (uando pes(uisa um valor
simples. 3 valor LProcura.pK comparado ao elemento de vetor destino (ue comea
com o caractere mais i es(uerda no elemento destino e prosse"ue at (ue nao ha&a mais
nenhum caractere em LProcura.pK. Caso nao ha&a correspondancia0 A)CAN67 vai
para o pr+imo elemento no vetor.
Como A)CAN67 utiliza o operador 6N7 para comparaoes0 ele sens$vel ao status de
.]ACT. Caso .]ACT este&a 3N0 o elemento de vetor destino deve ser eatamente
i"ual ao resultado de LProcura.pK para (ue ha&a correspondancia.
)e o ar"umento de LProcura.pK se&a um bloco de c+di"o0 A)CAN67 varre o vetor
LaDestinoK eecutando o bloco para cada elemento acessado. r medida em (ue cada
elemento encontrado0 A)CAN67 passa o valor do elemento como um ar"umento para
o bloco de c+di"o0 e depois eecuta um .1AL67 no bloco. A operaao de pes(uisa p/ra
(uando o bloco de c+di"o retorna verdadeiro 6.T.70 ou (uando A)CAN67 atin"e o %ltimo
elemento no vetor.
.emplos
3 eemplo a se"uir demonstra a pes(uisa em um vetor de tras elementos utilizando
valores simples e um bloco de c+di"o como critrios de pes(uisa. 3s critrios do bloco
de c+di"o ilustram como eecutar uma pes(uisa (ue nao faz diferenciaao entre
mai%sculas e min%sculasM
aArray := { "Tom", "Mary", "Sue" }
? ASCAN(aArray, "Mary") // Resulta: 2
? ASCAN(aArray, "mary") // Resulta: 0
? ASCAN(aArray, { |x| UPPER(x) == "MARY" }) // Resulta: 2
3 .emplo abaio demonstra como continuar a pes(uisa dos m%ltiplos tipos de um
ar"umento de pes(uisa ap+s ter sido encontrada uma correspondanciaM
LOCAL aArray := { "Tom", "Mary", "Sue", "Mary" }, nStart := 1
// Pegar ultima posicao de elemento de vetor
nAtEnd := LEN(myVetor)
While (nPos := ASCAN(aArray, "Mary", nStart)) > 0
? nPos, aArray[nPos]
// Pegar nova posicao inicial e testar condicao de limite
If (nStart := ++nPos) > nAtEnd
EXIT
EndIf
EndDo
)intae
A)CAN 6 L aDestino K 0 L Procura.p K 0 : n9nicio ; 0 : nCont ; 7 TTK nParou.m
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP LaDestinoK o vetor a ser varrido.
Procura.p 6Zual(uer7
LProcura.pK pode ser um valor simples a ser procurado0
ou um bloco de c+di"o. Caso LProcura.pK se&a um valor
simples0 este poder/ ser do tipo numrico0 l+"ico0 data0 ou
caractere.
n9nicio Numrico
Ln9nicioK o elemento a partir do (ual ter/ in$cio a
pes(uisa. )e este ar"umento nao for especificado0 a
posiao inicial padrao um.
nCont Numrico
LnContK a (uantidade de elementos (ue serao varridos a
partir da posiao inicial. Caso este ar"umento nao se&a
especificado0 todos os elementos0 desde o elemento inicial
at o final do vetor0 serao varridos.
8etorno
Tipo Descrio
Numrico
A)CAN67 retorna um valor numrico (ue representa a posiao ocupada no
vetor pelo %ltimo elemento varrido. )e LProcura.pK for um valor
simples0 A)CAN67 retorna a posiao do primeiro elemento (ue
corresponder ao valor procurado0 ou zero caso nao ha&a correspondancia.
)e LProcura.pK for um bloco de c+di"o0 A)CAN67 retorna a posiao do
elemento onde o bloco retornou verdadeiro 6.T.7.
Descrio
A)CAN67 uma funao de tratamento de vetor (ue varre um vetor procurando um valor
especificado e opera da mesma forma (ue o comando )..b (uando pes(uisa um valor
simples. 3 valor LProcura.pK comparado ao elemento de vetor destino (ue comea
com o caractere mais i es(uerda no elemento destino e prosse"ue at (ue nao ha&a mais
nenhum caractere em LProcura.pK. Caso nao ha&a correspondancia0 A)CAN67 vai
para o pr+imo elemento no vetor.
Como A)CAN67 utiliza o operador 6N7 para comparaoes0 ele sens$vel ao status de
.]ACT. Caso .]ACT este&a 3N0 o elemento de vetor destino deve ser eatamente
i"ual ao resultado de LProcura.pK para (ue ha&a correspondancia.
)e o ar"umento de LProcura.pK se&a um bloco de c+di"o0 A)CAN67 varre o vetor
LaDestinoK eecutando o bloco para cada elemento acessado. r medida em (ue cada
elemento encontrado0 A)CAN67 passa o valor do elemento como um ar"umento para
o bloco de c+di"o0 e depois eecuta um .1AL67 no bloco. A operaao de pes(uisa p/ra
(uando o bloco de c+di"o retorna verdadeiro 6.T.70 ou (uando A)CAN67 atin"e o %ltimo
elemento no vetor.
.emplos
3 eemplo a se"uir demonstra a pes(uisa em um vetor de tras elementos utilizando
valores simples e um bloco de c+di"o como critrios de pes(uisa. 3s critrios do bloco
de c+di"o ilustram como eecutar uma pes(uisa (ue nao faz diferenciaao entre
mai%sculas e min%sculasM
aArray := { "Tom", "Mary", "Sue" }
? ASCAN(aArray, "Mary") // Resulta: 2
? ASCAN(aArray, "mary") // Resulta: 0
? ASCAN(aArray, { |x| UPPER(x) == "MARY" }) // Resulta: 2
3 .emplo abaio demonstra como continuar a pes(uisa dos m%ltiplos tipos de um
ar"umento de pes(uisa ap+s ter sido encontrada uma correspondanciaM
LOCAL aArray := { "Tom", "Mary", "Sue", "Mary" }, nStart := 1
// Pegar ultima posicao de elemento de vetor
nAtEnd := LEN(myVetor)
While (nPos := ASCAN(aArray, "Mary", nStart)) > 0
? nPos, aArray[nPos]
// Pegar nova posicao inicial e testar condicao de limite
If (nStart := ++nPos) > nAtEnd
EXIT
EndIf
EndDo
ParCmetros
Ar"umento Tipo Descrio
destino 6Zual(uer7
8epresenta o ob&eto a ser varrido pela funo0 pode ser
atribuido ao parametro um arraP um 3b&eto.
procura 6Zual(uer7
8epresenta o valor (ue ser/ pes(uisado0 podendo ser um
bloco de c+di"o.
n9nicio Numrico
8epresenta o elemento a partir do (ual ter/ inicio a
pes(uisa0 (uando este ar"umento nao for informado o
valor default ser/ @.
nCont Numrico
8epresenta a (uantidade de elementos (ue sero
pes(uisados a partir da posio inicial0 (uando este
ar"umento nao for informado todos elementos do arraP
sero pes(uisados
8etorno
Tipo Descrio
Numrico
8etorna o valor numrico6indice7 (ue representa a posio ocupada no
vetor pelo ultimo elemento pes(uisado0 no caso (uando a o elemnto foi
encontrado.
Descrio
A funo A)CAN]67s uma funao de tratamento de vetor. A)CAN] tem como
ob&etivo varrer um vetor
procurando um valor especificado e opera de forma parecida com a funo A)CAN.
A diferena fundamental da funao A)CAN] (ue a funo recebe um se"undo
parametro em seu codebloc2 representando o indice do arraP.
.emplo.M
"Pos 2= aSca"M5 ARRAW9 X YM9WY MZC[ == c'o,e 0OR0 -\=CDD]6
Nesta linha de eemplo0 note a incluso no codebloc2 do ^0 onde a funo ir/ terminar
sua eecuo em G condioesM
@7 At encontrar o elemento no ARRAW com a ocorrancia c'o,e9 retornando a
posio desse elemento.
A7 .ssa novidade0 A)CAN] ir/ verificar o ArraP at a posio @FF.
G73 elemento cNome nao foi encontrado no A88A^ e a condio de ^ at @FF nao
satizfaz0 pois o arraP menor do (ue @FF posioesm
3bs.M Como A)CAN67 (ue utiliza o operador 6N7 para comparaoes0 a funao
A)CAN]67 tambm case sensitive0 no caso os elementos procurados devem ser
eatamente i"ual.
)intae
A)9\. 6 L aDestino K 0 L cnTamanho K 7 TTK A)9\.67
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP LaDestinoK o vetor a ser aumentado ou diminuido.
nTamanho Numrico LnTamanhoK o novo tamanho do vetor.
8etorno
Tipo Descrio
ArraP 8etorna uma referancia ao arraP aDestino.
Descrio
A)9\.67 uma funo de tratamento de vetor (ue muda o valor real do vetor
LaDestinoK. 3 vetor diminuido ou aumentado para corresponder ao tamanho
especificado. Caso o vetor se&a diminuido0 os elementos no final do vetor sao perdidos.
)e o vetor for aumentado0 novos elementos sao adicionados ao final do vetor e a eles
atribuido N9L.
A)9\.67 semelhante a AADD670 o (ual adiciona somente um novo elemento ao final
de um vetor e opcionalmente atribui um novo valor ao mesmo tempo. 3bserve (ue
A)9\.67 diferente de A9N)67 e AD.L670 os (uais na realidade nao modificam o
tamanho do vetor.
.emplos
.stes eemplos demonstram a adio de novos elementos e a eliminao de elementos
eistentesM
aArray := { 1 } // Resulta: aArray e { 1 }
ASIZE(aArray, 3) // Resulta: aArray e { 1, NIL, NIL }
ASIZE(aArray, 1) // Resulta: aArray e { 1 }
)intae
A)38T 6 L aDestino K 0 : n9nicio ; 0 : nCont ; 0 : b3rdem ; 7 TTK aDestino
ParCmetros
Ar"umento Tipo Descrio
aDestino ArraP
LaDestinoK o vetor cu&os elementos serao colocados em
ordem.
n9nicio Numrico
Ln9nicioK o primeiro dos elementos (ue serao
colocados em ordem. Caso nao se&a especificada0 a
posiao inicial assumida um.
nCont Numrico LnContK a (uantidade de elementos (ue serao
colocados em ordem. )e nao for especificada0 todos os
elementos no vetor (ue comeam com o elemento inicial
sao ordenados.
b3rdem CodeT-loc2
Lb3rdemK um bloco de c+di"o opcional utilizado para
determinar (ual a ordem (ue ser/ se"uida. Caso nao se&a
especificada0 a ordem padrao ascendente. VVV Ateno M
Caso utilizada a funo a)ort para um arraP aninhado
6miltiTdimensional70 o parCmetro b3rdem deve ser
passado [ caso contr/rio o arraP no ser/ ordenado.
8etorno
Tipo Descrio
ArraP A)38T67 retorna uma referancia ao vetor LaDestinoK.
Descrio
A)38T67 uma funao de vetor (ue coloca em ordem todo ou parte de um vetor (ue
contm elementos de um %nico tipo de dados. 3s tipos de dados (ue podem ser
ordenados incluem caractere0 data0 l+"ico e numrico.
)e o ar"umento Lb3rdemK nao for especificado0 a ordem padrao ascendente.
.lementos com valores baios sao colocados no in$cio do vetor 6primeiro elemento70
en(uanto elementos com valores altos sao colocados no final do vetor 6%ltimo
elemento7.
Caso o ar"umento de bloco Lb3rdemK se&a especificado0 ele utilizado para determinar
a ordem em (ue os elementos serao colocados. Cada vez (ue o bloco avaliado0 dois
elementos do vetor destino sao passados como parCmetros de bloco. 3 bloco deve
retornar verdadeiro 6.T.7 se os elementos estiverem ordenados. 9sto pode ser usado para
criar uma ordem descendente ou de dicion/rio. 1e&a os eemplos abaio.
Zuando ordenadas0 as cadeias de caracteres sao colocadas na se(uancia A)C99[ valores
l+"icos sao ordenados com falso 6.,.7 sendo considerado o valor menor[ valores data sao
ordenados cronolo"icamente[ e numricos sao ordenados por ma"nitude.
3-).81Ah3 M )endo os vetores multiTdimensionais em Clipper implementados
atravs do aninhamento de subTvetores dentro de outros vetores0 A)38T67 nao ordena
diretamente vetores deste tipo. Para ordenar um vetor aninhado0 voca deve fornecer um
bloco de c+di"o (ue dar/ o tratamento ade(uado aos subTvetores.
.emplos
No .emplo abaio 0 ordenamos um arraP em ordem crescenter 0 depois em ordem
decrescente atravs de um codeTbloc2 .
Local aArray := { 3, 5, 1, 2, 4 }
ASORT(aArray) // Resultado: { 1, 2, 3, 4, 5 }
ASORT(aArray,,,{ |x, y| x > y }) // Resultado: { 5, 4, 3, 2, 1 }
No .emplo abaio 0 utilizamos na epresso de ordenao a funo upper67 0 para
ordenar o arraP em ordem alfabrica independentemente da informao estar em letras
mai%sculas eDou minusculas.
aArray := { "Fred", Kate", "ALVIN", "friend" }
ASORT(aArray,,, { |x, y| UPPER(x) < UPPER(y) })
No eemplo abaio 0 montamos um codeTbloc2 para ordenao de um arraP multiT
dimensional 0 para ordenar o arraP em ordem crescente do se"undo elemento da
dimenso.
aKids := { {"Mary", 14}, {"Joe", 23},{"Art", 16} }
aSortKids := ASORT(aKids,,, { |x, y| x[2] < y[2] })
// Resultado : { {"Mary", 14}, {"Art", 16}, {"Joe",23} }
)intae
ATA9L 6 L aArraP K 7 TTK 8et
ParCmetros
Ar"umento Tipo Descrio
aArraP ArraP 8epresenta o arraP a ser informado para a funo.
8etorno
Tipo Descrio
6Zual(uer7 8etorna / %ltima ocorrencia ou o %ltimo elemento do arraP.
Descrio
A funo tem o ob&etivo de retornar a %ltima ocorrancia do arraP informado pelo
ar"umento LaArraPK0 caso o ar"umento ArraP passado este&a vazio a funo ir/ retornar
N9L.
)e for informado um ar"umento (ue no for um ArraP para a funo0 isto ir/ causar um
um erro AD1PL.

.M
user function tstArraP67

Local aArraP MN I_ola_0 _ops_0 _o(_0 _aff_0 _ol&ha_O
Local c8et
c8et MN atail6aArraP7 DDretorna ol&ha

return c8et
FU'LVES TRATAME'TO MML
)intae
]mlChildCount 6 L oParent K 7 TTK nChild
ParCmetros
Ar"umento Tipo Descrio
oParent 3b&eto
9ndica o node ]'L no (ual ele ir/ fazer a conta"em dos
filhos.
8etorno
Tipo Descrio
Numrico 8etorna o numero de elementos encontrados.
Descrio
A funo tem o ob&etivo de retornar a (uantidade de n+s eistentes0 a partir de um nodo
pai informado como ar"umento.
A funo no faz essa conta"em recursivamente pela estrutura0 ou se&a0 ela nao varre a
estrutura entrando em todos su#'odos a partir do elemento passado como raiz para a
conta"em e sim apenas os filhos de primeiro n$vel.
.ssa funo util para manipularmos os ob&etos ]'L diretamente0 sem
necessariamente conhecermos o conte%do do ob&eto.
)intae
]mlChild. 6 L 3Parent K 0 L cProcura K 7 TTK retorno
ParCmetros
Ar"umento Tipo Descrio
3Parent 3b&eto
Nodo usado para indicar o inicio da procura do elemento
re(uerido.
cProcura Caracter 8epresenta o nome do elemento (ue dese&amos encontrar.
8etorno
Tipo Descrio
6Zual(uer7
Zuando a funao encontrar apenas um elemento ser/ retornado o ob&eto
node0 caso possua mais de um elemento do mesmo nome ir/ retornar um
arraP dos nodes0 caso contr/rio retorna N9L.
Descrio
A funo tem o ob&etivo de retornar um ou mais filhos da estrutura0 de acordo com o
nome do elemento procurado.
.specificando um elemento (ual(uer do ob&eto para a funo0 na (ual ser/ usado como
base para busca apenas em seu primeiro subTn$vel a funo ir/ retornar todos os
nodos filhos (ue encontar.
X %til (uando (uando (ueremos buscar por um elemento filho e eista mais de um
elemento do mesmo tipo.
)intae
]mlCloneNode 6 L oParent K 0 L cNe*Name K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
oParent 3b&eto 8epresenta o ob&eto node ]'L no (ual ser/ colando
cNe*Name Caracter 9ndica o nome no (ual ser/ atribuido o node clonado
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo tem o ob&etivo de criar um clone0 do n+ informado pelo parametro0
especificando um novo nome para o elemento0 de forma (ue a funo clona apenas o
node0 as propriedades no.
Zuando o nodo clonado esta com o mesmo nome de um eistente0 ento criado um
arraP automaticamente com os nodos.
.la pode ser utilizada para acrescentarmos dados em um modelo de ml &/ eistente.
)intae
]mlDelNode 6 L oParent K 0 L cNode K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
oParent 3b&eto 8epresenta o Node pai do elemento (ue ser/ removido.
cNode Caracter
8epresenta o 8eal name do elemento node (ue ser/
removido.
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo tem o ob&etivo de deletar um nodo de um ob&eto ml.
Para isto informamos passando por parametro um elemento do ob&eto (ue contm a
estrutura do ml6um nodo (ual(uer70 este nao precisa ser obri"at+riamente o root da
estrutura.
.m se"uida informamos o nome do nodo (ue dese&amos deletar0 pois a funo ir/
procurar recursivamente a partir do nodo informado0 o elemento (ue possu$ o nome do
nodo a ser deletado dentro da estrutura.
A mlDelNode ir/ deletar todos nodos (ue contenham o nome i"ual ao do nodo
informado para ser deletado a partir do nodo informado para pes(uisa.
A funo retorna true caso consi"a encontrar u, elemento e deletaTlo0 &a$se caso
contr/rio.
.emplos
Neste eemplo0 criamos uma strin" contendo o ml0 em se"uida parseamos ele0 e a"ora
vamos deletar um nodo do ob&eto retornado pela mlParser0 note (ue no eemplo passei
o nodo _LitensK_ como raiz da estrutura a ser pes(uisada e (ueremos deletar o nodo
_LitemK_0 (ue elemento de _LitensK_.
A funo mlDelNode tem como ob&etivo deletar todos os elementos _LitemK_ (ue
encontrar dentro da estrutura passada para inicio da pes(uisa.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObjXML()
Local cError := ""
Local cWarning := ""
Local oXml := NIL
//Gera o Objeto XML
oXml := XmlParser( GeraXML(), "_", @cError, @cWarning )

if !XmlDelNode( oScript:_PEDIDO:_ITENS, "_ITEM" )
conout("Nao foi possivel excluir")
EndIf
// Tranforma o Objeto XML em arquivo ou string
// Grava o arquivo em um diretrio \xml a partir do rootPath
SAVE oXml XMLFILE "\xml\teste.xml"
Return oXml
// funo para gerar uma string contendo um xml
Static Function GeraXML()
Local cScript := '<?xml version="1.0" encoding="UTF-8"?>'
cScript += "<pedido>"
cScript += " <Nome Cliente>Microsiga Software S/A</Nome
Cliente>"
cScript += " <Endereco>Av. Braz Leme</Endereco>"
cScript += " <Numero>1361</Numero>"
cScript += " <Data>22-03-2005</Data>"
cScript += " <Itens>"
cScript += " <Item>"
cScript += " <Produto>Prothues</Produto>"
cScript += " <Quantidade>1</Quantidade>"
cScript += " <Preco>100.00</Preco>"
cScript += " </Item>"
cScript += " <Item>"
cScript += " <Produto>ERP<Produto>"
cScript += " <Quantidade>0</Quantidade>"
cScript += " <Preco>0</Preco>"
cScript += " </Item>"
cScript += " </Itens>"
cScript += "</pedido>"
Return cScript
)intae
]ml5etChild 6 7 TTK Nil
8etorno
Tipo Descrio
6NEL37 Nil
Descrio
A funo tem o ob&etivo de retornar um elemento filho da estrutura.
.specificando um elemento (ual(uer do ob&eto para a funo0 na (ual ir/ usar como
base para retornar o nodo filho de n%mero indicado pelo se"undo parametro passado
para a funo.
X %til (uando (ueremos mudar o posicionamento do ob&eto0 para al"um nodo filho
do atual na estrutura do ob&eto ]'L.
No .emplo se"uinte usamos a funo para nos posicionar no nodo LitensK0 em se"uida
apa"amos todos os nodos filhos com a mlDelNode.
Esando o comando )A1. criamos um ar(uivo teste.ml ao final da eecuo do
pro"rama.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function ExeXML()
Local cError := ""
Local cWarning := ""
Local oScript
Local cFile := ""

//a partir do rootpath do ambiente
cFile := "\xml\pedido.xml"
//Gera o Objeto XML ref. ao script
oScript := XmlParser( GeraXML(), "_", @cError, @cWarning )

oScript := XmlGetchild( oScript:_PEDIDO ,
XmlChildCount( oScript:_PEDIDO ))
// Agora vou apagar um node
if !XmlDelNode( oScript , "_ITEM" )
conout("Nao foi possivel apagar o nodo")
EndIf
// Tranforma o Objeto XML em arquivo
SAVE oScript XMLFILE "\xml\teste.xml"
Return oScript
Static Function GeraXML()
// Script XML a gerar objeto
Local cScript := '<?xml version="1.0" encoding="UTF-8"?>'
cScript += "<pedido>"
cScript += " <Nome Cliente>Microsiga Software S/A</Nome
Cliente>"
cScript += " <Endereco>Av. Braz Leme</Endereco>"
cScript += " <Numero>1361</Numero>"
cScript += " <Data>22-03-2005</Data>"
cScript += " <Itens>"
cScript += " <Item>"
cScript += " <Produto>Prothues</Produto>"
cScript += " <Quantidade>1</Quantidade>"
cScript += " <Preco>100.00</Preco>"
cScript += " </Item>"
cScript += " <Item>"
cScript += " <Produto>ERP<Produto>"
cScript += " <Quantidade>0</Quantidade>"
cScript += " <Preco>0</Preco>"
cScript += " </Item>"
cScript += " </Itens>"
cScript += "</pedido>"
Return cScript
)intae
]ml5etParent 6 L oNode K 7 TTK oParent
ParCmetros
Ar"umento Tipo Descrio
oNode 3b&eto
representa o node no (ual ser/ usado como referancia para o
retorno do node pai.
8etorno
Tipo Descrio
3b&eto Em ob&eto posicionado no node de acordo com o ar"umento passado.
Descrio
A funo tem o ob&etivo de retornar um nodo (ue representa o nodo _pai_
do elemento especificado por parametro.
X %til (uando (ueremos _subir_ na estrutura do ob&eto ]'L
)intae
]mlNe*Node 6 L oParent K 0 L c.lementName K 0 L c8ealName K 0 L cTPpe K 7 TTK Nil
ParCmetros
Ar"umento Tipo Descrio
oParent 3b&eto 9ndica o local onde ser/ inserido o novo node ]'L.
c.lementName Caracter X o nome do elemento Node no ]'L
c8ealName Caracter X o nome 8eal do Node ]'L
cTPpe Caracter 8epresenta o tipo de node ]'L (ue ser/ criado
8etorno
Tipo Descrio
3b&eto Nil
Descrio
A funo tem o ob&etivo de criar um novo nodo a partir de um ponto (ual(uer no ml.
Para isto necess/rio informar em (ual ponto do ob&eto ml6o ml parseado7 (ue
dese&amos adicionar um novo elemento.
3 novo nodo ser/ adicionado como filho do nodo passado por parametro0 onde sero
informados tambm os dados em relao a eleM
T8.ALNA'.
T.L.'.NTNA'.
TT^P.
6para entender melhor o funcionamento da funo ve&a o eemplo7
.emplos
Neste eemplo criamos o ml atravs da funo 5era]'L0 parseamos ele atravs da
mlParser retornando o ob&eto ml.
.m se"uida visualizamos o ob&eto retornado e usamos a funao mlChildCount
retornando a (uantidade de elementos no ob&eto contendo o ml. No Nosso eemplo a
funo ir/ retornar B elementos.
A"ora usaremos a mlNe*Node0 especificando (ue o novo nodo ser/ adicionado como
filho de _LpedidoK_0 lo"o depois acessamos o nodo e acrecentamos um teto para ele.
obsM o resultado disso no ml ser/ Leemplo@K.emplo 'icrosi"aLDeemplo@K
Ap+s a criao do nodo0 a mlChildCount ir/ retornar < indicando (ue o nodo foi
inserido.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObjXML()
Local cError := ""
Local cWarning := ""
Local cXML := ""
Local oXml := NIL
//Gera o Objeto XML
oXml := XmlParser( GeraXML(), "_", @cError, @cWarning )
//verifica quantos elementos possuo
conout( XmlChildCount( oScript:_PEDIDO ) )
// Criando um node
XmlNewNode(oScript:_PEDIDO, "Exemplo1", "Exemplo1", "NOD" )
//setando o CONTEUDO do meu nodo ""
oXml:_PEDIDO:Exemplo1:Text := "Exemplo Microsiga"
//verifica quantos elementos possuo depois da insero
conout( XmlChildCount( oScript:_PEDIDO ) )
// Tranforma o Objeto XML em string
SAVE oXml XMLSTRING cXML
Return oXml
// funo para gerar uma string contendo um xml
Static Function GeraXML()
Local cScript := '<?xml version="1.0" encoding="UTF-8"?>'
cScript += "<pedido>"
cScript += " <Nome Cliente>Microsiga Software S/A</Nome
Cliente>"
cScript += " <Endereco>Av. Braz Leme</Endereco>"
cScript += " <Numero>1361</Numero>"
cScript += " <Data>22-03-2005</Data>"
cScript += " <Itens>"
cScript += " <Item>"
cScript += " <Produto>Prothues</Produto>"
cScript += " <Quantidade>1</Quantidade>"
cScript += " <Preco>100.00</Preco>"
cScript += " </Item>"
cScript += " <Item>"
cScript += " <Produto>ERP<Produto>"
cScript += " <Quantidade>0</Quantidade>"
cScript += " <Preco>0</Preco>"
cScript += " </Item>"
cScript += " </Itens>"
cScript += "</pedido>"
Return cScript
)intae
]mlNodeAArr 6 L o8oot K 0 L cNodeAArraP K 7 TTK l8et
ParCmetros
Ar"umento Tipo Descrio
o8oot 3b&eto
.lemento Node no (ual ser/ usado como root para inicio
da busca do elemento a ser tranformado em arraP.
cNodeAArraP Caracter
8epresenta o elemento procurado para ser transformado em
arraP na estrutura.
8etorno
Tipo Descrio
L+"ico 8etorna true caso consi"a transformar em arraP0 false caso contr/rio.
Descrio
A funo tem o ob&etivo de transformar em arraP0 um ob&eto6node7 da estrutura do ml.
9nformando um elemento6node7 da estrutura ]'L atravs de parametro como raiz0 a
funo ir/ procurar pelo nome do nodo no (ual se dese&a transformar em arraP.
.emplos
No eemplo se"uinte demonstrado o simples uso da funo ]mlNodeAArr0 em (ue
pe"amos o ob&eto]ml e o tranformamos em um arraP.
.m se"uida "ravamos esse ob&eto em ar(uivo .ml propriamente dito.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function ExeXML()
Local cError := ""
Local cWarning := ""
Local oScript
//Gera o Objeto XML ref. ao script
oScript := XmlParser( GeraXML(), "_", @cError, @cWarning )

// Transforma node em uma array, no caso tranforma a estrutura
para array
XmlNode2Arr( oScript:_PEDIDO, "_PEDIDO" )
// Tranforma o Objeto XML em arquivo
// Grava o arquivo em um diretrio \xml a partir do rootPath
SAVE oScript XMLFILE "\xml\teste.xml"
Return .T.
Static Function GeraXML()
Local cScript := '<?xml version="1.0" encoding="UTF-8"?>'
cScript += "<pedido>"
cScript += " <Nome Cliente>Microsiga Software S/A</Nome
Cliente>"
cScript += " <Endereco>Av. Braz Leme</Endereco>"
cScript += " <Numero>1361</Numero>"
cScript += " <Data>22-03-2005</Data>"
cScript += " <Itens>"
cScript += " <Item>"
cScript += " <Produto>Prothues</Produto>"
cScript += " <Quantidade>1</Quantidade>"
cScript += " <Preco>100.00</Preco>"
cScript += " </Item>"
cScript += " <Item>"
cScript += " <Produto>ERP<Produto>"
cScript += " <Quantidade>0</Quantidade>"
cScript += " <Preco>0</Preco>"
cScript += " </Item>"
cScript += " </Itens>"
cScript += "</pedido>"
Return cScript
)intae
]mlParser 6 L c]ml K 0 L c8eplace K 0 L cc.rror K 0 L cc!arnin" K 7 TTK o]'L
ParCmetros
Ar"umento Tipo Descrio
c]ml Caracter X a cadeia de caracteres (ue contm o c+di"o ]'L.
c8eplace Caracter
8epresenta o valor a ser atribuido para os caracteres de
espao encontrados na especificao dos nodes ]'L.
c.rror Caracter
Caso ocorra al"um erro durante eecuo da funo0 a
vari/vel ser/ preenchida com a descrio do erro ocorrido.
c!arnin" Caracter
Caso ocorra al"um alerta de _*arnin"_ durante eecuo da
funo0 a vari/vel ser/ preenchida com a descrio do
_*arnin"_ ocorrido.
8etorno
Tipo Descrio
3b&eto 8epresenta um ob&eto com a estrutura de acordo com o ]'L.
Descrio
A funo tem o ob&etivo de retornar um ob&eto (ue possu$ uma estrutura referente
ao ml0 passado pelo parametro na funo.
A estrutura retornadaM
L3b&]'LK
LNode]'LK
TLArraPNodesK
T8.ALNA'.
TT.]T
TT^P.
3nde 8.ALNA'.0 T.]T e T^P. so propriedades (ue todos nodos possuem.
A propriedade ArraPNodes eistir/ (uando um nodo possuir mais de um filho0 do
,es,o tipo0 6demonstrado no eemplo7
.emplos
Neste eemplo criamos uma funo "era]ml (ue retorna uma strin" contento um
]'L.
Zuando passamos essa strin" para a ]mlParser0 a funo ir/ montar o ob&eto analisando
se a sintae e a ordem das ta"s est/ bem formada0 caso isso nao ocorra a funo ir/
retonar um *arnin" ou at um poss$vel erro0 nos parametros informados por referancia.
A estruturaM
o]mlM
pedidoM
TrealName
TtPpe
Ttet
nomekclienteM
TrealName
TtPpe
Ttet
endereoM
TrealName
TtPpe
Ttet
numeroM
TrealName
TtPpe
Ttet
dataM
TrealName
TtPpe
Ttet
itensM
Tite, \< 5arra-6
Tite,ZC[2
TrealName
TtPpe
Ttet
produtoM
(uantidadeM
precoM
Tite,ZJ[
TrealName
TtPpe
Ttet
produtoM
(uantidadeM
precoM
TrealName
TtPpe
Ttet

Caso isso nao ocorra a funo ir/ retornar o ob&eto contendo uma estrutura em forma de
arvore0 no caso a mesma estrutura do ml.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObjXML()
Local cError := ""
Local cWarning := ""
Local cXML := ""
Local oXml := NIL
//Gera o Objeto XML
oXml := XmlParser( GeraXML(), "_", @cError, @cWarning )
//acessando o CONTEUDO do meu nodo ""
oXml:_PEDIDO:_NOME_CLIENTE:Text := "Microsiga"
// Tranforma o Objeto XML em string
//SAVE oXml XMLSTRING cXML
Return oXml
// funo para gerar uma string contendo um xml
Static Function GeraXML()
Local c)cript MN _
)intae
]mlParser,ile 6 L c,ile K 0 L c8eplace K 0 L cc.rror K 0 L cc!arnin" K 7 TTK o]'L
ParCmetros
Ar"umento Tipo Descrio
c,ile Caracter
8epresenta o path de um ar(uivo .ml0 indicando o local
onde se encontra o ar(uivo no disco.
c8eplace Caracter
8epresenta o valor a ser atribuido para os caracteres de
espao encontrados na especificao dos nodes ]'L.
c.rror Caracter
c.rror Caracter Caso ocorra al"um erro durante eecuo
da funo0 a vari/vel ser/ preenchida com a descrio do
erro ocorrido.
c!arnin" Caracter
c!arnin" ArraP Caso ocorra al"um alerta de _*arnin"_
durante eecuo da funo0 a vari/vel ser/ preenchida
com a descrio do _*arnin"_ ocorrido.
8etorno
Tipo Descrio
3b&eto 8etorna um ob&eto ( contm uma estrutura de acordo com o ]'L.
Descrio
A funo tem o ob&etivo de retornar um ob&eto (ue possu$ uma estrutura referente ao
ar(uivo .ml0 passado pelo parametro na funo.
A estrutura retornadaM
L3b&]'LK
LNode]'LK
TLArraPNodesK
T8.ALNA'.
TT.]T
TT^P.
3nde 8.ALNA'.0 T.]T e T^P. so propriedades (ue todos nodos possuem.
A propriedade ArraPNodes eistir/ (uando um nodo possuir mais de um filho0 do
,es,o tipo0 6demonstrado no eemplo7
.emplos
Neste eemplo vamos usar a funo (ue tem o mesmo ob&etivo da ]mlParser0 a
diferena (ue esta la um ar(uivo do disco com a etenso .ml.
Zuando passamos a strin" informando o path do ar(uivo em disco0 devemos lembrar
(ue a procura do ar(uivo ser/ feita atravs do rootpath do Protheus.
lo"o ap+s a leitura do ar(uivo a funo ir/ montar o ob&eto analisando se a sintae e a
ordem das ta"s est/ bem formada0 caso isso no ocorra a funo ir/ retonar um *arnin"
ou at um poss$vel erro0 nos parametros informados por referancia.
Caso isso nao ocorra a funo ir/ retornar o ob&eto contendo uma estrutura em forma de
arvore0 no caso a mesma estrutura do ml.
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObjXML()
Local cError := ""
Local cWarning := ""
Local oXml := NIL
Local cFile := ""

//a partir do rootpath do ambiente
cFile := "\xml\pedido.xml"
//Gera o Objeto XML
oXml := XmlParserFile( cFile, "_", @cError, @cWarning )
//acessando o CONTEUDO do meu nodo ""
oXml:_PEDIDO:_NOME_CLIENTE:Text := "Microsiga"
Return oXml
I'FORMALVES A%ICIO'AIS
ARRE%O'%AME'TO
No Protheus0 pode haver diferena de arredondamento em al"umas operaYes
numricas. 9sso ocorre devido a diferenas no armazenamento de vari/veis numricas
nos diversos processadores. Diferena esta0 inclusive0 presente no Advpl0 mesmo antes
do sur"imento do Protheus.
Para evitar esses problemas de arredondamento0 utilize a funo _8ound_0 principalmente
antes de realizar uma comparao0 e antes de utilizar a funo _9nt_. Desse
modo0 asse"uraTse (ue o resultado ser/ correto independentemente do processador D
plataforma.
E*e,p$osM
@. 9f 61alorDGF7 N BF -- po." $" /a&$o o0 #!v1&#.o
9f Rou"d51alorDGF9 D6 N BF -- co"'o
A. 'TK..>kZTD.'@MN 9nt 6'TK..>k)LD9N9D'TK..>kZ.7 -- po." $"
/a&$o o0 #!v1&#.o
'TK..>kZTD.'@MN 9nt 6Rou"d5'TK..>k)LD9N9D'TK..>kZ.9 CD67 --
co"'o
CRIAL/O %E CLASSES
Podemos criar Classes pr+prias em Advpl [ bastando para tal nos utilizarmos dos
comandos de declarao de Classes 0 'todos e Propriedades do Protheus. 1e&a abaio
um modelo simples (ue eemplifica a utilizao e declarao de uma Classe de
.emplo utilizando AdvplM
#INCLUDE "PROTHEUS.CH"
// Crio uma funo para teste da Classe Exemplo
Function u_teste()
Local oSoma1 := Exemplo():New() // Crio um novo objeto de exemplo
( objeto 1 )
Local oSoma2 := Exemplo():New() // Crio outro objeto de exemplo
( objeto 2 )
// Realizo 3 chamadas ao mtodo Soma, com o objeto 1
oSoma1:Soma(10)
oSoma1:Soma(20)
oSoma1:Soma(30)
// Realizo 2 chamadas ao mtodo Soma, com o objeto 2
oSoma2:Soma(30)
oSoma2:Soma(30)
// Imprimo no console o acumulador das somas do obj 1 ( 60 )
conout(oSoma1:nAcumulador)
// Imprimo no console o acumulador das chamadas soma com o objeto 1
( 3 )
conout(oSoma1:nChamadas)
// Imprimo no console o acumulador das somas do obj 2 ( 60 )
conout(oSoma2:nAcumulador)
// Imprimo no console o acumulador das chamadas soma com o objeto 2
(2)
conout(oSoma2:nChamadas)
Return
//
----------------------------------------------------------------------
----------
// Declaracao da Classe Exemplo
//
----------------------------------------------------------------------
----------
C1ASS E6,p4o
// Declaracao das propriedades da Classe
DATA *A-+,+4#'o!DATA *Ch#,#'#s
// Declarao dos Mtodos da Classe
MET/OD N8;< CONSTRUCTORMET/OD So,#; *N+, <
ENDC1ASS
// Criao do construtor, onde atribuimos os valores default
// para as propriedades e retornamos Self
MET/OD N8;< C4#ss E6,p4o
::nAcumulador := 0
::nChamadas := 0
Return Self
// Criao do Mtodo de Soma , que recebe um nmero e o soma
// ao acumulador, retornando o conteudo do acumululador aps
// a soma , e incrementa em 1 o contador de chamadas do mtodo
MET/OD So,#; *N+, < C4#ss E6,p4o
::nAcumulador += nNum
::nChamadas++
Return ::nAcumulador
Podemos utilizar os outros tipos de vari/veis Advpl nas Classes 0 como vari/veis Locais
0 Private 0 )tatic 0 etc... Para acessarmos uma propriedade da classe atual 0 devemos
prefi/Tla com MM 6 dois sinais de A pontos 7
Ao declarar um ob&eto utilizando o construtor da classe 0 utilizamos a sintae M
o3b&eto MN NomeDaClasse67M'etodokContrutor67. Para acessar uma propriedade deste
ob&eto 0 utilizamos o3b&etoMPropriedade 0 e para acessar um mtodo da classe aplic/vel
a este ob&eto 0 utilizamos o3b&etoM'etodo6 parametros0... 7
PALAVRAS RESERVA%AS
Lista de Pa$a.ras Reser.adas
AADD DT3) 9Nb.^ 8.PL9CAT. 1AL
A-) .L). 9NT 8L3Cb 1ALT^P.
A)C .L).9, LA)T8.C 83END !#9L.
AT .'PT^ L.N 83! !38D
-3, .NDCA). L3Cb 8T89' ^.A8
-8.Ab .NDD3 L35 ).C3ND) CD3!
.ND9, L3!.8 ).L.CT C#8 .3,
LT89' ).TP3) C'3NT# .]P 'A]
)PAC. C3L ,C3ENT '9N )Z8T
CT3D ,9.LDNA'. '3NT# )T8 DAT.
,9L. PC3L )E-)T8 DA^ ,L3Cb
PC3ENT T9'. D.L.T.D ,3END P83C.DE8.
T8AN),38' D.1P3) ,ENCT93N P83! T89'
D3! 9, 8.CC3ENT T^P. DT3C
99, 8.CN3 EPP.8
0ovas Palavras &eservadas
A pa'# .a$ v"$2"$ Po'("0$ Ap3 4 B0#&. 5.,,.,*,5,6 , Ap7 4 B0#&.
5.,,.,*,5,6 " Ap5 4 B0#&. 5.,,.,*,5,6 , a$ pa&ava$ a%a#8o pa$$aam a $"
"$"va.a$9

TRW AS CATCH THRO@
0otas#
Palavras reservadas no podem ser utilizadas para vari/veis0 procedimentos0 ou
funYes.
,unYes reservadas so pertencentes ao compilador e portanto no podem ser
redefinidas por uma aplicao.
AbreviaYes de (uatro letras de palavras reservadas e funYes tambm so
reseravdas.
Todos os identifadores (ue comearem com um ou mais caracters de sublinhado
6k7 so utilizados como identificadores internos e portanto so tambm
reservados.
TABELAS %E PICTURES %E FORMATAL/O
Co,a"do SAWHPSAW
'unes
Conteudo ,uncionalidade
C .ibe C8 depois de n%meros positivos
. .ibe numricos com o ponto e a v$r"ula invertidos 6formato .uropeu7
8 9nsere caracteres diferentes dos caracteres de template
] .ibe D- depois de n%meros ne"ativos
\ .ibe zeros como brancos
6 .nvolve n%meros ne"ativos entre paranteses
m Converte todos os carecteres alfab/ticos para mai%sculo
Tem(lates
Conteudo ,uncionalidade
] .ibe d$"itos para (ual(uer tipo de dado
? .ibe d$"itos para (ual(uer tipo de dado
l .ibe d$"itos para (ual(uer tipo de dado
m Converte caracteres alfabticos para mai%sculo
V .ibe asterisco no lu"ar de espaos em branco inicias em n%meros
. .ibe a posio do ponto decimal
0 .ibe a posio do milhar
Co,a"do :ET
'unes
Conteudo ,uncionalidade
A Permite apenas caracteres alfabticos
C .ibe C8 depois de n%meros positivos
. .ibe numricos com o ponto e v$r"ula invertidos 6formato .uropeu7
8
9nsere caracteres diferentes dos caracteres de template na eibio mas no
insereTos na vari/vel do 5.T
)LnK
Permite rolamento horizontal do teto dentro do 5.T0 LnK um n%mero
inteiro (ue identifica o tamanho da re"io
] .ibe D- depois de n%meros ne"ativos
\ .ibe zeros como brancos
6 .ibe n%meros ne"ativos entre paranteses com os espaos em branco iniciais
7 .ibe n%meros ne"ativos entre paranteses sem os espaos em branco iniciais
m Converte caracteres alfabticos para mai%sculo
Tem(lates
Conteudo ,uncionalidade
] Permite (ual(uer caractere
?
Permite apenas d$"itos para (ual(uer tipo de dado0 incluindo o sinal para
numricos
l Permite d$"itos0 sinais e espaos em branco para (ual(uer tipo de dado
m Converte caracteres alfabticos para mai%sculo
V .ibe um asterisco no lu"ar dos espaos em branco iniciais em n%meros
. .ibe o ponto decimal
0 .ibe a posio do milhar
TOC'ICAS %E PRO:RAMAL/O EFICIE'TE
Para o desenvolvimento de sistemas e a pro"ramao de rotinas0 sempre esperado (ue
(ual(uer c+di"o escrito se&aM
de correto funcionamento
eficiente
le"$vel
reutiliz/vel
etens$vel
port/vel
Ap+s anos de eperiancia na utilizao de lin"ua"ens padro -ase e do
desenvolvimento da lin"ua"em AdvPl0 al"umas tcnicas para uma pro"ramao
otimizada e eficiente foram reconhecidas. A utilizao das tcnicas a se"uir0 visa buscar
o m/imo aproveitamento dos recursos da lin"ua"em com o ob&etivo de criar pro"ramas
com estas caracter$sticas.
Cria()o de Fu"(Aes Se3u"do a 'ecessidade
3bserve o c+di"o de eemploM
User Function GetAnswer(lDefault)
Local lOk
lOk := GetOk(lDefault)
If lOk
Return .T.
Else
Return .F.
Endif
Return nil
EtilizandoTse apenas o critrio fa funo funciona corretamentenf0 a funo 5etAns*er
perfeita. 8ecebe um parCmetro l+"ico com a resposta padro e retorna um valor l+"ico
dependente da opo escolhida pelo usu/rio em uma funo de di/lo"o fsimDnof
desi"nada para isso. Pode entretanto ser melhorada0 particularmente se eficiancia for
considerada como um critrio para um c+di"o melhor. .ficiancia tipicamente involve a
utilizao de poucos recursos de m/(uina0 poucos chamadas de funYes ou tornar mais
r/pido um processo.
)e"undo esse racioc$nio0 poderia se produzir o se"uinte c+di"oM
User Function GetAnswer(lDefault)
Return If( GetOk(lDefault), .T., .F.)
3u melhorM
User Function GetAnswer(lDefault)
Return GetOk(lDefault)
Com a otimizao do c+di"o da funo 5etAns*er0 pode facilmente verificar (ue a
mesma no realiza nada adicional i chamada de 5et320 podendo ser substitu$da por
uma chamada direta desta0 continuando a funcionar corretamente.
Codi&ica()o Auto<%ocu,e"t?.e$
Nenhum coment/rio substitui um c+di"o claramente escrito0 e este no um um
acidente. Considere o eemploM
cVar := " " // 11 espaos
3 tamanho da vari/vel c1ar no evidente por si s+ e no facilmente verificado. .stes
mesmos @F espaos estariam mais +bvios e ainda assim "arantidos se a instruo fosse
escrita comoM
cVar := Space(11)
3 mesmo princ$pio pode ser aplicado para (ual(uer strin" lon"a de caracteres repetidos.
A funo 8eplicate pode ser utilizada como a se"uirM
cVar := Replicate( "*", 80 )
.ste tipo de pro"ramao deia o c+di"o f/cil de di"itar0 f/cil de ler e mais fle$vel.
Uti$i7a()o de So$u(Aes Si,p$es
)implicidade na criao de instruYes torna a pro"ramao e at mesmo a eecuo
mais r/pida. Considere a linha de c+di"oM
If nVar > 0 .Or. nVar < 0
)e o valor da vari/vel n1ar for i"ual a zero 6F7 no momento da eecuo desta linha de
c+di"o0 ambas as comparaYes separadas pelo operador l+"ico .3r. sero efetuadasM
Ap+s ser avaliada0 a primeria comparao ir/ falhar. A se"unda comparao ser/ ento
avaliada e falhar/ tambm. Como resultado0 o c+di"o eistente dentro da estrutura de
fluo 9f no ser/ eecutado. Tal c+di"o somente ser/ eecutado (uando o valor desta
vari/vel for maior 3E menor do (ue zero. 3u se&a0 sempre (ue for D9,.8.NT. de
zero0 o (ue torna a linha a se"uir mais eficienteM
If nVar != 0
.ste tipo de alterao torna o c+di"o mais le"$vel e o processamento mais r/pido0
evitando a avaliao de instruYes desnecessariamente.
.istem outras situaYes onde a simplificao pode ser utilizada. A epresso de
avaliao a se"uirM
If cVar == "A" .Or. cVar == "B" .Or ;
cVar == "C" .Or. cVar == "D"
Pode ser substitu$do pelo operador de contenoM
If cVar $ "ABCD"
Op()o por F$e*i#i$idade
A melhor soluo a(uela (ue envolve o problema imediato e previne problemas no
futuro. Considere o eemploM
@nRow,nCol PSAY cVar Picture "!!!!!!!!!!!!!!!!!!!!"
.ceto contandoTse os caracteres0 no eiste maneira de saber se o n%mero de caracteres
de eclamao o esperado. .n(uanto isto um problema0 eistem al"o mais "rave. A
epresso de picture est/tica. )e no futuro for necess/rio a&ustar o tamanho da vari/vel
c1ar0 ser/ necess/rio localizar todos os lu"ares no c+di"o onde esta m/scara de picture
est/ sendo utilizada para a&uste manual. .iste uma opo dsoluo de de autoTa&uste
dispon$vel (ue f/cil de di"itar e tem a "arantia de eecutar a tarefa i"ualmente 6tornar
todos os caracteres mai%sculos7M
@nRow,nCol PSAY cVar Picture "@!"
Op()o da Praticidade ao %ra,a
)e a soluo parece complea0 provavelmente por(ue o caminho escolhido est/
levando a isso. DeveTse sempre se per"untar por(ue al"um desenvolveria uma
lin"ua"em (ue re(uisite tantos comandos complicados para fazer al"o simples. Na
"rande maioria dos casos0 eiste uma soluo mais simples. 3 eemplo abaio deia
isso bem claroM
@ 10,25 Say Substr(cCep,1,5) + "-" + Substr(cCep,6,3) Picture
"!!!!!!!!!"
Zue pode ficar mais simples assimM
@ 10,25 Say cCep Picture "@R 99999-999"
Uti$i7a()o de Operadores de I"cre,e"toH%ecre,e"to
Etilizados devidamente0 os operadores de incremento e decremento tornam o c+di"o
mais f/cil de ler e possivelmente um pouco mais r/pidos. Ao contr/rio de escrever
adiYes simples comoM
nVar := nVar + 1
nVar := nVar -1
PodeTse escrevaTlas assimM
++nVar
--nVar
DeveTse apenas tomar cuidado com a precedancia destes operadores0 pois o fjjf ou o
fTTf podem aparecer antes ou depois de uma vari/vel0 e em al"uns casos (uando a
vari/vel for utilizada dentro de uma epresso0 a prefiao ou sufiao destes
operadores afetar/ o resultado. Para maiores detalhes0 consulte a documentao de
operadores da lin"ua"em AdvPl.
E.itar Passos %es"ecess?rios
.iste uma diferena entre um bom h/bito e perda de tempo. Al"umas vezes estes
conceitos podem estar muito pr+imos0 mas um modo de diferenci/Tlos balancear os
benef$cios de realizar al"uma ao contra o problema (ue resultaria se no fosse
eecutada. 3bserve o eemploM
Local nCnt := 0
For nCnt := 1 To 10
<cdigo>
Next nCnt
9nicializar a vari/vel no momento da declarao no um problema. )e o F fosse
necess/rio no eemplo0 teria sido %til a inicializao na declarao. 'as neste caso a
estrutura de repetio ,or... Net atribui o seu valor imediatamente com @0 portanto no
houve "anho em atribuir a vari/vel com F no comeo.
Neste eemplo no h/ nenhum ponto ne"ativo e nada errado ocorrer/ se a vari/vel no
for inicializada0 portanto aconselh/vel evitar este tipo de inicializao0 pois no torna
o c+di"o mais se"uro e tambm no epressa a inteno do c+di"o mais claramente.
Porm note este eemplo0 onde a vari/vel no inicializadaM
Local nCnt
While ( nCnt++ < 10 )
<cdigo>
EndDo
.m AdvPl0 vari/veis no inicializadas sempre tem seu valor contendo nulo 6nil7 a
princ$pio0 o (ue far/ com (ue uma eceo em tempo de eecuo acontea (uando a
instruo de repetio *hile for eecutada.
Diferentemente do primeiro eemplo0 onde a inicializao da vari/vel no fazia
diferena al"uma0 neste se"undo eemplo a inicializao absolutamente necess/ria.
DeveTse procurar inicializar vari/veis numricas com zero 6F7 e vari/veis caracter com
strin" nula 6ff7 apenas (uando realmente necess/rio.
Etilizao de Alternativas
Zuando se est/ trabalhando em uma simples rotina0 deveTse tomar al"um tempo para
eplorar duas ou tras diferentes aborda"ens. Zuando se est/ trabalhando em al"o mais
compleo0 deveTse plane&ar prototipar al"umas a mais. Considere o se"uinte c+di"oM
If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif
Um cdigo de uma nica letra, (A at E), foi informado para indicar a
cor de cabelo. Este cdigo foi ento convertido e armazenado como uma
string. Pode-se notar que a cor "Preto" ser atribuda se nenhuma
outra opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais
fcil de ler enquanto reduz o nmero de comandos replace:
Do Case
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
cColor := "Preto"
EndCase
Replace hair With cColor
Ut)4):#$%o ' A!7+)"os ' C#b$#4ho
>+#*'o N-ss2!)o
Se um arquivo de cdigo criado se referencia a comandos para
interpretao e tratamento de arquivos XML, este deve se incluir o
arquivo de cabealho prprio para tais comandos (XMLXFUN.CH no
exemplo). Porm no deve-se incluir arquivos de cabealho apenas por
segurana. Se no se est referenciando nenhuma das constantes ou
utilizando nenhum dos comandos contidos em um destes arquivos, a
incluso apenas tornar a compilao mais demorada.
Co*st#*ts , M#).s-+4o
Isto uma conveno que faz sentido. Em AdvPl, como em C por exemplo,
a regra utilizar todos os caracteres de uma constante em maisculo,
a fim de que possam ser claramente reconhecidos como constantes no
cdigo, e que no seja necessrios lembrar onde foram declarados.
Ut)4):#$%o ' I'*t#$%o
Este um hbito que todo programador deve desenvolver. No consome
muito esforo para manter o cdigo alinhado durante o trabalho, porm
quando necessrio pode-se utilizar AP6 IDE para a reidentao de
cdigo.
Considere o exemplo:
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo

A utilizao da identao seguindo as estruturas de controle de fluxo
(while, if, case, etc) torna a compreenso do cdigo muito mais fcil:
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
Ut)4):#$%o ' Esp#$os , B!#*-o
Espaos em branco extras tornam o cdigo mais fcil para a leitura.
No necessrio imensas reas em branco, mas agrupar pedaos de
cdigo atravs da utilizao de espaos em branco funciona muito bem.
Costuma-se separar parmetros com espaos em branco.
>+b!# ' 1)*h#s M+)to 1o*A#s
Com o objetivo de tornar o cdigo mais fcil de ler e imprimir, as
linhas do cdigo no devem estender o limite da tela ou do papel.
Podem ser "quebradas" em mais de uma linha de texto utilizando o
ponto-e-vrgula (;).
C#p)t+4#$%o ' P#4#"!#s0Ch#"
Uma conveno amplamente utilizada a de capitular as palavras
chaves, funes, variveis e campos utilizando uma combinao de
caracteres em maisculo e minsculo, visando facilitar a leitura do
cdigo fonte. O cdigo a seguir:
local ncnt
while ( ncnt++ < 10 )
ntotal += ncnt * 2
enddo

Ficaria melhor com as palavras chaves e variveis capituladas:
Local nCnt
While ( nCnt++ < 10 )
nTotal += nCnt * 2
EndDo
Ut)4):#$%o '# Not#$%o /.*A#!#
A Notao Hngara muito comum entre programadores xBase e de outras
linguagens. A documentao do AdvPl utiliza esta notao para a
descrio das funes e comandos e aconselhvel sua utilizao na
criao de rotinas, pois ajuda a evitar pequenos erros e facilita a
leitura do cdigo. Para maiores detalhes, consulte a documentao
sobre a Notao Hngara disponvel na documentao da linguagem AdvPl.
Ut)4):#$%o ' No,s S)A*)()-#*ts p#!#
V#!)2")s
A principal vantagem da liberdade na criao dos nomes de variveis
a facilidade de identificao da sua utilidade. Portanto deve-se
utilizar essa facilidade o mximo possvel. Nomes sem sentido apenas
tornaro difcil a identificao da utilidade de uma determinada
varivel, assim como nomes extremamente curtos. Nem sempre a
utilizao de uma varivel chamada i a melhor sada. Claro, no
convm criar uma varivel com um nome muito longo que ser utilizada
como um contador, e referenciada muitas vezes no cdigo. O bom senso
deve ser utilizado.
Criar variveis como nNumero ou dData tambm no ajudam na
identificao. A Notao Hngara j est sendo utilizada para isso e o
objetivo do nome da varivel deveria ser identificar sua utilizao,
no o tipo de dado utilizado. Deve-se procurar substituir tais
variveis por algo como nTotal ou dCompra.
O mesmo vlido para nomes de funes, que devem descrever um pouco
sobre o que a funo faz. Novamente nomes extremamente curtos no so
aconselhveis.
Ut)4):#$%o ' Co,*t2!)os
Comentrios so muito teis na documentao de programas criados e
para facilitar a identificao de processos importantes no futuro.
Devem sempre ser utilizados.
Sempre que possvel, funes criadas devem ter uma breve descrio do
seu objetivo, parmetros e retorno. Alm de servir como documentao,
os comentrios embelezam o cdigo ao separar as funes umas das
outras.
Os comentrios devem ser utilizados com bom senso, pois reescrever a
sintaxe AdvPl em portugus torna-se apenas perda de tempo:
#EX
If nLastKey == 27 // Se o nLastKey for igual a 27
#EX
C!)#$%o ' M*s#A*s S)stB,)-#s
S)A*)()-#*ts Co*s)st*ts
Seja oferecendo assistncia, exibindo mensagens de aviso ou mantendo o
usurio informado do estado de algum processo, as mensagens devem
refletir o tom geral e a importncia da aplicao. Em termos gerais,
deve-se evitar ser muito informal e ao mesmo tempo muito tcnico.
#EX
"Aguarde. Reindexando (B1_FILIAL+B1_COD+B1_LOCAL) do arquivo:
\DADOSADV\SB1990.DBF"
#/EX

Esse tipo de mensagem pode dar informaes demais para o usurio e
deix-lo sentindo-se desconfortvel se no souber o que significa
"reindexando", etc. E de fato, o usurio no devia ser incomodado com
tais detalhes. Apenas a frase "Aguarde, indexando." funcionaria
corretamente, assim como palavras "processando" ou "reorganizando".
Outra boa idia evitar a referencia a um item corrente de uma tabela
como um "registro":
#EX
"Deletar este registro?"
#/EX

Se a operao estiver sendo efetuada em um arquivo de clientes, o
usurio deve ser questionado sobre a remoo do cliente corrente, se
possvel informando valores de identificao como o cdigo ou o nome.
E")t#! Ab!")#$%o ' Co,#*'os , C
4t!#s
Apesar do AdvPl suportar a abreviao de comandos em quatro letras
(por exemplo, repl no lugar de replace) no h necessidade de utilizar
tal funcionalidade. Isto apenas torna o cdigo mais difcil de ler e
no torna a compilao mais rpida ou simples.
E")t#! DD)s(#!-sD *o CE')Ao
No deve-se criar constantes para expresses complexas. Isto tornar o
cdigo muito difcil de compreender e poder causar erros primrios,
pois pode-se imaginar que uma atribuio efetuada a uma varivel
quando na verdade h toda uma expresso disfarada:
#define NUMLINES aPrintDefs[1]
#define NUMPAGES aPrintDefs[2]
#define ISDISK aReturn[5]
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
A impresso que se tem aps uma leitura deste cdigo de que valores
esto sendo atribuidos s variveis ou que constantes esto sendo
utilizadas. Se o objetivo flexibilidade, o cdigo anterior deve ser
substitudo por:
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK 5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
E")t#! CE')Ao ' SA+!#*$#
Ds*-ss2!)o
Dada sua natureza binria, tudo pode ou no acontecer dentro de um
computador. Adicionar pedaos de cdigo apenas para "garantir a
segurana" frequentemente utilizado como uma desculpa para evitar
corrigir o problema real. Isto pode incluir a checagem para validar
intervalos de datas ou para tipos de dados corretos, o que comumente
utilizando em funes:
Static Function MultMalor( nVal )
If ValType( nVal ) != "N"
nVal := 0
Endif
Return ( nVal * nVal )

O ganho irrisrio na checagem do tipo de dado do parmetro j que
nenhum programa corretamente escrito em execuo poderia enviar uma
string ou uma data para a funo. De fato, este tipo de "captura" o
que torna a depurao difcil, j que o retorno ser sempre um valor
vlido (mesmo que o parmetro recebido seja de tipo de dado
incorreto). Se esta captura no tiver sido efetuada quando um
possvel erro de tipo de dado invlido ocorrer, o cdigo pode ser
corrigido para que este erro no mais acontea.
Iso4#,*to ' St!)*As ' T6to
No caso de mensagens e strings de texto, a centralizao um bom
negcio. Pode-se colocar mensagens, caminhos para arquivos, e mesmo
outros valores em um local especfico. Isto os torna acessveis de
qualquer lugar no programa e fceis de gerenciar.
Por exemplo, se existe uma mensagem comum como "Imprimindo, por favor
aguarde..." em muitas partes do cdigo, corre-se o risco de no seguir
um padro para uma das mensagens em algum lugar do cdigo. E mant-las
em um nico lugar, como um arquivo de cabealho, torna fcil a
produo de documentao e a internacionalizao em outros idiomas.
SI'TAME %E LI':UA:EM
Criac^o de u, Pro3ra,a
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
Em pro"rama de computador nada mais do (ue um "rupo de comandos lo"icamente
dispostos com o ob&etivo de eecutar determinada tarefa. .sses comandos so "ravados
em um ar(uivo teto (ue transformado em uma lin"ua"em eecut/vel por um
computador atravs de um processo chamado compilao. A compilao substitui os
comandos de alto n$vel 6(ue os humanos compreendem7 por instruYes de baio n$vel
6compreendida pelo sistema operacional em eecuo no computador7. No caso do
AdvPl0 no o sistema operacional de um computador (ue ir/ eecutar o c+di"o
compilado0 mas sim o AP< )erver.
Dentro de um pro"rama0 os comandos e funYes utilizados devem se"uir re"ras de
sintae da lin"ua"em utilizada0 pois caso contr/rio o pro"rama ser/ interrompido por
erros. 3s erros podem ser de compilao ou de eecuo.
.rros de compilao so a(ueles encontrados na sintae (ue no permitem (ue o
ar(uivo de c+di"o do pro"rama se&a compilado. Podem ser comandos
especificados de forma errdnea0 utilizao inv/lida de operadores0 etc.
.rros de eecuo so a(ueles (ue acontecem depois da compilao0 (uando o
pro"rama est/ sendo eecutado. Podem ocorrer por in%meras razYes0 mas
"eralmente se referem a funYes no eistentes0 ou vari/veis no criadas ou
inicializadas0 etc.
Li"as de Pro3ra,a
As linhas eistentes dentro de um ar(uivo teto de c+di"o de pro"rama podem ser
linhas de comando0 linhas de coment/rio ou linhas mistas.
Lin)as e Comano
Linhas de comando possuem os comandos ou instruYes (ue sero eecutadas. Por
eemploM
Local nCnt
Local nSoma := 0
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Lin)as e Coment*rio
Linhas de coment/rio possuem um teto (ual(uer0 mas no so eecutadas. )ervem
apenas para documentao e para tornar mais f/cil o entendimento do pro"rama.
.istem tras formas de se comentar linhas de teto. A primeira delas utilizar o sinal de
V 6asterisco7 no comeo da linhaM
* Programa para clculo do total
* Autor: Microsiga Software S.A.
* Data: 2 de outubro de 2001
Todas as linhas iniciadas com um sinal de asterisco so consideradas como coment/rio.
PodeTse utilizar a palavra N3T. ou dois s$mbolos da letra fef comercial 6tt7 para
realizar a funo do sinal de asterisco. Porm todas estas formas de coment/rio de
linhas so obsoletas e eistem apenas para compatibilizao com o padro -ase. A
melhor maneira de comentar linhas em AdvPl utilizar duas barras transversaisM
// Programa para clculo do total
// Autor: Microsiga Software S.A.
// Data: 2 de outubro de 2001
3utra forma de documentar tetos utilizar as barras transversais &untamente com o
asterisco0 podendoTse comentar todo um bloco de teto sem precisar comentar linha a
linhaM
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o teto encontrado entre a abertura 6indicada pelos caracteres DV7 e o fechamento
6indicada pelos caracteres VD7 considerado como coment/rio.
Lin)as +istas
3 AdvPl tambm permite (ue eistam linhas de comando com coment/rio. 9sto
poss$vel inclu$ndoTse as duas barras transversais 6DD7 ao final da linha de comando e
adicionandoTse o teto do coment/rioM
Local nCnt
Local nSoma := 0 // Inicializa a varivel com zero para a soma
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Ta,a"o da Li"a
Assim como a linha f$sica0 delimitada pela (uantidade de caracteres (ue pode ser
di"itado no editor de tetos utilizado0 eiste uma linha considerada linha l+"ica. A linha
l+"ica0 a(uela considerada para a compilao como uma %nica linha de comando.
A princ$pio0 cada linha di"itada no ar(uivo teto diferenciada ap+s o pressionamento
da tecla L.nterK. 3u se&a0 a linha l+"ica0 a linha f$sica no ar(uivo. Porm al"umas
vezes0 por limitao f$sica do editor de teto ou por esttica0 podeTse f(uebrarf a linha
l+"ica em mais de uma linha f$sica no ar(uivo teto. 9sto efetuado utilizandoTse o sinal
de pontoTeTv$r"ula 6[7.
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Neste eemplo eiste uma linha de comando para a checa"em das vari/veis utilizadas.
Como a linha tornaTse muito "rande0 podeTse divid$Tla em mais de uma linha f$sica
utilizando o sinal de pontoTeTv$r"ula. )e um sinal de pontoTeTv$r"ula for es(uecido nas
duas primeiras linhas0 durante a eecuo do pro"rama ocorrer/ um erro0 pois a se"unda
linha f$sica ser/ considerada como uma se"unda linha de comando na compilao. .
durante a eecuo esta linha no ter/ sentido.
Estrutura de u, Pro3ra,a
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
Apesar de no ser uma lin"ua"em de padrYes r$"idos com relao i estrutura do
pro"rama0 importante identificar al"umas de suas partes. Considere o pro"rama de
eemplo abaioM
/*
+===========================================+
| Programa: Clculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+===========================================+
*/

Local nCnt
Local nResultado := 1 // Resultado do fatorial
Local nFator := 5 // Nmero para o clculo

// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt

// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))

// Termina o programa
Return
PodeTse classificar um pro"rama em AdvPl em (uatro partes b/sicasM
urea de 9dentificao
urea de A&ustes 9niciais
Corpo do Pro"rama
urea de .ncerramento
A ,rea e !entifi-a.o
.sta uma /rea (ue no obri"at+ria e dedicada a documentao do pro"rama.
Zuando eistente0 contm apenas coment/rios eplicando a sua finalidade0 data de
criao0 autor0 etc0 e aparece no comeo do pro"rama0 antes de (ual(uer linha de
comando.
3 formato para esta /rea no definido. PodeTse colocar (ual(uer tipo de informao
dese&ada e escolher a formatao apropriada.
/*
+==========================================+
| Programa: Clculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+==========================================+
*/
3pcionalmente podeTse incluir definiYes de constantes utilizadas no pro"rama ou
incluso de ar(uivos de cabealho nesta /rea.
A ,rea e A/ustes !ni-iais
Nesta /rea "eralmente se fazem os a&ustes iniciais0 importantes para o correto
funcionamento do pro"rama. .ntre os a&ustes se encontram declaraYes de vari/veis0
inicializaYes0 abertura de ar(uivos0 etc. Apesar do AdvPl no ser uma lin"ua"em r$"ida
e as vari/veis poderem ser declaradas em (ual(uer lu"ar do pro"rama0 aconselh/vel
fazaTlo nesta /rea visando tornar o c+di"o mais le"$vel e facilitar a identificao de
vari/veis no utilizadas.
Local nCnt
Local nResultado := 0 // Resultado do fatorial
Local nFator := 10 // Nmero para o clculo
O Cor(o o Programa
X nesta /rea (ue se encontram as linhas de c+di"o do pro"rama. X onde se realiza a
tarefa necess/ria atravs da or"anizao l+"ica destas linhas de comando. .speraTse (ue
as linhas de comando este&am or"anizadas de tal modo (ue no final desta /rea o
resultado esperado se&a obtido0 se&a ele armazenado em um ar(uivo ou em vari/veis de
mem+ria0 pronto para ser eibido ao usu/rio atravs de um relat+rio ou na tela.
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
A ,rea e En-erramento
X nesta /rea onde as finalizaYes so efetuadas. X onde os ar(uivos abertos so
fechados0 e o resultado da eecuo do pro"rama utilizado. PodeTse eibir o resultado
armazenado em uma vari/vel ou em um ar(uivo ou simplesmente finalizar0 caso a tarefa
&/ tenha sido toda completada no corpo do pro"rama. X nesta /rea (ue se encontra o
encerramento do pro"rama. Todo pro"rama em AdvPl deve sempre terminar com a
palavra chave return.
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))

// Termina o programa
Return
Co"tro$a"do o F$u*o
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
3 AdvPl suporta v/rias estruturas de controle (ue permitem mudar a se(Qancia de fluo
de eecuo de um pro"rama. .stas estruturas permitem a eecuo de c+di"o baseado
em condiYes l+"ica e a repetio da eecuo de pedaos de c+di"o (ual(uer n%mero
de vezes.
.m AdvPl0 todas as estruturas de controle podem ser faninhadasf dentro de todas as
demais estruturas contanto (ue este&am aninhadas propriamente. .struturas de controle
tam um identificador de in$cio e um de fim0 e (ual(uer estrutura aninhada deve se
encontrar entre estes identificadores.
Tambm eistem estruturas de controle para determinar (ue elementos0 comandos0 etc
em um pro"rama sero compilados. .stas so as diretivas do prTprocessador
lifdef...lendif e lifndef...lendif. Consulte a documentao sobre o prTprocessador para
maiores detalhes.
As estruturas de controle em AdvPl esto divididas em M
.struturas de 8epetio
.struturas de Deciso.
%es.ia"do a E*ecuc^o
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
.struturas de desvio so dese"inadas para eecutar uma seo de c+di"o se determinada
condio l+"ica resultar em verdadeiro 6.T.7. .m AdvPl eistem dois comandos para
eecuo de seYes de c+di"o de acordo com avaliaYes l+"icas. 3 comando
9,....ND9, e o comando D3 CA).....NDCA)..
O Co,a"do %O CASE000E'%CASE
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
.ecuta o primeiro con&unto de comandos cu&a epresso condicional resulta em
verdadeiro 6.T.7.
%inta0e
DO CASE
CASE lExpressao1
Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
Par1metros
CA).
l.pressao@
Comandos...
Zuando a primeira epresso CA). resultante em verdadeiro 6.T.7 for
encontrada0 o con&unto de comandos se"uinte eecutado. A
eecuo do con&unto de comandos continua at (ue a pr+ima
cl/usula CA).0 3T#.8!9). ou .NDCA). se&a encontrada. Ao
terminar de eecutar esse con&unto de comandos0 a eecuo continua
com o primeiro comando se"uinte ao .NDCA)..
)e uma epresso CA). resultar em falso 6.,.70 o con&unto de
comandos se"uinte a esta at a pr+ima cl/usula i"norado.
Apenas um con&unto de comandos eecutado. .stes so os primeiros
comandos cu&a epresso CA). avaliada como verdadeiro 6.T.7.
Ap+s a eecuo0 (ual(uer outra epresso CA). posterior
i"norada 6mesmo (ue sua avaliao resultasse em verdadeiro7.
3T#.8!9).
Commandos
)e todas as epressYes CA). forem avaliadas como falso 6.,.70 a
cl/usula 3T#.8!9). determina se um con&unto adicional de
comandos deve ser eecutado. )e essa cl/usula for incluida0 os
comandos se"uintes sero eecutados e ento o pro"rama continuar/
com o primeiro comando se"uinte ao .NDCA).. )e a cl/usula
3T#.8!9). for omitida0 a eecuo continuar/ normalmente ap+s a
cl/usula .NDCA)..
Coment*rios
3 Comando D3 CA).....NDCA). utilizado no lu"ar do comando 9,....ND9,
(uando um n%mero maior do (ue uma epresso deve ser avaliada0 substituindo a
necessidade de mais de um comando 9,....ND9, aninhados.
E0em(lo
Local nMes := Month(Date())
Local cPeriodo := ""

DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
O Co,a"do IF000E'%IF
8evisoM AFDF?DAFFH
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
.ecuta um con&unto de comandos baseado no valor de uma epresso l+"ica.
%inta0e
IF lExpressao
Comandos
[ELSE
Comandos...]
ENDIF
Par1metros
l.pressao .specifica uma epresso l+"ica (ue avaliada. )e l.pressao resultar em
verdadeiro 6.T.70 (ual(uer comando se"uinte ao 9, e antecedente ao .L). ou
.ND9, 6o (ue ocorrer primeiro7 ser/ eecutado.)e l.pressao resultar em
falso 6.,.7 e a cl/usula .L). for definida0 (ual(uer comando ap+s essa
cl/usula e anterior ao .ND9, ser/ eecutada. )e a cl/usula .L). no for
definida0 todos os comandos entre o 9, e o .ND9, so i"norados. Neste
caso0 a eecuo do pro"rama continua com o primeiro comando se"uinte ao
.ND9,.
Comandos
Con&unto de comandos AdvPl (ue sero eecutados dependendo da
avaliao da epresso l+"ica em l.pressao.
Coment*rios
PodeTse aninhar um bloco de comando 9,....ND9, dentro de outro bloco de comando
9,....ND9,. Porm0 para a avaliao de mais de uma epresso l+"ica0 deveTse utilizar o
comando D3 CA).....NDCA)..
E0em(lo
Local dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
IF "o Proteus
Nas versYes do .8P )i"a Advanced A.F= DH.F= e anteriores0 caso o comando 9,
recebesse um ar"umento nulo 6 N9L 7 0 a aplicao era abortada com a ocorrancia
f.rror -A).D@F<< Ar"ument errorM conditionalf.
A partir das versYes Protheus BF= e posteriores0 a aplicao no abortada0 e o
comando 9, comportaTse como se tivesse recebido o valor booleano .,. 6 falso 7 .

O Co,a"do FOR000'EMT
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
A estrutura de controle ,38...N.]T0 ou simplesmente o loop ,380 repete uma seo
de c+di"o em um n%mero determinado de vezes.
%inta0e
FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos...
[EXIT]
[LOOP]
NEXT
Par1metros
1ariavel
.specifica uma vari/vel ou um elemento de uma matriz para atuar
como um contador. A vari/vel ou o elemento da matriz no precisa ter
sido declarado antes da eecuo do comando ,38...N.]T. )e a
vari/vel no eistir0 ser/ criada como uma vari/vel privada.
n1alor9nicial
T3 n1alor,inal
n1alor9nicial o valor inicial para o contador[ n1alor,inal o valor
final para o contador. PodeTse utilizar valores numricos literais0
vari/veis ou epressYes0 contanto (ue o resultado se&a do tipo de dado
numrico.
)T.P
n9ncremento
n9ncremento a (uandidade (ue ser/ incrementada ou decrementada no
contador ap+s cada eecuo da seo de comandos. )e o valor de
n9ncremento for ne"ativo0 o contador ser/ decrementado. )e a cl/usula
)T.P for omitida0 o contador ser/ incrementado em @. PodeTse utilizar
valores numricos literais0 vari/veis ou epressYes0 contanto (ue o
resultado se&a do tipo de dado numrico.
Comandos
.specifica um ou mais instruYes de comando AdvPl (ue sero
eecutadas.
.]9T
Transfere o controle de dentro do comando ,38...N.]T para o
comando imediatamente se"uinte ao N.]T0 ou se&a0 finaliza a
repetio da seo de comandos imediatamente. PodeTse colocar o
comando .]9T em (ual(uer lu"ar entre o ,38 e o N.]T.
L33P
8etorna o controle diretamente para a cl/usula ,38 sem eecutar o
restante dos comandos entre o L33P e o N.]T. 3 contador
incrementadou ou decrementado normalmente0 como se o N.]T
tivesse sido alcanado. PodeTse colocar o comando L33P em (ual(uer
lu"ar entre o ,38 e o N.]T.
Coment*rios
Ema vari/vel ou um elemento de uma matriz utilizado como um contador para
especificar (uantas vezes os comandos AdvPl dentro da estrutura ,38...N.]T so
eecutados. 3s comandos AdvPl depois do ,38 so eecutados at (ue o N.]T se&a
alcanado. 3 contador 61ariavel7 ento incrementado ou decremantado com o valor
em n9ncremento 6se a cl/usula )T.P for omitida0 o contador incrementado em @7.
.nto0 o contador comparado com o valor em n1alor,inal. )e for menor ou i"ual ao
valor em n1alor,inal0 os comandos se"uintes ao ,38 so eecutados novamente. )e o
valor for maior (ue o contido em n1alor,inal0 a estrutura ,38...N.]T terminada e o
pro"rama continua a eecuo no primeiro comando ap+s o N.]T.
3s valores de n1alor9nicial0 n1alor,inal e n9ncremento so apenas considerados
inicialmente. .ntretanto0 mudar o valor da vari/vel utilizada como contador dentro da
estrutura afetar/ o n%mero de vezes (ue a repetio ser/ eecutada. )e o valor de
n9ncremento ne"ativo e o valor de n1alor9nicial maior (ue o de n1alor,inal0 o
contador ser/ decrementado a cada repetio.
.emplo
Local nCnt
Local nSomaPar := 0
For nCnt := 0 To 100 Step 2
nSomaPar += nCnt
Next
Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )
Return
.ste eemplo imprime a soma dos @FF primerios n%meros pares. A soma obitida
atravs da repetio do c/lculo utilizando a pr+pria vari/vel de contador. Como a
cl/usula )T.P est/ sendo utilizada0 a vari/vel nCnt ser/ sempre incrementada em A. .
como o contador comea com F0 seu valor sempre ser/ um n%mero par.
O Co,a"do @HILE000E'%%O
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
A estrutura de controle !#9L.....NDD30 ou simplesmente o loop !#9L.0 repete uma
seo de c+di"o en(uanto uma determinada epresso resultar em verdadeiro 6.T.7.
%inta0e
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Par1metros
l.pressao
.specifica uma epresso l+"ica cu&o valor determina (uando os comandos
entre o !#9L. e o .NDD3 so eecutados. .n(uanto o resultado de
l.pressao for avaliado como verdadeiro 6.T.70 o con&unto de comandos so
eecutados.
Comandos
.specifica um ou mais instruYes de comando AdvPl (ue sero eecutadas
en(uanto l.pressao for avaliado como verdadeiro 6.T.7.
.]9T
Transfere o controle de dentro do comando !#9L.....NDD3 para o
comando imediatamente se"uinte ao .NDD30 ou se&a0 finaliza a repetio da
seo de comandos imediatamente. PodeTse colocar o comando .]9T em
(ual(uer lu"ar entre o !#9L. e o .ND3.
L33P
8etorna o controle diretamente para a cl/usula !#9L. sem eecutar o
restante dos comandos entre o L33P e o .NDD3. A epresso em
l.pressao reavaliada para a deciso se os comandos continuaro sendo
eecutados.
Coment*rios
3s comandos entre o !#9L. e o .NDD3 so eecutados en(uanto o resultado da
avaliao da epresso em l.pressao permanecer verdadeiro 6.T.7. Cada palavra chave
!#9L. deve ter uma palavra chave .NDD3 correspondente.
E0em(lo
Local nNumber := 0
Local nSomaPar := 0
While nNumber <= 100
nSomaPar += nNumber
nNumber += 2
Enddo
Alert( "A soma dos 100 primeiros nmeros pares : " +
cValToChar(nSomaPar) )
Return
Repetic^o de Co,a"dos
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
.struturas de repetio so dese"inadas para eecutar uma seo de c+di"o mais de uma
vez. Por eemplo0 ima"iandoTse a eistancia de uma funo para imprimir um relat+rio0
podeTse dese&ar imprimiTlo (uatro vezes. Claro0 podeTse simplesmente chamar a funo
de impresso (uatro vezes em se(Qancia0 mas isto se tornaria pouco profissional e no
resolveria o problema se o n%mero de relat+rios fosse vari/vel.
.m AdvPl eistem dois comandos para a repetio de seYes de c+di"o. 3 comando
,38...N.]T e o comando !#9L.....NDD3.
Macro Su#stituic^o
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
3 operador de macro substituio0 simbolizado pelo fef comercial 6t70 utilizado para
a avaliao de epressYes em tempo de eecuo. ,unciona como se uma epresso
armazenada fosse compilada em tempo de eecuo0 antes de ser de fato eecutada.
Considere o eemploM
01 X := 10
02 Y := "X + 1"
03 B := &Y // O contedo de B ser 11
A vari/vel ] atribu$da com o valor @F0 en(uanto a vari/vel ^ atribu$da com a strin"
de caracteres contendo f] j @f.
A terceira linha utiliza o operador de macro. .sta linha faz com (ue o n%mero @@ se&a
atribu$do i vari/vel -. PodeTse perceber (ue esse o valor resultante da epresso em
formato de caractere contida na vari/vel ^.
EtilizandoTse uma tcnica matem/tica elementar0 a substituio0 temos (ue na se"unda
linha0 ^ definido como f] j @f0 ento podeTse substituir ^ na terceira linhaM
03 B := &"X + 1"
3 operador de macro cancela as aspasM
03 B := X + 1
PodeTse perceber (ue o operador de macro remove as aspas0 o (ue deia um pedao de
c+di"o para ser eecutado. DeveTse ter em mente (ue tudo isso acontece em tempo de
eecuo0 o (ue torna tudo muito dinCmico. Ema utilizao interessante criar um tipo
de calculadora0 ou avaliador de f+rmulas0 (ue determina o resultado de al"o (ue o
usu/rio di"ita.
3 operador de macro tem uma limitaoM vari/veis referenciadas dentro da strin" de
caracteres 6] nos eemplos anteriores7 no podem ser locais.
Operadores Co,u"s
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
Na documentao sobre vari/veis h/ uma breve demonstrao de como atribuir valores
a uma vari/vel da forma mais simples. 3 AdvPl amplia si"nificativamente a utilizao
de vari/veis atravs do uso de epressYes e funYes. Ema epresso um con&unto de
operadores e operandos cu&o resultado pode ser atribu$do a uma vari/vel ou ento
analisado para a tomada de decisYes. Por eemploM
Local nSalario := 1000, nDesconto := 0.10
Local nAumento, nSalLiquido
nAumento := nSalario * 1.20
nSalLiquido := nAumento * (1-nDesconto)
Neste eemplo so utilizadas al"umas epressYes para calcular o sal/rio l$(uido ap+s
um aumento. 3s operandos de uma epresso podem ser uma vari/vel0 uma constante0
um campo de ar(uivo ou uma funo.
Operadores Mate,?ticos
3s operadores utilizados em AdvPl para c/lculos matem/ticos soM
j Adio
T )ubtrao
V 'ultiplicao
D Diviso
VV ou v .ponenciao
w '+dulo 68esto da Diviso7
Operadores de Stri"3
3s operadores utilizados em AdvPl para tratamento de caracteres soM
j Concatenao de strin"s 6unio7
T Concatenao de strin"s com eliminao dos brancos finais das strin"s intermedi/rias
x Comparao de )ubstrin"s 6contido em7
Operadores Re$acio"ais
3s operadores utilizados em AdvPl para operaYes e avaliaYes relacionais soM
L Comparao 'enor
K Comparao 'aior
N Comparao 9"ual
NN Comparao .atamente 9"ual 6para caracteres7
LN Comparao 'enor ou 9"ual
KN Comparao 'aior ou 9"ual
LK ou l ou mN Comparao Diferente
Operadores LB3icos
3s operadores utilizados em AdvPl para operaYes e avaliaYes l+"icas soM
.And. . l+"ico
.3r. 3E l+"ico
.Not. ou m Nh3 l+"ico
Operadores Especiais
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
Alm dos operadores comuns0 o AdvPl possui al"uns outros operadores ou
identificadores. .stas so suas finalidadesM
67 A"rupamento ou ,uno
:; .lemento de 'atriz
IO Definio de 'atriz0 Constante ou -loco de C+di"o
TK 9dentificador de Apelido
t 'acrosubstituio
c Passa"em de parCmetro por referancia
3s paranteses so utilizados para a"rupar elementos em uma epresso mudando a
ordem de precedancia da avaliao da epresso 6se"undo as re"ras matem/ticas por
eemplo7. Tambm servem para envolver os ar"umentos de uma funo. 1e&a a
documentao sobre precedancia de operadores para maiores detalhes.
3s colchetes so utilizados para especificar um elemento espec$fico de uma matriz. Por
eemplo0 A:G0A;0 refereTse ao elemento da matriz A na linha G0 coluna A.
As chaves so utilizadas para a especificao de matrizes literais ou blocos de c+di"o.
Por eemplo0 AMNI@F0AF0GFO cria uma matriz chamada A com tras elementos.
3 s$mbolo TK identifica um campo de um ar(uivo diferenciandoTo de uma vari/vel. Por
eemplo0 ,ENCTKnome refereTse ao campo nome do ar(uivo ,ENC. 'esmo (ue eista
uma vari/vel chamada nome0 o campo nome (ue ser/ acessado.
3 s$mbolo t identifica uma avaliao de epresso atravs de macro e visto em
detalhes na documentao sobre macrossubstituio.
3 s$mbolo c utilizado para indicar (ue durante a passa"em de uma vari/vel para uma
funo ou procedimento ela se&a tomada como uma referancia e no como valor.
Operadores de Atri#uic^o
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
3s operadores utilizados em AdvPl para atribuio de valores a vari/veis de mem+ria
soM
N Atribuio )imples
MN Atribuio em Linha
jN Adio e Atribuio em Linha
TN )ubtrao e Atribuio em Linha
VN 'ultiplicao e Atribuio em Linha
DN Diviso e Atribuio em Linha
VVN ou vN .ponenciao e Atribuio em Linha
wN '+dulo 6resto da diviso7 e Atribuio em Linha
Atri#ui()o Si,p$es
3 sinal de i"ualdade utilizado para atribuir valor a uma vari/vel de mem+ria.
nVariavel = 10
Atri#ui()o e, Li"a
3 operador de atribuio em linha caracterizado por dois pontos e o sinal de
i"ualdade. Tem a mesma funo do sinal de i"ualdade sozinho0 porm aplia a atribuio
is vari/veis. Com ele podeTse atribuir mais de uma vari/vel ao mesmo tempo.
nVar1 := nVar2 := nVar3 := 0
Zuando diversas vari/veis so inicializadas em uma mesma linha0 a atribuio comea
da direita para a es(uerda0 ou se&a0 n1arG recebe o valro zero inicialmente0 n1arA
recebe o conte%do de n1arG e n1ar@ recebe o conte%do de n1arA por final.
Com o operador de atribuio em linha0 podeTse substituir as inicializaYes individuais
de cada vari/vel por uma inicializao apenasM
Local nVar1 := 0, nVar2 := 0, nVar3 := 0
por
Local nVar1 := nVar2 := nVar3 := 0
3 operador de atribuio em linha tambm pode ser utilizado para substituir valores de
campos em um banco de dados.
Atri#ui()o Co,posta
3s operadores de atribuio composta so uma facilidade da lin"ua"em AdvPl para
epressYes de c/lculo e atribuio. Com eles podeTse economizar di"itaoM
3perador .emplo .(uivalente a
jN ] jN ^ ] N ] j ^
TN ] TN ^ ] N ] T ^
VN ] VN ^ ] N ] V ^
DN ] DN ^ ] N ] D ^
VVN ou vN ] VVN ^ ] N ] VV ^
wN ] wN ^ ] N ] w ^
Operadores de I"cre,e"toH%ecre,e"to
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
A lin"ua"em AdvPl possui operadores para realizar incremento ou decremento de
vari/veis. .ntendeTse por incremento aumentar o valor de uma vari/vel numrica em @ e
entendeTse por decremento diminuir o valor da vari/vel em @. 3s operadores soM
jj 9ncremento P+s ou PrTfiado
TT Decremento P+s ou PrTfiado
3s operadores de decrementoDincremento podem ser colocados tanto antes 6prTfiado7
como depois 6p+sTfiado7 do nome da vari/vel. Dentro de uma epresso0 a ordem do
operador muito importante0 podendo alterar o resultado da epresso. 3s operadores
incrementais so eecutados da es(uerda para a direita dentro de uma epresso.
Local nA := 10
Local nB := nA++ + nA
3 valor da vari/vel n- resulta em A@0 pois a primeira referancia a nA 6antes do jj7
continha o valor @F (ue foi considerado e imediatamente aumentado em @. Na se"unda
referancia a nA0 este &/ possu$a o valor @@. 3 (ue foi efetuado foi a soma de @F mais @@0
i"ual a A@. 3 resultado final ap+s a eecuo destas duas linhas a vari/vel n-
contendo A@ e a vari/vel nA contendo @@.
No entantoM
Local nA := 10
Local nB := ++nA + nA
8esulta em AA0 pois o operador incremental aumentou o valor da primeira nA antes (ue
seu valor fosse considerado.
Orde, de Precede"cia dos Operadores
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
Dependendo do tipo de operador0 eiste uma ordem de precedancia para a avaliao dos
operandos. .m princ$pio0 todas as operaYes com os operadores so realizadas da
es(uerda para a direita se eles tiverem o mesmo n$vel de prioridade.
A ordem de precedancia0 ou n$vel de prioridade de eecuo0 dos operadores em AdvPl
M
@. 3peradores de 9ncrementoDDecremento prTfiado
A. 3peradores de )trin"
G. 3peradores 'atem/ticos
H. 3peradores 8elacionais
B. 3peradores L+"icos
<. 3peradores de Atribuio
=. 3peradores de 9ncrementoDDecremento p+sTfiado
.m epressYes compleas com diferentes tipos de operadores0 a avaliao se"uir/ essa
se(uancia. Caso eista mais de um operador do mesmo tipo 6ou se&a0 de mesmo n$vel70 a
avaliao se d/ da es(uerda para direita. Para os operadores matem/ticos entretanto h/
uma precedancia a se"uirM
@. .ponenciao
A. 'ultiplicao e Diviso
G. Adio e )ubtrao
Considere o eemploM
Local nResultado := 2+10/2+5*3+2^3
3 resultado desta epresso GF0 pois primeiramente calculada a eponenciao
AvG6N>70 ento so calculadas as multiplicaYes e divisYes @FDA6NB7 e BVG6N@B70 e
finalmente as adiYes resultando em AjBj@Bj>6NGF7.
A$tera()o da PrecedU"cia
A utilizao de paranteses dentro de uma epresso altera a ordem de precedancia dos
operadores. 3perandos entre paranteses so analisados antes dos (ue se encontram fora
dos paranteses. )e eistirem mais de um con&unto de paranteses noTaninhados0 o "rupo
mais a es(uerda ser/ avaliado primeiro e assim sucessivamente.
Local nResultado := (2+10)/(2+5)*3+2^3
No eemplo acima primeiro ser/ calculada a eponenciao AvG6N>7. .m se"uida
Aj@F6N@A7 ser/ calculado0 AjB6N=7 calculado0 e finalmente a diviso e a multiplicao
sero efetuadas0 o (ue resulta em @AD=VGj>6N@G.@H7.
)e eistirem v/rios paranteses aninhados0 ou se&a0 colocados um dentro do outro0 a
avaliao ocorrer/ do paranteses mais intero em direo ao mais eterno.
B$ocos de Codi3o
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
-locos de c+di"o so um conceito eistente h/ muito tempo em lin"ua"ens -ase. No
como al"o (ue apareceu da noite para o dia0 e sim uma evoluo pro"ressiva utilizando
a combinao de muitos conceitos da lin"ua"em para a sua implementao.
U, Pri,eiro Le,#rete
3 AdvPl uma lin"ua"em baseada em funYes. ,unYes tam um valor de retorno.
Assim como o operador de atribuio MN.
Assim0 ao invs de escreverM
x := 10 // Atribui o valor 10 varivel chamada X
Alert("Valor de x: " + cValToChar(x))
PodeTse escreverM
// Atribui e ento exibe o valor da varivel X
Alert("Valor de x: " + cValtoChar(X := 10))
A epresso MN@F avaliada primeiro0 e ento seu resultado 6o valor de ]0 (ue a"ora
@F7 passada para a funo cvaltochar para a converso para caracter0 e em se"uida
para a funo alert para a eibio. Por causa desta re"ra de precedancia poss$vel
atribuir um valor a mais de uma var$avel ao mesmo tempoM
Z := Y := X := 0
Por causa dessa re"ra0 essa epresso avaliada como se fosse escrita assimM
Z := ( Y := (X := 0) )
Apesar do AdvPl avaliar epressYes da es(uerda para a direita0 no caso de atribuiYes
isso acontece ao contr/rio0 da direita para a es(uerda. 3 valor atribu$do i vari/vel ]0
(ue retorna o valor para ser atribu$do i vari/vel ^ e assim sucessivamente. PodeTse
dizer (ue o zero foi fpropa"ado atravs da epressof.
Outro Le,#rete
.m AdvPl podeTse &untar diversas linhas de c+di"o em uma %nica linha f$scia do
ar(uivo. Por eemplo0 o c+di"oM
If lAchou
Alert("Cliente encontrado!")
Endif
pode ser escrito assimM
If lAchou ; Alert("Cliente encontrado!") ; Endif
3 pontoTeTv$r"ula indica ao AdvPl (ue a nova linha de c+di"o est/ para comear. PodeT
se ento colocar diversas linhas l+"icas de c+di"o na mesma linha f$sica atravs do
editor de teto utilizado.
Apesar da possibilidade de se escrever todo o pro"rama assim0 em uma %nica linha
f$sica0 isto no recomendado pois dificulta a le"ibilidade do pro"rama e0
conse(Qentemente0 a manuteno.
Lista de E*pressAes
A evoluo dos blocos de c+di"o comea com as listas de epressYes. Nos eemplos a
se"uir0 o s$mbolo NNK indicar/ o retorno da epresso ap+s sua avaliao 6se&a para
atribuir em uma vari/vel0 eibir para o usu/rio ou imprimir em um relat+rio70 (ue ser/
impresso em um relat+rio por eemplo.
Duas Lin)as e C2igo
@00,00 PSAY x := 10 ==> 10
@00,00 PSAY y := 20 ==> 20
Cada uma das linhas ter/ a epresso avaliada0 e o valor da vari/vel ser/ ento
impresso.
Duas Lin)a e C2igo em 3ma 4 3tili5ano Ponto-e-67rgula
.ste o mesmo c+di"o (ue o anterior0 apenas escrito em uma %nica linhaM
Alert( cValToChar( x := 10 ; y := 20 ) ) ==> 10
Apesar desse c+di"o se encontrar em uma %nica linha f$sica0 eistem duas linhas l+"icas
separadas pelo ponto e v$r"ula. 3u se&a0 esse c+di"o e(uivalente aM
Alert( cValToChar( x := 10 ) )
y := 20
Portanto apenas o valor @F da vari/vel ser/ passado para as funYes cvaltochar e alert
para ser eibido. . o valor AF apenas ser/ atribu$do i vari/vel P.
Con&erteno (ara uma Lista e E0(resses
Zuando paranteses so colocados ao redor do c+di"o e o sinal de pontoTeTv$r"ula
substitu$do por uma v$r"ula apenas0 o c+di"o tornaTse uma lista de epressYesM
Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) ==> 20
3 valor de retorno resultante de uma lista de epressYes o valor resultante da %ltima
epresso ou elemento da lista. ,unciona como se fosse um pe(ueno pro"rama ou
funo0 (ue retorna o resultado de sua %ltima avaliao 6efetuadas da es(uerda para a
direita7.
Neste eemplo0 a epresso MN @F avaliada0 e ento a epresso P MN AF0 cu&o valor
resultante passado para a funo alert e cvaltochar0 e ento eibido. Depois (ue essa
linha de c+di"o eecutada0 o valor de ] i"ual a @F e o de P i"ual a AF0 e AF ser/
eibido.
Teoricamente0 no h/ limitao para o n%mero de epressYes (ue podem ser
combinadas em uma lista de epressYes. Na pr/tica0 o n%mero m/imo por volta de
BFF s$mbolos.
Debu"ar listas de epressYes dif$cil opr(ue as epressYes no esto divididas em
linhas de c+di"o fonte0 o (ue torna todas as epressYes associadas a uma mesma linha
de c+di"o. 9sto pode tornar muito dif$cil determinar onde um erro ocorreu.
One Poe-se 3tili5ar uma Lista e E0(resses8
3 prop+sito principal de uma lista de epressYes a"rup/Tlas em uma %nica unidade.
.m (ual(uer lu"ar do c+di"o AdvPl (ue uma epresso simples pode ser utilizada0
podeTse utilizar uma lista de epressYes. . ainda0 podeTse fazer com (ue v/rias coisas
aconteam onde normalmente apenas uma aconteceria.
X := 10 ; Y := 20
If X > Y
Alert("X")
Z := 1
Else
Alert("Y")
Z := -1
Endif
A(ui temos o mesmo conceito0 escrito utilizando listas de epressYes na funo iifM
X := 10 ; Y := 20
iif( X > Y , ;
( Alert("X"), Z := 1 ) , ;
( Alert("Y"), Z := -1 ) )
%e Listas de E*pressAes para B$ocos de CBdi3o
Considere a se"uinte lista de epressYesM
Alert( cValToChar( ( x := 10, y := 20 ) ) ) ==> 20
3 AdvPl permite criar funYes0 (ue so pe(uenos pedaos de c+di"o0 como se fosse um
pe(ueno pro"rama0 utilizados para diminuir partes de tarefas mais compleas e
reaproveitar c+di"o em mais de um lu"ar num pro"rama. Para maiores detalhes consulte
a documentao sobre a criao de funYes em AdvPl. Porm0 a idia neste momento
(ue a lista de epressYes utilizada na linha anterior pode ser criada como uma funoM
Function Lista()
X := 10
Y := 20
Return Y
. a linha de eemplo com a lista de epressYes pode ser substitu$da0 tendo o mesmo
resultado0 porM
Alert( cValToChar( Lista() ) ) ==> 20
Como mencionado anteriormente0 uma lista de epressYes como um pe(ueno
pro"rama ou funo. Com poucas mudanas0 uma lista de epressYes pode se tornar um
bloco de c+di"oM
( X := 10 , Y := 20 ) // Lista de Expresses
{|| X := 10 , Y := 20 } // Bloco de Cdigo
Note as chaves IO utilizadas no bloco de c+di"o. 3u se&a0 um bloco de c+di"o uma
matriz. Porm na verdade0 no uma lista de dados0 e sim uma lista de comandos0 uma
lista de c+di"o.
// Isto uma matriz de dados
A := {10, 20, 30}
// Isto um bloco de cdigo, porm funciona como
// se fosse uma matriz de comandos
B := {|| x := 10, y := 20}
E0e-utano um Blo-o e C2igo
Diferentemente de uma matriz0 no se pode acessar elementos de um bloco de c+di"o
atravs de um $ndice numrico. Porm blocos de c+di"o so semelhantes a uma lista de
epressYes0 e a uma pe(uena funo. 3u se&a0 podem ser eecutados. Para a eecuo0
ou avaliao0 de um bloco de c+di"o0 deveTse utilizar a funo evalM
nRes := Eval(B) ==> 20
.ssa funo recebe como parCmero um bloco de c+di"o e avalias todas as epressYes
contidas neste bloco de c+di"o0 retornando o resultado da %ltima epresso avaliada.
Passano Par1metros
4/ (ue blocos de c+di"o so como pe(uenas funYes0 tambm poss$vel a passa"em de
parCmetros para um bloco de c+di"o. 3s parCmetros devem ser informados entre as
barras verticais 6JJ7 separados por v$r"ulas0 assim como em uma funo.
B := {| N | X := 10, Y := 20 + N}
Porm deveTse notar (ue &/ (ue o bloco de c+di"o recebe um parCmetro0 um valor deve
ser passado (uando o bloco de c+di"o for avaliado.
C := Eval(B, 1) ==> 21
3tili5ano Blo-os e C2igo
-locos de c+di"o podem ser utilizados em diversas situaYes. 5eralmente so utilizados
para eecutar tarefas (uando eventos de ob&etos so acionados ou para modificar o
comportamento padro de al"umas funYes.
Por eemplo0 considere a matriz abaioM
A := {"GARY HALL", "FRED SMITH", "TIM JONES"}
.sta matriz pode ser ordenada pelo primeiro nome0 utilizandoTse a chamada da funo
asort6A70 resultado na matriz com os elementos ordenados dessa formaM
{"FRED SMITH", "GARY HALL", "TIM JONES"}
A ordem padro para a funo asort ascendente. .ste comportamento pode ser
modificado atravs da informao de um bloco de c+di"o (ue ordena a matriz de forma
descendenteM
B := { |X, Y| X > Y }
aSort(A, B)
3 bloco de c+di"o 6de acordo com a documentao da funo asort7 deve ser escrito
para aceitar dois parCmetros (ue so os dois elementos da matriz para comparao. Note
(ue o bloco de c+di"o no conhece (ue elementos est/ comparando T a funo asort
seleciona os elementos 6talvez utilizando o al"or$tmo Zuic2)ort7 e passaTos para o
bloco de c+di"o. 3 bloco de c+di"o comparaTos e retorna verdadeiro 6.T.7 se se
encontram na ordem correta0 ou falso 6.,.7 se no. )e o valor de retorno for falso0 a
funo asort ir/ ento trocar os valores de lu"ar e se"uir comparando o pr+imo par de
valores.
.nto0 no bloco de c+di"o anterior0 a comparao ] K ^ verdadeira se os elementos
esto em ordem descendente0 o (ue si"nifica (ue o primeiro valor maior (ue o
se"undo.
Para ordenar a mesma matriz pelo %ltimo nome0 tambm em ordem descendente0 podeT
se utilizar o se"uinte bloco de c+di"oM
B := { |X, Y| Substr(X,At(" ",X)+1) > Substr(Y,At(" ",Y)+1) }
Note (ue este bloco de c+di"o procura e compara as partes dos caracteres
imediatamente se"uinte a um espao em branco. Depois de utilizar esse bloco de c+di"o
para a funo asort0 a matriz conter/M
{"GARY HALL", "TIM JONES", "FRED SMITH"}
,inalmente0 para ordenar um subTelemento 6coluna7 de uma matriz por eemplo0 podeT
se utilizar o se"uinte bloco de c+di"oM
B := { |X, Y| X[1] > Y[1] }
Criac^o e Atri#uic^o de Varia.eis
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
1ari/veis de mem+ria so um dos recursos mais importantes de uma lin"ua"em. )o
/reas de mem+ria criadas para armazenar informaYes utilizadas por um pro"rama para
a eecuo de tarefas. Por eemplo0 (uando o usu/rio di"ita uma informao (ual(uer0
como o nome de um produto0 em uma tela de um pro"rama esta informao
armazenada em uma vari/vel de mem+ria para posteriormente ser "ravada ou impressa.
A partir do momento (ue uma vari/vel criada0 no necess/rio mais se referenciar ao
seu conte%do0 e sim ao seu nome. 3 nome de uma vari/vel um identificador %nico (ue
se"ue duas re"ras re"rasM
M?*i,o de CD caracteres0 3 AdvPl no impede a criao de uma vari/vel de mem+ria
cu&o nome contenha mais de @F caracteres0 porm apenas os @F primeiros sero
considerados para a localizao do conte%do armazenado. Portanto se forem criadas
duas vari/veis cu&os @F primeiros caracteres forem i"uais0 como nTotal5eralAnual e
nTotal5eral'ensal0 as referancias a (ual(uer uma delas no pro"rama resultaro o
mesmo. 3u se&a0 sero a mesma vari/velM

nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))
Zuando o conte%do da vari/vel nTotal5eral'ensal eibido0 o seu valor ser/ de GFF.
9sso acontece por(ue no momento (ue esse valor foi atribuido i vari/vel
nTotal5eralAnual0 o AdvPl considerou apenas os @F primeiros caracteres 6assim como
o faz (uando deve eibir o valor da vari/vel nTotal5eral'ensal70 ou se&a0 considerouTas
como a mesma vari/vel. Assim o valor ori"inal de @FF foi substituido pelo de GFF.
Li,ita()o de caracteres "o "o,e0 3s nomes das vari/veis devem sempre comear por
uma letra ou o caracter de sublinhado 6 k 7. No restante0 pode conter letras0 n%meros e o
caracter de sublinhado. Zual(uer outro caracter0 incluindo espaos em branco0 no so
permitidos.
3 AdvPl permite a criao ilimitada de vari/veis0 dependendo apenas da mem+ria
dispon$vel. A se"uir esto al"uns nomes v/lidos para vari/veisM

TOT01
cNumero
VAR_QUALQUER
M_CARGO
A11
. al"uns inv/lidosM

1CODIGO (Inicia por um nmero)
M CARGO (contm um espao em branco)
LOCAL (palavra reservada do AdvPl)
3 AdvPl no uma lin"ua"em de tipos r$"idos para vari/veis0 ou se&a0 no necess/rio
informar o tipo de dados (ue determinada vari/vel ir/ conter no momento de sua
declarao0 e o seu valor pode mudar durante a eecuo do pro"rama. Tambm no h/
necessidade de declarar vari/veis em uma seo espec$fica do seu c+di"o fonte0 embora
se&a aconselh/vel declarar todas as vari/veis necess/rias no comeo0 tornando a
manuteno mais f/cil e evitando a declarao de vari/veis desnecess/rias.
Para declarar uma vari/vel deveTse utilizar um identificador de escopo0 se"uido de uma
lista de vari/veis separadas por v$r"ula 607. Em identificador de escopo uma palavra
chave (ue indica a (ue conteto do pro"rama a vari/vel declarada pertence. 3 conteto
de vari/veis pode ser local 6visualizadas apenas dentro do pro"rama atual70 p%blico
6visualizadas por (ual(uer outro pro"rama70 entre outros. 3s diferentes tipos de
conteto de vari/veis so eplicados na documentao sobre escopo de vari/veis.
Considere as linhas de c+di"o de eemploM

nResultado := 250 * (1 + (nPercentual / 100))
)e esta linha for eecutada em um pro"rama AdvPl0 ocorrer/ um erro de eecuo com
a mensa"em fvariable does not eistM nPercentualf0 pois esta vari/vel est/ sendo
utilizada em uma epresso de c/lculo sem ter sido declarada. Para solucionar este erro0
deveTse declarar a vari/vel previamenteM

Local nPercentual, nResultado
nResultado := 250 * (1 + (nPercentual / 100))
Neste eemplo0 as vari/veis so declaradas previamente utilizando o identificador de
escopo local. Zuando a linha de c/lculo for eecutada0 o erro de vari/vel no eistente
no mais ocorrer/. Porm vari/veis no inicializadas tam sempre o valor default nulo
6Nil7 e este valor no pode ser utilizado em um c/lculo pois tambm "erar/ erros de
eecuo 6nulo no pode ser dividido por @FF7. A resoluo deste problema efetuada
inicializandoTse a vari/vel atravs de uma das formasM

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

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

Local nPercentual := 10, nResultado
nResultado := 250 * (1 + (nPercentual / 100))
A diferena entre o %ltimo eemplo e os dois anteriores (ue a vari/vel inicializada
no momento da declarao. Nos dois primeiros eemplos0 a vari/vel primeiro
declarada e ento inicializada em uma outra linha de c+di"o. 3 comando store eiste
apenas por compatibilidade com versYes anteriores e outras lin"ua"ens -ase0 mas
obsoleto. DeveTse utilizar o operador de atribuio 6MN ou somente N7. X aconselh/vel
optar pelo operador de atribuio composto de dois pontos e sinal de i"ual0 pois o
operador de atribuio utilizando somente o sinal de i"ual pode ser facilmente
confundido com o operador relacional 6para comparao7 durante a criao do
pro"rama.
Ema vez (ue um valor lhe se&a atribu$do0 o tipo de dado de uma vari/vel i"ual ao tipo
de dado do valor atribu$do. 3u se&a0 uma vari/vel passa a ser numrica se um n%mero
lhe atribu$do0 passa a ser caracter se uma strin" de teto lhe for atribu$da0 etc. Porm
mesmo (ue uma vari/vel se&a de determinado tipo de dado0 podeTse mudar o tipo da
vari/vel atribuindo outro tipo a elaM

01 Local xVariavel // Declara a varivel inicialmente com valor nulo
02
03 xVariavel := "Agora a varivel caracter..."
04 Alert("Valor do Texto: " + xVariavel)
05
06 xVariavel := 22 // Agora a varivel numrica
07 Alert(cValToChar(xVariavel))
08
09 xVariavel := .T. // Agora a varivel lgica
10 If xVariavel
11 Alert("A varivel tem valor verdadeiro...")
12 Else
13 Alert("A varivel tem valor falso...")
14 Endif
15
16 xVariavel := Date() // Agora a varivel data
17 Alert("Hoje : " + DtoC(xVariavel))
18
19 xVariavel := nil // Nulo novamente
20 Alert("Valor nulo: " + xVariavel)
21
22 Return
No pro"rama de eemplo anterior0 a vari/vel 1ariavel utilizada para armazenar
diversos tipos de dados. A letra ff em min%sculo no comeo do nome utilizada para
indicar uma vari/vel (ue pode conter diversos tipos de dados0 se"undo a Notao
#%n"ara 6consulte documentao espec$fica para detalhes7. .ste pro"rama troca os
valores da vari/vel e eibe seu conte%do para o usu/rio atravs da funo alert. .ssa
funo recebe um parCmetro (ue deve ser do tipo strin" de caracter0 por isso
dependendo do tipo de dado da vari/vel 1ariavel necess/rio fazer uma converso
antes.
Apesar dessa fleibilidade de utilizao de vari/veis0 deveTse tomar cuidados na
passa"em de parCmetros para funYes ou comandos0 e na concatenao 6ou soma7 de
valores. Note a linha AF do pro"rama de eemplo. Zuando esta linha eecutada0 a
vari/vel 1ariavel contem o valor nulo. A tentativa de soma de tipos de dados
diferentes "era erro de eecuo do pro"rama. Nesta linha do eemplo0 ocorrer/ um
erro com a mensa"em ftPpe mismatch on jf. .cetuandoTse o caso do valor nulo0 para
os demais deveTse sempre utilizar funYes de converso (uando necessitaTse concatenar
tipos de dados diferentes 6por eemplo0 nas linhas F= e @=.
Note tambm (ue (uando uma vari/vel do tipo de dado l+"ico0 ela pode ser utilizada
diretamente para checa"em 6linha @F7M

If xVariavel
o mesmo (ue

If xVariavel = .T.
A declarao de vari/veis para os demais tipos de dados0 matrizes e blocos de c+di"o0
eatamente i"ual ao descrito at a"ora. Apenas eistem al"umas diferenas (uanto a
inicializao0 (ue podem ser consultadas na documentao de inicializao de matrizes
e blocos de c+di"o.
%i&ere"ciac^o e"tre .aria.eis e "o,es de
ca,pos
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
'uitas vezes uma vari/vel pode ter o mesmo nome (ue um campo de um ar(uivo ou
tabela aberto no momento. Neste caso0 o AdvPl privile"iar/ o campo. Assim uma
referancia a um nome (ue identifi(ue tanto uma vari/vel como um campo0 resultar/ no
conte%do do campo.
Para especificar (ual deve ser o elemento referenciado0 deveTse utilizar o operador de
identificao de apelido 6TK7 e um dos dois identificadores de referancia0 '.'1A8 ou
,9.LD.
cRes := MEMVAR->NOME
.sta linha de comando identifica (ue o valor atribu$do i vari/vel c8es deve ser o valor
da vari/vel de mem+ria chamada N3'..
cRes := FIELD->NOME
Neste caso0 o valor atribu$do i vari/vel c8es ser/ o valor do campo N3'. eistente no
ar(uivo ou tabela aberto na /rea atual.
3 identificador ,9.LD pode ser substitu$do pelo apelido de um ar(uivo ou tabela
aberto0 para evitar a necessidade de selecionar a /rea antes de acessar o conte%do de
terminado campo.
cRes := CLIENTES->NOME
Para maiores detalhes sobre abertura de ar(uivos com atribuio de apelidos0 consulte a
documentao sobre acesso a banco de dados ou a documentao da funo dbEseArea.
I"icia$i7a"do Matri7es
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
Al"umas vezes o tamanho da matriz conhecido previamente. 3utras vezes o tamanho
da matriz s+ ser/ conhecido em tempo de eecuo.
)e o tamanho da matriz conhecido
)e o tamanho da matriz conhecido no momento (ue o pro"rama escrito0 h/ diversas
maneiras de implementar o c+di"o.

01 Local nCnt
02 Local aX[10]
03 Local aY := Array(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
.ste c+di"o preenche a matriz com uma tabela de (uadrados. 3s valores sero @0 H0 ?0
@< ... >@0 @FF. Note (ue a linha F= se refere i vari/vel a]0 mas poderia tambm
trabalhar com a^ ou a\. 3 ob&etivo deste eemplo demonstrar trys modos de criar
uma matriz de tamanho conhecido no momento da criao do c+di"o.
Na linha FA a matriz criada usando a]:@F;. 9sto indica ao AdvPl para alocar espao
para @F elementos na matriz. 3s colchetes : e ; so utilizados para indicar o tamanho
necess/rio.
Na linha FG utilizada a funo arraP com o parCmetro @F para criar a matriz0 e o
retorno desta funo atribu$do i vari/vel a^.
Na linha FG efetuado o (ue se chama fdesenhar a ima"en da matrizf. Como podeTse
notar0 eistem dez Fzs na lista encerrada entre chaves 6IO7. Claramente0 este mtodo no
o utilizado para criar uma matriz de @FFF elementos. 3 terceiro mtodo difere dos
anteriores por(ue inicializa a matriz com os valores definitivos. Nos dois primeiros
mtodos0 cada posio da matriz contm um valor nulo 6Nil7 e deve ser inicializado
posteriormente.
A linha F= demonstra como um valor pode ser atribu$do para uma posio eistente em
uma matriz especificando o $ndice entre colchetes.
)e o tamanho da matriz no conhecido
)e o tamanho da matriz no conhecido at o momento da eecuo do pro"rama0 h/
al"umas maneiras de criar uma matriz e adicionar elementos a ela. 3 eemplo a se"uir
ilustra a idia de criao de uma matriz vazia 6sem nenhum elemento7 e adio de
elementos dinamicamente.

01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
07 aAdd(aX,nCnt*nCnt)
08 Next nCnt
A linha FA utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum
elemento0 seu tipo de dado matriz.
Na linha FG a chamada da funo arraP cria uma matriz sem nenhum elemento.
Na linha FH est/ declarada a representao de uma matriz vazia em AdvPl. 'ais uma
vez0 esto sendo utilizadas as chaves para indicar (ue o tipo de dados da vari/vel
matriz. Note (ue IO uma matriz vazia 6tem o tamanho F70 en(uanto INilO uma
matriz com um %nico elemento nulo 6tem tamanho @7.
Por(ue cada uma destas matrizes no contem elementos0 a linha F= utiliza a funo aadd
para adicionar elementos sucessivamente at o tamanho necess/rio 6especificado por
eemplo na vari/vel n)ize7.
Matri7es
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
'atrizes0 ou arraPs0 so coleYes de valores. 3u0 de uma maneira mais f/cil de
entender0 uma lista. Ema matriz pode ser criada atravs de diferentes maneiras.
Consulte a documentao sobre 9nicializao de 'atrizes para maiores detalhes.
Cada item em uma matriz referenciado pela indicao de sua posio numrica na
lista0 iniciando pelo n%mero @. 3 eemplo a se"uir declara uma vari/vel0 atribui uma
matriz de tras elementos a ela0 e ento eibe um dos elementos e o tamanho da matrizM
Local aLetras // Declarao da varivel
aLetras := {"A", "B", "C"} // Atribuio da matriz varivel
Alert(aLetras[2]) // Exibe o segundo elemento da matriz
Alert(cValToChar(Len(aLetras))) // Exibe o tamanho da matriz
3 AdvPl permite a manipulao de matrizes facilmente. .n(uanto (ue em outras
lin"ua"ens como C ou Pascal necess/rio alocar mem+ria para cada elemento de uma
matriz 6o (ue tornaria a utilizao de fpointeirosf necess/ria70 o AdvPl se encarre"a de
"erenciar a mem+ria e torna simples adicionar elementos a uma matriz0 utilizando a
funo aAddM
aAdd(aLetras,"D") // Adiciona o quarto elemento ao final da matriz
Alert(aLetras[4]) // Exibe o quarto elemento
Alert(aLetras[5]) // Erro! No h um quinto elemento na matriz
Matri7es co,o Estruturas
Ema caracter$stica interessante do AdvPl (ue uma matriz pode conter (ual(uer coisaM
n%meros0 datas0 l+"icos0 caracteres0 ob&etos0 etc. . ao mesmo tempo. .m outras
palavras0 os elementos de uma matriz no precisam ser necessariamente do mesmo tipo
de dado0 em contraste com outras lin"ua"ens como C e Pascal.
aFunct1 := {"Pedro",32,.T.}
.sta matriz contem uma strin"0 um n%mero e um valor l+"ico. .m outras lin"ua"ens
como C ou Pascal0 este fpacotef de informaYes pode ser chamado como um fstructf
6estrutura em C0 por eemplo7 ou um frecordf 6re"istro em Pascal0 por eemplo7. Como
se fosse na verdade um re"istro de um banco de dados0 um pacote de informaYes
constru$do com diversos campos. Cada campo tendo um pedao diferente de dado.
)uponha (ue no eemplo anterior0 o arraP a,unct@ contenha informaYes sobre o nome
de uma pessoa0 sua idade e sua situao matrimonial. 3s se"uintes ldefines podem ser
criados para indicar cada posio dos valores dentro da matrizM
#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
. considere mais al"umas matrizes para representar mais pessoasM
aFunct2 := {"Maria" , 22, .T.}
aFunct3 := {"Antnio", 42, .F.}
3s nomes podem ser impressos assimM
Alert(aFunct1[FUNCT_NOME])
Alert(aFunct2[FUNCT_NOME])
Alert(aFunct3[FUNCT_NOME])
A"ora0 ao invs de trabalhar com vari/veis individuais0 podeTse a"rup/Tlas em uma
outra matriz0 do mesmo modo (ue muitos re"istros so a"rupados em uma tabela de
banco de dadosM
aFuncts := {aFunct1, aFunct2, aFunct3}
Zue e(uivalente a issoM
aFuncts := { {"Pedro" , 32, .T.}, ;
{"Maria" , 22, .T.}, ;
{"Antnio", 42, .F.} }
a,uncts uma matriz com G linhas por G colunas. Ema vez (ue as vari/veis separadas
foram combinadas em uma matriz0 os nomes podem ser eibidos assimM
Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount,FUNCT_NOME])
// O acesso a elementos de uma matriz multidimensional
// pode ser realizado tambm desta forma:
// aFuncts[nCount][FUNCT_NOME]
Next nCount
A vari/vel nCount seleciona (ue funcion/rio 6ou (ue linha7 de interesse. .nto a
constante ,ENCTkN3'. seleciona a primeira coluna da(uela linha.
Cuidados co, Matri7es
'atrizes so listas de elementos0 portanto mem+ria necess/ria para armazenar estas
informaYes. Como as matrizes podem ser multidimensionais0 a mem+ria necess/ria
ser/ a multiplicao do n%mero de itens em cada dimenso da matriz0 considerandoTse o
tamanho do conte%do de cada elemento contido nesta. Portanto o tamanho de uma
matriz pode variar muito.
A facilidade da utilizao de matrizes0 mesmo (ue para armazenar informaYes em
pacotes como descrito anteriormente0 no compensada pela utilizao em mem+ria
(uando o n%mero de itens em um arraP for muito "rande. Zuando o n%mero de
elementos for muito "rande deveTse procurar outras soluYes0 como a utilizao de um
ar(uivo de banco de dados tempor/rio.
No h/ limitao para o n%mero de dimensYes (ue uma matriz pode ter0 mas o n%mero
de elementos m/imo 6independentes das dimensYes onde se encontram7 de @FFFFF.
Tipos de %ados
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
3 AdvPl no uma lin"ua"em de tipos r$"idos 6stron"lP tPped70 o (ue si"nifica (ue
vari/veis de mem+ria podem diferentes tipos de dados durante a eecuo do pro"rama.
1ari/veis podem tambm conter ob&etos0 mas os tipos prim/rios da lin"ua"em soM
Numrico
L+"ico
Caracter
Data
'atriz 6ArraP7
-loco de C+di"o
Num9ri-o
3 AdvPl no diferencia valores inteiros de valores com ponto flutuante0 portanto podeT
se criar vari/veis numricas com (ual(uer valor dentro do intervalo permitido. 3s
se"uintes elementos so do tipo de dado numricoM
2
43.53
0.5
0.00001
1000000
Ema vari/vel do tipo de dado numrico pode conter um n%mero de dezoito d$"itos
incluindo o ponto flutuante0 no intervalo de A.AABF=G>B>BF=AF@H .{GF> at
@.=?=<?G@GH><AG@B> .jGF>.
L2gi-o
1alores l+"icos em AdvPl so identificados atravs de .T. ou .^. para verdadeiro e .,.
ou .N. para falso 6independentemente se os caracteres estiverem em mai%sculo ou
min%sculo7.
Cara-ter
)trin"s ou cadeias de caracteres so identificadas em AdvPl por blocos de teto entre
aspas duplas 6f7 ou aspas simples 6_7M
"Ol mundo!"
'Esta uma string'
"Esta 'outra' string"
Ema vari/vel do tipo caracter pode conter strin"s com no m/imo @ 'b0 ou se&a0
@FH>B=< caracteres.
Data
3 AdvPl tem um tipo de dados espec$fico para datas. 9nternamente as vari/veis deste
tipo de dado so armazenadas como um n%mero correspondente a data 4uliana.
1ari/veis do tipo de dados Data no podem ser declaradas diretamente0 e sim atravs da
utilizao de funYes espec$ficas como por eemplo ctod (ue converte uma strin" para
data.
+atri5 #Arra:$
'atrizes so um tipo de dado especial. X a disposio de outros elementos em colunas e
linhas. 3 AdvPl suporta matrizes uni ou multidimensionais. 3s elementos de uma
matriz so acessados atravs de $ndices numricos iniciados em @0 identificando a linha
e coluna para (uantas dimenYes eistirem.
Ema matriz pode conter no m/imo @FFFFF elementos0 independentemente do n%mero
de dimensYes.
'atrizes devem ser utilizadas com cautela0 pois se forem muito "randes podem eaurir
a mem+ria do servidor.
Blo-o e C2igo
3 bloco de c+di"o um tipo de dado especial. X utilizado para armazenar instruYes
escritas em AdvPl (ue podero ser eecutadas posteriormente.
ESCOPO %E V_RIAVEIS
O Co"te*to de Varia.eis de"tro de u,
Pro3ra,a
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
As vari/veis declaradas em um pro"rama ou funo0 so vis$veis de acordo com o
escopo onde so definidas. Como tambm do escopo depende o tempo de eistancia das
vari/veis. A definio do escopo de uma vari/vel efetuada no momento de sua
declarao.
Local nNumero := 10
.sta linha de c+di"o declara uma vari/vel chamada nNumero indicando (ue pertence
seu escopo local.
3s identifadores de escopo soM
L3CAL
)TAT9C
P891AT.
PE-L9C
3 AdvPl no r$"ido em relao i declarao de vari/veis no comeo do pro"rama. A
incluso de um identificador de escopo no necess/rio para a declarao de uma
vari/vel0 contanto (ue um valor lhe se&a atribu$do.
nNumero2 := 15
Zuando um valor atribu$do i uma vari/vel em um pro"rama ou funo0 o AdvPl criar/
a vari/vel caso ela no tenha sido declarada anteriormente. A vari/vel ento criada
como se tivesse sido declarada como Private.
Devido a essa caracter$stica0 (uando pretendeTse fazer uma atribuio a uma vari/vel
declarada previamente mas escreveTse o nome da vari/vel de forma incorreta0 o AdvPl
no "erar/ nenhum erro de compilao ou de eecuo. Pois compreender/ o nome da
vari/vel escrito de forma incorreta como se fosse a criao de uma nova vari/vel. 9sto
alterar/ a l+"ica do pro"rama0 e um erro muitas vezes dif$cil de identificar.
Varia.eis Estaticas
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
1ari/veis est/ticas funcionam basicamente como as vari/veis locais0 mas mantam seu
valor atravs da eecuo. 1ari/veis est/ticas devem ser declaradas eplicitamente no
c+di"o com o identificador )TAT9C.
3 escopo das vari/veis est/ticas depende de onde so declaradas. )e forem declaradas
dentro do corpo de uma funo ou procedimento0 seu escopo ser/ limitado i(uela
rotina. )e forem declaradas fora do corpo de (ual(uer rotina0 seu escopo todo o
ar(uivo de pro"rama.
Neste eemplo0 a vari/vel n1ar declarada como est/tica e inicializada com o valor @FM
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Zuando a funo ,ilha eecutada0 n1ar ainda eiste mas no pode ser acessada.
Diferente de vari/veis declaras como L3CAL ou P891AT.0 n1ar continua a eistir e
mantem seu valor atual (uando a eecuo da funo Pai termina. .ntretanto0 somente
pode ser acessada por eecuYes subse(Qantes da funo Pai.
Varia.eis Locais
8evisoM FAD@ADAFFH
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
1ari/veis locais so pertencentes apenas ao escopo da funo onde foram declaradas.
Devem ser eplicitamente declaradas com o identificador L3CAL0 como no eemploM
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste eemplo0 a vari/vel n1ar foi declarada como local e atribu$da com o valor @F.
Zuando a funo ,ilha eecutada0 n1ar ainda eiste mas no pode ser acessada.
Zuando a eecuo da funo Pai terminar0 a vari/vel n1ar destru$da. Zual(uer
vari/vel com o mesmo nome no pro"rama (ue chamou a funo Pai no afetada.
1ari/veis locais so criadas automaticamente cada vez (ue a funo onde forem
declaradas for ativada. .las continuam a eistir e mantam seu valor at o fim da
ativao da funo 6ou se&a0 at (ue a funo retorne o controle para o c+di"o (ue a
eecutou7. )e uma funo chamada recursivamente 6por eemplo0 chama a si mesma70
cada chamada em recurso cria um novo con&unto de vari/veis locais.
A visibilidade de vari/veis locais idantica ao escopo de sua declarao. 3u se&a0 a
vari/vel vis$vel em (ual(uer lu"ar do c+di"o fonte em (ue foi declarada. )e uma
funo chamada recursivamente0 apenas as vari/veis locais criadas na mais recente
ativao so vis$veis.
A dec$ara()o de .ari?.eis $ocais de"tro de u,a &u"()o de.e preceder 1ua$1uer
co,a"do i"ter"o ou dec$ara()o de outros tipos de .ari?.eis 5Pri.ate ou Pu#$ic6 da
&u"()o caso co"tr?rio ser? 3erado u, erro de co,pi$a()o.
.emploM
,unction A6 7
Private MN F
Loca$ #2=D \\\\\ ERRA%O9 ERRO %E COMPILAL/O
...
8eturn
1erso corretaM
,unction A6 7
Loca$ #2=D HH correto
Private MNF
....
8eturn
Varia.eis Pri.adas
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
A declarao opcional para vari/veis privadas. 'as podem ser declaradas
eplicitamente com o identificador P891AT..
Adicionalmente0 a atribuio de valor a uma vari/vel no criada anteriormente
automaticamente cria a vari/vel como privada. Ema vez criada0 uma vari/vel privada
continua a eistir e mantem seu valor at (ue o pro"rama ou funo onde foi criada
termine 6ou se&a0 at (ue a funo onde foi criada retorne para o c+di"o (ue a eecutou7.
Neste momento0 automaticamente destru$da.
X poss$vel criar uma nova vari/vel privada com o mesmo nome de uma vari/vel &/
eistente. .ntretanto0 a nova 6duplicada7 vari/vel pode apenas ser criada em um n$vel de
ativao inferior ao n$vel onde a vari/vel foi declarada pela primeira vez 6ou se&a0
apenas em uma funo chamada pela funo onde a vari/vel &/ havia sido criada7. A
nova vari/vel privada ir/ esconder (ual(uer outra vari/vel privada ou p%blica 6ve&a a
documentao sobre vari/veis p%blicas7 com o mesmo nome en(uanto eistir.
Ema vez criada0 uma vari/vel privada vis$vel em todo o pro"rama en(uanto no for
destru$da automaticamente (uando a rotina (ue a criou terminar ou uma outra vari/vel
privada com o mesmo nome for criada em uma subfuno chamada 6neste caso0 a
vari/vel eistente tornaTse inacess$vel at (ue a nova vari/vel privada se&a destru$da7.
.m termos mais simples0 uma vari/vel privada vis$vel dentro da funo de criao e
todas as funYes chamadas por esta0 a menos (ue uma funo chamada crie sua pr+pria
vari/vel privada com o mesmo nome.
Por eemploM
Function Pai()
Private nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste eemplo0 a vari/vel n1ar criada como privada e inicializada com o valor @F.
Zuando a funo ,ilha eecutada0 n1ar ainda eiste e0 diferente de uma vari/vel local0
pode ser acessada pela funo ,ilha. Zuando a funo Pai terminar0 n1ar ser/ destru$da
e (ual(uer declarao de n1ar anterior se tornar/ acess$vel novamente.
Varia.eis Pu#$icas
8evisoM @GDF=DAFFA
Abran"ancia
1erso B.F= 1erso B.F> 1erso <.F? 1erso =.@F 1erso >.@@
1ersYes Anteriores
PodeTse criar vari/veis p%blicas dinamicamente no c+di"o com o identificador PE-L9C.
As vari/veis p%blicas continuam a eistir e mantam seu valor at o fim da eecuo.
X poss$vel criar uma vari/vel privada com o mesmo nome de uma vari/vel p%blica
eistente. .ntretanto0 no permitido criar uma vari/vel p%blica com o mesmo nome de
uma vari/vel privada eistente.
Ema vez criada0 uma vari/vel p%blica vis$vel em todo o pro"rama onde foi declarada
at (ue se&a escondida por uma vari/vel privada criada com o mesmo nome. A nova
vari/vel privada criada esconde a vari/vel p%blica eistente0 e esta se tornar/ inacess$vel
at (ue a nova vari/vel privada se&a destru$da. Por eemploM

Function Pai()
Public nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste eemplo0 n1ar criada como p%blica e inicializada com o valor @F. Zuando a
funo ,ilha eecutada0 n1ar ainda eiste e pode ser acessada. Diferente de vari/veis
locais ou privadas0 n1ar ainda eiste ap+s o trmino da a eecuo da funo Pai.
Diferentemente dos outros identificadores de escopo0 (uando uma vari/vel declarada
como p%blica sem ser inicializada0 o valor assumido falso 6.,.7 e no nulo 6nil7.

Você também pode gostar