Você está na página 1de 402

AdvPl________________________________________________________________1

ndice

A Tecnologia Protheus.......................................................................................................16
Caractersticas da Tecnologia Protheus..........................................................................16
As Camadas do Advanced Protheus................................................................................16
Servidor de Aplicao....................................................................................................17
Terminal Thin-Client ......................................................................................................17
Dados...............................................................................................................................17
Repositrio de Apos......................................................................................................17
Estruturao........................................................................................................................18
A estrutura de diretrios do Advanced Protheus ......................................................18
Verso AP5..................................................................................................................18
Verso AP6..................................................................................................................18
Aplicativos do Advanced Protheus...............................................................................19
Protheus Server..........................................................................................................19
Remote.........................................................................................................................19
IDE................................................................................................................................19
Monitor.........................................................................................................................19
Nomenclaturas Utilizadas..............................................................................................20
Topologia de Rede.............................................................................................................20
Caractersticas e Possibilidades de Topologias de Rede..........................................20
IDE - Integrated Development Environment.................................................................22
Caractersticas do IDE...................................................................................................22
Monitor.................................................................................................................................23
Informaes Bsicas das Conexes ............................................................................23
Btrieve..................................................................................................................................23
Informaes Bsicas......................................................................................................23
Configurao do Btrieve/PervasiveSQL2000:.............................................................24
CTree....................................................................................................................................26
Informaes Bsicas......................................................................................................26
ndices..............................................................................................................................26
Sistemas Operacionais e Plataformas (verso AP6 e posteriores) .............................27
Sistemas Operacionais e Plataformas.........................................................................27
Plataformas e SO's suportados................................................................................27
Novos SO's a serem suportados..............................................................................27
AdPl Guia de Programao............................................................................................28
A Linguagem AdvPl ............................................................................................................28
Programao Com Interface Prpria com o Usurio................................................28
Programao Sem Interface Prpria com o Usurio.................................................28
Programao por Processos.....................................................................................29
AdvPl________________________________________________________________2
Programao de RPC.................................................................................................29
Programao Web......................................................................................................29
Programao TelNet ..................................................................................................29
Sintaxe da Linguagem.......................................................................................................29
Edio de Programas.........................................................................................................29
Criao de um Programa..................................................................................................29
Linhas de Programa.......................................................................................................30
Linhas de Comando...................................................................................................30
Linhas de Comentrio................................................................................................30
Linhas Mistas...............................................................................................................31
Tamanho da Linha.........................................................................................................31
Estrutura de um Programa...............................................................................................31
A rea de Identificao.................................................................................................32
A rea de Ajustes Iniciais.............................................................................................32
O Corpo do Programa....................................................................................................33
A rea de Encerramento...............................................................................................33
Variveis de Memria........................................................................................................33
Tipos de Dados...................................................................................................................33
Numrico.........................................................................................................................33
Lgico...............................................................................................................................34
Caracter ...........................................................................................................................34
Data..................................................................................................................................34
Matriz (Array)..................................................................................................................34
Bloco de Cdigo..............................................................................................................34
Criao e Atribuio de Variveis ....................................................................................35
Matrizes................................................................................................................................37
Matrizes como Estruturas..............................................................................................38
Cuidados com Matrizes..................................................................................................40
Inicializando Matrizes.........................................................................................................40
Se o tamanho da matriz conhecido..........................................................................40
Se o tamanho da matriz no conhecido..................................................................41
Blocos de Cdigo................................................................................................................41
Um Primeiro Lembrete..................................................................................................41
Outro Lembrete..............................................................................................................42
Lista de Expresses........................................................................................................43
Duas Linhas de Cdigo..............................................................................................43
Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula..............................43
Convertendo para uma Lista de Expresses..........................................................43
Onde Pode-se Utilizar uma Lista de Expresses?..................................................44
De Listas de Expresses para Blocos de Cdigo.......................................................44
Executando um Bloco de Cdigo.............................................................................45
Passando Parmetros................................................................................................46
Utilizando Blocos de Cdigo......................................................................................46
Escopo de Variveis...........................................................................................................47
AdvPl________________________________________________________________3
O Contexto de Variveis dentro de um Programa........................................................47
Variveis Locais..................................................................................................................48
Variveis Estticas..............................................................................................................49
Variveis Privadas..............................................................................................................49
Variveis Pblicas...............................................................................................................50
Diferenciao entre variveis e nomes de campos.......................................................51
Operadores da Linguagem................................................................................................52
Operadores Comuns..........................................................................................................52
Operadores Matemticos..............................................................................................52
Operadores de String.....................................................................................................53
Operadores Relacionais.................................................................................................53
Operadores Lgicos .......................................................................................................53
Operadores de Atribuio.................................................................................................54
Atribuio Simples..........................................................................................................54
Atribuio em Linha.......................................................................................................54
Atribuio Composta......................................................................................................55
Operadores de Incremento/Decremento........................................................................55
Operadores Especiais.........................................................................................................56
Ordem de Precedncia dos Operadores.........................................................................57
Alterao da Precedncia..............................................................................................57
Macro Substituio.............................................................................................................58
Estruturas de Controle.......................................................................................................59
Controlando o Fluxo...........................................................................................................59
Estruturas de Repetio....................................................................................................59
Repetio de Comandos....................................................................................................59
O Comando FOR...NEXT....................................................................................................59
O Comando WHILE...ENDDO...........................................................................................61
Estruturas de Deciso........................................................................................................62
Desviando a Execuo.......................................................................................................62
O Comando IF...ENDIF......................................................................................................62
O Comando DO CASE...ENDCASE....................................................................................63
Informaes Adicionais.....................................................................................................64
Lista de Palavras Reservadas...........................................................................................64
Tcnicas de Programao Eficiente em AdvPl ...............................................................65
Criao de Funes Segundo a Necessidade.............................................................66
Codificao Auto-Documentvel ..................................................................................67
Utilizao de Solues Simples....................................................................................67
Opo por Flexibilidade.................................................................................................68
Opo da Praticidade ao Drama..................................................................................68
Utilizao de Operadores de Incremento/Decremento............................................68
Evitar Passos Desnecessrios.......................................................................................69
Utilizao de Alternativas..............................................................................................70
Utilizao de Arquivos de Cabealho Quando Necessrio.......................................71
Constantes em Maisculo.............................................................................................71
AdvPl________________________________________________________________4
Utilizao de Identao.................................................................................................71
Utilizao de Espaos em Branco................................................................................72
Quebra de Linhas Muito Longas ..................................................................................72
Capitulao de Palavras-Chave....................................................................................73
Utilizao da Notao Hngara....................................................................................73
Utilizao de Nomes Significantes para Variveis.....................................................73
Utilizao de Comentrios.............................................................................................73
Criao de Mensagens Sistmicas Significantes e Consistentes.............................74
Evitar Abreviao de Comandos em 4 letras.............................................................74
Evitar "Disfarces" no Cdigo.........................................................................................74
Evitar Cdigo de Segurana Desnecessrio...............................................................75
Isolamento de Strings de Texto...................................................................................76
Tabela de Pictures de Formatao..................................................................................76
Comando SAY/PSAY.......................................................................................................76
Comando GET.................................................................................................................76
Programao do AdvPl para o ERP Siga Advanced Protheus......................................77
Prefcio................................................................................................................................77
O Que Fazer um Programa com Inteligncia.........................................................78
Programando Simples, mas Certo...............................................................................79
Erros que Podem ser Evitados.....................................................................................79
A Importncia de Programas Documentados............................................................80
Cabealho de Programa / Funo................................................................................80
Criao de Variveis...........................................................................................................81
A Declarao...................................................................................................................81
O Tipo de Varivel..........................................................................................................81
Tipos Existentes..........................................................................................................81
Inicializao.....................................................................................................................82
Padronizao de Variveis............................................................................................82
Criando uma Varivel Utilizando a Funo CRIAVAR() ............................................82
Variveis de Relatrios..................................................................................................83
Cuidados com o Posicionamento de Registros..............................................................84
Funo Posicione............................................................................................................85
Funo Existcpo..............................................................................................................85
Restaurando ndice e limpando filtros........................................................................85
Outros Cuidados.................................................................................................................86
Confrontando relatrios e consultas............................................................................86
Problemas com Looping de Programas......................................................................86
Manipulao de Arquivos Externos ao Protheus .......................................................87
Desenvolvendo Telas.....................................................................................................88
Salvando Arrays padres..............................................................................................89
Pontos de Entrada..............................................................................................................89
Objetivo dos Pontos de Entrada..................................................................................89
Quando criar um Ponto de Entrada.............................................................................89
Sintaxe para criar um Ponto de Entrada: ...............................................................90
AdvPl________________________________________________________________5
Procedimentos para sua criao..................................................................................90
Contabilizando....................................................................................................................90
A Funo HeadProva......................................................................................................91
A funo DetProva() ......................................................................................................91
A funo RodaProva() ...................................................................................................91
Atualizando SX (ATUSX)....................................................................................................92
Exemplo de atualizao no SX: ....................................................................................92
SX1 - Parmetros Genricos.........................................................................................92
SX2 - Mapeamento dos arquivos.................................................................................92
SX3 - Dicionrio de Dados............................................................................................93
SX5 - Tabelas Genricas ...............................................................................................93
SX6 - Parmetros...........................................................................................................93
SX7 Gatilhos.................................................................................................................93
SXE/SXF - Seqncia. de documentos........................................................................93
SINDEX- Arquivo de ndices.........................................................................................93
Controle de Transao (TTS) ...........................................................................................93
O que ............................................................................................................................93
Quando usar....................................................................................................................93
Como usar .......................................................................................................................93
Onde no usar ................................................................................................................94
Comandos Definidos pelo Usurio (UDCs)...................................................................94
Uso de Strings.................................................................................................................95
Conceito de Filial e Compartilhamento de Arquivos.....................................................96
Arquivos Compartilhados..............................................................................................96
Arquivos Exclusivos........................................................................................................96
Tcnicas para Filtragem................................................................................................97
Chaves Primrias............................................................................................................97
Chaves Estrangeiras.......................................................................................................97
Integridade Referencial.................................................................................................97
Utilizando Rotinas Automticas........................................................................................98
Controle de Semforo........................................................................................................98
Atualizao do SourceSafe................................................................................................99
Procedimentos de Localizaes........................................................................................99
Procedimentos a serem cumpridos em alterao / desenvolvimento de
programas :.....................................................................................................................99
Programando com Schedule de Relatrios...................................................................100
Modelos de Programas Padronizados............................................................................100
Modelo 1............................................................................................................................101
Modelo 2............................................................................................................................103
Modelo 3............................................................................................................................111
Modelos de Relatrios .....................................................................................................125
Modelos de Clculos.........................................................................................................129
Funes bsicas da Linguagem......................................................................................138
AAdd...................................................................................................................................138
AdvPl________________________________________________________________6
ACopy.................................................................................................................................139
AClone................................................................................................................................140
ADel....................................................................................................................................141
ADir.....................................................................................................................................141
AEval...................................................................................................................................142
AFill.....................................................................................................................................144
AIns....................................................................................................................................145
Alias....................................................................................................................................145
Append From....................................................................................................................146
Array...................................................................................................................................148
AScan.................................................................................................................................149
ASize...................................................................................................................................151
ASort...................................................................................................................................152
ATail ...................................................................................................................................153
BTVCanOpen.....................................................................................................................153
BTVCreateDDFs................................................................................................................154
BTVDropIdxs.....................................................................................................................155
BTVTables..........................................................................................................................156
CDow..................................................................................................................................157
CMonth...............................................................................................................................157
Commit...............................................................................................................................158
Copy To..............................................................................................................................159
Copy File............................................................................................................................160
Copy Structure..................................................................................................................161
CPYS2T ..............................................................................................................................162
CPYT2S..............................................................................................................................163
CTreeDelIdxs.....................................................................................................................163
CTreeDellnt........................................................................................................................164
CurDir.................................................................................................................................165
Date....................................................................................................................................166
Day.....................................................................................................................................166
DBAppend..........................................................................................................................167
DBClearAllFilter.................................................................................................................168
DBClearFilter .....................................................................................................................169
DBCloseAll .........................................................................................................................169
DBCloseArea......................................................................................................................170
DBClearIndex....................................................................................................................170
DBCommit..........................................................................................................................171
DBCommitAll .....................................................................................................................171
DBCreate............................................................................................................................172
DBCreateIndex..................................................................................................................173
DBDelete............................................................................................................................174
DBEval................................................................................................................................174
DBF.....................................................................................................................................176
AdvPl________________________________________________________________7
DBFieldInfo........................................................................................................................176
DBFilter ..............................................................................................................................177
DBGoBottom......................................................................................................................178
DBGoTo..............................................................................................................................179
DBGoTop............................................................................................................................179
DBInfo................................................................................................................................180
DBOrderInfo......................................................................................................................181
DBOrderNickName...........................................................................................................182
DBRecall.............................................................................................................................183
DBRecordInfo....................................................................................................................183
DBReindex.........................................................................................................................184
DBRLock.............................................................................................................................185
DBRLockList.......................................................................................................................186
DBRunLock........................................................................................................................186
DbSeek...............................................................................................................................187
DBSetDriver.......................................................................................................................189
DBSetFilter.........................................................................................................................189
DBSetIndex.......................................................................................................................190
DBSetNickName................................................................................................................191
DBSetOrder .......................................................................................................................192
DBSkip................................................................................................................................193
DBStruct.............................................................................................................................194
DBUnlock...........................................................................................................................194
DBUnlockAll .......................................................................................................................195
Delete.................................................................................................................................195
Deleted...............................................................................................................................196
DevOutPict.........................................................................................................................197
DevPos...............................................................................................................................198
Directory............................................................................................................................198
DirRemove.........................................................................................................................200
DiskSpace..........................................................................................................................200
Dow....................................................................................................................................201
Dtoc....................................................................................................................................202
Dtos....................................................................................................................................203
Eject ...................................................................................................................................204
ElapTime............................................................................................................................204
FClose.................................................................................................................................205
FCreate...............................................................................................................................206
FErase................................................................................................................................207
FError .................................................................................................................................208
FieldBlock...........................................................................................................................209
FieldWbl .............................................................................................................................210
File......................................................................................................................................210
FOpen.................................................................................................................................211
AdvPl________________________________________________________________8
FOpenPort..........................................................................................................................213
FRead.................................................................................................................................215
FReadStr............................................................................................................................216
Frename.............................................................................................................................217
FSeek..................................................................................................................................218
FWrite.................................................................................................................................219
GetImpWindows...............................................................................................................220
GetPortActive....................................................................................................................220
GetClientDir.......................................................................................................................221
Header ...............................................................................................................................222
IndexKey............................................................................................................................222
IndexOrd............................................................................................................................223
InitPrint..............................................................................................................................223
IsPrinter .............................................................................................................................224
IsCisaSyncOn....................................................................................................................225
Locate.................................................................................................................................226
LUpdate..............................................................................................................................227
MakeDir..............................................................................................................................227
MemoLine..........................................................................................................................228
MemoRead.........................................................................................................................229
MemoWrite........................................................................................................................230
MLCount.............................................................................................................................231
Month.................................................................................................................................231
MsCompress......................................................................................................................232
MsCRC32............................................................................................................................233
MsCRC32Str.......................................................................................................................234
MsDecomp.........................................................................................................................235
OrdCondSet.......................................................................................................................236
OrdCreate..........................................................................................................................237
OrdDescend.......................................................................................................................238
OrdKey...............................................................................................................................239
OrdListAdd.........................................................................................................................240
PRow..................................................................................................................................241
Pack....................................................................................................................................242
PCol ....................................................................................................................................242
PreparePrint ......................................................................................................................243
PrnFlush.............................................................................................................................244
RDDSetDefault..................................................................................................................245
RealRDD.............................................................................................................................246
Recall..................................................................................................................................246
RecSize...............................................................................................................................248
ReIndex..............................................................................................................................248
Replace..............................................................................................................................249
RLock..................................................................................................................................250
AdvPl________________________________________________________________9
Seconds..............................................................................................................................251
Seek....................................................................................................................................252
Select..................................................................................................................................253
Set Filter ............................................................................................................................253
Set Index...........................................................................................................................254
Set Order ...........................................................................................................................255
SetPrc.................................................................................................................................256
Skip.....................................................................................................................................257
SplitPath.............................................................................................................................258
TCConType........................................................................................................................259
TCDelFile............................................................................................................................260
TCGenQry..........................................................................................................................261
TCIsvLock..........................................................................................................................261
TCRefresh..........................................................................................................................262
TCSetBuff...........................................................................................................................262
TCSetConn.........................................................................................................................263
TCSetDummy....................................................................................................................263
TCSetField..........................................................................................................................264
TCSpExec...........................................................................................................................265
TCSpExist...........................................................................................................................266
TCSqlError .........................................................................................................................267
TCSrvType.........................................................................................................................268
TCSysExe...........................................................................................................................268
;TCUnLink..........................................................................................................................269
TCVUnLock........................................................................................................................270
TCVLock.............................................................................................................................271
Time...................................................................................................................................271
UnLock...............................................................................................................................272
UpdateIntName................................................................................................................273
Use......................................................................................................................................274
Used...................................................................................................................................275
Year ....................................................................................................................................276
ZAP.....................................................................................................................................276
Classes de Interface Visual.............................................................................................278
tSrvObject..........................................................................................................................278
Caractersticas...............................................................................................................278
Propriedades.................................................................................................................278
Mtodos.........................................................................................................................279
SetFocus....................................................................................................................279
Hide............................................................................................................................279
Show...........................................................................................................................279
Enable........................................................................................................................279
Disable.......................................................................................................................280
Refresh.......................................................................................................................280
AdvPl________________________________________________________________10
Classes de J anelas............................................................................................................280
tWindow.............................................................................................................................280
Hierarquia......................................................................................................................280
Caractersticas...............................................................................................................280
Propriedades.................................................................................................................281
Mtodos.........................................................................................................................281
New............................................................................................................................281
Activate......................................................................................................................282
End.............................................................................................................................283
Center.........................................................................................................................283
Exemplo.....................................................................................................................283
TDialog...............................................................................................................................283
Hierarquia......................................................................................................................284
Caractersticas...............................................................................................................284
Propriedades.................................................................................................................284
Mtodos.........................................................................................................................284
New............................................................................................................................284
Activate......................................................................................................................285
End.............................................................................................................................285
MSDialog............................................................................................................................286
Hierarquia......................................................................................................................286
Caractersticas...............................................................................................................286
Propriedades.................................................................................................................286
Mtodos.........................................................................................................................286
New............................................................................................................................286
Classes Auxiliares.............................................................................................................287
tFont...................................................................................................................................288
Hierarquia......................................................................................................................288
Descrio.......................................................................................................................288
Mtodos.........................................................................................................................288
New............................................................................................................................288
Exemplo.........................................................................................................................289
Classes de Componentes................................................................................................289
tControl ..............................................................................................................................289
Hierarquia......................................................................................................................289
Caractersticas...............................................................................................................289
Propriedades.................................................................................................................289
Mtodos.........................................................................................................................290
SetFocus....................................................................................................................290
Classes de Componentes Visuais...................................................................................290
tButton...............................................................................................................................290
Hierarquia......................................................................................................................290
Descrio.......................................................................................................................290
Propriedades.................................................................................................................290
AdvPl________________________________________________________________11
Metodos.........................................................................................................................290
New............................................................................................................................291
Exemplo.........................................................................................................................291
tCheckBox..........................................................................................................................292
Hierarquia......................................................................................................................292
Descrio.......................................................................................................................292
Mtodos.........................................................................................................................292
New............................................................................................................................292
Exemplo.........................................................................................................................293
tComboBox........................................................................................................................294
Hierarquia......................................................................................................................294
Descrio.......................................................................................................................294
Propriedades.................................................................................................................294
Mtodos.........................................................................................................................294
New............................................................................................................................294
Select..........................................................................................................................295
Exemplo.........................................................................................................................296
tGet.....................................................................................................................................296
Hierarquia......................................................................................................................296
Descrio.......................................................................................................................296
Propriedades.................................................................................................................296
Mtodos.........................................................................................................................296
New............................................................................................................................296
Exemplo.........................................................................................................................298
tGroup................................................................................................................................298
Hierarquia......................................................................................................................298
Descrio.......................................................................................................................298
Mtodos.........................................................................................................................298
New............................................................................................................................298
Exemplo.........................................................................................................................299
tListbox..............................................................................................................................299
Hierarquia......................................................................................................................300
Descrio.......................................................................................................................300
Parmetros....................................................................................................................300
Mtodos.........................................................................................................................300
New............................................................................................................................300
Select..........................................................................................................................301
Add.............................................................................................................................301
Modify.........................................................................................................................302
Del ..............................................................................................................................302
Len..............................................................................................................................302
Reset ..........................................................................................................................303
Exemplo.........................................................................................................................303
tMeter.................................................................................................................................303
AdvPl________________________________________________________________12
Hierarquia......................................................................................................................303
Descrio.......................................................................................................................304
Parmetros....................................................................................................................304
Mtodos.........................................................................................................................304
New............................................................................................................................304
Set ..............................................................................................................................305
Exemplo.........................................................................................................................305
tMultiget.............................................................................................................................306
Hierarquia......................................................................................................................306
Descrio.......................................................................................................................306
Propriedades.................................................................................................................306
Mtodos.........................................................................................................................306
New............................................................................................................................306
EnableVScroll ............................................................................................................307
EnableHScroll ............................................................................................................308
Exemplo.........................................................................................................................308
tPanel .................................................................................................................................308
Hierarquia......................................................................................................................309
Descrio.......................................................................................................................309
Mtodos.........................................................................................................................309
New............................................................................................................................309
Exemplo.........................................................................................................................310
tRadMenu..........................................................................................................................310
Hierarquia......................................................................................................................310
Descrio.......................................................................................................................310
Propriedades.................................................................................................................310
Mtodos.........................................................................................................................310
New............................................................................................................................310
EnableItem................................................................................................................311
Exemplo.........................................................................................................................312
tSay....................................................................................................................................312
Hierarquia......................................................................................................................312
Descrio.......................................................................................................................312
Parmetros....................................................................................................................312
Mtodos.........................................................................................................................312
New............................................................................................................................312
SetText.......................................................................................................................313
Exemplo.........................................................................................................................314
tScrollbox...........................................................................................................................314
Hierarquia......................................................................................................................314
Descrio.......................................................................................................................314
Mtodos.........................................................................................................................314
New............................................................................................................................314
Exemplo.........................................................................................................................315
AdvPl________________________________________________________________13
Infra-estrutura..................................................................................................................316
MsGetDados......................................................................................................................316
MsGetDb............................................................................................................................320
MsmGet..............................................................................................................................324
MBrowse............................................................................................................................327
Funes..............................................................................................................................328
AllGroups...........................................................................................................................328
AllUsers..............................................................................................................................329
APMsgAlert ........................................................................................................................331
APMsgInfo.........................................................................................................................331
APMsgNoYes .....................................................................................................................332
APMsgStop.........................................................................................................................332
APMsgYesNo.....................................................................................................................333
APMsgYesNo.....................................................................................................................333
Cabec.................................................................................................................................334
Capital ................................................................................................................................336
CloseBrowse......................................................................................................................336
Conpad1.............................................................................................................................337
Enchoicebar.......................................................................................................................337
FileNoExt............................................................................................................................338
Final....................................................................................................................................339
FTPConnect.......................................................................................................................339
FTPDirChange...................................................................................................................340
FTPDirectory......................................................................................................................341
FTPDisconnect ..................................................................................................................341
FTPDownload....................................................................................................................342
FTPErase............................................................................................................................342
FTPGetCurDir ....................................................................................................................343
FTPRenameFile.................................................................................................................343
FTPUpload.........................................................................................................................344
FunDesc.............................................................................................................................345
FunName...........................................................................................................................345
GetCountryList ..................................................................................................................346
GetMark.............................................................................................................................346
GetMv.................................................................................................................................347
IncProc...............................................................................................................................348
IncRegua...........................................................................................................................348
IndRegua...........................................................................................................................350
MarkBRefresh....................................................................................................................351
MarkBrow...........................................................................................................................351
Ms_Flush............................................................................................................................352
MsAppend..........................................................................................................................354
MsCopyFile........................................................................................................................354
MsCopyTo..........................................................................................................................355
AdvPl________________________________________________________________14
MsCreate............................................................................................................................356
MsErase..............................................................................................................................356
MsFile.................................................................................................................................357
MsRename.........................................................................................................................358
MsUnlock............................................................................................................................358
OurSpool............................................................................................................................359
Pergunte............................................................................................................................360
Processa.............................................................................................................................361
ProcRegua.........................................................................................................................362
PswAdmin..........................................................................................................................362
PswID.................................................................................................................................363
PswName...........................................................................................................................363
PswOrder...........................................................................................................................364
PswRet ...............................................................................................................................365
PswSeek.............................................................................................................................365
ReadVar .............................................................................................................................366
RetAcsName......................................................................................................................366
RetExtHlp...........................................................................................................................367
RetExtHls...........................................................................................................................367
RetExtHpr ..........................................................................................................................368
RetExtMnu.........................................................................................................................368
RetFileName......................................................................................................................369
Roda...................................................................................................................................369
RptStatus...........................................................................................................................371
SetDefault..........................................................................................................................372
SetPrint ..............................................................................................................................374
SetRegua...........................................................................................................................376
SixDescricao......................................................................................................................378
VerSenha...........................................................................................................................378
X1Def01.............................................................................................................................379
X1Def02.............................................................................................................................379
X1Def03.............................................................................................................................380
X1Def04.............................................................................................................................380
X1Def05.............................................................................................................................381
X1Pergunt..........................................................................................................................381
X2Nome.............................................................................................................................382
X3CBox...............................................................................................................................383
X3Descric...........................................................................................................................383
X3Picture............................................................................................................................384
X3Titulo..............................................................................................................................384
X3Uso.................................................................................................................................384
X5Descri.............................................................................................................................385
X6Conteud.........................................................................................................................386
X6Desc1.............................................................................................................................386
AdvPl________________________________________________________________15
X6Desc2.............................................................................................................................387
X6Descric...........................................................................................................................387
XADescric...........................................................................................................................388
XBDescri.............................................................................................................................388
AdvPl________________________________________________________________16
A Tecnologia Protheus

O Advanced Protheus uma nova tecnologia desenvolvida sobre o sistema Advanced, que teve toda a
inteligncia dividida em duas camadas: Servidor de Aplicao (Protheus Server) e Interface (Remote). Ou
seja, uma aplicao 32 bits que se encarrega do gerenciamento das conexes, da execuo do cdigo
AdvPl e do acesso aos recursos de banco de dados (ADS, Btrieve, CTree ou TopConnect), e uma aplicao
thin-client que efetua apenas a interface com o usurio.
Caractersticas da Tecnologia Protheus
As principais caractersticas da tecnologia Protheus so:
Possibilidade de grande variao de topologias de rede e processamento distribudo
Baixo trfego de rede entre o AP5 Server e o AP5 Remote
Utilizao de configuraes, possibilitando o uso de conexes simultneas atravs de protocolos
diferentes e o acesso a diferentes repositrios de APO's e diretrios (o que permite o uso de
diferentes idiomas, verses, etc, acessando a mesma base de dados)
Diferentes possibilidades de impresso de relatrios. No Advanced Protheus pode-se imprimir os
relatrios de trs formas:
1.Em disco
2.Via Windows
3.Direto na Porta
As impresses efetuadas via Windows ou diretamente na porta podem ser impressas no servidor (o
que evitar o trfego de rede do relatrio impresso) ou na estao. As impresses efetuadas em disco
tambm evitam o trfego de rede. Os relatrios em disco so sempre mantidos no servidor e somente
as pginas requisitadas so enviadas estao.
Os arquivos de banco de dados so sempre abertos no servidor. Entretanto, arquivos texto
podem ser abertos na estao com a funo FOpen. A referncia a paths que no contiverem uma
letra de drive (por exemplo, "\DADOS\ARQ.TXT"), so consideradas a partir do servidor no diretrio
informado na seo "RootPath" do arquivo de configuraes do Protheus Server
No existe o conceito de "mdulos" de sistema. Existe o conceito de programa inicial, de onde a
execuo do Remote ser iniciada (e os outros APO's utilizados sero carregados e descarregados
dinamicamente de acordo com sua chamada a partir deste). Isso permite que rotinas que eram de
"mdulos" diferentes sejam executadas diretamente de um mesmo menu de usurio
As Camadas do Advanced Protheus
AdvPl________________________________________________________________17

O Advanced Protheus dividido em quatro camadas para a operao so elas:
Servidor de Aplicao
Terminal Thin-Client
Dados
Repositrio de APOs
Servidor de Aplicao
O Protheus Server a aplicao encarregada da compilao e da execuo do cdigo em AdvPl, no qual o
sistema Siga Advanced est escrito a partir da verso 5.07. Na linguagem AdvPl, as rotinas so mantidas
em APO's (Advanced Protheus Objects) individuais em repositrios. Isso permite que as rotinas sejam
carregadas/descarregadas dinamicamente da memria da mquina onde o Protheus Server est sendo
executado, ou seja, de acordo com a necessidade de execuo dos Terminais conectados, e facilita a
atualizao aps correes de no-conformidades ou criao de melhorias, pois apenas os APO's
modificados necessitam ser atualizados. Desse modo, a performance alta e no requer muitos recursos
da mquina para a execuo do servidor.
Terminal Thin-Client
O Remote a aplicao encarregada da interface com o usurio. No existe processamento local, por isso
o trfego de rede entre o Terminal e o Servidor de Aplicao baixo, tratando-se apenas de comandos
para o desenho das telas e do tratamento do teclado e mouse.
Dados
O acesso aos dados efetuado pelo Servidor de Aplicao utilizando as seguintes bases de dados: ADS,
BTrieve, CTree e TopConnect (para padro SQL). Para bases de dados SQL, existe total suporte a Stored
Procedures. No Protheus, todas as bases de dados tm suporte a controle de transao.
Repositrio de Apos
E no repositrio que se encontram os programas escritos em AdvPl que sero carregados para a execuo
de determinada tarefa. atravs do repositrio de Apos que pode-se incluir novas customizaes no
sistema.

AdvPl________________________________________________________________18
Estruturao
A estrutura de diretrios do Advanced Protheus
A estrutura de diretrios do Advanced Protheus depende da verso instalada.
Verso AP5
\ap5\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os
caminhos informados em parmetros, customizaes, etc.
\ap5\apo\ Diretrio onde sero localizados os arquivos de repositrio de APOs.
\ap5\bin\ Diretrio onde so localizados os arquivos do ncleo do Protheus: executveis,
bibliotecas de carga dinmica (DLLs) e arquivos de configurao do sistema.
\ap5\sigaadv\ Similar ao \SIGAADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se
encontram os arquivos de configurao do sistema ERP Advanced, arquivos de menus,
etc. tambm o diretrio inicial de execuo no Remote.
\ap5\dadosadv\ Similar ao \DADOSADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se
localizam os arquivos de base de dados para verses no SQL.
\ap5\relato\ Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de impresso em disco.
\ap5\cprova\ Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de contabilizao.
\ap5\ixbpad\ Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres
definidos pela Microsiga Software S.A.
\ap5\include\ Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a
compilao de programas escritos em AdvPl.
\ap5\util\ Diretrio de ferramentas adicionais do Protheus.

Verso AP6
\ap6\ Diretrio inicial do Protheus. a partir deste diretrio que o sistema ir localizar os
caminhos informados em parmetros, customizaes, etc.
\ap6\apo\ Diretrio onde sero localizados os arquivos de repositrio de APOs.
\ap6\bin\server\ Diretrio onde so localizados os arquivos do ncleo do Protheus Server:
executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao.
\ap6\bin\remote\ Diretrio onde so localizados os arquivos das aplicaes clientes (Remote, IDE,
Monitor, etc): executveis, bibliotecas de carga dinmica (DLLs) e arquivos de
configurao.
AdvPl________________________________________________________________19
\ap6\sigaadv\ Similar ao \SIGAADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se
encontram os arquivos de configurao do sistema ERP Advanced, arquivos de
menus, etc. tambm o diretrio inicial de execuo no Remote.
\ap6\dadosadv\ Similar ao \DADOSADV\ das verses Advanced 2.0x/4.0x. o diretrio onde se
localizam os arquivos de base de dados para verses no SQL.
\ap6\relato\ Similar ao \RELATO\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de impresso em disco.
\ap6\cprova\ Similar ao \CPROVA\ das verses Advanced 2.0x/4.0x. Diretrio para gravao de
arquivos de contabilizao.
\ap6\ixbpad\ Diretrio de localizao de programas de exemplo escritos em AdvPl, nos padres
definidos pela Microsiga Software S.A.
\ap6\include\ Diretrio de arquivos de incluso padro (extenso .CH) necessrios para a
compilao de programas escritos em AdvPl.

Estas so as estruturas para uma instalao padro do Protheus de acordo com a verso utilizada.
Porm a localizao de instalao pode variar de acordo com o local de instalao.
Aplicativos do Advanced Protheus
O Advanced Protheus possui, basicamente, quatro aplicativos utilizados com diferentes finalidades. So
eles:
Protheus Server
Trata-se do servidor de aplicao do Advanced Protheus esta a parte do sistema que ser executada no
Servidor e ser responsvel pela comunicao entre o Cliente, a Base de Dados e o Repositrio de Apos.
O nome do executvel depende da verso e sistema operacional utilizados, por exemplo: AP5SRV.EXE ou
AP6SRVWIN.EXE.
Remote
o Remote que utilizamos para interagir com todo o sistema, ele poder ser instalado de duas maneiras,
no servidor ou na prpria estao de trabalho. O nome do executvel depende da verso utilizada, por
exemplo: AP5RMT.EXE ou AP6RMT.EXE.
IDE
Trata-se do ambiente de desenvolvimento integrado do Advanced Protheus. atravs deste aplicativo que
todos os acessos aos repositrios de Apos (compilao de customizaes, visualizao de funes
existentes etc.) so efetuados, e tambm a ferramenta para desenvolvimento e depurao de
aplicaes/customizaes. O nome do executvel depende da verso utilizada, por exemplo: AP5IDE.EXE
ou AP6IDE.EXE.
Monitor
AdvPl________________________________________________________________20
Esta ferramenta permite a interao com os usurios conectados ao sistema: Analisar os programas em
uso, derrubar conexes pendentes, enviar mensagens ao usurios etc. O nome do executvel depende da
verso utilizada, por exemplo: AP5MONIT.EXE ou AP6MONIT.EXE
Alem destas aplicaes, o Siga Advanced Protheus conta ainda com outros utilitrios diversos, como o Diff
(utilizado para comparao de arquivos texto) e Dump (utilizado para edio de arquivos binrios).
Nomenclaturas Utilizadas
Estas so as principais nomeclaturas utilizadas no Advanced Protheus:
Build: Verso completa do sistema com seus executveis, Dlls e RPO completo. O build do sistema pode
ser identificado atravs da opo Miscelneas | Sobre dentro dos mdulos do sistema.
RPO: o arquivo binrio de repositrio de APOs, com o cdigo AdvPl.
Patch: Arquivo binrio semelhante ao repositrio contendo apenas atualizaes de APOs, correes
disponibilizadas pela Microsiga Software S.A., que ser aplicado no repositrio atravs do IDE.
Verso Master: Mesma definio de build porm neste caso a verso ser utilizada como referncia para
a gerao de atualizaes do sistema (patchs). Quando gerada, a verso encaminhada a todos os
envolvidos em processos de implantao/utilizao do sistema via correio ou disponibilizada no site de FTP
do Protheus.

A definio dos nomes dos arquivos dos repositrios de APO's e Patchs seguem o mesmo padro
(diferenciando-se apenas na extenso Patch=.PAT e repositrio=RPO) e efetuada da seguinte
maneira AP12345.RPO:
1 (D)bf, (T)op, (A)ds, (B)trieve, (C)Tree;
2 (P)ortuguese, (E)nglish, (S)panish;
3 Verso;
4 Verso;
5 Verso;
Por exemplo, APBP609.RPO ser um repositrio de APO's para base de dados BTrieve, idioma
Portugus e verso 609.

Topologia de Rede
Devido sua diviso em camadas, a tecnologia Protheus permite montar o ambiente de execuo com
diferentes topologias, priorizando a execuo, o trfego de rede ou os recursos individuais das mquinas
existentes, o que torna o processamento distribudo. Essa uma das grandes vantagens da tecnologia
Protheus.
Caractersticas e Possibilidades de Topologias de Rede
AdvPl________________________________________________________________21

Pode-se manter um ou mais servidores de aplicao do Protheus (Protheus Server).
Um Protheus Server pode estar na mesma mquina que o gerenciador de banco de dados.
Mquinas melhores ou com mais recursos podem ter um Protheus Server sendo executado
localmente (na estao) visando priorizar o processamento local. Porm h um aumento do trfego
de rede entre o gerenciador de banco de dados e o Protheus Server local.
Do mesmo modo, pode-se executar servidores remotamente priorizando o processamento de uma
ou mais estaes.
Utilizao do protocolo TCP-IP para as conexes. Na verso AP5 pode-se utilizar tambm o
protocolo NAMED PIPES.
Pode-se disponibilizar conexes via Internet atravs da montagem de um Web Server na empresa
ou atravs de provedores de acesso (como a UOL e o ZAZ). Neste caso, o Protheus Server pode ser
executado no provedor ou na empresa utilizando uma LP para a conexo ao provedor de acesso.
A Internet utilizada apenas como o meio de comunicao, ou seja, a conexo TCP-IP entre o
Remote e o Protheus Server. Alm da segurana oferecida pelo sistema Advanced, a segurana
dever ser oferecida pela conexo. Por isso, aconselhvel que a mquina onde o servidor Web
esteja sendo executado no seja o mesmo do servidor da banco de dados.


O Protheus Server tambm pode ser executado como um servidor Internet, HTTP e/ou FTP.
Pode-se manter uma pgina para o download do Remote, de modo que os usurio remotos possam
efetuar o download para conectar-se e utilizar o sistema. Na verso AP6 pode-se configurar o
Remote para se atualizar automaticamente a partir do Protheus Server sendo executado como um
servidor FTP.
AdvPl________________________________________________________________22

A definio da melhor topologia para execuo um passo importante da implementao da
tecnologia Protheus, pois influenciar totalmente na performance. O maior trfego de rede est
localizado entre o Protheus Server e o Banco de Dados, j que o trfego entre o Protheus Server e
o Remote limita-se s informaes para montagem de telas e controle de teclado e mouse. Desta
forma, dependendo do tipo e da velocidade da conexo, pode se tornar invivel manter um
Protheus Server em uma cidade conectado ao banco de dados em outra. Por outro lado, caso
existam muitas conexes nesta outra cidade, ou caso estas conexes executem processamentos
pesados, priorizar o processamento disponibilizando um Protheus Server para ser executado
localmente nesta cidade pode ser uma boa soluo.
I DE - I ntegrated Development Environment
O IDE (Integrated Development Environment) uma ferramenta de edio, compilao e depurao de
erros. atravs do IDE que o sistema ERP Siga Advanced desenvolvido. Tambm atravs do IDE que
os analistas da Microsiga e os usurios do Protheus podem criar e manter suas rotinas especficas. O IDE
o nico modo de compilar os arquivos de programas escritos em AdvPl para a gerao dos APO's no
repositrio.
Como ferramenta de edio e depurao, engloba todos os recursos disponveis nas melhores ferramentas
de desenvolvimento do mercado.
Caractersticas do I DE
Para a execuo do IDE no necessrio conectar-se ao Protheus Server, exceto nas operaes de
atualizao ou consulta de um repositrio (compilao, obteno do Mapa de Objetos, aplicao de
patchs, etc) e durante o processo de depurao.
No aconselhvel executar o IDE remotamente (via Internet ou via modem), pois a conexo do
Remote ao Protheus, quando efetuada atravs do IDE, mais lenta.
Os passos para o desenvolvimento de programas em AdvPl utilizando o IDE so:
1.Criao do cdigo atravs do editor. Na linguagem AdvPl, os analistas e os usurios do Protheus
tm todos os recursos disponveis para o desenvolvimento de suas rotinas. E diferentemente do
antigo RDMAKE, no mais uma linguagem interpretada. Por isso, a performance das rotinas
especficas dez vezes maior do que era nos RDMAKEs antigos.
2.Montagem do Grupo de Projetos. O Grupo de Projetos um gerenciador existente dentro do
IDE, onde o usurio pode manter os arquivos de cdigo separados por projetos e pastas. Com
um grupo de projetos os arquivos podem ser organizados de uma forma lgica, em projetos e
pastas.
3.Compilao. Durante a compilao, os arquivos so enviados ao Protheus Server. Toda a
compilao e a gravao no repositrio so efetuadas no servidor.
4.Depurao. O IDE permite aos usurios depurar as rotinas criadas, executando-as linha a linha ou
em modo de animao. Permite visualizar informaes como variveis em diferentes escopos,
pilha de chamadas, lista de break points, etc. Exatamente como as melhores ferramentas de
desenvolvimento existentes no mercado. No IDE pode-se depurar pontos de entrada
simplesmente colocando-se um ponto de parada (break point) em uma linha qualquer do cdigo
do ponto de entrada;

AdvPl________________________________________________________________23
Monitor
O Monitor utilizado para monitorar as conexes de terminais ao Protheus Server. Atravs dele pode-se:
Verificar as conexes ativas.
Enviar mensagens para uma ou mais conexes.
Desabilitar novas conexes. Isto til quando se precisa efetuar alguma manuteno e se precisa
evitar que outros usurios se conectem.
Informaes Bsicas das Conexes
Usurio. o nome do usurio na rede local. Para conexes remotas este nome est em branco.
Computador. Nome da mquina onde o Remote est sendo executado.
Conexo. Indica a data e hora de incio da conexo do Remote.
Tempo de Uso. Indica o tempo em horas, minutos e segundos desde que o Remote se conectou.
Programa Inicial. o nome do programa inicial (APO) com o qual o Remote iniciou a execuo.
Environment. Nome do ambiente sendo utilizado pelo terminal.


Btrieve
Informaes Bsicas
Para manipulao de tabelas Btrieve o driver utilizado "BTVCDX";
Para programar algo especfico para o Btrieve pode-se utilizar o teste "#ifdef BTV";
A extenso padro das tabelas ".dat";
Os ndices so criados no mesmo arquivo de dados (".dat");
As manipulaes e visualizaes de dados devem ser feitas atravs do "APSdu", pois as antigas
ferramentas so incompatveis;
O Btrieve verso 6.15 no precisa ser instalado, pois as DLLs necessrias so disponibilizadas junto
com o Protheus. Os arquivos necessrios ficam no diretrio "BIN" (wbtrv32.dll, w32mkrc.dll,
wbtrvres.dll e w32mkde.exe). O funcionamento praticamente igual ao Btrieve Server, portanto
pode-se executar os testes na verso 6.15 normalmente;
O w32mkde continua um perodo em execuo aps o trmino do Protheus, pois se o Protheus for
executado novamente no necessrio seu reincio. Quando o usurio desejar renomear o diretrio
AdvPl________________________________________________________________24
"BIN", o mesmo no ser permitido por esse motivo, deve-se portanto finalizar a execuo do
mesmo;
As informaes das tabelas, campos e ndices so armazenados no diretrio "DDF", criado abaixo do
"RootPath", atravs dos arquivos (Field.btv, File.btv, Finfo.btv, Iinfo.btv e Index.btv). Se estes
arquivos forem apagados as tabelas sero recriadas e todos os dados sero PERDIDOS. No se pode
copiar uma tabela com estrutura diferente para este diretrio, pois seus dados devem ser
atualizados nos arquivos do DDF tambm. Como os dados e o diretrio DDF devem estar
"sincronisados" os arquivos do DDF devem ser includos no esquema de "backup" dos dados;
As tabelas s podem ter "um" campo do tipo memo e este campo deve ser o ltimo, por isso na
hora da criao da tabela o Protheus automaticamente desloca o campo memo para o final e mostra
uma mensagem de aviso;
Para apagar os ndices, entrar em APSdu, abrir a tabela e escolher Index/erase all. Ele apagar
todos os ndices da tabela e tambm a sua definio no DDF. Para fazer via programa, selecione a
tabela e chame a funo <@>BTVDropIdxs(). Portanto aconselha-se utilizar o ndice do tipo
permanente somente se o mesmo for utilizado posteriormente (outras aberturas da tabela) caso
contrrio deve-se utilizar os ndices temporrios;
Para gerar os arquivos DFFs compatveis com outras ferramentas que manipulam arquivos btrieve,
inclusive Crystal Reports, existem duas funes para criar os arquivos necessrios: <@>BTVTables e
<@>BTVCreateDDFs;
Configurao do Btrieve/ PervasiveSQL2000:
Para configurar o Btrieve Server deve-se executar os seguintes passos:
1.Terminar a execuo do Protheus e parar o servio w32mkde;
2.Deletar os arquivos binrios do Btrieve do diretrio "Protheus\Bin" (wbtrv32.dll, w32mkrc.dll,
wbtrvres.dll e w32mkde.exe);
3.Instalar o PervasiveSQL200 com os respectivos "Services Packs";
4.Entrar no Pervasive Control Center (menu Iniciar - Pervasive - Pervasive Control Center);
5.Visualizar os nomes dos servidores disponveis (no caso de Linux, Novell e Solaris deve-se
acrescentar um servidor);
6.Atravs de um duplo click sobre o servidor que se deseja utilizar entrar em "configurao"
(configuration);
7.Para Windows NT e 2000 deve-se acertar os valores de alguns parmetros:
Pasta Access:
Accept Remote Request : ON
Active Clients :10000
Logical File Handles :100000
MaxDatabases: 10
Maximum Open Files: 10000
Number of Sessions: 20
Pasta Communication Buffer Size:
AdvPl________________________________________________________________25
Communication Buffer Size : 63
MKDE Communication Buffer Size: 63
Read Buffer Size: 4
Pasta Data Integrity:
10. Initiation Time Limit: 100000
11. Operation Bundle Limit: 10000
Pasta Memory usage:
Allocate Resource at Startup: On
Back to Minimal State if Inactive: On
Extended Operation Buffer Size: 16
System Cache: On
Pasta Performance Tunning:
Cache Allocation Size: +- 131072 (mnimo de 12000)
Communications Threads : 64
Index Balancing: Off
Largest Compressed Record Size: 0
Log Buffer Size: 64
Number of Input/ Output Threads : 64
Number of Worker Threads: 64
Transaction Log Size: 512
*Obs: O Cache Allocation Size aloca memria do servidor para uso do banco de dados.
Quanto mais memria, mais rpidas so executadas as operaes.

A verso 6.15 possui uma limitao: Se dois servidores NT4 estiverem acessando o mesmo
arquivo, ocorrer lentido na rede. Isso acontece se for utilizado o mesmo RPO (que um arquivo
btrieve) para dois servidores no AP5. A soluo sempre replicar os repositrios em cada servidor
ou adquirir (deve ser comprado) a verso a partir da PervasiveSQL2000. Em mquinas Win2000,
no nem mesmo possvel abrir um arquivo btrieve de dois servidores. Este problema de
conhecimento da Pervasive, mas no ser alterado porque esta verso foi descontinuada por volta
de agosto de 2001.

AdvPl________________________________________________________________26
CTree
Informaes Bsicas
Para manipulao de tabelas Ctree o driver utilizado CTREECDX;
Para programar algo especfico para o Ctree pode-se utilizar o teste #ifdef CTREE;
A extenso padro das tabelas .dtc. Quando o LocalFile estiver utilizando o banco Ctree os SXs
continuam tendo como padro a extenso .dbf, mas as tabelas criadas (SX1990.DBF, SX2990.DBF,
etc) so Ctree. Portanto recomenda-se que se configure outra extenso padro para arquivos locais
do tipo Ctree atravs da chave LocalDbExtension no arquivo ap6srv.ini como .dtc;
As manipulaes e visualizaes de dados devem ser feitas atravs do APSdu, pois as antigas
ferramentas so incompatveis;
O Ctree no precisa ser instalado, pois sua biblioteca gerada junto com o Protheus;
Os campos do tipo memo devem ser os ltimos da tabela, por isso na hora da sua criao o
Protheus automaticamente desloca-os para o final e mostra uma mensagem de aviso;
As tabelas geradas pelo Ctree so totalmente compatveis entre as plataformas Windows e Linux,
pode-se inclusive copiar uma tabela gerada no Linux e abr-la no Windows e vice-e-versa.
ndices
- O ndice interno do Ctree (ordem do recno) criado em outro arquivo com extenso .int. Uma
pasta (ctreeint) criada abaixo da pasta com a tabela. Nesta pasta sero armazenados todos os
ndices internos daquele diretrio. Caso no exista o arquivo de ndice interno o mesmo gerado
automaticamente pelo Protheus mostrando um aviso de que reconstruiu o ndice no servidor na hora
da abertura da tabela. Para apag-lo pode ser utilizada uma funo <@>CTREEDELINT;
- Os arquivos de ndices permanentes so criados fora do arquivo da tabela com extenso padro
como nos outros RDDs (.cdx), mas suas informaes so armazenadas no arquivo da tabela
(.dtc). Portanto para se criar ou excluir ndices permanentes a tabela deve estar aberta em modo
exclusivo. Na hora da abertura da tabela, todos os arquivos de ndices permanentes relacionados em
sua estrutura so abertos tambm, por isso no se pode deletar o arquivo de ndice permanente com
a respectiva tabela aberta. Caso no exista um ou mais arquivos de ndices da tabela na hora de sua
abertura, o Protheus ir recri-los automaticamente de forma semelhante ao ndice interno. O
diretrio do arquivo de ndice tambm armazenado na estrutura da tabela, mas quando a tabela
aberta e constatado que a tabela est em outro diretrio o Protheus automaticamente atualiza esta
informao. Para se deletar os ndices de uma tabela Ctree pode-se utilizar a funo
<@>CTREEDELIDXS ou utilizar a opo Index/erase all no APSdu. Portanto aconselha-se utilizar o
ndice do tipo permanente somente se o mesmo for utilizado posteriormente (outras aberturas da
tabela) caso contrrio deve-se utilizar os ndices temporrios;
- O ndice temporrio criados dentro de um subdiretrio com o nome do arquivo especificado na
hora de sua criao, por exemplo ind1.idx contendo os arquivos ind1.ind, ind1c.ind e
ind1r.ind. Este tipo de ndice no possui definio armazenada no arquivo da tabela, por ser
temporrio.

AdvPl________________________________________________________________27
Sistemas Operacionais e Plataformas (verso AP6 e
posteriores)
Sistemas Operacionais e Plataformas
O Protheus Server foi desenvolvido em ANSI C++ e , portanto, independe de API's especificas para
funcionar. Graas a isso, o ncleo do Protheus pode ser recompilado em todos os sistemas operacionais e
plataformas que suportem ANSI C++.
Outra preocupao durante o desenvolvimento do Protheus foi garantir total compatibilidade dos
repositrios de objetos do Protheus (RPO's) e das correes dos repositrios (Patch's) entre os sistemas
operacionais e plataformas.
Plataformas e SO's suportados
Windows e Linux Intel,
Windows IA64,
Sun Solaris ( RISC ),
HP UX ( RISC ),
Compaq True64 ( RISC ),
IBM AIX ( Power PC e RS/6000 ),
Novos SO's a serem suportados
PalmOS ( em fase Beta )
PocketPC


AdvPl________________________________________________________________28
AdPl Guia de Programao
A Linguagem AdvPl
A Linguagem AdvPl teve seu incio em 1994, sendo na verdade uma evoluo na utilizao de linguagens
no padro xBase pela Microsiga Software S.A. (Clipper, Visual Objects e depois FiveWin). Com a criao
da tecnologia Protheus, era necessrio criar uma linguagem que suportasse o padro xBase para a
manuteno de todo o cdigo existente do sistema de ERP Siga Advanced. Foi ento criada a linguagem
chamada Advanced Protheus Language.
O AdvPl uma extenso do padro xBase de comandos e funes, operadores, estruturas de controle de
fluxo e palavras reservadas, contando tambm com funes e comandos disponibilizados pela Microsiga
que a torna uma linguagem completa para a criao de aplicaes ERP prontas para a Internet. Tambm
uma linguagem orientada a objetos e eventos, permitindo ao programador desenvolver aplicaes visuais
e criar suas prprias classes de objetos.
Quando compilados, todos os arquivos de cdigo tornam-se unidades de inteligncia bsicas, chamados
APOs (de Advanced Protheus Objects). Tais APOs so mantidos em um repositrio e carregados
dinamicamente pelo AP6 Server para a execuo. Como no existe a linkedio, ou unio fsica do cdigo
compilado a um determinado mdulo ou aplicao, funes criadas em AdvPl podem ser executadas em
qualquer ponto do ambiente Advanced Protheus.
O compilador e o interpretador da linguagem AdvPl o prprio servidor AP6 (AP6 Server), e existe um
ambiente visual para desenvolvimento integrado (AP6 IDE) onde o cdigo pode ser criado, compilado e
depurado.
Os programas em AdvPl podem conter comandos ou funes de interface com o usurio. De acordo com
tal caracterstica, tais programas so subdivididos nas seguintes categorias:
Programao Com Interface Prpria com o Usurio
Nesta categoria entram os programas desenvolvidos para serem executados atravs do terminal remoto
do Protheus, o AP6 Remote. O AP6 Remote a aplicao encarregada da interface e da interao com o
usurio, sendo que todo o processamento do cdigo em AdvPl, o acesso ao banco de dados e o
gerenciamento de conexes efetuado no AP6 Server. O AP6 Remote o principal meio de acesso a
execuo de rotinas escritas em AdvPl no AP6 Server, e por isso permite executar qualquer tipo de cdigo,
tenha ele interface com o usurio ou no. Porm nesta categoria so considerados apenas os programas
que realizem algum tipo de interface remota utilizando o protocolo de comunicao do Protheus.
Pode-se criar rotinas para a customizao do sistema ERP Advanced Protheus, desde processos adicionais
at mesmo relatrios. A grande vantagem aproveitar todo o ambiente montado pelos mdulos do ERP
Advanced Protheus. Porm, com o AdvPl possvel at mesmo criar toda uma aplicao, ou mdulo, do
comeo.
Todo o cdigo do sistema ERP Advanced Protheus escrito em AdvPl.
Programao Sem I nterface Prpria com o Usurio
As rotinas criadas sem interface so consideradas nesta categoria porque geralmente tm uma utilizao
mais especfica do que um processo adicional ou um relatrio novo. Tais rotinas no tm interface com o
usurio atravs do AP6 Remote, e qualquer tentativa nesse sentido (como a criao de uma janela
padro) ocasionar uma exceo em tempo de execuo. Estas rotinas so apenas processos, ou Jobs,
executados no AP6 Server. Algumas vezes, a interface destas rotinas fica a cargo de aplicaes externas,
AdvPl________________________________________________________________29
desenvolvidas em outras linguagens, que so responsveis por iniciar os processos no servidor AP6
atravs dos meios disponveis de integrao e conectividade no Protheus.
De acordo com a utilizao e com o meio de conectividade utilizado, estas rotinas so subcategorizadas
assim:
Programao por Processos
Rotinas escritas em AdvPl podem ser iniciadas como processos individuais (sem interface) no AP6 Server
atravs de duas maneiras: Iniciadas por outra rotina AdvPl atravs da chamada de funes como StartJob
ou CallProc ou iniciadas automaticamente na inicializao do AP6 Server (quando propriamente
configurado).
Programao de RPC
Atravs de uma biblioteca de funes disponvel no Protheus (uma API de comunicao), pode-se executar
rotinas escritas em AdvPl diretamente no AP6 Server, atravs de aplicaes externas escritas em outras
linguagens. Isto o que se chama de RPC (de Remote Procedure Call, ou Chamada de Procedimentos
Remota).
O servidor Protheus tambm pode executar rotinas em AdvPl em outros servidores Protheus atravs de
conexo TCP/IP direta utilizando o conceito de RPC. Do mesmo modo, aplicaes externas podem
requisitar a execuo de rotinas escritas em AdvPl atravs de conexo TCP/IP direta.
Programao Web
O AP6 Server pode tambm ser executado como um servidor Web, respondendo a requisies HTTP. No
momento destas requisies, pode executar rotinas escritas em AdvPl como processos individuais,
enviando o resultado das funes como retorno das requisies para o cliente HTTP (como por exemplo
um Browser de Internet). Qualquer rotina escrita em AdvPl que no contenha comandos de interface pode
ser executada atravs de requisies HTTP. O Protheus permite a compilao de arquivos HTML contendo
cdigo AdvPl embutido. So os chamados arquivos AdvPl ASP, para a criao de pginas dinmicas.
Programao TelNet
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto atravs de
uma aplicao cliente deste protocolo. O AP6 Server pode emular um terminal TelNet, atravs da
execuo de rotinas escritas em AdvPl. Ou seja, pode-se escrever rotinas AdvPl cuja interface final ser
um terminal TelNet ou um coletor de dados mvel.

Sintaxe da Linguagem
Edio de Programas
Criao de um Programa
AdvPl________________________________________________________________30
Um programa de computador nada mais do que um grupo de comandos logicamente dispostos com o
objetivo de executar determinada tarefa. Esses comandos so gravados em um arquivo texto que
transformado em uma linguagem executvel por um computador atravs de um processo chamado
compilao. A compilao substitui os comandos de alto nvel (que os humanos compreendem) por
instrues de baixo nvel (compreendida pelo sistema operacional em execuo no computador). No caso
do AdvPl, no o sistema operacional de um computador que ir executar o cdigo compilado, mas sim o
AP6 Server.
Dentro de um programa, os comandos e funes utilizados devem seguir regras de sintaxe da linguagem
utilizada, pois caso contrrio o programa ser interrompido por erros. Os erros podem ser de compilao
ou de execuo.
Erros de compilao so aqueles encontrados na sintaxe que no permitem que o arquivo de cdigo do
programa seja compilado. Podem ser comandos especificados de forma errnea, utilizao invlida de
operadores, etc.
Erros de execuo so aqueles que acontecem depois da compilao, quando o programa est sendo
executado. Podem ocorrer por inmeras razes, mas geralmente se referem a funes no existentes, ou
variveis no criadas ou inicializadas, etc.
Linhas de Programa
As linhas existentes dentro de um arquivo texto de cdigo de programa podem ser linhas de comando,
linhas de comentrio ou linhas mistas.
Linhas de Comando
Linhas de comando possuem os comandos ou instrues que sero executadas. Por exemplo:

Local nCnt
Local nSoma : = 0
For nCnt : = 1 To 10
nSoma += nCnt
Next nCnt

Linhas de Comentrio
Linhas de comentrio possuem um texto qualquer, mas no so executadas. Servem apenas para
documentao e para tornar mais fcil o entendimento do programa. Existem trs formas de se comentar
linhas de texto. A primeira delas utilizar o sinal de * (asterisco) no comeo da linha:

* Pr ogr ama par a cl cul o do t ot al
* Aut or : Mi cr osi ga Sof t war e S. A.
* Dat a: 2 de out ubr o de 2001

Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio. Pode-se utilizar a
palavra NOTE ou dois smbolos da letra "e" comercial (&&) para realizar a funo do sinal de asterisco.
Porm todas estas formas de comentrio de linhas so obsoletas e existem apenas para compatibilizao
com o padro xBase. A melhor maneira de comentar linhas em AdvPl utilizar duas barras transversais:

/ / Pr ogr ama par a cl cul o do t ot al
/ / Aut or : Mi cr osi ga Sof t war e S. A.
/ / Dat a: 2 de out ubr o de 2001

AdvPl________________________________________________________________31
Outra forma de documentar textos utilizar as barras transversais juntamente com o asterisco, podendo-
se comentar todo um bloco de texto sem precisar comentar linha a linha:

/ *
Pr ogr ama par a cl cul o do t ot al
Aut or : Mi cr osi ga Sof t war e S. A.
Dat a: 2 de out ubr o de 2001
*/

Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento (indicada pelos
caracteres */) considerado como comentrio.
Linhas Mistas
O AdvPl tambm permite que existam linhas de comando com comentrio. Isto possvel inclundo-se as
duas barras transversais (//) ao final da linha de comando e adicionando-se o texto do comentrio:

Local nCnt
Local nSoma : = 0 / / I ni ci al i za a var i vel comzer o par a a soma
For nCnt : = 1 To 10
nSoma += nCnt
Next nCnt
Tamanho da Linha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no editor de
textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela considerada para a
compilao como uma nica linha de comando.
A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento da tecla <Enter>.
Ou seja, a linha lgica, a linha fsica no arquivo. Porm algumas vezes, por limitao fsica do editor de
texto ou por esttica, pode-se "quebrar" a linha lgica em mais de uma linha fsica no arquivo texto. Isto
efetuado utilizando-se o sinal de ponto-e-vrgula (;).

I f ! Empt y( cNome) . And. ! Empt y( cEnd) . And. ; <ent er >
! Empt y( cTel ) . And. ! Empt y( cFax) . And. ; <ent er >
! Empt y( cEmai l )

Gr avaDados( cNome, cEnd, cTel , cFax, cEmai l )

Endi f

Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como a linha
torna-se muito grande, pode-se divid-la em mais de uma linha fsica utilizando o sinal de ponto-e-vrgula.
Se um sinal de ponto-e-vrgula for esquecido nas duas primeiras linhas, durante a execuo do programa
ocorrer um erro, pois a segunda linha fsica ser considerada como uma segunda linha de comando na
compilao. E durante a execuo esta linha no ter sentido.

Estrutura de um Programa
AdvPl________________________________________________________________32
Apesar de no ser uma linguagem de padres rgidos com relao estrutura do programa, importante
identificar algumas de suas partes. Considere o programa de exemplo abaixo:

/ *
+===========================================+0
| Pr ogr ama: Cl cul o do Fat or i al |
| Aut or : Mi cr osi ga Sof t war e S. A. |
| Dat a : 02 de out ubr o de 2001 |
+===========================================+
*/

Local nCnt
Local nResul t ado : = 1 / / Resul t ado do f at or i al
Local nFat or : = 5 / / Nmer o par a o cl cul o

/ / Cl cul o do f at or i al
For nCnt : = nFat or To 1 St ep - 1
nResul t ado *= nCnt
Next nCnt

/ / Exi be o r esul t ado na t el a, at r avs da f uno al er t
Al er t ( " O f at or i al de " + cVal ToChar ( nFat or ) + ;
" " + cVal ToChar ( nResul t ado) )

/ / Ter mi na o pr ogr ama
Ret ur n

Pode-se classificar um programa em AdvPl em quatro partes bsicas:

1.rea de Identificao
2.rea de Ajustes Iniciais
3.Corpo do Programa
4.rea de Encerramento
A rea de Identificao
Esta uma rea que no obrigatria e dedicada a documentao do programa. Quando existente,
contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc, e aparece no comeo
do programa, antes de qualquer linha de comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao desejada e escolher
a formatao apropriada.

/ *
+==========================================+
| Pr ogr ama: Cl cul o do Fat or i al |
| Aut or : Mi cr osi ga Sof t war e S. A. |
| Dat a : 02 de out ubr o de 2001 |
+==========================================+
*/
Opcionalmente pode-se incluir definies de constantes utilizadas no programa ou incluso de arquivos de
cabealho nesta rea.
A rea de Ajustes Iniciais
AdvPl________________________________________________________________33
Nesta rea geralmente se fazem os ajustes iniciais, importantes para o correto funcionamento do
programa. Entre os ajustes se encontram declaraes de variveis, inicializaes, abertura de arquivos,
etc. Apesar do AdvPl no ser uma linguagem rgida e as variveis poderem ser declaradas em qualquer
lugar do programa, aconselhvel faz-lo nesta rea visando tornar o cdigo mais legvel e facilitar a
identificao de variveis no utilizadas.

Local nCnt
Local nResul t ado : = 0 / / Resul t ado do f at or i al
Local nFat or : = 10 / / Nmer o par a o cl cul o
O Corpo do Programa
nesta rea que se encontram as linhas de cdigo do programa. onde se realiza a tarefa necessria
atravs da organizao lgica destas linhas de comando. Espera-se que as linhas de comando estejam
organizadas de tal modo que no final desta rea o resultado esperado seja obtido, seja ele armazenado
em um arquivo ou em variveis de memria, pronto para ser exibido ao usurio atravs de um relatrio
ou na tela.

/ / Cl cul o do f at or i al
For nCnt : = nFat or To 1 St ep - 1
nResul t ado *= nCnt
Next nCnt
A rea de Encerramento
nesta rea onde as finalizaes so efetuadas. onde os arquivos abertos so fechados, e o resultado
da execuo do programa utilizado. Pode-se exibir o resultado armazenado em uma varivel ou em um
arquivo ou simplesmente finalizar, caso a tarefa j tenha sido toda completada no corpo do programa.
nesta rea que se encontra o encerramento do programa. Todo programa em AdvPl deve sempre terminar
com a palavra chave return.

/ / Exi be o r esul t ado na t el a, at r avs da f uno al er t
Al er t ( " O f at or i al de " + cVal ToChar ( nFat or ) + ;
" " + cVal ToChar ( nResul t ado) )

/ / Ter mi na o pr ogr ama
Ret ur n

Variveis de Memria
Tipos de Dados
O AdvPl no uma linguagem de tipos rgidos (strongly typed), o que significa que variveis de memria
podem diferentes tipos de dados durante a execuo do programa. Variveis podem tambm conter
objetos, mas os tipos primrios da linguagem so:
Numrico
AdvPl________________________________________________________________34
O AdvPl no diferencia valores inteiros de valores com ponto flutuante, portanto pode-se criar variveis
numricas com qualquer valor dentro do intervalo permitido. Os seguintes elementos so do tipo de dado
numrico:

2
43. 53
0. 5
0. 00001
1000000

Uma varivel do tipo de dado numrico pode conter um nmero de dezoito dgitos incluindo o ponto
flutuante, no intervalo de 2.2250738585072014 E308 at 1.7976931348623158 E+308.
Lgico
Valores lgicos em AdvPl so identificados atravs de .T. ou .Y. para verdadeiro e .F. ou .N. para falso
(independentemente se os caracteres estiverem em maisculo ou minsculo).
Caracter
Strings ou cadeias de caracteres so identificadas em AdvPl por blocos de texto entre aspas duplas (") ou
aspas simples ('):

" Ol mundo! "
' Est a uma st r i ng'
" Est a ' out r a' st r i ng"

Uma varivel do tipo caracter pode conter strings com no mximo 1 Mb, ou seja, 1048576 caracteres.
Data
O AdvPl tem um tipo de dados especfico para datas. Internamente as variveis deste tipo de dado so
armazenadas como um nmero correspondente a data J uliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim atravs da utilizao de
funes especficas como por exemplo ctod que converte uma string para data.
Matriz (Array)
Matrizes so um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O AdvPl
suporta matrizes uni ou multidimensionais. Os elementos de uma matriz so acessados atravs de ndices
numricos iniciados em 1, identificando a linha e coluna para quantas dimenes existirem.
Uma matriz pode conter no mximo 100000 elementos, independentemente do nmero de dimenses.
Matrizes devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a memria do
servidor.
Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas em AdvPl
que podero ser executadas posteriormente.

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

nTot al Ger al Mensal : = 100
nTot al Ger al Anual : = 300
Al er t ( " Val or mensal : " + cVal ToChar ( nTot al Ger al Mensal ) )

Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300. Isso acontece
porque no momento que esse valor foi atribuido varivel nTotalGeralAnual, o AdvPl considerou apenas
os 10 primeiros caracteres (assim como o faz quando deve exibir o valor da varivel nTotalGeralMensal),
ou seja, considerou-as como a mesma varivel. Assim o valor original de 100 foi substituido pelo de 300.
Limitao de caracteres no nome. Os nomes das variveis devem sempre comear por uma letra ou o
caracter de sublinhado ( _ ). No restante, pode conter letras, nmeros e o caracter de sublinhado.
Qualquer outro caracter, incluindo espaos em branco, no so permitidos.
O AdvPl permite a criao ilimitada de variveis, dependendo apenas da memria disponvel. A seguir
esto alguns nomes vlidos para variveis:

TOT01
cNumer o
VAR_QUALQUER
M_CARGO
A11

E alguns invlidos:

1CODI GO ( I ni ci a por umnmer o)
M CARGO ( cont mumespao embr anco)
LOCAL ( pal avr a r eser vada do AdvPl )

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

nResul t ado : = 250 * ( 1 + ( nPer cent ual / 100) )

Se esta linha for executada em um programa AdvPl, ocorrer um erro de execuo com a mensagem
"variable does not exist: nPercentual", pois esta varivel est sendo utilizada em uma expresso de
clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar a varivel previamente:

Local nPer cent ual , nResul t ado
nResul t ado : = 250 * ( 1 + ( nPer cent ual / 100) )

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

Local nPer cent ual , nResul t ado
St or e 10 To nPer cent ual
nResul t ado : = 250 * ( 1 + ( nPer cent ual / 100) )

ou

Local nPer cent ual , nResul t ado
nPer cent ual : = 10
nResul t ado : = 250 * ( 1 + ( nPer cent ual / 100) )

ou

Local nPer cent ual : = 10, nResul t ado
nResul t ado : = 250 * ( 1 + ( nPer cent ual / 100) )

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

01 Local xVar i avel / / Decl ar a a var i vel i ni ci al ment e comval or nul o
AdvPl________________________________________________________________37
02
03 xVar i avel : = " Agor a a var i vel car act er . . . "
04 Al er t ( "Val or do Text o: " + xVar i avel )
05
06 xVar i avel : = 22 / / Agor a a var i vel numr i ca
07 Al er t ( cVal ToChar ( xVar i avel ) )
08
09 xVar i avel : = . T. / / Agor a a var i vel l gi ca
10 I f xVar i avel
11 Al er t ( " A var i vel t emval or ver dadei r o. . . " )
12 El se
13 Al er t ( " A var i vel t emval or f al so. . . " )
14 Endi f
15
16 xVar i avel : = Dat e( ) / / Agor a a var i vel dat a
17 Al er t ( "Hoj e : " + Dt oC( xVar i avel ) )
18
19 xVar i avel : = ni l / / Nul o novament e
20 Al er t ( "Val or nul o: " + xVar i avel )
21
22 Ret ur n

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

If xVariavel

o mesmo que

If xVariavel = .T.

A declarao de variveis para os demais tipos de dados, matrizes e blocos de cdigo, exatamente igual
ao descrito at agora. Apenas existem algumas diferenas quanto a inicializao, que podem ser
consultadas na documentao de inicializao de matrizes e blocos de cdigo.
Matrizes
AdvPl________________________________________________________________38
Matrizes, ou arrays, so colees de valores. Ou, de uma maneira mais fcil de entender, uma lista. Uma
matriz pode ser criada atravs de diferentes maneiras. Consulte a documentao sobre Inicializao de
Matrizes para maiores detalhes.
Cada item em uma matriz referenciado pela indicao de sua posio numrica na lista, iniciando pelo
nmero 1. O exemplo a seguir declara uma varivel, atribui uma matriz de trs elementos a ela, e ento
exibe um dos elementos e o tamanho da matriz:

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

O AdvPl permite a manipulao de matrizes facilmente. Enquanto que em outras linguagens como C ou
Pascal necessrio alocar memria para cada elemento de uma matriz (o que tornaria a utilizao de
"pointeiros" necessria), o AdvPl se encarrega de gerenciar a memria e torna simples adicionar
elementos a uma matriz, utilizando a funo aAdd:

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
Matrizes como Estruturas
Uma caracterstica interessante do AdvPl que uma matriz pode conter qualquer coisa: nmeros, datas,
lgicos, caracteres, objetos, etc. E ao mesmo tempo. Em outras palavras, os elementos de uma matriz
no precisam ser necessariamente do mesmo tipo de dado, em contraste com outras linguagens como C e
Pascal.

aFunct1 := {"Pedro",32,.T.}

Esta matriz contem uma string, um nmero e um valor lgico. Em outras linguagens como C ou Pascal,
este "pacote" de informaes pode ser chamado como um "struct" (estrutura em C, por exemplo) ou um
"record" (registro em Pascal, por exemplo). Como se fosse na verdade um registro de um banco de dados,
um pacote de informaes construdo com diversos campos. Cada campo tendo um pedao diferente de
dado.
Suponha que no exemplo anterior, o array aFunct1 contenha informaes sobre o nome de uma pessoa,
sua idade e sua situao matrimonial. Os seguintes #defines podem ser criados para indicar cada posio
dos valores dentro da matriz:

#define FUNCT_NOME 1
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
AdvPl________________________________________________________________39

E considere mais algumas matrizes para representar mais pessoas:

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

Os nomes podem ser impressos assim:

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

Agora, ao invs de trabalhar com variveis individuais, pode-se agrup-las em uma outra matriz, do
mesmo modo que muitos registros so agrupados em uma tabela de banco de dados:

aFuncts := {aFunct1, aFunct2, aFunct3}

Que equivalente a isso:

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

aFuncts uma matriz com 3 linhas por 3 colunas. Uma vez que as variveis separadas foram combinadas
em uma matriz, os nomes podem ser exibidos assim:

Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount,FUNCT_NOME])
// O acesso a elementos de uma matriz multidimensional
// pode ser realizado tambm desta forma:
// aFuncts[nCount][FUNCT_NOME]
Next nCount

AdvPl________________________________________________________________40
A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a constante
FUNCT_NOME seleciona a primeira coluna daquela linha.
Cuidados com Matrizes
Matrizes so listas de elementos, portanto memria necessria para armazenar estas informaes.
Como as matrizes podem ser multidimensionais, a memria necessria ser a multiplicao do nmero de
itens em cada dimenso da matriz, considerando-se o tamanho do contedo de cada elemento contido
nesta. Portanto o tamanho de uma matriz pode variar muito.
A facilidade da utilizao de matrizes, mesmo que para armazenar informaes em pacotes como descrito
anteriormente, no compensada pela utilizao em memria quando o nmero de itens em um array for
muito grande. Quando o nmero de elementos for muito grande deve-se procurar outras solues, como a
utilizao de um arquivo de banco de dados temporrio.
No h limitao para o nmero de dimenses que uma matriz pode ter, mas o nmero de elementos
mximo (independentes das dimenses onde se encontram) de 100000.
Inicializando Matrizes
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da matriz s ser
conhecido em tempo de execuo.
Se o tamanho da matriz conhecido
Se o tamanho da matriz conhecido no momento que o programa escrito, h diversas maneiras de
implementar o cdigo.

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

Este cdigo preenche a matriz com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ... 81, 100.
Note que a linha 07 se refere varivel aX, mas poderia tambm trabalhar com aY ou aZ. O objetivo
deste exemplo demonstrar trs modos de criar uma matriz de tamanho conhecido no momento da
criao do cdigo.
Na linha 02 a matriz criada usando aX[10]. Isto indica ao AdvPl para alocar espao para 10 elementos
na matriz. Os colchetes [ e ] so utilizados para indicar o tamanho necessrio.
Na linha 03 utilizada a funo array com o parmetro 10 para criar a matriz, e o retorno desta funo
atribudo varivel aY.
AdvPl________________________________________________________________41
Na linha 03 efetuado o que se chama "desenhar a imagen da matriz". Como pode-se notar, existem dez
0s na lista encerrada entre chaves ({}). Claramente, este mtodo no o utilizado para criar uma matriz
de 1000 elementos. O terceiro mtodo difere dos anteriores porque inicializa a matriz com os valores
definitivos. Nos dois primeiros mtodos, cada posio da matriz contm um valor nulo (Nil) e deve ser
inicializado posteriormente.
A linha 07 demonstra como um valor pode ser atribudo para uma posio existente em uma matriz
especificando o ndice entre colchetes.
Se o tamanho da matriz no conhecido
Se o tamanho da matriz no conhecido at o momento da execuo do programa, h algumas maneiras
de criar uma matriz e adicionar elementos a ela. O exemplo a seguir ilustra a idia de criao de uma
matriz vazia (sem nenhum elemento) e 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 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum elemento, seu tipo
de dado matriz.
Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento.
Na linha 04 est declarada a representao de uma matriz vazia em AdvPl. Mais uma vez, esto sendo
utilizadas as chaves para indicar que o tipo de dados da varivel matriz. Note que {} uma matriz vazia
(tem o tamanho 0), enquanto {Nil} uma matriz com um nico elemento nulo (tem tamanho 1).
Porque cada uma destas matrizes no contem elementos, a linha 07 utiliza a funo aadd para adicionar
elementos sucessivamente at o tamanho necessrio (especificado por exemplo na varivel nSize).
Blocos de Cdigo
Blocos de cdigo so um conceito existente h muito tempo em linguagens xBase. No como algo que
apareceu da noite para o dia, e sim uma evoluo progressiva utilizando a combinao de muitos
conceitos da linguagem para a sua implementao.
Um Primeiro Lembrete
O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim como o operador
de atribuio :=.
Assim, ao invs de escrever:
AdvPl________________________________________________________________42

x := 10 // Atribui o valor 10 varivel chamada X
Alert("Valor de x: " + cValToChar(x))

Posde-se escrever:

// Atribui e ento exibe o valor da varivel X
Alert("Valor de x: " + cValtoChar(X := 10))

A expresso x:=10 avaliada primeiro, e ento seu resultado (o valor de X, que agora 10) passada
para a funo cvaltochar para a converso para caracter, e em seguida para a funo alert para a
exibio. Por causa desta regra de precedncia possvel atribuir um valor a mais de uma varavel ao
mesmo tempo:

Z := Y := X := 0

Por causa dessa regra, essa expresso avaliada como se fosse escrita assim:

Z := ( Y := (X := 0) )

Apesar do AdvPl avaliar expresses da esquerda para a direita, no caso de atribuies isso acontece ao
contrrio, da direita para a esquerda. O valor atribudo varivel X, que retorna o valor para ser
atribudo varivel Y e assim sucessivamente. Pode-se dizer que o zero foi "propagado atravs da
expresso".
Outro Lembrete
Em AdvPl pode-se juntar diversas linhas de cdigo em uma nica linha fscia do arquivo. Por exemplo, o
cdigo:

If lAchou
Alert("Cliente encontrado!")
Endif

pode ser escrito assim:

If lAchou ; Alert("Cliente encontrado!") ; Endif

AdvPl________________________________________________________________43
O ponto-e-vrgula indica ao AdvPl que a nova linha de cdigo est para comear. Pode-se ento colocar
diversas linhas lgicas de cdigo na mesma linha fsica atravs do editor de texto utilizado.
Apesar da possibilidade de se escrever todo o programa assim, em uma nica linha fsica, isto no
recomendado pois dificulta a legibilidade do programa e, conseqentemente, a manuteno.
Lista de Expresses
A evoluo dos blocos de cdigo comea com as listas de expresses. Nos exemplos a seguir, o smbolo
==> indicar o retorno da expresso aps sua avaliao (seja para atribuir em uma varivel, exibir para o
usurio ou imprimir em um relatrio), que ser impresso em um relatrio por exemplo.
Duas Linhas de Cdigo
@00,00 PSAY x := 10 ==> 10
@00,00 PSAY y := 20 ==> 20

Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.
Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula
Este o mesmo cdigo que o anterior, apenas escrito em uma nica linha:

Alert( cValToChar( x := 10 ; y := 20 ) ) ==> 10

Apesar desse cdigo se encontrar em uma nica linha fsica, existem duas linhas lgicas separadas pelo
ponto e vrgula. Ou seja, esse cdigo equivalente a:

Alert( cValToChar( x := 10 ) )
y := 20

Portanto apenas o valor 10 da varivel x ser passado para as funes cvaltochar e alert para ser exibido.
E o valor 20 apenas ser atribudo varivel y.
Convertendo para uma Lista de Expresses
Quando parnteses so colocados ao redor do cdigo e o sinal de ponto-e-vrgula substitudo por uma
vrgula apenas, o cdigo torna-se uma lista de expresses:

Alert( cValToChar ( ( X := 10 , Y := 20 ) ) ) ==> 20

O valor de retorno resultante de uma lista de expresses o valor resultante da ltima expresso ou
elemento da lista. Funciona como se fosse um pequeno programa ou funo, que retorna o resultado de
sua ltima avaliao (efetuadas da esquerda para a direita).
AdvPl________________________________________________________________44
Neste exemplo, a expresso x := 10 avaliada, e ento a expresso y := 20, cujo valor resultante
passado para a funo alert e cvaltochar, e ento exibido. Depois que essa linha de cdigo executada, o
valor de X igual a 10 e o de y igual a 20, e 20 ser exibido.
Teoricamente, no h limitao para o nmero de expresses que podem ser combinadas em uma lista de
expresses. Na prtica, o nmero mximo por volta de 500 smbolos.
Debugar listas de expresses difcil oprque as expresses no esto divididas em linhas de cdigo fonte,
o que torna todas as expresses associadas a uma mesma linha de cdigo. Isto pode tornar muito difcil
determinar onde um erro ocorreu.
Onde Pode-se Utilizar uma Lista de Expresses?
O propsito principal de uma lista de expresses agrup-las em uma nica unidade. Em qualquer lugar
do cdigo AdvPl que uma expresso simples pode ser utilizada, pode-se utilizar uma lista de expresses. E
ainda, pode-se fazer com que vrias coisas aconteam onde normalmente apenas uma aconteceria.

X := 10 ; Y := 20

If X > Y
Alert("X")
Z := 1
Else
Alert("Y")
Z := -1
Endif

Aqui temos o mesmo conceito, escrito utilizando listas de expresses na funo iif:

X := 10 ; Y := 20

iif( X > Y , ;
( Alert("X"), Z := 1 ) , ;
( Alert("Y"), Z := -1 ) )
De Listas de Expresses para Blocos de Cdigo
Considere a seguinte lista de expresses:

Alert( cValToChar( ( x := 10, y := 20 ) ) ) ==> 20

AdvPl________________________________________________________________45
O AdvPl permite criar funes, que so pequenos pedaos de cdigo, como se fosse um pequeno
programa, utilizados para diminuir partes de tarefas mais complexas e reaproveitar cdigo em mais de um
lugar num programa. Para maiores detalhes consulte a documentao sobre a criao de funes em
AdvPl. Porm, a idia neste momento que a lista de expresses utilizada na linha anterior pode ser
criada como uma funo:

Function Lista()
X := 10
Y := 20
Return Y

E a linha de exemplo com a lista de expresses pode ser substituda, tendo o mesmo resultado, por:

Alert( cValToChar( Lista() ) ) ==> 20

Como mencionado anteriormente, uma lista de expresses como um pequeno programa ou funo. Com
poucas mudanas, uma lista de expresses pode se tornar um bloco de cdigo:

( X := 10 , Y := 20 ) // Lista de Expresses
{|| X := 10 , Y := 20 } // Bloco de Cdigo

Note as chaves {} utilizadas no bloco de cdigo. Ou seja, um bloco de cdigo uma matriz. Porm na
verdade, no uma lista de dados, e sim uma lista de comandos, uma lista de cdigo.

// Isto uma matriz de dados
A := {10, 20, 30}

// Isto um bloco de cdigo, porm funciona como
// se fosse uma matriz de comandos
B := {|| x := 10, y := 20}
Executando um Bloco de Cdigo
Diferentemente de uma matriz, no se pode acessar elementos de um bloco de cdigo atravs de um
ndice numrico. Porm blocos de cdigo so semelhantes a uma lista de expresses, e a uma pequena
funo. Ou seja, podem ser executados. Para a execuo, ou avaliao, de um bloco de cdigo, deve-se
utilizar a funo eval:

nRes := Eval(B) ==> 20
AdvPl________________________________________________________________46

Essa funo recebe como parmero um bloco de cdigo e avalias todas as expresses contidas neste bloco
de cdigo, retornando o resultado da ltima expresso avaliada.
Passando Parmetros
J que blocos de cdigo so como pequenas funes, tambm possvel a passagem de parmetros para
um bloco de cdigo. Os parmetros devem ser informados entre as barras verticais (||) separados por
vrgulas, assim como em uma funo.

B := {| N | X := 10, Y := 20 + N}

Porm deve-se notar que j que o bloco de cdigo recebe um parmetro, um valor deve ser passado
quando o bloco de cdigo for avaliado.

C := Eval(B, 1) ==> 21
Utilizando Blocos de Cdigo
Blocos de cdigo podem ser utilizados em diversas situaes. Geralmente so utilizados para executar
tarefas quando eventos de objetos so acionados ou para modificar o comportamento padro de algumas
funes.
Por exemplo, considere a matriz abaixo:

A := {"GARY HALL", "FRED SMITH", "TIM JONES"}

Esta matriz pode ser ordenada pelo primeiro nome, utilizando-se a chamada da funo asort(A), resultado
na matriz com os elementos ordenados dessa forma:

{"FRED SMITH", "GARY HALL", "TIM JONES"}

A ordem padro para a funo asort ascendente. Este comportamento pode ser modificado atravs da
informao de um bloco de cdigo que ordena a matriz de forma descendente:

B := { |X, Y| X > Y }
aSort(A, B)

O bloco de cdigo (de acordo com a documentao da funo asort) deve ser escrito para aceitar dois
parmetros que so os dois elementos da matriz para comparao. Note que o bloco de cdigo no
conhece que elementos est comparando - a funo asort seleciona os elementos (talvez utilizando o
algortmo QuickSort) e passa-os para o bloco de cdigo. O bloco de cdigo compara-os e retorna
verdadeiro (.T.) se se encontram na ordem correta, ou falso (.F.) se no. Se o valor de retorno for falso, a
funo asort ir ento trocar os valores de lugar e seguir comparando o prximo par de valores.
AdvPl________________________________________________________________47
Ento, no bloco de cdigo anterior, a comparao X > Y verdadeira se os elementos esto em ordem
descendente, o que significa que o primeiro valor maior que o segundo.
Para ordenar a mesma matriz pelo ltimo nome, tambm em orden descendente, pode-se utilizar o
seguinte bloco de cdigo:

B := { |X, Y| Substr(X,At(" ",X)+1) > Substr(Y,At(" ",Y)+1) }

Note que este bloco de cdigo procura e compara as partes dos caracteres imediatamente seguinte a um
espao em branco. Depois de utilizar esse bloco de cdigo para a funo asort, a matriz conter:

{"GARY HALL", "TIM JONES", "FRED SMITH"}

Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, pode-se utilizar o
seguinte bloco de cdigo:

B := { |X, Y| X[1] > Y[1] }

Escopo de Variveis
O Contexto de Variveis dentro de um Programa
As variveis declaradas em um programa ou funo, so visveis de acordo com o escopo onde so
definidas. Como tambm do escopo depende o tempo de existncia das variveis. A definio do escopo
de uma varivel efetuada no momento de sua declarao.

Local nNumero := 10

Esta linha de cdigo declara uma varivel chamada nNumero indicando que pertence seu escopo local.

Os identifadores de escopo so:

LOCAL
STATIC
AdvPl________________________________________________________________48
PRIVATE
PUBLIC

O AdvPl no rgido em relao declarao de variveis no comeo do programa. A incluso de um
identificador de escopo no necessrio para a declarao de uma varivel, contanto que um valor lhe
seja atribudo.

nNumero2 := 15

Quando um valor atribudo uma varivel em um programa ou funo, o AdvPl criar a varivel caso
ela no tenha sido declarada anteriormente. A varivel ento criada como se tivesse sido declarada
como Private.

Devido a essa caracterstica, quando pretende-se fazer uma atribuio a uma varivel declarada
previamente mas escreve-se o nome da varivel de forma incorreta, o AdvPl no gerar nenhum
erro de compilao ou de execuo. Pois compreender o nome da varivel escrito de forma
incorreta como se fosse a criao de uma nova varivel. Isto alterar a lgica do programa, e um
erro muitas vezes difcil de identificar.
Variveis Locais
Variveis locais so pertencentes apenas ao escopo da funo onde foram declaradas. Devem ser
explicitamente declaradas com o identificador LOCAL, como no exemplo:

Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)

AdvPl________________________________________________________________49
Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a funo Filha
executada, nVar ainda existe mas no pode ser acessada. Quando a execuo da funo Pai terminar, a
varivel nVar destruda. Qualquer varivel com o mesmo nome no programa que chamou a funo Pai
no afetada.
Variveis locais so criadas automaticamente cada vez que a funo onde forem declaradas for ativada.
Elas continuam a existir e mantm seu valor at o fim da ativao da funo (ou seja, at que a funo
retorne o controle para o cdigo que a executou). Se uma funo chamada recursivamente (por
exemplo, chama a si mesma), cada chamada em recurso cria um novo conjunto de variveis locais.
A visibilidade de variveis locais idntica ao escopo de sua declarao. Ou seja, a varivel visvel em
qualquer lugar do cdigo fonte em que foi declarada. Se uma funo chamada recursivamente, apenas
as variveis locais criadas na mais recente ativao so visveis.
Variveis Estticas
Variveis estticas funcionam basicamente como as variveis locais, mas mantm seu valor atravs da
execuo. Variveis estticas devem ser declaradas explicitamente no cdigo com o identificador STATIC.
O escopo das variveis estticas depende de onde so declaradas. Se forem declaradas dentro do corpo
de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem declaradas fora do
corpo de qualquer rotina, seu escopo todo o arquivo de programa.
Neste exemplo, a varivel nVar declarada como esttica e inicializada com o valor 10:

Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)

Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente de variveis
declaras como LOCAL ou PRIVATE, nVar continua a existir e mantem seu valor atual quando a execuo
da funo Pai termina. Entretanto, somente pode ser acessada por execues subseqntes da funo Pai.
Variveis Privadas
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com o
identificador PRIVATE.
AdvPl________________________________________________________________50
Adicionalmente, a atribuio de valor a uma varivel no criada anteriormente automaticamente cria a
varivel como privada. Uma vez criada, uma varivel privada continua a existir e mantem seu valor at
que o programa ou funo onde foi criada termine (ou seja, at que a funo onde foi criada retorne para
o cdigo que a executou). Neste momento, automaticamente destruda.
possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente. Entretanto, a
nova (duplicada) varivel pode apenas ser criada em um nvel de ativao inferior ao nvel onde a varivel
foi declarada pela primeira vez (ou seja, apenas em uma funo chamada pela funo onde a varivel j
havia sido criada). A nova varivel privada ir esconder qualquer outra varivel privada ou pblica (veja a
documentao sobre variveis pblicas) com o mesmo nome enquanto existir.
Uma vez criada, uma varivel privada visvel em todo o programa enquanto no for destruda
automaticamente quando a rotina que a criou terminar ou uma outra varivel privada com o mesmo nome
for criada em uma subfuno chamada (neste caso, a varivel existente torna-se inacessvel at que a
nova varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as funes
chamadas por esta, a menos que uma funo chamada crie sua prpria varivel privada com o mesmo
nome.
Por exemplo:

Function Pai()
Private nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)

Neste exemplo, a varivel nVar criada como privada e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e, diferente de uma varivel local, pode ser acessada pela funo Filha.
Quando a funo Pai terminar, nVar ser destruda e qualquer declarao de nVar anterior se tornar
acessvel novamente.
Variveis Pblicas
Pode-se criar variveis pblicas dinamicamente no cdigo com o identificador PUBLIC. As variveis
pblicas continuam a existir e mantm seu valor at o fim da execuo.
possvel criar uma varivel privada com o mesmo nome de uma varivel pblica existente. Entretanto,
no permitido criar uma varivel pblica com o mesmo nome de uma varivel privada existente.
Uma vez criada, uma varivel pblica visvel em todo o programa onde foi declarada at que seja
escondida por uma varivel privada criada com o mesmo nome. A nova varivel privada criada esconde a
AdvPl________________________________________________________________51
varivel pblica existente, e esta se tornar inacessvel at que a nova varivel privada seja destruda. Por
exemplo:

Function Pai()
Public nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)

Neste exemplo, nVar criada como pblica e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privadas, nVar ainda
existe aps o trmino da a execuo da funo Pai.

Diferentemente dos outros identificadores de escopo, quando uma varivel declarada como
pblica sem ser inicializada, o valor assumido falso (.F.) e no nulo (nil).
Diferenciao entre variveis e nomes de campos
Muitas vezes uma varivel pode ter o mesmo nome que um campo de um arquivo ou tabela aberto no
momento. Neste caso, o AdvPl privilegiar o campo. Assim uma referncia a um nome que identifique
tanto uma varivel como um campo, resultar no contedo do campo.
Para especificar qual deve ser o elemento referenciado, deve-se utilizar o operador de identificao de
apelido (->) e um dos dois identificadores de referncia, MEMVAR ou FIELD.

cRes := MEMVAR->NOME

Esta linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da varivel de
memria chamada NOME.

cRes := FIELD->NOME
AdvPl________________________________________________________________52

Neste caso, o valor atribudo varivel cRes ser o valor do campo NOME existente no arquivo ou tabela
aberto na rea atual.
O identificador FIELD pode ser substitudo pelo apelido de um arquivo ou tabela aberto, para evitar a
necessidade de selecionar a rea antes de acessar o contedo de terminado campo.

cRes := CLIENTES->NOME

Para maiores detalhes sobre abertura de arquivos com atribuio de apelidos, consulte a documentao
sobre acesso a banco de dados ou a documentao da funo dbUseArea.

Operadores da Linguagem
Operadores Comuns
Na documentao sobre variveis h uma breve demonstrao de como atribuir valores a uma varivel da
forma mais simples. O AdvPl amplia significativamente a utilizao de variveis atravs do uso de
expresses e funes. Uma expresso um conjunto de operadores e operandos cujo resultado pode ser
atribudo a uma varivel ou ento analisado para a tomada de decises. Por exemplo:

Local nSalario := 1000, nDesconto := 0.10
Local nAumento, nSalLiquido
nAumento := nSalario * 1.20
nSalLiquido := nAumento * (1-nDesconto)

Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps um aumento. Os
operandos de uma expresso podem ser uma varivel, uma constante, um campo de arquivo ou uma
funo.
Operadores Matemticos
Os operadores utilizados em AdvPl para clculos matemticos so:
+ Adio
- Subtrao
* Multiplicao
AdvPl________________________________________________________________53
/ Diviso
** ou ^ Exponenciao
% Mdulo (Resto da Diviso)
Operadores de String
Os operadores utilizados em AdvPl para tratamento de caracteres so:
+ Concatenao de strings (unio)
- Concatenao de strings com eliminao dos brancos finais das strings intermedirias
$ Comparao de Substrings (contido em)
Operadores Relacionais
Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so:
< Comparao Menor
> Comparao Maior
= Comparao Igual
== Comparao Exatamente Igual (para caracteres)
<= Comparao Menor ou Igual
>= Comparao Maior ou Igual
<>
ou
#
ou
!=
Comparao Diferente

Operadores Lgicos
Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so:
.And. E lgico
.Or. OU lgico
AdvPl________________________________________________________________54
.Not. ou ! NO lgico

Operadores de Atribuio
Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so:
= Atribuio Simples
:= Atribuio em Linha
+= Adio e Atribuio em Linha
-= Subtrao e Atribuio em Linha
*= Multiplicao e Atribuio em Linha
/= Diviso e Atribuio em Linha
**= ou ^= Exponenciao e Atribuio em Linha
%= Mdulo (resto da diviso) e Atribuio em Linha

Atribuio Simples
O sinal de igualdade utilizado para atribuir valor a uma varivel de memria.

nVariavel = 10
Atribuio em Linha
O operador de atribuio em linha caracterizado por dois pontos e o sinal de igualdade. Tem a mesma
funo do sinal de igualdade sozinho, porm aplia a atribuio s variveis. Com ele pode-se atribuir mais
de uma varivel ao mesmo tempo.

nVar1 := nVar2 := nVar3 := 0

Quando diversas variveis so inicializadas em uma mesma linha, a atribuio comea da direita para a
esquerda, ou seja, nVar3 recebe o valro zero inicialmente, nVar2 recebe o contedo de nVar3 e nVar1
recebe o contedo de nVar2 por final.
Com o operador de atribuio em linha, pode-se substituir as inicializaes individuais de cada varivel
por uma inicializao apenas:

AdvPl________________________________________________________________55
Local nVar1 := 0, nVar2 := 0, nVar3 := 0

por

Local nVar1 := nVar2 := nVar3 := 0

O operador de atribuio em linha tambm pode ser utilizado para substituir valores de campos em um
banco de dados.
Atribuio Composta
Os operadores de atribuio composta so uma facilidade da linguagem AdvPl para expresses de clculo
e atribuio. Com eles pode-se economizar digitao:
Operador Exemplo Equivalente a
+= X += Y X = X + Y
-= X -= Y X = X - Y
*= X *= Y X = X * Y
/= X /= Y X = X / Y
**= ou ^= X **= Y X = X ** Y
%= X %= Y X = X % Y
Operadores de I ncremento/ Decremento
A linguagem AdvPl possui operadores para realizar incremento ou decremento de variveis. Entende-se
por incremento aumentar o valor de uma varivel numrica em 1 e entende-se por decremento diminuir o
valor da varivel em 1. Os operadores so:
++ Incremento Ps ou Pr-fixado
-- Decremento Ps ou Pr-fixado

Os operadores de decremento/incremento podem ser colocados tanto antes (pr-fixado) como depois
(ps-fixado) do nome da varivel. Dentro de uma expresso, a ordem do operador muito importante,
podendo alterar o resultado da expresso. Os operadores incrementais so executados da esquerda para a
direita dentro de uma expresso.

Local nA := 10
AdvPl________________________________________________________________56
Local nB := nA++ + nA

O valor da varivel nB resulta em 21, pois a primeira referncia a nA (antes do ++) continha o valor 10
que foi considerado e imediatamente aumentado em 1. Na segunda referncia a nA, este j possua o
valor 11. O que foi efetuado foi a soma de 10 mais 11, igual a 21. O resultado final aps a execuo
destas duas linhas a varivel nB contendo 21 e a varivel nA contendo 11.
No entando:

Local nA := 10
Local nB := ++nA + nA

Resulta em 22, pois o operador incremental aumentou o valor da primeira nA antes que seu valor fosse
considerado.
Operadores Especiais
Alm dos operadores comuns, o AdvPl possui alguns outros operadores ou identificadores. Estas so suas
finalidades:
() Agrupamento ou Funo
[] Elemento de Matriz
{} Definio de Matriz, Constante ou Bloco de Cdigo
-> Identificador de Apelido
& Macrosubstituio
@ Passagem de parmetro por referncia

Os parnteses so utilizados para agrupar elementos em uma expresso mudando a ordem de
precedncia da avaliao da expresso (segundo as regras matemticas por exemplo). Tambm servem
para envolver os argumentos de uma funo. Veja a documentao sobre precedncia de operadores
para maiores detalhes.
Os colchetes so utilizados para especificar um elemento especfico de uma matriz. Por exemplo, A[3,2],
refere-se ao elemento da matriz A na linha 3, coluna 2.
As chaves so utilizadas para a especificao de matrizes literais ou blocos de cdigo. Por exemplo,
A:={10,20,30} cria uma matriz chamada A com trs elementos.
O smbolo -> identifica um campo de um arquivo diferenciando-o de uma varivel. Por exemplo, FUNC-
>nome refere-se ao campo nome do arquivo FUNC. Mesmo que exista uma varivel chamada nome, o
campo nome que ser acessado.
O smbolo & identifica uma avaliao de expresso atravs de macro e visto em detalhes na
documentao sobre macrossubstituio.
AdvPl________________________________________________________________57
O smbolo @ utilizado para indicar que durante a passagem de uma varivel para uma funo ou
procedimento ela seja tomada como uma referncia e no como valor.
Ordem de Precedncia dos Operadores
Dependendo do tipo de operador, existe uma ordem de precedncia para a avaliao dos operandos. Em
princpio, todas as operaes com os operadores so realizadas da esquerda para a direita se eles tiverem
o mesmo nvel de prioridade.
A ordem de precedncia, ou nvel de prioridade de execuo, dos operadores em AdvPl :
1.Operadores de Incremento/Decremento pr-fixado
2.Operadores de String
3.Operadores Matemticos
4.Operadores Relacionais
5.Operadores Lgicos
6.Operadores de Atribuio
7.Operadores de Incremento/Decremento ps-fixado
Em expresses complexas com diferentes tipos de operadores, a avaliao seguir essa sequncia. Caso
exista mais de um operador do mesmo tipo (ou seja, de mesmo nvel), a avaliao se d da esquerda
para direita. Para os operadores matemticos entretanto h uma precedncia a seguir:
1.Exponenciao
2.Multiplicao e Diviso
3.Adio e Subtrao
Considere o exemplo:

Local nResultado := 2+10/2+5*3+2^3

O resultado desta expresso 30, pois primeiramente calculada a exponenciao 2^3(=8), ento so
calculadas as multiplicaes e divises 10/2(=5) e 5*3(=15), e finalmente as adies resultando em
2+5+15+8(=30).
Alterao da Precedncia
A utilizao de parnteses dentro de uma expresso altera a ordem de precedncia dos operadores.
Operandos entre parnteses so analisados antes dos que se encontram fora dos parnteses. Se existirem
mais de um conjunto de parnteses no-aninhados, o grupo mais a esquerda ser avaliado primeiro e
assim sucessivamente.

Local nResultado := (2+10)/(2+5)*3+2^3

AdvPl________________________________________________________________58
No exemplo acima primeiro ser calculada a exponenciao 2^3(=8). Em seguida 2+10(=12) ser
calculado, 2+5(=7) calculado, e finalmente a diviso e a multiplicao sero efetuadas, o que resulta em
12/7*3+8(=13.14).
Se existirem vrios parnteses aninhados, ou seja, colocados um dentro do outro, a avaliao ocorrer do
parnteses mais intero em direo ao mais externo.
Macro Substituio
O operador de macro substituio, simbolizado pelo "e" comercial (&), utilizado para a avaliao de
expresses em tempo de execuo. Funciona como se uma expresso armazenada fosse compilada em
tempo de execuo, antes de ser de fato executada. Considere o exemplo:

01 X := 10
02 Y := "X + 1"
03 B := &Y // O contedo de B ser 11

A varivel X atribuda com o valor 10, enquanto a varivel Y atribuda com a string de caracteres
contendo "X + 1".
A terceira linha utiliza o operador de macro. Esta linha faz com que o nmero 11 seja atribudo varivel
B. Pode-se perceber que esse o valor resultante da expresso em formato de caractere contida na
varivel Y.
Utilizando-se uma tcnica matemtica elementar, a substituio, temos que na segunda linha, Y definido
como "X + 1", ento pode-se substituir Y na terceira linha:

03 B := &"X + 1"

O operador de macro cancela as aspas:

03 B := X + 1

Pode-se perceber que o operador de macro remove as aspas, o que deixa um pedao de cdigo para ser
executado. Deve-se ter em mente que tudo isso acontece em tempo de eecuo, o que torna tudo muito
dinmico. Uma utilizao interessante criar um tipo de calculadora, ou avaliador de frmulas, que
determina o resultado de algo que o usurio digita.

O operador de macro tem uma limitao: variveis referenciadas dentro da string de caracteres (X
nos exemplos anteriores) no podem ser locais.
AdvPl________________________________________________________________59
Estruturas de Controle
Controlando o Fluxo
O AdvPl suporta vrias estruturas de controle que permitem mudar a seqncia de fluxo de execuo de
um programa. Estas estruturas permitem a execuo de cdigo baseado em condies lgica e a repetio
da execuo de pedaos de cdigo qualquer nmero de vezes.
Em AdvPl, todas as estruturas de controle podem ser "aninhadas" dentro de todas as demais estruturas
contanto que estejam aninhadas propriamente. Estruturas de controle tm um identificador de incio e um
de fim, e qualquer estrutura aninhada deve se encontrar entre estes identificadores.
Tambm existem estruturas de controle para determinar que elementos, comandos, etc em um programa
sero compilados. Estas so as diretivas do pr-processador #ifdef...#endif e #ifndef...#endif. Consulte a
documentao sobre o pr-processador para maiores detalhes.
As estruturas de controle em AdvPl esto divididas em Estruturas de Repetio e Estruturas de
Deciso.
Estruturas de Repetio
Repetio de Comandos
Estruturas de repetio so deseginadas para executar uma seo de cdigo mais de uma vez. Por
exemplo, imagiando-se a existncia de uma funo para imprimir um relatrio, pode-se desejar imprimi-lo
quatro vezes. Claro, pode-se simplesmente chamar a funo de impresso quatro vezes em seqncia,
mas isto se tornaria pouco profissional e no resolveria o problema se o nmero de relatrios fosse
varivel.
Em AdvPl existem dois comandos para a repetio de sees de cdigo. O comando FOR...NEXT e o
comando WHILE...ENDDO.
O Comando FOR...NEXT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma seo de cdigo em um
nmero determinado de vezes.
Sintaxe
FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos...
AdvPl________________________________________________________________60
[EXIT]
[LOOP]
NEXT
Parmetros
Variavel Especifica uma varivel ou um elemento de uma matriz para atuar como um
contador. A varivel ou o elemento da matriz no precisa ter sido declarado antes
da execuo do comando FOR...NEXT. Se a varivel no existir, ser criada como
uma varivel privada.
nValorInicial
TO nValorFinal
nValorInicial o valor inicial para o contador; nValorFinal o valor final para o
contador. Pode-se utilizar valores numricos literais, variveis ou expresses,
contanto que o resultado seja do tipo de dado numrico.
STEP
nIncremento
nIncremento a quandidade que ser incrementada ou decrementada no contador
aps cada execuo da seo de comandos. Se o valor de nIncremento for negativo,
o contador ser decrementado. Se a clusula STEP for omitida, o contador ser
incrementado em 1. Pode-se utilizar valores numricos literais, variveis ou
expresses, contanto que o resultado seja do tipo de dado numrico.
Comandos Especifica um ou mais instrues de comando AdvPl que sero executadas.
EXIT Transfere o controle de dentro do comando FOR...NEXT para o comando
imediatamente seguinte ao NEXT, ou seja, finaliza a repetio da seo de
comandos imediatamente. Pode-se colocar o comando EXIT em qualquer lugar entre
o FOR e o NEXT.
LOOP Retorna o controle diretamente para a clusula FOR sem executar o restante dos
comandos entre o LOOP e o NEXT. O contador incrementadou ou decrementado
normalmente, como se o NEXT tivesse sido alcanado. Pode-se colocar o comando
LOOP em qualquer lugar entre o FOR e o NEXT.
Comentrios
Uma varivel ou um elemento de uma matriz utilizado como um contador para especificar quantas vezes
os comandos AdvPl dentro da estrutura FOR...NEXT so executados. Os comandos AdvPl depois do FOR
so executados at que o NEXT seja alcanado. O contador (Variavel) ento incrementado ou
decremantado com o valor em nIncremento (se a clusula STEP for omitida, o contador incrementado
em 1). Ento, o contador comparado com o valor em nValorFinal. Se for menor ou igual ao valor em
nValorFinal, os comandos seguintes ao FOR so executados novamente. Se o valor for maior que o
contido em nValorFinal, a estrutura FOR...NEXT terminada e o programa continua a execuo no
primeiro comando aps o NEXT.
Os valores de nValorInicial, nValorFinal e nIncremento so apenas considerados inicialmente. Entretanto,
mudar o valor da varivel utilizada como contador dentro da estrutura afetar o nmero de vezes que a
repetio ser executada. Se o valor de nIncremento negativo e o valor de nValorInicial maior que o de
nValorFinal, o contador ser decrementado a cada repetio.
Exemplo
Local nCnt
Local nSomaPar := 0
AdvPl________________________________________________________________61

For nCnt := 0 To 100 Step 2
nSomaPar += nCnt
Next

Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )

Return

Este exemplo imprime a soma dos 100 primerios nmeros pares. A soma obitida atravs da repetio do
clculo utilizando a prpria varivel de contador. Como a clusula STEP est sendo utilizada, a varivel
nCnt ser sempre incrementada em 2. E como o contador comea com 0, seu valor sempre ser um
nmero par.
O Comando WHI LE...ENDDO
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma seo de cdigo
enquanto uma determinada expresso resultar em verdadeiro (.T.).
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpressao Especifica uma expresso lgica cujo valor determina quando os comandos entre o WHILE
e o ENDDO so executados. Enquanto o resultado de lExpressao for avaliado como
verdadeiro (.T.), o conjunto de comandos so executados.
Comandos Especifica um ou mais instrues de comando AdvPl que sero executadas enquanto
lExpressao for avaliado como verdadeiro (.T.).
EXIT Transfere o controle de dentro do comando WHILE...ENDDO para o comando
imediatamente seguinte ao ENDDO, ou seja, finaliza a repetio da seo de comandos
imediatamente. Pode-se colocar o comando EXIT em qualquer lugar entre o WHILE e o
ENDO.
AdvPl________________________________________________________________62
LOOP Retorna o controle diretamente para a clusula WHILE sem executar o restante dos
comandos entre o LOOP e o ENDDO. A expresso em lExpressao reavaliada para a
deciso se os comandos continuaro sendo executados.
Comentrios
Os comandos entre o WHILE e o ENDDO so executados enquanto o resultado da avaliao da expresso
em lExpressao permanecer verdadeiro (.T.). Cada palavra chave WHILE deve ter uma palavra chave
ENDDO correspondente.
Exemplo
Local nNumber := nAux := 350

nAux := Int(nAux / 2)

While nAux > 0
nSomaPar += nCnt
Next

Alert( "A soma dos 100 primeiros nmeros pares : " + ;
cValToChar(nSomaPar) )

Return
Estruturas de Deciso
Desviando a Execuo
Estruturas de desvio so deseginadas para executar uma seo de cdigo se determinada condio lgica
resultar em verdadeiro (.T.). Em AdvPl existem dois comandos para execuo de sees de cdigo de
acordo com avaliaes lgicas. O comando IF...ENDIF e o comando DO CASE...ENDCASE.
O Comando I F...ENDI F
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
AdvPl________________________________________________________________63
Sintaxe
I F lExpressao
Comandos
[ ELSE
Comandos...]
ENDI F
Parmetros
lExpressao Especifica uma expresso lgica que avaliada. Se lExpressao resultar em verdadeiro
(.T.), qualquer comando seguinte ao IF e antecedente ao ELSE ou ENDIF (o que ocorrer
primeiro) ser executado.
Se lExpressao resultar em falso (.F.) e a clusula ELSE for definida, qualquer comando
aps essa clusula e anterior ao ENDIF ser executada. Se a clusula ELSE no for
definida, todos os comandos entre o IF e o ENDIF so ignorados. Neste caso, a execuo
do programa continua com o primeiro comando seguinte ao ENDIF.
Comandos Conjunto de comandos AdvPl que sero executados dependendo da avaliao da
expresso lgica em lExpressao.
Comentrios
Pode-se aninhar um bloco de comando IF...ENDIF dentro de outro bloco de comando IF...ENDIF. Porm,
para a avaliao de mais de uma expresso lgica, deve-se utilizar o comando DO CASE...ENDCASE.
Exemplo
Local dVenct o : = CTOD( " 31/ 12/ 01" )
I f Dat e( ) > dVenct o
Al er t ( "Venci ment o ul t r apassado! ")
Endi f
Ret ur n
O Comando DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro (.T.).
Sintaxe
DO CASE
CASE lExpressao1
Commandos
[ CASE lExpressao2
Commandos
. . .
CASE lExpressaoN
Commandos]
[ OTHERWI SE
Commandos]
ENDCASE
Parmetros
AdvPl________________________________________________________________64
CASE
lExpressao1
Comandos...
Quando a primeira expresso CASE resultante em verdadeiro (.T.) for encontrada, o
conjunto de comandos seguinte executado. A execuo do conjunto de comandos
continua at que a prxima clusula CASE, OTHERWISE ou ENDCASE seja
encontrada. Ao terminar de executar esse conjunto de comandos, a execuo
continua com o primeiro comando seguinte ao ENDCASE.
Se uma expresso CASE resultar em falso (.F.), o conjunto de comandos seguinte a
esta at a prxima clusula ignorado.
Apenas um conjunto de comandos executado. Estes so os primeiros comandos
cuja expresso CASE avaliada como verdadeiro (.T.). Aps a execuo, qualquer
outra expresso CASE posterior ignorada (mesmo que sua avaliao resultasse em
verdadeiro).
OTHERWISE
Commandos
Se todas as expresses CASE forem avaliadas como falso (.F.), a clusula
OTHERWISE determina se um conjunto adicional de comandos deve ser executado.
Se essa clusula for incluida, os comandos seguintes sero executados e ento o
programa continuar com o primeiro comando seguinte ao ENDCASE. Se a clusula
OTHERWISE for omitida, a execuo continuar normalmente aps a clusula
ENDCASE.
Comentrios
O Comando DO CASE...ENDCASE utilizado no lugar do comando IF...ENDIF quando um nmero maior
do que uma expresso deve ser avaliada, substituindo a necessidade de mais de um comando IF...ENDIF
aninhados.
Exemplo
Local nMes : = Mont h( Dat e( ) )
Local cPer i odo : = " "

DO CASE
CASE nMes <= 3
cPer i odo : = "Pr i mei r o Tr i mest r e"
CASE nMes >= 4 . And. nMes <= 6
cPer i odo : = "Segundo Tr i mest r e"
CASE nMes >= 7 . And. nMes <= 9
cPer i odo : = "Ter cei r o Tr i mest r e"
OTHERWI SE
cPer i odo : = "Quar t o Tr i mest r e"
ENDCASE

Ret ur n

Informaes Adicionais
Lista de Palavras Reservadas
AADD DTOS INKEY REPLICATE VAL
AdvPl________________________________________________________________65
ABS ELSE INT RLOCK VALTYPE
ASC ELSEIF LASTREC ROUND WHILE
AT EMPTY LEN ROW WORD
BOF ENDCASE LOCK RTRIM YEAR
BREAK ENDDO LOG SECONDS
CDOW ENDIF LOWER SELECT
CHR EOF LTRIM SETPOS
CMONTH EXP MAX SPACE
COL FCOUNT MIN SQRT
CTOD FIELDNAME MONTH STR
DATE FILE PCOL SUBSTR
DAY FLOCK PCOUNT TIME
DELETED FOUND PROCEDURE TRANSFORM
DEVPOS FUNCTION PROW TRIM
DOW IF RECCOUNT TYPE
DTOC IIF RECNO UPPER

Notas:
Palavras reservadas no podem ser utilizadas para variveis, procedimentos, ou funes.
Funes reservadas so pertencentes ao compilador e portanto no podem ser redefinidas por uma
aplicao.
Abreviaes de quatro letras de palavras reservadas e funes tambm so reseravdas.
Todos os identifadores que comearem com um ou mais caracters de sublinhado (_) so utilizados
como identificadores internos e portanto so tambm reservados.
Tcnicas de Programao Eficiente em AdvPl
Para o desenvolvimento de sistemas e a programao de rotinas, sempre esperado que qualquer cdigo
escrito seja:
de correto funcionamento
eficiente
AdvPl________________________________________________________________66
legvel
reutilizvel
extensvel
portvel
Aps anos de experincia na utilizao de linguagens padro xBase e do desenvolvimento da linguagem
AdvPl, algumas tcnicas para uma programao otimizada e eficiente foram reconhecidas. A utilizao das
tcnicas a seguir, visa buscar o mximo aproveitamento dos recursos da linguagem com o objetivo de
criar programas com estas caractersticas.
Criao de Funes Segundo a Necessidade
Observe o cdigo de exemplo:

User Function GetAnswer(lDefault)
Local lOk
lOk := GetOk(lDefault)
If lOk
Return .T.
Else
Return .F.
Endif
Return nil

Utilizando-se apenas o critrio "a funo funciona corretamente?", a funo GetAnswer perfeita. Recebe
um parmetro lgico com a resposta padro e retorna um valor lgico dependente da opo escolhida
pelo usurio em uma funo de dilogo "sim/no" designada para isso. Pode entretanto ser melhorada,
particularmente se eficincia for considerada como um critrio para um cdigo melhor. Eficincia
tipicamente involve a utilizao de poucos recursos de mquina, poucos chamadas de funes ou tornar
mais rpido um processo.
Segundo esse raciocnio, poderia se produzir o seguinte cdigo:

User Function GetAnswer(lDefault)
Return If( GetOk(lDefault), .T., .F.)

Ou melhor:

User Function GetAnswer(lDefault)
Return GetOk(lDefault)
AdvPl________________________________________________________________67

Com a otimizao do cdigo da funo GetAnswer, pode facilmente verificar que a mesma no realiza
nada adicional chamada de GetOk, podendo ser substituda por uma chamada direta desta, continuando
a funcionar corretamente.
Codificao Auto-Documentvel
Nenhum comentrio substitui um cdigo claramente escrito, e este no um um acidente. Considere o
exemplo:

cVar := " " // 11 espaos

O tamanho da varivel cVar no evidente por si s e no facilmente verificado. Estes mesmos 10
espaos estariam mais bvios e ainda assim garantidos se a instruo fosse escrita como:

cVar := Space(10)

O mesmo princpio pode ser aplicado para qualquer string longa de caracteres repetidos. A funo
Replicate pode ser utilizada como a seguir:

cVar := Replicate( "*", 80 )

Este tipo de programao deixa o cdigo fcil de digitar, fcil de ler e mais flexvel.
Utilizao de Solues Simples
Simplicidade na criao de instrues torna a programao e at mesmo a execuo mais rpida.
Considere a linha de cdigo:

If nVar > 0 .Or. nVar < 0

Se o valor da varivel nVar for igual a zero (0) no momento da execuo desta linha de cdigo, ambas as
comparaes separadas pelo operador lgico .Or. sero efetuadas: Aps ser avaliada, a primeria
comparao ir falhar. A segunda comparao ser ento avaliada e falhar tambm. Como resultado, o
cdigo existente dentro da estrutura de fluxo If no ser executado. Tal cdigo somente ser executado
quando o valor desta varivel for maior OU menor do que zero. Ou seja, sempre que for DIFERENTE de
zero, o que torna a linha a seguir mais eficiente:

If nVar != 0

Este tipo de alterao torna o cdigo mais legvel e o processamento mais rpido, evitando a avaliao de
instrues desnecessariamente.
AdvPl________________________________________________________________68
Existem outras situaes onde a simplificao pode ser utilizada. A expresso de avaliao a seguir:

If cVar == "A" .Or. cVar == "B" .Or ;
cVar == "C" .Or. cVar == "D"

Pode ser substitudo pelo operador de conteno:

If cVar $ "ABCD"
Opo por Flexibilidade
A melhor soluo aquela que envolve o problema imediato e previne problemas no futuro. Considere o
exemplo:

@nRow,nCol PSAY cVar Picture "!!!!!!!!!!!!!!!!!!!!"

Exceto contando-se os caracteres, no existe maneira de saber se o nmero de caracteres de exclamao
o esperado. Enquanto isto um problema, existem algo mais grave. A expresso de picture esttica.
Se no futuro for necessrio ajustar o tamanho da varivel cVar, ser necessrio localizar todos os lugares
no cdigo onde esta mscara de picture est sendo utilizada para ajuste manual. Existe uma opo
dsoluo de de auto-ajuste disponvel que fcil de digitar e tem a garantia de executar a tarefa
igualmente (tornar todos os caracteres maisculos):

@nRow,nCol PSAY cVar Picture "@!"
Opo da Praticidade ao Drama
Se a soluo parece complexa, provavelmente porque o caminho escolhido est levando a isso. Deve-se
sempre se perguntar porque algum desenvolveria uma linguagem que requisite tantos comandos
complicados para fazer algo simples. Na grande maioria dos casos, existe uma soluo mais simples. O
exemplo abaixo deixa isso bem claro:

@ 10,25 Say Substr(cCep,1,5) + "-" + Substr(cCep,6,3) Picture "!!!!!!!!!"

Que pode ficar mais simples assim:

@ 10,25 Say cCep Picture "@R 99999-999"
Utilizao de Operadores de I ncremento/ Decremento
Utilizados devidamente, os operadores de incremento e decremento tornam o cdigo mais fcil de ler e
possivelmente um pouco mais rpidos. Ao contrrio de escrever adies simples como:
AdvPl________________________________________________________________69

nVar := nVar + 1
nVar := nVar -1

Pode-se escrev-las assim:

++nVar
--nVar

Deve-se apenas tomar cuidado com a precedncia destes operadores, pois o "++" ou o "--" podem
aparecer antes ou depois de uma varivel, e em alguns casos quando a varivel for utilizada dentro de
uma expresso, a prefixao ou sufixao destes operadores afetar o resultado. Para maiores detalhes,
consulte a documentao de operadores da linguagem AdvPl.
Evitar Passos Desnecessrios
Existe uma diferena entre um bom hbito e perda de tempo. Algumas vezes estes conceitos podem estar
muito prximos, mas um modo de diferenci-los balancear os benefcios de realizar alguma ao contra
o problema que resultaria se no fosse executada. Observe o exemplo:

Local nCnt := 0
For nCnt := 1 To 10
<cdigo>
Next nCnt

Inicializar a varivel no momento da declarao no um problema. Se o 0 fosse necessrio no exemplo,
teria sido til a inicializao na declarao. Mas neste caso a estrutura de repetio For... Next atribui o
seu valor imediatamente com 1, portanto no houve ganho em atribuir a varivel com 0 no comeo.
Neste exemplo no h nenhum ponto negativo e nada errado ocorrer se a varivel no for inicializada,
portanto aconselhvel evitar este tipo de inicializao, pois no torna o cdigo mais seguro e tambm
no expressa a inteno do cdigo mais claramente.
Porm note este exemplo, onde a varivel no inicializada:

Local nCnt
While ( nCnt++ < 10 )
<cdigo>
EndDo

AdvPl________________________________________________________________70
Em AdvPl, variveis no inicializadas sempre tem seu valor contendo nulo (nil) a princpio, o que far com
que uma exceo em tempo de execuo acontea quando a instruo de repetio while for executada.
Diferentemente do primeiro exemplo, onde a inicializao da varivel no fazia diferena alguma, neste
segundo exemplo a inicializao absolutamente necessria. Deve-se procurar inicializar variveis
numricas com zero (0) e variveis caracter com string nula ("") apenas quando realmente necessrio.
Utilizao de Alternativas
Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para explorar duas ou
trs diferentes abordagens. Quando se est trabalhando em algo mais complexo, deve-se planejar
prototipar algumas a mais. Considere o seguinte cdigo:

If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif

Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. Este cdigo foi ento
convertido e armazenado como uma string. Pode-se notar que a cor "Preto" ser atribuda se nenhuma
outra opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto reduz o nmero
de comandos replace:

Do Case
Case cHair == "A"
AdvPl________________________________________________________________71
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
Utilizao de Arquivos de Cabealho Quando Necessrio
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.
Constantes em Maisculo
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.
Utilizao de I dentao
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"
AdvPl________________________________________________________________72
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
Utilizao de Espaos em Branco
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.
Quebra de Linhas Muito Longas
AdvPl________________________________________________________________73
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 (;).
Capitulao de Palavras-Chave
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
Utilizao da Notao Hngara
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.
Utilizao de Nomes Significantes para Variveis
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.
Utilizao de Comentrios
AdvPl________________________________________________________________74
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:

If nLastKey == 27 // Se o nLastKey for igual a 27
Criao de Mensagens Sistmicas Significantes e Consistentes
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.

"Aguarde. Reindexando (B1_FILIAL+B1_COD+B1_LOCAL) do arquivo: \DADOSADV\SB1990.DBF"

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":

"Deletar este registro?"

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.
Evitar Abreviao de Comandos em 4 letras
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.
Evitar "Disfarces" no Cdigo
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]
AdvPl________________________________________________________________75

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
Evitar Cdigo de Segurana Desnecessrio
Dada sua natureza binria, tudo pode ou no acontecer dentro de um computador. Adicionar pedaos de
cdigo apenas para "garantir a segurana" freqentemente 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 RaizQuadrada( 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.
AdvPl________________________________________________________________76
Isolamento de Strings de Texto
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.
Tabela de Pictures de Formatao
Comando SAY/ PSAY
Funes
C Exibe CR depois de nmeros positivos
E Exibe numricos com o ponto e a vrgula invertidos (formato Europeu)
R Insere caracteres diferentes dos caracteres de template
X Exibe DB depois de nmeros negativos
Z Exibe zeros como brancos
( Envolve nmeros negativos entre parnteses
! Converte todos os carecteres alfabticos para maisculo

Templates
X Exibe dgitos para qualquer tipo de dado
9 Exibe dgitos para qualquer tipo de dado
# Exibe dgitos para qualquer tipo de dado
! Converte caracteres alfabticos para maisculo
* Exibe asterisco no lugar de espaos em branco inicias em nmeros
. Exibe a posio do ponto decimal
, Exibe a posio do milhar
Comando GET
AdvPl________________________________________________________________77
Funes
A Permite apenas caracteres alfabticos
C Exibe CR depois de nmeros positivos
E Exibe numricos com o ponto e vrgula invertidos (formato Europeu)
R Insere caracteres diferentes dos caracteres de template na exibio mas no insere-os na
varivel do GET
S<n> Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro que identifica
o tamanho da regio
X Exibe DB depois de nmeros negativos
Z Exibe zeros como brancos
( Exibe nmeros negativos entre parnteses com os espaos em branco iniciais
) Exibe nmeros negativos entre parnteses sem os espaos em branco iniciais
! Converte caracteres alfabticos para maisculo

Templates
X Permite qualquer caractere
9 Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para numricos
# Permite dgitos, sinais e espaos em branco para qualquer tipo de dado
! Converte caracteres alfabticos para maisculo
* Exibe um asterisco no lugar dos espaos em branco iniciais em nmeros
. Exibe o ponto decimal
, Exibe a posio do milhar

Programao do AdvPl para o ERP Siga Advanced Protheus
Prefcio
AdvPl________________________________________________________________78
Existe um ditado chins que diz: O Homem no tropea em montanhas, tropea em pedregulhos, areia,
pequenos buracos, mas nunca em uma montanha.
Isso nos remete a pensar que onde erramos exatamente no simples, naquele detalhe quase
imperceptvel e que tem um valor muito grande para o todo. Avaliemos do ponto de vista humano; ser
to difcil cumprimentar a todos, sermos mais amigos, mais serenos nas decises e companheiros uns dos
outros e trabalharmos em equipe? Por que muitas vezes no o fazemos? Por que insistimos no
individualismo e no mal-humor? No seria mais fcil, at mesmo bvio, estarmos mais bem-humorados e
dispostos a trabalhar em equipe, trocarmos conhecimento e discernimento nas decises, pensarmos mais
no todo porm se importando com as partes que o compe?
Seria mais interessante se ao caminharmos por um parque, prestssemos mais ateno nas rvores, no
caminho, nas flores, no canto dos passarinhos sem se esquecer do objetivo do passeio, sem perder a
noo de tempo e distncia, mas curtindo muito a paisagem, o detalhe.
Agora vamos traar um paralelo com o nosso dia a dia. No seria melhor ao reservarmos um fonte,
verificarmos com mais ateno:
As condicionais? Afinal muitas vezes no testamos um ELSE.
Os filtros? Geralmente esquecemos de tentar otimizar a performance no SQL.
As mensagens? Afinal to comum nos depararmos com textos completamente sem sentido.
Os helps? Damos pouca ateno a eles e nos esquecemos que a primeira coisa que o usurio tenta.
Imaginem algumas ligaes menos por causa de uma simples documentao a mais! Aquele ponto de
entrada que criamos e no pensamos nos supostos parmetros que nosso pessoal em campo pode querer,
ou mesmo no retorno mais adequado para aquela funo.
Lembrem-se tambm da documentao do novo campo; Ela realmente necessria? Se a chave de
ndice imprescindvel, por que no crio uma query? Ao responder um BOPS, no seria melhor que fosse
sua ltima argumentao para o problema? Se isto ficar claro e bem resolvido no teremos mais aquela
ocorrncia ou dvida. Se tivermos que explicar um processo para algum, que o faamos de tal forma a
no gerarmos incgnitas.
Por que ao invs de focarmos nossos esforos para matarmos o BOPS, no avaliamos o fonte para
evitarmos NOVOS BOPS? Ao resolver uma ocorrncia lembre-se de todos os pontos de implicao da sua
atividade. O que isso ir impactar no servio do outro? Sem falar em documentar no Quark!
Vamos trazer o comportamento do parque para o nosso trabalho tambm. Ao programar vamos nos ater
aos detalhes, sermos mais crticos, pensarmos que aquela instruo a mais, significa muito para o sistema
e que l na frente, se tratado com descuido, pode causar problemas.
Tenha convico que, se agirmos de maneira mais focada aos nossos propsitos, o passeio ou melhor a
programao, ser muito mais entusiasmada, produtiva e com uma margem de erro bem menor. Com
esse comportamento quem ganha somos ns; Microsiga!. S assim teremos mais tempo de irmos ao
parque no final de semana.
Lembre-se que no adianta decidirmos passear no parque do Ibirapuera no domingo, e no estarmos com
a cabea voltada para o passeio, ao invs disso pensarmos no trabalho, na DLLl que no comunica, no
BOPS que no foi baixado, pois se assim for, estaremos to voltados para outros fins que no curtiremos
o passeio. Pense que para passear, ou melhor, programar, a regra tambm valida, no adianta nem ao
menos tentarmos se no estivermos concentrados para isso.
Enfim, quer uma prova de trabalho em equipe com um alto nvel de qualidade e detalhes; este manual,
que foi constitudo em apenas 2 dias, com a colaborao de mais de 20 pessoas, focadas em seus
objetivos, se atentando cada um com o seu tema. O resultado? Um trabalho excelente, um documento
para nos ajudar a sermos melhores e no errarmos no fcil!
O Que Fazer um Programa com Inteligncia
Precisamos entender, antes de mais nada, o que inteligncia.
Segundo o dicionrio Michaelis, inteligncia significa:
AdvPl________________________________________________________________79
faculdade de entender, pensar, raciocinar e interpretar;
Compreenso, conhecimento profundo.
De acordo com essa definio, se pretendemos utilizar nosso bem mais precioso em nosso trabalho,
vamos precisar desenvolver alguns hbitos:
Devemos estudar o programa antes de comear a desenvolver. Imagine prestar um concurso ou fazer
uma prova sem estudar. Vai ganhar um zero na certa! No programa no ser diferente!
Fazer um levantamento dos programas que sofrero as conseqncias das alteraes realizadas. Todos
esses programas devero ser testados juntamente com o programa alterado.
Antes de criar uma funo, consulte o Help Microsiga ou os colegas de trabalho, pois esta funo j pode
ter sido criada.
Ao criar uma funo, certifique-se de que no cabealho conste algumas informaes bsicas como:
descrio da funo, sintaxe, definio dos parmetros e autor. comum ao desenvolver uma funo,
utilizarmos outra j pronta como exemplo, e neste momento o copiar/colar nos faz esquecer de alterar
estas informaes.
Imagine se algum desenvolver uma funo inconsistente e esquecer de trocar o seu nome no cabealho.
Devemos assumir a responsabilidade de nossos atos.
Ao fazer a documentao das alteraes realizadas, certifique-se de que as informaes esto claras, no
s para o seu entendimento mas para que os colegas no percam tempo tentando entender-las.
Ao realizar os testes, defina critrios. Antes de comear defina onde quer chegar. No basta consistir suas
alteraes. O fato de suas alteraes estarem funcionando como previstas no garante a no existncia
de erros.
No limite-se a testar sua alterao na base que voc utilizou durante o desenvolvimento, pois voc criou
o ambiente perfeito para que o programa funcione.
Pode parecer um pouco trabalhoso passar por estes processos no decorrer do desenvolvimento do
sistema, mas se medidas como estas no forem tomadas, o que era extremamente simples se tornar
extremamente trabalhoso.
Programando Simples, mas Certo
Qual profissional da rea de informtica ainda no se deparou com um cdigo fonte que parecia estar
escrito em outro dialeto mesmo com todo conhecimento adquirido naquela linguagem, este fato
geralmente ocorre pela m utilizao de sintaxes complexas que nem sempre significam um bom
funcionamento do sistema.
Um profissional da rea de informtica no possui nenhum modelo padro para desenvolver os seus
algoritmos, porm necessria a aplicao da tica profissional para que se possa desenvolver algoritmos
de maneira simples e correta, este conceito se baseia nos seguintes aspectos :
Entender qual o objetivo do processo em questo
Analisar a melhor forma de desenvolver um algoritmo que seja de fcil manuteno.
Utilizar comandos e sintaxes que utilizem o mximo de simplicidade e clareza possvel.
Erros que Podem ser Evitados
Existem alguns erros que com um pouco de ateno, podem ser evitados, tais como:
Verifique se a varivel est declarada antes do uso;
Ao declarar uma varivel, verifique qual a necessidade de ter essa varivel e qual o tipo e a sua classe;
AdvPl________________________________________________________________80
Classifiquem as funes e os procedimentos conforme a necessidade, como por exemplo, na declarao de
um array, defina o seu tamanho e no uso verifique se o elemento existe;
Salve a ordem e a rea e o registro do arquivo que ser utilizadopara que no final do processo se recupere
estes valores;
Evite retornar da funo antes do seu final, ou seja, crie preferencialmente um nico retorno;
Valide sempre o retorno do ponto de entrada;
Quando for gravar um arquivo que utiliza campos de outros arquivos, posicione todos os arquivos e
registros antes de iniciar a gravao, e descreva o alias do campo;
Utilize de arquivo CH nas strings para localizao;
Quando possvel utilize a linguagem SQL, pois minimiza o tempo de execuo em muitos processos.
A I mportncia de Programas Documentados
Todos sabemos o quanto difcil elaborar e manter uma documentao tcnica atualizada, ainda mais
aqui na Microsiga, cuja dinmica dos acontecimentos muitas vezes impede que isso seja viabilizado.
Diante desse cenrio, o que nos resta? Obviamente que pelo menos os programas sejam documentados,
bem documentados.
Documentar bem, no significa que tenhamos que escrever dezenas de linhas de comentrios a cada linha
de cdigo. Significa que os comentrios tm passar alguma informao relevante. Vemos comentrios
assim: compara A com B e s. Isso bvio, a leitura do cdigo j nos diz isso. A documentao deve se
ater a conceitos, por exemplo: Se A for maior que B, o arquivo de saldos ser atualizado, caso contrrio
o registro ser rejeitado para que o saldo no fique negativo.. Isto sim transmite alguma informao.
Tambm se pode utilizar desse recurso para fazer lembretes a fatos importantes que, se forem deixados
de lado, podem comprometer o funcionamento das rotinas.
Por exemplo: Ao acionar esta funo, o arquivo XXX DEVE estar posicionado no ndice 1.
E os cabealhos? Quantos programas so aproveitados e nem sequer o nome do autor trocado? Se o
analista X tivesse escrito todos programas que aparece como autor ele deveria ter comeado na poca do
Charles Babage. O cabealho das funes de conter o nome na dita cuja, autor, data de criao, uma
descrio sumria de sua funcionalidade, a sintaxe e por ltimo, mas no menos importante, a descrio
dos argumentos de entrada e sada. A respeito desse ltimo item deve-se ter especial ateno nas
manutenes, pois novos argumentos so criados e nem sempre so declarados nessa seo da
documentao do cabealho, isso muito grave.
No IDE do PROTHEUS existem opes bastante interessantes para nos auxiliar nessa tarefa. Experimente
as opes Inserir, Documentao de cabealho e Inserir, Documentao de Explicao.
Existe ainda um tipo de documentao que nem sempre observada, aquela inerente ao prprio cdigo.
Programas cujas variveis so declaradas como nX, cVAR1, dAUX, nNUM, etc., so extremamente difceis
de entender e pior, manter. conveniente que os nomes das variveis retratem seu uso ou destino. Por
exemplo: dDataDeS ou dDataDeE. Segundo as convenes da Microsiga, variveis do tipo DATA devem
ser iniciadas pela letra d. Assim Data, no acrescenta nada ao entendimento do que a varivel
representa. Nos sobrou o dES e o dEE para informar para que diados serve a bendita varivel. Ser
sada, soluo, saldo? Entrada, Estorno, Estoque? Que tal isso: dSeguro e dEntrega?
Enfim, como foi dito, no preciso escrever um livro a cada programa, basta ser objetivo e se colocar na
posio de quem no conhece o programa to pouco o assunto. Algum dia voc mesmo poder estar
nessa posio.
Cabealho de Programa / Funo
O cabealho do programa utilizado para identificar informaes gerais sobre a rotina, seu autor, data,
entre outras informaes. importante que esteja preenchida de forma correta e atualizada. Lembre-se
de que nada adianta um cabealho que no informe nada ou pior ainda, com informaes errneas.
AdvPl________________________________________________________________81
Lembre-se que um bom livro comea com um bom prefcio, e um bom programa comea com um
cabealho til e legvel.
A manuteno/atualizao do cabealho de responsabilidade da ltima pessoa que alterou o fonte. O
cabealho de programa padro da Microsiga contm: rotina, autor, data do desenvolvimento, comentrio
sinttico e sintaxe.
Criao de Variveis
Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:
A declarao
O tipo de varivel
A funo CRIAVAR()
A inicializao
Padronizao de variveis
A Declarao
Deve ser feita sempre no incio da rotina que for utiliz-la, como no exemplo:
Function a910VerCod()
Local cCod910 := 001
Return
O Tipo de Varivel
O tipo de varivel serve para identificar a utilizao que a mesma ter no decorrer da rotina. Toda varivel
deve estar tipada durante sua criao. Quando programamos nativamente em C, isto se torna
obrigatrio. Devemos fazer o mesmo no AP5, pois isto demonstra que a varivel foi conscientemente
declarada.
Tipos Existentes
PUBLIC: Esta varivel ser inicializada em um valor lgico falso (.F.) at que seja atribudo um valor
especfico a ela. Esta varivel permanece definida por toda a durao da aplicao e pode ser vista (assim
como usada, alterada e avaliada) por qualquer funo. Esta varivel gera um token (indicao) na tabela
de smbolos, isto significa que o mdulo principal conter smbolos para esta classe de varivel, o que, por
sua vez, ocupa mais espao de memria. Deve-se evitar a utilizao deste tipo, a no ser em casos
extremos.
PRIVATE: Esta varivel ser inicializada em valor nulo (NIL) e uma vez declarada, permanecer assim
durante toda a durao do fluxo da funo, at que este volte ao procedimento inicial que a chamou. Em
essncia, uma varivel de memria PRIVATE inicializada logo no incio do Protheus, agir como um
varivel PUBLIC. Esta varivel pode ser vista por uma sub-rotina da funo e modificada de maneira
correspondente. Esta varivel tambm gera um token na tabela de smbolos comentada acima.
LOCAL: Esta varivel de memria ser inicializada com valor nulo (NIL) e s visvel dentro da funo que
a inicializa, mesmo que esta ltima, contenha funes incorporadas a seu contedo. Este tipo de varivel
o mais adequado a ser utilizado em funes, pois no gera smbolos na tabela de smbolos, por
conseqncia ocupa pouco espao de memria e, o compilador avalia as variveis LOCAL e STATIC mais
AdvPl________________________________________________________________82
rapidamente que os outros tipos (PUBLIC e PRIVATE). Cuidado para no sucumbir teoria de que se pode
obter economia de memria, mudando qualquer referncia PRIVATE para uma referncia LOCAL. Se voc
fizer isso, as funes podem no funcionar corretamente, embora funcionassem na verso anterior s
alteraes.
STATIC: A varivel STATIC idntica classe de armazenamento LOCAL, com uma exceo. Uma varivel
STATIC retida dentro de sua sub-rotina, mesmo depois que o fluxo da funo a tenha deixado. Isto
particularmente til para funes independentes tipo caixa-preta, que contm seu prprio conjunto de
variveis exclusivas e devem manter esses valores de interao em interao.
Inicializao
Quando no atribumos nenhum valor a uma varivel no momento de sua declarao, corremos o risco de
utiliz-la com valor NIL e causar erros fatais. Por isso, a inicializao de uma varivel de extrema
importncia.
Padronizao de Variveis
importante que ao lermos o nome de uma varivel, possamos saber se o seu tipo numrico, caracter,
data ou lgico. O nome da varivel de get no deve coincidir com uma varivel de outro programa, pois
toda varivel de get possui um help especfico.
Exemplo:
a varivel DBaixa (get da baixa no programa de Ttulos a Receber), j possui um texto help que indica seu
conteudo e no dever ser criada outra varivel para outra finalidade com este mesmo nome.
Para tanto, definimos a seguinte padronizao :
N -> Numricas
L -> Lgicas
D -> Data
C -> Caracter
A -> Array (matriz)
O -> Objeto
U -> Sem definio
Criando uma Varivel Utilizando a Funo CRIAVAR()
Esta funo cria uma varivel, retornando o valor do campo, de acordo com o dicionrio de dados. Avalia
o inicializador padro e retorna o contedo de acordo com o tipo de dado definido no dicionrio.
Sintaxe
uRet := CriaVar(cCampo,lIniPad,cLado)
Onde :
Uret -> tipo de retorno de acordo com o dicionrio de dados, considerando inicializador padro.
cCampo -> Nome do campo
LiniPad -> Indica se considera (.T.) ou no (.F.) o inicializador padrao (X3_RELACAO)
Clado -> Lado para inicializao padro
AdvPl________________________________________________________________83
Variveis de Relatrios
Na criao de um relatrio algumas variveis e seus tipos so convencionados para a utilizao da
biblioteca de funes de relatrio.
Varivel Tipo Contedo
wnRel Local Nome default do relatrio em disco
cbCont Local Contador
Cabec1 Local 1 linha do cabealho do relatrio
Cabec2 Local 2 linha do cabealho do relatrio
Cabec3 Local 3 linha do cabealho do relatrio
Tamanho Local
Tamanho do Relatrio (P = Pequeno 80 colunas, M = Mdio 132 colunas, G =
Grande, 220 colunas)
cDesc1 Local 1 linha da descrio do relatrio
cDesc2 Local 2 linha da descrio do relatrio
cDesc3 Local 3 linha da descrio do relatrio
Limite Local Quantidade de colunas no relatrio (80,132,220)
Titulo Local Ttulo do Relatrio
aReturn Private Matriz com as informaes para a tela de configurao de impresso
Nomeprog Private Nome do programa do relatrio
cString Private Alias do arquivo principal do relatrio para o uso de filtro
Li Private
Controle das linhas de impresso. Seu valor inicial a quantidade mxima de
linhas por pgina utilizada no relatrio
m_pag Private Controle do nmero de pginas do relatrio
aOrd Private
Matriz contendo as ordens de layout para a impresso. Caso no existam vrias
ordens esta matriz deve estar vazia. Ex.: aOrd := {"Cdigo", "Descrio",
"Telefone"} -> O layout do relatrio vai depender da ordem selecionada na tela
de configurao de impresso
nLastKey Private Utilizado para controlar o cancelamento da impresso do relatrio
cPerg Private Nome da pergunta a ser exibida para o usurio
aLinha Private Matriz que contem informaes para impresso de relatrios cadastrais
AdvPl________________________________________________________________84
Cuidados com o Posicionamento de Registros
O posicionamento correto de registros fundamental para a funcionalidade completa dos programas.
Algumas dicas para posicionamento de registros so :
Evitar DBGOTOP(), usar DBSEEK(XFILIAL()) para os arquivos de dados do sistema. O comando
DBGOTOP() somente ser utilizado quando da real necessidade de se efetuar uma leitura desde o incio do
arquivo independente do tratamento de filial.
Como no mesmo arquivo de dados, poderemos ter registros de vrias filiais, desta forma ficar garantido
o posicionamento no primeiro registro da filial corrente.
Ao executar um DBSEEK(), verificar se localizou o registro, exemplo:
If ! SB1->(dbSeek(xFilial("SB1")))
// No achei o registro
Endif
Mesmo que seja bvio a existncia do registro, faa o teste pois o programa deve prever que a base de
dados no to confivel como deveria, e um alerta ajuda a identificar estes casos. Em casos de
relatrios, atentar-se para imprimir a mensagem de forma consciente.
Se for executada a funo RECLOCK(cAlias, .F.), para alterao do registro atual, em um arquivo no
estado de EOF() (caso falhe um DBSEEK() ) ser abortado o programa e gravado um arquivo texto de
nome MSRLOCK.EOF que poder ser usado para averiguaes.
O comando SOFTSEEK determina se ser usada uma busca relativa durante um procura em um banco de
dados. Se este comando estiver em ON, e for utilizada uma funo DBSEEK(), e nenhuma
correspondncia for encontrada, o ponteiro de registro ficar no prximo registro do ndice que possua um
valor mais alto que a expresso utilizada nesta funo. Este comando dever ser utilizado com a mxima
ateno, pois caso esteja ligado, poder localizar um registro errado.
Quanto ao comando DO WHILE no esquecer de incluir a condio referente filial, quando esta leitura for
de registros de uma filial). Exemplo :
dbSelectArea("SB1")
dbSeek(xFilial("SB1"))
Do While ! Eof() .And. B1_FILIAL == xFilial("SB1")
// Processamento
dbSkip()
Enddo
Ao criar uma funo que ir desposicionar registros, use a funo GETAREA() e RESTAREA(), para voltar
tudo posio original. Exemplo:
Dbselectarea("SD1")
aAreasd1 := Getarea() // Armazena o ambiente do arquivo SD1
SD1->(dbsetorder(3))
SD1->(dbseek(xfilial("SD1") + DTOS("01/03/01"), .T.))
Do While ! Eof() .And. D1_FILIAL == xfilial("SD1") .And. DTOS(D1_EMISSAO) <= DTOS(mv_par02)
AdvPl________________________________________________________________85
// Processamento
Dbskip()
Enddo
Restarea(aAreasd1) // Restaura o ambiente do arquivo SD1
Funo Posicione
Podemos tambm buscar uma informao em determinado campo usando apenas uma funo.
Sintaxe:
Posicione(cAlias, nOrdem, cChave, cCampo)
Exemplo:
Posicione("SB1", 1, xFilial("SB1") + cCodigo, "B1_DESC")
Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave da busca xFilial("SB1") + cCodigo e
ser retornado o contedo do campo "B1_DESC". Note que esta funo, no restaura a posio original do
arquivo alvo (no caso SB1).
necessrio colocar a FILIAL do arquivo na chave passada como parmetro, caso ela exista na chave do
indice.
Funo Existcpo
Retorna se determinada chave existe ou no no arquivo.
Sintaxe :
ExistCpo(cAlias,cChave,nOrdem)
Exemplo :
ExistCpo("SB1", 1, cCodigo, "B1_DESC")
Desta forma, ser efetuada uma busca no SB1, na ordem 1, chave cChave. E ser retornado se a chave
foi encontrada ou no (.T. ou ,F,). Neste caso no necessrio passar a filial. Ela ser inserida
automaticamente na chave de pesquisa pela funo.
Restaurando ndice e limpando filtros
Nos relatrios devemos analisar que a funo SetPrint, possibilita efetuar filtros , escolha da ordem e
gerao em disco ou impressora , no final dos programas de relatrio devemos restaurar a ordem
original do arquivos e limpar o filtro e desativar a impressora.
//Trmino do relatorio
dbSelectArea("SRA")
Set Filter to
dbSetOrder(1)
Set Device To Screen
If aReturn[5] = 1
Set Printer To
AdvPl________________________________________________________________86
Commit
ourspool(wnrel)
Endif
MS_FLUSH()
Outros Cuidados
Um dos cuidados que devemos ter quando da criao de relatrios contendo valores a utilizao dos
subtotais e totais, a fim de evitar erros que podem ser desastrosos durante uma tomada de deciso
errada devido a valores errados.
A utilizao de somatrias deve ser bastante criteriosa a fim de no cometermos o erro de misturarmos
unidades de medidas diferentes no mesmo clculo.
Confrontando relatrios e consultas
Quando elaboramos um sistema, existem muitos relatrios que geram dados para outros relatrios e
consultas.
Devemos tomar cuidado para que no aconteam divergncias de informaes de um para o outro, como
por exemplo, no caso de valores.
Um bom exemplo disso, a rotina de impresso de folha de pagamento. Este relatrio exibe informaes
que so utilizadas em outros relatrios, tais como, valores para o FGTS, guia de recolhimento de
impostos.
Uma soluo para que no se ocorra uma divergncia de valores, seria utilizar uma nica funo ou rotina
de processamento. Isto evitaria que ao se alterar o sistema, por motivo de lei ou outro qualquer, o
programador alterasse por exemplo s rotinas de relatrio de folha de pagamento e guia de impostos e
esquecesse de alterar por exemplo rotina de relatrio de FGTS.
Exemplos como Saldos Bancrios, Quantidades de Estoques, Valores de Faturamento, entre outros, devem
ser confrontados entre relatrios e consultas para no gerarem informaes errneas ao cliente.
Normalmente estes problemas ocorrem em funes de critrios de filtragens diferenciados entre eles. Para
evitar este tipo de problema fundamental que o analista ao efetuar alguma manuteno em algum
relatrio ou consulta atente-se ao fato de assegurar que esta alterao no influencie outras situaes.
Este um tipo de no conformidade simples de ser evitada e que pode causar problemas srios para os
usurios alm de ser de dificil argumentao quando nos questionado, pois evidencia falta de ateno ou
critrio na manuteo ou falta de conhecimento sobre o funcionamento do sistema.
Problemas com Looping de Programas
O Protheus utiliza a tecnologia Cliente/Servidor. Isto significa que o aplicativo no mais executado
individualmente em cada mquina, ele ser executado no servidor do aplicativo. At a verso 4.07 um
programa travado significava que apenas a estao estava comprometida (o executvel estava na
memria da estao). Com o Protheus, todo o processamento est no Server e quando o programa est
em looping estaremos gradativamente usando todo a CPU do Server e consequentemente parando todo
o processamento.
Se ao desenvolvermos uma rotina e a mesma entrar em looping (tiver apenas uma entrada e no tiver
uma sada do processamento), este processamento utilizar todos os recursos do servidor
comprometendo (reduzindo drasticamente a performance do aplicativo), ou at impedindo, o uso do
aplicativo por todos os demais usurios.
AdvPl________________________________________________________________87
Se isso acontecer em uma empresa onde existem apenas 5 usurios, o administrador da rede poder
reiniciar o servidor, porm onde existe um nmero considervel de usurios poder haver um prejuzo
para a empresa que utiliza nosso sistema.
Exemplo:
dbSeek(xFilial(SE1)+DTOS(dDtIni))
Do While SE1->(!Eof())


<---------- Falta um DbSkip()
Enddo
No exemplo acima, a rotina ficar em looping (pois falta um comando de sada da rotina, um DbSkip()
seria o mais apropriado), utilizando todos os recursos de processamento do servidor, fazendo com que o
mesmo pare de funcionar.
Outro exemplo:
aCampos := {}
Do while .T.
Aadd(aCampos, Teste)
Enddo
No exemplo acima o caso ainda mais crtico, pois alm utilizar todo o recurso de processamento do
servidor, em dado momento haver uma queda do aplicativo, devido a limitao da varivel tipo
Array, criada acima. E quando este limite for ultrapassado, o sistema ser interrompido abruptamente
e todos os demais usurios ficaro impossibilitados de utilizarem o sistema.
Manipulao de Arquivos Externos ao Protheus
A manipulao de arquivos considerados externos ao Protheus dever ter um tratamento diferenciado. O
arquivos a serem manipulados (alterados/consultados) devero ser copiados do Client para o Server e
vice-versa utilizando uma conexo (TPC-IP,IPX,etc). Para copiar os arquivos, foram criadas duas funes
que sero executadas via conexo, a CPYS2T() encarregada de copiar do Server para o Client/Terminal e
a CPYT2S() encarregada de copiar do Client/Terminal para o Server.
O editor de texto Word da Microsoft, os arquivos de imagens (BMP,JPEG,etc) exigem um lugar fsico para
abertura dos documentos/imagens, navegando pela Internet por exemplo so copiados via conexo para
um diretrio temporrio no computador para serem visualizados.
O AP5 trabalha da mesma forma, atravs dessas consideraes e utilizando a arquitetura Client/Server via
conexo os arquivos sero copiados.
Em alguns Mdulos do Protheus so encontradas rotinas de Importao/Exportao de lanamentos,
exigindo serem utilizadas as funes CPYT2S() e CPYS2T() para manipulao dos arquivos. Por exemplo,
uma importao de lanamentos da Folha de Pagamento poder ser feita diretamente do Client sem
precisar copiar para o Server mas se outro usurio precisar visualizar os lanamentos de origem da
importao no ter acesso, agora se for realizado a cpia do Client para o Server todos podero
visualizar (aconselhvel). Isso acontece no Mdulo de Controle de Documentos, quando todos os arquivos
(documentos) so copiados entre o Client e o Server para que todos visualizem e manipulem. Um
exemplo que no h necessidade de cpia so os arquivos gerados para contabilizao (CPROVA), pois
estes so gerados no prprio Server no havendo necessidade de cpia.
Os arquivos que podero ser copiados devero estar necessariamente embaixo do RootPath na
configurao do Server, isto , o diretrio DOCS do exemplo abaixo dever ser sub-diretrio do RootPath.
AdvPl________________________________________________________________88
Exemplo de cpia do Server para o Client:
CPYS2T("\DOCS\EXEMPLO.DOC,"C:\WINDOWS\TEMP",.T.)
Onde os parmetros so:
1o. o <Nome do Arquivo> a ser copiado para o Client
2o. o <Nome do Diretrio> do Client e/ou local fsico onde ser copiado o arquivo.
3o. se deseja compactar o arquivo (recomendvel)

Exemplo de cpia do Client para o Server:

CPYT2S("C:\WINDOWS\TEMP\EXEMPLO.DOC,"\DOCS",.T.)
Onde os parmetros so:
1o. o <Nome do Arquivo> a ser copiado para o Server
2o. o <Nome do Diretrio> do Server
3o. se deseja compactar o arquivo (recomendvel)

As funes possuem um retorno True(.T.) ou False(.F.) indicando se a cpia foi realizada com sucesso ou
no.
Desenvolvendo Telas
A aparncia e objetividade das telas num sistema base fundamental da interface Sistema x Usurio.
O AP5 j cria, automaticamente, a grande parte das telas de um mdulo, tais como a Browse, a GetDados
e Enchoice.
Algumas outras telas necessitam de construo manual, ou seja, com a utilizao de comandos, tais
como SAY , GET e LABEL, na Dialog.
Procure sempre colocar em tela as informaes que mais se objetivam com o assunto abordado.
Sempre que possvel, d preferncia aos campos obrigatrios primeiro. Isso facilita a digitao do usurio,
que no precisar passar de campo em campo (no caso de estar utilizando a tecla <TAB>) at chegar ao
campo desejado. A ordem dos campos tambm importante para a fcil localizao das informaes.
Quando o volume de informaes muito grande, divida os campos em folders, ou seja, pastas,
agrupando os campos em assuntos. Isso ir deixar a tela menos poluda e evitar que o usurio navegue
por uma tela s. Para fazer essa facilidade, preencha o campo X3_FOLDER, no SX3, com um nmero,
agrupando-os de acordo com a tipo de informao e no SXA, com o ALIAS do arquivo em pauta, a ordem,
que equivale ao numero informado no X3_FOLDER e a descrio nos trs idiomas. Essa descrio que ser
a informao contida na pasta do folder. Exemplo: Os campos SZ1_ENDER, SZ1_NUM e SZ1_BAIRRO
devem estar com o campo X3_FOLDER preenchido com o contedo 1. No SXA, o XA_ALIAS dever ser
SZ1, o XA_ORDEM = 1 (mesmo valor preenchido no X3_FOLDER), no XA_DESCRIC, Endereo
Residencial e, nos demais, o mesmo texto em outros idiomas.
O Folder, alm de agrupar e facilitar a procura pelos campos, evita a rolagem vertical da tela, facilitando a
visualizao das informaes.
Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Utilize telas sequenciais,
conhecidas como Wizard (semelhante aos de instalao de um software). Dessa forma, o usurio ficar
AdvPl________________________________________________________________89
mais atento aos fatos, dificultando o erro. Mas cuidado: no faa disso uma incansvel sequncia de telas,
pois isso acabar desmotivando o usurio a utilizar o sistema.
Enfim, as telas devem ser limpas e objetivas, de tal forma que impea o usurio de sair de seu objetivo
final. Todo curioso ir apertar todos os botes da tela ou preencher todos os campos com qualquer tipo de
informao. Portanto, esteja atento a tamanho dos labels, para que os mesmos no excedam o tamanho
da caixa de dilogo definida. Isso, alm de no ser esttico, prejudica o entendimento da informao.
Salvando Arrays padres
Quando temos Janelas que necessitem apresentar mais de uma getdados, devemos salvar os elementos,
acols, aheader e n, da tela anterior para apresentar uma nova janela.
As principais variveis so:
Acols = Array contendo as linhas usada que sero apresentadas na
Getdados
AHeader = Array contendo o cabeo das colunas da Getdados
N = Varivel publica que indica a posio do atual no acols
(a Linha que est sendo editada na Getdados)
Para salva-las podemos:
aColsAnt := aClone(Acols)
aHeaderAnt := aClone(aHeader)
nElemAnt := n
E para restaura-las:
aCols := aClone(aColsAnt)
aHeader := aClone(aHeaderAnt)
n := nElemAnt
Pontos de Entrada
Dentro dos processos operacionais dos programas possvel criar aberturas que possibilitam a
execuo de processos distintos a partir de uma rotina do sistema.
Objetivo dos Pontos de Entrada
Deixar o sistema flexivl , pois isso permite uma grande variedade de desenvolvimento pelos nossos
analistas de suporte de acordo com a necessidade de cada tipo de cliente/implantao.
Permitir que o sistema seja o mais abrangente possvel de acordo com cada tipo de segmento de negcio.
Quando criar um Ponto de Entrada
O ponto de entrada tem resultado quando permite que um processo possa ser modificado, desde que ele
no seja crtico para o sistema.
AdvPl________________________________________________________________90
Exemplo: Montagem das parcelas de pagamento de um pedido
Ele til em processos que podem ser diferentes de acordo com o tipo de negcio de cada empresa ou
estratgia adotada.
Ex: Relatrio de Pedido, Cadastro de Clientes
Sintaxe para criar um Ponto de Entrada:
Function TMKA010()
Local lRetorno := .F.
Local LTMKMCL := Existblock("TMKMCl") // O Existblock detecta se existe uma funo no repositrio do
AP5 com esse PE.
If lTMKMCL
lRetorno := Execblock(TMKMCI,.F.,F.,{aValor}) // aValor um array que seria recebido pelo usuario
em PARAMIXB
Endif
Return( lRetorno )
Procedimentos para sua criao
Avaliar com critrio a criao do Ponto de Entrada, pois importante localiza-lo num ponto que seja til,
no redudante e que realmente d condies de atender ao solicitante.
O Ponto de entrada no uma ferramenta de correo de eventuais falha do sistema e sim para ajudar no
desenvolvimento de negcios especficos.
Documentar no QUARK com nome,momento no qual o momento em que ele disparado, parametros que
ele envia,retorno esperado (se houver) e o que ele executa com o retorno.
Contabilizando
A contabilizao de registros em um sistema ERP necessrio toda vez que houverem operaoes
envolvendo valores na empresa, como por exemplo, a emisso de uma nota fiscal, um recebimento de
dinheiro, um pagamento na folha, entre outros.
Para quem est programando fundamental que este conceito esteja bastante sidimentado.
Para se definir a contabilizao em qualquer rotina deve-se :
Definir os lanamentos padronizados que sero utilizados para a rotina (cada mdulo ou famlia de
mdulo possui uma sequencia lgica)
Preparar o programa para efetuar as atualizaes e a contabilizao. Este detalhe muito
importante pois o lanamento padro uma frmula e o posicionamento dos registros
fundamental. Exemplo : Na rotina de exclusao de nota fiscal deve-se executar a contabilizao
antes do comando dbDelete().
A chamada do lanamento contbil deve estar em um lugar estratgicamente correto, pois
teoricamente a ltima coisa a ser feita na rotina. No aconselhvel executar a contabilizao
e depois efetuar outros comandos.
AdvPl________________________________________________________________91
Existem trs funes que devero ser utilizadas, para que seja criado um arquivo texto, contendo as
informaes a serem contabilizadas.
Como temos 2 sistemas contbeis (SIGACON e SIGACTB) com procedimentos diferenciados programamos
de forma identica para ambos porm internamente as rotinas efetuam comandos diferentes. Os comandos
para a contabilizao so :
A Funo HeadProva
Este funo cria o cabealho da contabilizao. tratada de forma diferenciada para os mdulos SIGACON
e SIGACTB.
Sintaxe:
nHdlPrv := HeadProva(cLoteAtf, cNomProg, Substr(cUsuario,7,6), @arquivo, .T.)
Onde:
NHdlPrv -> Varivel que conter o num. (Handle) do arquivo (.LAN) criado.
cLoteAtf -> Cdigo do lote do mdulo (Ex.: Ativo Fixo: 8866)
cNomProg -> Nome do Programa (Ex.: ATFA060)
cUsuario -> Usurio arquivo: nome do arquivo (Ex.: cArquivo := )
A funo DetProva()
Em primeiro lugar, deve-se estar posicionado no registro, que contm o valor ser contabilizado
Sintaxe:
ExpN1 := DetProva(ExpN2,ExpC1,ExpC2,ExpC3)
ExpN1 -> Valor Total da Contabilizao
ExpN2 -> Handle retornado da funo anterior
ExpC1 -> Cdigo do Lanamento Padro
ExpC2 -> Nome da rotina Geradora
ExpC3 -> Lanamento Padro
A funo RodaProva()
Esta funo ir cria a finalizao da contabilizao.
Sintaxe:
RodaProva(ExpN1, ExpN2)
ExpN1 -> Handle retornado da funo anterior
ExpN2 -> Valor Total da contabililizao
No Final, ou seja, aps todos registros serem processados utilizar a funo CA100INCL(), cujo objetivo
ler o arquivo gerado (.LAN), e gerar os lanamentos no arquivo SI2 (Lanamentos contbeis).
Exemplo:
CA100Incl( cArquivo, nHdlPrv, nOpcx, cLoteContabil, lDigita, lAglut, cOnLine, dData)
AdvPl________________________________________________________________92
Onde:
cArquivo -> Nome do arquivo
nHdlPrv -> Numero do Header
nOpcx -> Numero da Opcao escolhida
cLoteContabil -> Numero do Lote
lDigita -> Se Mostra ou nao
lAglut -> Se Aglutina ou no
cOnLine -> Determina se sera On Line ou pelo cProva
Atualizando SX (ATUSX)
O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos customizadores
internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as informaes padres
necessrias para a criao de bases das empresas e efetuar possveis customizaes.
Em uma atualizao de verso, o sistema ir fazer uma compatibilizao de dados com os arquivos j
existentes e os atualizar com base nos SXs. Ao desenvolver uma rotina que exige um novo campo, por
exemplo, este dever ser criado no ATUSX, caso contrrio gerar uma no conformidade
comprometendo todo o trabalho da atualizao e o bom andamento do trabalho. Todo os campos,
perguntas, ndices, parmetros novos devero estar no ATUSX , pois estes so os padres do Protheus.
aqui tambm que cadastramos os HELPs de campo e de programas, criamos os menus do sistema e
onde disponibilizamos informaes para serem traduzidas para outros pases.
Exemplo de atualizao no SX:
Criao de ndice no Cadastro de Funcionrios- Suponhamos que seja necessrio um ndice por Data de
Admisso. Neste caso utilizaremos o SINDEX , onde devero ser alimentados basicamente o Alias (SRA),
a ordem , a chave de indexao (RA_ADMISSA) e sua descrio em Portugus. As descries referentes
s outras lnguas devero ficar a cargo do departamento de tradues. Numa atualizao de verso, o
sistema enxergar a existncia deste ndice pelo SINDEX e o disponibilizar para utilizao.
Ao final da manuteno dos arquivos SXs, abre-se uma janela onde deve ser documentado todas as
alteraes efetuadas da forma mais clara e precisa possvel. Esta documentao de extrema importncia
para que se tenha um controle dos arquivos customizadores padres e garantem um perfeito
funcionamento do Protheus.
SX1 - Parmetros Genricos
Esta tabela contm as perguntas, os valores armazenados e a ltima resposta utilizada para
processamento, impresso de relatrios , etc.
Todos os processamentos ou relatrios que tenham a opo de parametrizao, devero utilizar a funo
Pergunte para carregar os valores dos parmetros e/ou apresentar na tela as perguntas relacionadas.
Como o usurio pode no utilizar a opo de parametrizao, devemos sempre carregar as variveis
MV_PARXX com os valores default ou com as ltimas respostas aplicadas, para evitar erros de
comparao de variveis.
SX2 - Mapeamento dos arquivos
AdvPl________________________________________________________________93
Armazena os Paths dos arquivos possibilitando que estes possam ser distribudos em diversos drives ou
diretrios.
SX3 - Dicionrio de Dados
Armazena informaes referentes s definies de todos os campos que existem no Protheus.
SX5 - Tabelas Genricas
Armazena tabelas genricas utilizadas em todo sistema.
SX6 - Parmetros
Elemento chave para a execuo de um processamento, que determina diferentes resultados dependendo
do seu contedo.
SX7 Gatilhos
Rotina ou operao que disparada a partir de um evento get.
SXE/ SXF - Seqncia. de documentos
Armazena sequencias alfanumricas que devero ser controladas por um semforo. Um exemplo clssico
seria a numerao de pedidos de venda, em que vrios usurios poderiam estar utilizando o mesmo
nmero de pedido.
SI NDEX- Arquivo de ndices
Armazena todos os ndices padres.
Controle de Transao (TTS)
O que
Tratando-se de Banco de Dados, toda e qualquer operao de incluso, alterao ou excluso de registro
armazenada primeiramente na rea de LOG, garantindo assim que ao fazer a incluso de uma linha
(registro) seja garantida a incluso completa de todas as colunas (campos). Caso no seja possvel a
incluso da linha completa ele executa um procedimento chamado de ROLLBACK, ou seja, ignora todo o
registro.
Quando usar
Quando temos uma operao em Banco de Dados que necessite que vrias incluses, alteraes ou
excluses s sejam efetuadas quando todas as operaes tenham sido realizadas com sucesso, garantindo
com isso que no seja atualizada parcialmente uma tabela ou que atualize uma tabela e no atualize outra
tabela relacionada.
Como usar
AdvPl________________________________________________________________94
Para definir uma transao, deve-se utilizar os comandos BEGIN TRANSACTION e END TRANSACTION
para definir inicio e fim de uma transao respectivamente. Todas informaes serem gravadas no
Banco devem estar dentro de uma nica transao sejam elas provenientes de uma ou vrias tabelas.
Deve-ser evitar utilizar laos (WHILE, FOR) dentro de uma transao, pois a rea de LOG do banco
limitada, e se o volume de informaes ultrapassarem este limite, ocasionar o travamento do banco de
dados. O tamanho da transao deve-ser ser conhecido pelo programdor. Em suma, para exemplificar,
devemos controlar a transao de uma nota e no de um conjunto ilimitado de notas.
Onde no usar
O controle de transao jamais dever ser utilizado durante processo que envolvam interface (telas com
entrada de dados). O controle deve-se resumir apenas ao processo de gravao. Entre um incio de
transao (Begin Transaction) e um final (End Transaction) Todos os registros a serem gravados ficam
locados at o final da transao. Caso tenhamos uma tela aps o BEGIN e antes do END dependeremos
do usurio para efetuar a liberao da transao, fato este que causaria enormes problemas para o
usurio.
Outro lugar que no deve-se ter o controle de transao refere-se a rotinas de reprocessamentos ou
reclculos, onde as informaes podem ser regerados durante este processo ou onde possamos ter um
grande nmero de locks.
BEGIN TRANSACTION
ExpN1 :=FuncGrava()
END TRANSACTION
Caso exista uma transao dentro de uma outra a segunda ser automaticamente ignorada, fechando-se
a transao principal quando da chamada do comando END TRANSACTION.
Comandos Definidos pelo Usurio (UDCs)
Este recurso cria novas e infinitas possibilidades para modificar a maneira pela qual escrevemos o cdigo
de uma funo e a maneira pela qual podemos resolver problemas complexos. Ele ajuda a facilitar a
manuteno do cdigo, e a implementao de normas.
Estes comandos so traduzidos, analisados e modificados antes que o compilador comece a trabalhar para
gerar um arquivo objeto. O responsvel por esta traduo o pr-processador que um tradutor
inteligente que atua antes da gerao do cdigo objeto.
Em sua maioria, isto se resume a encontrar os comandos no cdigo fonte e traduzi-los para instrues e
funes equivalentes que se acham no corpo da funo ou no contedo de arquivos .CH (arquivos de
cabealho). Este tipo de arquivo (.CH), contm diversos comandos que sero utilizados por todas as
funes que contenham a instruo include em seu cdigo.
Estes mesmos comandos poderiam estar embutidos na funo, mas para facilitar a manuteno, um nico
arquivo .CH, pode ser includo (comando include) em vrias funes ao mesmo tempo. No h a
necessidade de colocar o comando include em cada funo. Uma nica meno ao .CH no arquivo .PR?,
servir ao propsito de todas as funes nele embutidas.
Estes comandos so diretivas do pr-processador e comeam sempre com o caracter # diretamente
sua frente e devem estar escritos em caracteres tipo caixa alta. Os mais utilizados no Protheus so:
#DEFINE
#IFDEF, ou #IFNDEF
#ELSE
AdvPl________________________________________________________________95
#ENDIF
#INCLUDE
Cada um destes comandos pode ser colocado em qualquer parte do arquivo fonte, que ser lido pelo pr-
processador. No entanto, para facilitar a visualizao da existncia destes comandos e manuteno da
funo, estes comandos devem ser colocados no incio do fonte.
O pr-processador substituir, cada ocorrncia da constante no fonte, ser substituda pela expresso ou
valor, que estiver contida diretamente frente da mesma. A exemplo de sintaxe e cdigo fonte para este
comando :
#DEFINE _TESC 27
#DEFINE _LESC lastkey()
if _nLastkey == _TESC
RETURN
Endif
if _LESC == _TESC
RETURN
Endif
Esta diretiva muito til quando temos um valor constante vrias vezes repetido dentro do cdigo fonte,
que poder ser alterado com freqncia no decorrer da vida til da funo.
#IFDEF ou #IFNDEF <CONSTANTE>
<instrues>
#ELSE
<outras instrues>
#ENDIF
Esta diretiva do pr-processador permite que voc prepare aplicaes para compilao condicional, ou em
outras palavras, se a <constante>, definida anteriormente via diretiva DEFINE ou pelo Protheus foi
definida (IFDEF), as <instrues> sero incorporadas ao cdigo objeto e as <outras instrues>, sero
desprezadas. Mas se a <constante> no foi definida <IFNDEF> as <instrues> sero incorporadas e as
<outras instrues> sero desprezadas.
#INCLUDE <ARQUIVO>
Uma instruo INCLUDE diz ao pr-processador para inserir o contedo de outro arquivo em um local
determinado dentro da funo. Este arquivo especificado, deve focalizar outras instrues do pr-
processador que possam ser comuns a diversos mdulos da rotina.
Uso de Strings
Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de inserirmos
diretamente os textos no fonte do relatrio utilizamos o recurso de strings, onde atravs de um include
acessaremos o texto em trs lnguas diferentes (Portugus, Espanhol e Ingls) dependendo da forma da
compilao.
convencionado que o nome do include seja o mesmo nome do fonte do relatrio para que a manuteno
deste relatrio seja o mais simples possvel.
Exemplo:
AdvPl________________________________________________________________96
Relatrio -> FABR001.PRW
Include -> FABR001.CH
Conceito de Filial e Compartilhamento de Arquivos
O Sistema permite a criao de vrias Filiais para uma mesma empresa cadastrada, de modo que Filiais
da mesma empresa compartilhem ou no as mesmas informaes como Cadastro de Produtos, Clientes,
etc.
Este tratamento feito internamente atravs dos campo XX_FILIAL obedecendo a seguinte regra:
Arquivos Compartilhados
Quando o arquivo esta configurado para trabalhar no modo compartilhado (X2_MODO = C), este campo
ser gravado com ( espaos ).
Deste modo o registro ficara disponvel para todas as Filiais.
Arquivos Exclusivos
Quando o arquivo esta configurado para trabalhar no modo exclusivo ( X2_MODO= C ), esta campo ser
gravado com o cdigo da Filial Atual.
Deste modo o registro focara disponivel apenas para a Filial que o gravou.
Para que o registro realmente fique disponvel ou no para suas respectivas Filiais , TODAS as rotinas que
manilpulam registros diretamente na base de dados dever verificar a Filial atravs da Funo xFilial() ,
alem disto a maioria dos ndices possuem o campo FILIAL na
chave :
Sintaxe : XFILIAL(EXPC1) onde, ExpC1 = Alias do arquivo
A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ira retornar se o arquivo for
Compartilhado e o cdigo da Filial se o arquivo for exclusivo .
Por exemplo :
Para executar um dbSeek no arquivo de clientes :
DbSelectArea(SA1)
DbSeek(xFilial(SA1)+cCodCli+cLoja)
ndice do SA1 :
A1_FILIAL+A1_COD+A1_LOJA
Ou um processamento no arquivo :
Do while !EOF() .AND. XX_FILIAL==xFilial(01)
Sendo o campo FILIAL parte da chave de Todos os ndices do sistema, este procedimento garante que a
utilizao dos registros ser exclusiva da Filial que criou os mesmos no caso do arquivo ser Exclusivo, ou
disponvel para todas as Filiais quando o mesmo estiver configurado como Compartilhado.
AdvPl________________________________________________________________97
Jamais use um campo filial de uma tabela para executar um dbSeek() em outra tabela. Pois uma tabela
poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser compartilhada
(campo filial preenchido).
A varivel cFilAnt contm a filial que o usurio est operando, e a varivel cEmpant contm a empresa e
a filial
Tcnicas para Filtragem
Nos sistemas Microsiga, a filtragem dos dados em ambiente Code Base os DBFs feita de maneira
geral pela Funo INDREGUA(Params,) , o que de forma geral no impede o uso de instrues como SET
FILTER TO, DBSETFILTER(), DBFILTER() ou qualquer outro comando de sintaxe xBase. A INDREGUA()
uma funo interna que rene vrios atrativos e facilidades para o seu uso, entre elas a possibilidade de
se indexar e filtrar os registros atravs dos parmetros fornecidos, ela tambm preferencialmente usada
para que o cdigo fique mais limpo e de fcil interpretao pois dentro de sua estrutura rene uma srie
de comandos de indexao e filtragem que agiliza o processo de criao de ndices e filtros em arquivos
de trabalho com menos linhas de cdigo, vejamos o Exemplo :
Chaves Primrias
Sua funo garantir unicidade. Em toda relao, por definio, tem-se uma ou mais chaves candidatas.
Dessas chaves, uma ser primria e se houver mais de uma na relao, essas outras sero definidas
como chave alternada.
Chaves Estrangeiras
um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave externa
ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos so necessrios.
Integridade Referencial
Todos os valores da chave estrangeira tem, obrigatoriamente, que ter valor correspondente na chave
primria que se relaciona; mas nem todos os valores encontrados na chave primria, precisam ter seus
correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabela de clientes, o campo
A1_COD (cdigo do cliente), vai estar relacionado com outra tabela que indica quais so os pedidos de
venda colocados. Desta forma, nem todos os clientes precisam ter pedidos de venda colocados; mas,
necessariamente, todos os pedidos de venda precisam de um cliente.
Como o PROTHEUS foi projetado para o ambiente SQL, onde a integridade referencial das tabelas
definida no prprio banco de dados atravs de regras internas, devemos tomar algumas precaues com
esse tpico:
Verificar a integridade da coluna em todas as tabelas relacionadas: no pode-se alterar o tamanho do
cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se verificar as tabelas de
cabecalho e itens das notas fiscais, de titulos a pagar e receber, etc. O sistema conta com o recurso de
grupos de tabelas relacionadas, que permite alterar o tamanho de diversas colunas de uma vez s ,
garantindo a integridade das colunas
Verificar a integridade dos cadastros com todas as tabelas relacionadas: no pode-se excluir o cdigo do
cliente se existe um pedido de vendas em aberto para esse cliente, deve-se verificar todas as tabelas
relacionadas antes de atualizar a base de dados.Alm disso na incluso de cadastros devemos utilizar as
funes existchav e existcpo para garantir que as informaes de chave no sejam repetidas e que o
acesso a tabelas externas seja validado de maneira consistente.
Verificar a atualizao da informao em todas as tabelas relacionadas: a integridade no se resume a
validaes de cadastros e tamanho de colunas, deve-se garantir no ato do desenvolvimento que TODOS
os pontos relacionados ao tpico envolvido sejam analisados e se necessrio atualizados. Por exemplo, se
ser atualizado o saldo em estoque de determinado produto NO DEVE-SE atualizar somente o arquivo de
saldos em estoque, deve-se avaliar se o produto utiliza rastreabilidade para nesse caso atualizar o arquivo
de saldos por lote, deve-se avaliar se o produto utiliza controle de localizao fisica para nesse caso
AdvPl________________________________________________________________98
atualizar o arquivo de saldos por localizao, etc. Deve-se fazer um estudo antes de qualquer alterao
em atualizao de base de dados.
Utilizando Rotinas Automticas
A cada dia estamos criando rotinas com interface automtica para melhorar a entrada de dados via outros
equipamentos, tais como coletores de dados, interface de outros softwares, etc. Porm, para nossa
prpria portabilidade e utilizao de rotinas padronizadas, temos adotado o prprio programa standard,
contudo sem interferencia do usurio (digitador). Para tal, criamos um mecanismo onde todos os
programas que necessitem desta regra devem ser capazes de inserir dados de forma automtica. Abaixo
mostraremos como proceder :
Tome como exemplo o MATA250.PRX . O vetor aRotAuto passado para o programa citado. Se este vetor
contiver elementos, significa que ser utilizada a Rotina Automtica. Este vetor deve, quando da
utilizao das rotinas automticas, conter os dados mnimos necessrios para a atualizao dos arquivos.
Veja a estrutura do vetor a ser enviado para a rotina automtica.
ARotAuto := { cCampo, Contedo, Validao}
Onde
CCampo -> o campo a ser atualizado,
Contedo -> o contedo que cCampo vai receber
Validao -> a validao que cCampo vai receber.
Observao: A Validao pode ser uma funo ou um valor NIL. Se for NIL, as validaes a serem
utilizadas para o respectivo campo sero as existentes no SX3. Se as validaes no forem as do SX3,
elas devem ser passadas numa funo.
Exemplo,
ARotAuto := { { "D3_TM" ,"001" ,NIL } , ;
{ "D3_COD" ,padr("10100",15) ,NIL } , ;
{ "D3_UM" ,"UN" ,NIL } , ;
{ "D3_QUANT" ,1 ,NIL } , ;
{ "D3_OP" ,"00000401001" ,NIL } , ;
{ "D3_LOCAL" ,"01" ,NIL } , ;
{ "D3_EMISSAO" ,dDataBase ,NIL } }
Para o processo de incluso simples, sem getdados, a varivel padro a ser utilizada nos programas
chama-se aRotAuto, e para processo de incluso com cabealho e itens, as variveis a serem utilizadas
so: aAutoCab para o cabealho, e aAutoItens para os itens da getdados.
Para uma incluso simples, tomar como exemplo o MATA250.PRX. Para uma incluso com cabealho e
tem, tomar como exemplo o CONA050.PRX.
Controle de Semforo
AdvPl________________________________________________________________99
O controle de Semaforo permite que o sistema controle a Numerao Automtica de Documentos On Line.
Temos basicamente 3 funes que gerenciam o controle do mesmo.
So elas :
GETSXENUM( EXPC1) -> Obtem o nmero sequencial do alias especificado no parmetro.
ROLLBACKSXE -> Descarta o nmero pendente do semforo. usado quando o usurio cancela a
operao (o numero no aproveitado).
CONFIRMSXE -> Confirma o nmero sugerido. Esta funo deve ser chamada quando da confirmao da
gravao do registro.
MAYIUSE -> Checa fisicamente se um determinado arquivo existe. O arquivo poder conter o nmero
sequencial.
Obs : A funo GETX8NUM executa a prpria GETSXENUM.
Atualizao do SourceSafe
A atualizao do Source Safe a ltima, e mais crtica, etapa do processo de alterao dos programas.
Para que ela seja feita com a mxima segurana algumas etapas devem ser observadas. A seguir:
Aps as alteraes ser necessria uma anlise meticulosa de tudo o que foi alterado para avaliar qual o
impacto que estas podero causar no programa em que foram executadas e nos programas
correlacionados;
Devero ser efetuados o maior nmero de testes onde devero ser previstos o maior nmero de situaes
possveis e provveis. Os testes devero ser simulados em base equivalente instalada no cliente e para
as novas verses, em uma nova base que poder ser gerada atravs do ATUSX;
Feita a anlise, os testes e antes de atualizar definitivamente o Source Safe o programa alterado dever
ser comparado com o constante no Source Safe para verificar se as alteraes foram realmente feitas no
programa que foi reservado e, s ento o programa poder ser Baixado.
Aps a Baixa, e para garantir que o atualizao do Source Safe foi feita corretamente, o programa
atualizado dever ser novamente comparado. E claro que se todas as etapas anteriores, principalmente
a 1 e 2 , foram cumpridas essa no passar de uma medida de segurana.
Procedimentos de Localizaes
A Microsiga atua hoje em 13 pases e isto faz com que praticamente todas as alteraes executadas no
sistema reflitam em todos os pases (exceto quando no for necessrio tal procedimento).
Procedimentos a serem cumpridos em alterao / desenvolvimento de
programas :
A fim de evitar os inconvenientes citados no ponto anterior, existem procedimentos que devem ser
adotados no nosso dia a dia e repassado para aqueles funcionrios que se acoplam a nossa equipe. Estes
so (entre parntesis os problemas que seriam reduzidos usando os procedimentos) :
Quando includo um novo STR em um CH, ou criado um novo CH, ou modificado um STR em um
CH j existente, este deve ser replicado em PORTUGUS para os demais idiomas e
automaticamente deve ser encaminha um e-mail para traducoes@microsiga.com.br indicando
a verso, o STR e o CH que foi alterado.
AdvPl________________________________________________________________100
Quando criado um campo novo, ou modificado o contedo de um j existente, os campos que
devem refletir esta alterao nos demais idiomas devem ser deixados em branco, assim como o
pessoal de tradues identifica os campos que devem ser traduzidos. Isto valido para todos os
arquivos do dicionrio de dados.
Quando criado ou alterado um novo HELP (de campo ou de programa) deve ser informado de
imediato para tradues para proceder a traduo para os outros idiomas.
Para atualizar um parmetro deve ser sempre usada a funo PUTMV, NUNCA DEVE SER
PREENCHIDO NEM POSICIONADO POR FORA. Esta funo atualiza nos trs idiomas.
Quando criado um campo novo similar a outros j existentes no sistema, deve se analisar se este
deve ser replicado com caractersticas diferentes para todos os paises localizados, ou se as
caractersticas devem ser igual independentemente da localizao. Na falta de critrio ou
informao, deve ser informado ao setor de localizaes.
Quando criado um campo novo de uso exclusivo de Brasil (E1_INSS por exemplo) deve ser
informada a equipe de localizaes para configurar este campo (uso, browse, etc.) de acordo com
os demais paises.
Quando for modificada a caracterstica de um campo do sistema e este estiver replicado para o
resto dos pases, as alteraes devem ser replicadas em todos os paises. Na dvida da
aplicabilidade da alterao nos outros paises, deve ser informada a equipe de localizaes.
Os novos campos tipo COMBO, devem ser criados com numerao e no com siglas (1 para sim e 2
para no, ao invs de S para sim e N para no). Esta alterao o incluso deve ser informada de
imediato para a equipe de tradues.
Quando for criado um novo parmetro, ou modificado o contedo default de um j existente, esta
modificao deve ser aplicada nas 3 lnguas.
Quando houve a possibilidade de pegar um STR do dicionrio (funo RETTITLE() ), este deve ser
pego, o que evita ter que criar vrios STR e tratarmos com a varivel cPaisLoc dentro do
programa. Exemplo CGC, NOTA FISCAL, CEP, etc.
No deve ser usada a acentuao
Quando criadas novas perguntas no SX1, ou modificadas as existentes, e o X1_GSC for igual a C,
deve ser informado de imediato para tradues, pois os campos das opes do combo, quando
vazias, geram erro fatal na execuo.
Programando com Schedule de Relatrios
Como o sistema permite que a emisso de relatrios possa ser programada (schedule) fundamental que
se utilize as rotinas padres para a emisso dos mesmo. O controle do schedule feito pela funo
SetPrint. Sendo assim, no suportado interface com data entry durante o processo de relatrio, visto
que isto inviabilizar a utilizao do mesmo. A no ser em relatrios especficos e que sejam inviveis a
utilizao de shedule (ex. Impresso de Cheques) este procedimento dever ser adotado corretamente.
Caso exista alguma entrada de dados que seja possvel ser assumida qualquer valor apenas no schedule
deve-se adotar o seguinte procedimento :
Usar a varivel __cInternet, que se estiver com valor .T. (Verdadeiro) estamos no processo de schedule.
Modelos de Programas Padronizados
AdvPl________________________________________________________________101
Modelo 1
Este modelo de programa exibe um Browse vertical de campos presentes no dicionrio de dados.
Genericamente as validaes so herdadas do prprio dicionrio de dados.



/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ Funcao | FI NA010 | Aut or | Wagner Xavi er | Dat a | 28/ 04/ 92 |
+- - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - - - - +
| Descr i cao | Pr ogr ama de at ual i zacao de Nat ur ezas |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | FI NA010( ) |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | Gener i co |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ATUALI ZACOES SOFRI DAS DESDE A CONSTRUCAO NI CI AL |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ogr amador | Dat a | BOPS | Mot i vo da Al t er acao |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| | | | |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
AdvPl________________________________________________________________102
#I NCLUDE "FI NA010. CH"
#I NCLUDE "PROTHEUS. CH"
FUNCTI ON FI NA010
/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne Ar r ay cont endo as Rot i nas a execut ar do pr ogr ama +
| - - - - - - - - - - - El ement os cont i dos por di mensao - - - - - - - - - - - - +
| 1. Nome a apar ecer no cabecal ho +
| 2. Nome da Rot i na associ ada +
| 3. Usado pel a r ot i na +
| 4. Ti po de Tr ansacao a ser ef et uada +
| 1 - Pesqui sa e Posi ci ona emumBanco de Dados +
| 2 - Si mpl esment e Most r a os Campos +
| 3 - I ncl ui r egi st r os no Bancos de Dados +
| 4 - Al t er a o r egi st r o cor r ent e +
| 5 - Remove o r egi st r o cor r ent e do Banco de Dados +
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
PRI VATE aRot i na : = { { OemToAnsi ( STR0001) , " AxPesqui " , 0 , 1}, ; / / " Pesqui sar "
{ OemToAnsi ( STR0002) , " AxVi sual " , 0 , 2}, ; / / " Vi sual i zar "
{ OemToAnsi ( STR0003) , " AxI ncl ui " , 0 , 3}, ; / / " I ncl ui r "
{ OemToAnsi ( STR0004) , " AxAl t er a" , 0 , 4}, ; / / " Al t er ar "
{ OemToAnsi ( STR0005) , " FA010Del " , 0 , 5, 3} } / / " Excl ui r "
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne o cabecal ho da t el a de at ual i zacoes |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
PRI VATE cCadast r o : = OemToAnsi ( STR0006) / / " At ual i zacao de Nat ur ezas"
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ender eca f uncao Mbr owse |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
mBr owse( 6, 1, 22, 75, " SED")
Ret ur n
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | FA010DEL | Aut or | Wagner Xavi er | Dat a | 8/ 04/ 92 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Pr ogr ama de excl usao de Nat ur ezas |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | A010Del et a( ExpC1, ExpN1, ExpN2) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1 = Al i as do ar qui vo |
| | ExpN1 = Numer o do r egi st r o |
| | ExpN2 = Numer o da opcao sel eci onada |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FI NA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
FUNCTI ON FA010DEL( cAl i as, nReg, nOpc)
Local aAC : = { OemToAnsi ( STR0007) , OemToAnsi ( STR0008) } / / " Abandona" ###" Conf i r ma"
Local bCampo
Local l Del et a : = . T.
Local oDl g
Local nCont
Local nOpca
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont a a ent r ada de dados do ar qui vo |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Pr i vat e aTELA[ 0] [ 0] , aGETS[ 0]
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ver i f i ca se o ar qui vo est a r eal ment e vazi o ou se est a |
| posi ci onado emout r a f i l i al |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f EOF( ) . or . SED- >ED_FI LI AL ! = xFi l i al ( " SED")
HELP( " " , 1 , " ARQVAZI O" )
Ret ur n Ni l
Endi f

Whi l e . T.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Envi a par a pr ocessament o dos Get s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
AdvPl________________________________________________________________103
dbSel ect Ar ea( cAl i as )
bCampo : = {| nCPO| Fi el d( nCPO) }
FOR nCont : = 1 TO FCount ( )
M- >&( EVAL( bCampo, nCont ) ) : = Fi el dGet ( nCont )
NEXT nCont
nOpca : = 1
DEFI NE MSDI ALOG oDl g TI TLE cCadast r o FROM 9, 0 TO 28, 80 OF oMai nWnd
EnChoi ce( cAl i as, nReg, nOpc, , "AC" , OemToAnsi ( STR0009) ) / / " Quant o a excl usao?"
ACTI VATE MSDI ALOG oDl g ON I NI T Enchoi ceBar ( oDl g, {| | nOpca : = 2, oDl g: End( ) }, ;
{| | nOpca : = 1, oDl g: End( ) })
DbSel ect Ar ea( cAl i as)
dbSel ect Ar ea( cAl i as)
I F nOpcA == 2
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ant es de del et ar , ver i f i car se exi st e movi ment acao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SE1")
dbSet Or der ( 3)
I F ( dbSeek( cFi l i al +SED- >ED_CODI GO) )
Hel p( " " , 1, " A010NAODEL" )
l Del et a : = . F.
MsUnl ock( )
El se
dbSel ect Ar ea( "SE2" )
dbSet Or der ( 2)
I F ( dbSeek( cFi l i al +SED- >ED_CODI GO) )
Hel p( " " , 1, " A010NAODEL" )
l Del et a : = . F.
MsUnl ock( )
El se
dbSel ect Ar ea( " SE5" )
dbSet Or der ( 4)
I F ( dbSeek( cFi l i al +SED- >ED_CODI GO) )
Hel p( " " , 1, "A010NAODEL" )
l Del et a : = . F.
MsUnl ock( )
Endi f
Endi f
Endi f
I f l Del et a
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| I ni ci o da Pr ot ecao vi a TTS |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
BEGI N TRANSACTI ON
dbSel ect Ar ea( cAl i as)
RecLock( cAl i as, . F. , . T. )
dbDel et e( )
END TRANSACTI ON
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Fi nal da pr ot ecao vi a TTS |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Endi f
El se
MsUnl ock( )
Endi f
Exi t
Enddo
dbSel ect Ar ea( " SE1" )
dbSet Or der ( 1)
dbSel ect Ar ea( " SE2" )
dbSet Or der ( 1)
dbSel ect Ar ea( " SE5" )
dbSet Or der ( 1)
dbSel ect Ar ea( cAl i as)
RETURN
Modelo 2
AdvPl________________________________________________________________104
Este modelo de programa exibe um cabealho com informaes pr-determinadas, um Browse horizontal
central (dependente do dicionrio de dados) e um rodap com variveis de memria que so atualizadas
de acordo com os valores preenchidos no Browse horizontal.
As validaes do cabealho so pr-determinadas no programa-fonte. J as validaes do browse
horizontal so genericamente herdadas do dicionrio de dados.



/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ Funcao | CTBA120 | Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - - - - +
| Descr i cao | Cadast r o de Cr i t er i os de Rat ei o Ext er no |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | CTBA120( ) |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | Gener i co |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ATUALI ZACOES SOFRI DAS DESDE A CONSTRUCAO NI CI AL |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ogr amador | Dat a | BOPS | Mot i vo da Al t er acao |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| | | | |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
#I NCLUDE "CTBA120. CH"
#I NCLUDE "PROTHEUS. CH"
#I NCLUDE "FONT. CH"
AdvPl________________________________________________________________105
FUNCTI ON CTBA120( )
/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne Ar r ay cont endo as Rot i nas a execut ar do pr ogr ama +
| - - - - - - - - - - - El ement os cont i dos por di mensao - - - - - - - - - - - - +
| 1. Nome a apar ecer no cabecal ho +
| 2. Nome da Rot i na associ ada +
| 3. Usado pel a r ot i na +
| 4. Ti po de Tr ansacao a ser ef et uada +
| 1 - Pesqui sa e Posi ci ona emumBanco de Dados +
| 2 - Si mpl esment e Most r a os Campos +
| 3 - I ncl ui r egi st r os no Bancos de Dados +
| 4 - Al t er a o r egi st r o cor r ent e +
| 5 - Remove o r egi st r o cor r ent e do Banco de Dados +
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
PRI VATE aRot i na : = { { OemToAnsi ( STR0001) , " AxPesqui " , 0 , 1}, ; / / " Pesqui sar "
{ OemToAnsi ( STR0002) , " Ct b120Cad" , 0 , 2}, ; / / " Vi sual i zar "
{ OemToAnsi ( STR0003) , " Ct b120Cad" , 0 , 3}, ; / / " I ncl ui r "
{ OemToAnsi ( STR0004) , " Ct b120Cad" , 0 , 4}, ; / / " Al t er ar "
{ OemToAnsi ( STR0005) , " Ct b120Cad" , 0 , 5} } / / " Excl ui r "
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne o cabecal ho da t el a de at ual i zacoes |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Pr i vat e cCadast r o : = OemToAnsi ( STR0006) / / " Cr i t er i os de Rat ei o
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ender eca f uncao Mbr owse |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
mBr owse( 6, 1, 22, 75, " CTJ " )
Ret ur n
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120CAD| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Cadast r o de Rat ei o Ext er no |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Cad( ExpC1, ExpN1, ExpN2) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1 = Al i as do ar qui vo |
| | ExpN1 = Numer o do r egi st r o |
| | ExpN2 = Numer o da opcao sel eci onada |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct b120Cad( cAl i as, nReg, nOpc)
Local aSaveAr ea : = Get Ar ea( )
Local aCampos : = {}
Local aAl t er a : = {}
Local aTpSal d : = CTBCBOX( " CTJ _TPSALD" )
Local cAr q
Local cRat ei o
Local cDescRat
l OCAL cMoedaLc
Local cTpSal d
Local nOpca : = 0
Local oGet Db
Local oDl g
Local oFnt
Local oTpSal d
Pr i vat e aTel a : = {}
Pr i vat e aGet s : = {}
Pr i vat e aHeader : = {}
Pr i vat e nTot al D : = 0
Pr i vat e nTot al C : = 0
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont a aHeader par a uso comMSGETDB |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
aCampos : = Ct b120Head( @aAl t er a)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Cr i a ar qui vo Tempor ar i o par a uso comMSGETDB |
AdvPl________________________________________________________________106
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Ct b120Cr i ( aCampos, @cAr q)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Car r ega dados par a MSGETDB |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Ct b120Car r ( nOpc)
I f nOpc == 3 / / I ncl usao
cRat ei o : = Cr i aVar ( " CTJ _RATEI O" ) / / Numer o do Rat ei o
cDescRat : = Cr i aVar ( " CTJ _DESC" ) / / Descr i cao do Rat ei o
cMoedaLC : = Cr i aVar ( " CTJ _MOEDLC") / / Moeda do Lancament o
cTpSal d : = Cr i aVar ( " CTJ _TPSALD" ) / / Ti po do Sal do
El se / / Vi sual i zacao / Al t er acao / Excl usao
cRat ei o : = CTJ - >CTJ _RATEI O
cDescRat : = CTJ - >CTJ _DESC
cMoedaLC : = CTJ - >CTJ _MOEDLC
cTpSal d : = CTJ - >CTJ _TPSALD
EndI f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont a Tel a Model o 2 |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
DEFI NE MSDI ALOG oDl g TI TLE OemToAnsi ( STR0006) Fr om9, 0 To 32, 80 OF oMai nWnd / / "Rat ei os
Ext er nos"
DEFI NE FONT oFnt NAME " Ar i al " Si ze 10, 15
@18, 007 SAY OemToAnsi ( STR0007) PI XEL / / " Rat ei o: "

@18, 037 MSGET cRat ei o Pi ct ur e " 9999" SI ZE 020, 08 When ( nOpc == 3) ;
Val i d Ct b120Rat ( cRat ei o) OF oDl g PI XEL

@18, 090 Say OemToAnsi ( STR0008) PI XEL / / " Descr i cao: "
@18, 120 MSGET cDescRat Pi ct ur e " @! " SI ZE 140, 08 When ( nOpc == 3 . Or . ;
nOpc == 4) Val i d ! Empt y( cDescRat ) OF oDl g PI XEL
@33, 007 Say OemToAnsi ( STR0009) PI XEL / / " Moeda: "
@32, 037 MSGET cMoedaLc Pi ct ur e " @! " F3 " CTO" SI ZE 020, 08 When ( nOpc == 3 . Or . ;
nOpc == 4) Val i d Ct 120Moed( cMoedaLC) Of oDl g PI XEL

@33, 090 SAY OemToAnsi ( STR0010) PI XEL / / " Sal do: "
@32, 120 MSCOMBOBOX oTpSal d VAR cTpSal d I TEMS aTpSal d When ( nOpc == 3 . Or . ;
nOpc == 4) SI ZE 45, 08 OF oDl g PI XEL Val i d ( ! Empt y( cTpSal d) . And. ;
Ct bTpSal d( @cTpSal d, aTpSal d) )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Chamada da MSGETDB |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
oGet DB : = MSGet DB( ) : New( 044, 005, 120, 315, I i f ( nOpc==3, 4, nOpc) , "CTB120LOK", ;
" CTB120TOk" , "+CTJ _SEQUEN" , . t . , aAl t er a, , . t . , , " TMP" )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Val i dacao da j anel a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
ACTI VATE MSDI ALOG oDl g ON I NI T Enchoi ceBar ( oDl g, ;
{| | nOpca: =1, i f ( Ct b120TOK( ) , oDl g: End( ) , nOpca : = 0) }, ;
{| | nOpca: =2, oDl g: End( ) }) VALI D nOpca ! = 0
I F nOpcA == 1 / / Acei t a oper acao e gr ava dados
Begi n Tr ansact i on
Ct b120Gr a( cRat ei o, cDescRat , nOpc, cMoedaLC, cTpSal d)
End Tr ansact i on
ENDI F
dbSel ect Ar ea( cAl i as)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Apaga ar qui vo t empor ar i o ger ado par a MSGETDB |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
DbSel ect Ar ea( "TMP" )
DbCl oseAr ea( )
I f Sel ect ( " cAr q" ) = 0
FEr ase( cAr q+Get DBExt ensi on( ) )
EndI f
dbSel ect Ar ea( " CTJ " )
dbSet Or der ( 1)
Ret ur n nOpca
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120RAT| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
AdvPl________________________________________________________________107
| Descr i cao | Ver i f i ca exi st enci a do Rat ei o |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Rat ( ExpC1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1 = Numer o do Rat ei o |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | . T. / . F. |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct b120Rat ( cRat ei o)
Local aSaveAr ea: = Get Ar ea( )
Local l Ret : = . T.
Local nReg
I f Empt y( cRat ei o)
l Ret : = . F.
El se
dbSel ect Ar ea( " CTJ " )
dbSet Or der ( 1)
nReg : = Recno( )
I f dbSeek( xFi l i al ( ) +cRat ei o)
Hel p( " ", 1, " CTJ NRATEI O")
l Ret : = . F.
EndI f
dbGot o( nReg)
EndI f
Rest Ar ea( aSaveAr ea)
Ret ur n l Ret

/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120GRA| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Gr ava r esgi st r o di gi t ados |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Gr a( ExpC1, ExpC2, ExpN1, cExpC3, cExpC4) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1 = Numer o do Rat ei o |
| | ExpC2 = Descr i cao do Rat ei o |
| | ExpN1 = Opcao do Menu ( I ncl usao / Al t er acao et c) |
| | ExpC3 = Moeda do Rat ei o |
| | ExpC4 = Ti po de Sal do |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Funct i on Ct b120Gr a( cRat ei o, cDescRat , nOpc, cMoedaLC, cTpSal d)
Local aSaveAr ea : = Get Ar ea( )
dbSel ect Ar ea( " TMP" )
dbgot op( )
Whi l e ! Eof ( )
I f ! TMP- >CTJ _FLAG / / I t emnao del et ado na MSGETDB
I f nOpc == 3 . Or . nOpc == 4
dbSel ect Ar ea( "CTJ " )
dbSet Or der ( 1)
I f ! ( dbSeek( xFi l i al ( ) +cRat ei o+TMP- >CTJ _SEQUEN) )
RecLock( " CTJ " , . t . )
CTJ - >CTJ _FI LI AL : = xFi l i al ( )
CTJ - >CTJ _RATEI O : = cRat ei o
CTJ - >CTJ _DESC : = cDescRat
CTJ - >CTJ _MOEDLC : = cMoedaLC
CTJ - >CTJ _TPSALD : = cTpSal d
El se
RecLock( " CTJ " , . f . )
CTJ - >CTJ _DESC : = cDescRat
CTJ - >CTJ _MOEDLC : = cMoedaLC
CTJ - >CTJ _TPSALD : = cTpSal d
Endi f
For nCont : = 1 To Len( aHeader )
AdvPl________________________________________________________________108
I f ( aHeader [ nCont ] [ 10] ! = " V" )
Fi el dPut ( Fi el dPos( aHeader [ nCont ] [ 2] ) , ;
TMP- >( Fi el dGet ( Fi el dPos( aHeader [ nCont ] [ 2] ) ) ) )
EndI f
Next nCont
MsUnLock( )
El sei f nOpc == 5 / / Se f or excl usao
dbSel ect Ar ea( " CTJ " )
dbSet Or der ( 1)
I f dbSeek( xFi l i al ( ) +cRat ei o+TMP- >CTJ _SEQUEN)
RecLock( " CTJ " , . F. , . T. )
dbDel et e( )
MsUnl OCK( )
EndI f
EndI f
El se / / I t emdel et ado na MSGETDB
dbSel ect Ar ea( " CTJ ")
dbSet Or der ( 1)
I f dbSeek( xFi l i al ( ) +cRat ei o+TMP- >CTJ _SEQUEN)
RecLock( " CTJ ", . f . , . t . )
DbDel et e( )
MsUnl ock( )
Endi f
EndI f
dbSel ect Ar ea( " TMP" )
dbSki p( )
Enddo
Rest Ar ea( aSaveAr ea)
Ret ur n

/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120TOK| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Val i da MSGETDB - > Tudo OK |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120TOK( ExpC1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct b120TOk( )
Local aSaveAr ea : = Get Ar ea( )
Local l Ret : = . T.
Local nTot al D : = 0
Local nTot al C : = 0
dbSel ect Ar ea( " TMP" )
dbGot op( )
Whi l e ! Eof ( )
I f ! TMP- >CTJ _FLAG
I f ! Ct b120LOK( )
l Ret : = . F.
Exi t
Endi F
I f ! Empt y( TMP- >CTJ _DEBI TO)
nTot al D += TMP- >CTJ _PERCEN
EndI f
I f ! Empt y( TMP- >CTJ _CREDI TO)
nTot al C += TMP- >CTJ _PERCEN
EndI f
EndI f
dbSki p( )
EndDo
nTot al D : = Round( nTot al D, 2)
nTot al C : = Round( nTot al C, 2)
I f l Ret
I F ( nTot al D > 0 . And. nTot al D ! = 100 ) . Or . ( nTot al C > 0 . And. nTot al C ! = 100)
AdvPl________________________________________________________________109
Hel p( " ", 1, " CTJ 100%" )
l Ret : = . F.
EndI F
EndI f
Rest Ar ea( aSaveAr ea)
Ret ur n l Ret
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120LOK| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Val i da MSGETDB - > Li nhaOK |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120LOK( ExpC1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on CTB120LOK( )
Local l Ret : = . T.
Local nCont
I f ! TMP- >CTJ _FLAG
I f Empt y( TMP- >CTJ _PERCEN)
Hel p( " ", 1, " CTJ VLZERO" )
l Ret : = . F.
EndI f
I f l Ret
Val i daCont a( TMP- >CTJ _DEBI TO, " 1" , , , . t . )
EndI f
I f l Ret
Val i daCont a( TMP- >CTJ _CREDI TO, " 2" , , , . T. )
EndI f
EndI f
Ret ur n l Ret
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120Cr i | Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Cr i a Ar qui vo Tempor ar i o par a MSGETDB |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Cr i ( ExpA1, ExpC1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpA1 = Mat r i z comcampos a ser emcr i ados |
| | ExpC1 = Nome do ar qui vo t empor ar i o |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct b120Cr i a( aCampos, cAr q)
Local cChave
Local aSaveAr ea : = Get Ar ea( )
cChave : = " CTJ _SEQUEN"
cAr q : = Cr i aTr ab( aCampos, . t . )
dbUseAr ea( . t . , , cAr q, " TMP", . f . , . f . )
Rest Ar ea( aSaveAr ea)
Ret ur n
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120Head| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Mont ar aHeader par a ar qui vo t empor ar i o da MSGETDB |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Head( ExpA1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpA1 = Mat r i z comcampos que podemser al t er ados |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
AdvPl________________________________________________________________110
| Ret or no | ExpA1 = Mat r i z comcampos a ser emcr i ados no ar q t empor ar i o|
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct b120Head( aAl t er a)
Local aSaveAr ea: = Get Ar ea( )
Local aFor a : = {" CTJ _RATEI O" , "CTJ _DESC" , " CTJ _MOEDLC" , " CTJ _TPSALD", " CTJ _VALOR" }
Local aCampos : = {}
Local nCr i t er : = 0
PRI VATE nUsado : = 0
/ / Mont agemda mat r i z aHeader
dbSel ect Ar ea( " SX3" )
dbSet Or der ( 1)
dbSeek( " CTJ " )
Whi l e ! EOF( ) . And. ( x3_ar qui vo == "CTJ " )
I f Al l t r i m( x3_campo) == " CTJ _SEQUEN" . Or . ;
x3Uso( x3_usado) . and. cNi vel >= x3_ni vel
I f Ascan( aFor a, Tr i m( X3_CAMPO) ) <= 0
nUsado++
AADD( aHeader , { TRI M( X3Ti t ul o( ) ) , x3_campo, x3_pi ct ur e, ;
x3_t amanho, x3_deci mal , x3_val i d, ;
x3_usado, x3_t i po, " TMP", x3_cont ext } )
I f Al l t r i m( x3_campo) <> " CTJ _SEQUEN"
Aadd( aAl t er a, Tr i m( X3_CAMPO) )
EndI f
EndI F
EndI F
aAdd( aCampos, { SX3- >X3_CAMPO, SX3- >X3_TI PO, SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL } )
dbSki p( )
EndDO
Aadd( aCampos, {"CTJ _FLAG" , " L" , 1, 0})
Rest Ar ea( aSaveAr ea)
Ret ur n aCampos
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CTB120Car r | Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Car r ega dados par a MSGETDB |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Car r ( ExpN1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpN1 = Opcao do Menu - > I ncl usao / Al t er acao et c |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on CTB120Car r ( nOpc)
Local aSaveAr ea: = Get Ar ea( )
Local cAl i as : = " CTJ "
Local nPos
I f nOpc ! = 3 / / Vi sual i zacao / Al t er acao / Excl usao
cRat ei o : = CTJ - >CTJ _RATEI O
dbSel ect Ar ea( " CTJ " )
dbSet Or der ( 1)
I f dbSeek( xFi l i al ( ) +cRat ei o)
Whi l e ! Eof ( ) . And. CTJ - >CTJ _FI LI AL == xFi l i al ( ) . And. ;
CTJ - >CTJ _RATEI O == cRat ei o
dbSel ect Ar ea( "TMP" )
dbAppend( )
For nCont : = 1 To Len( aHeader )
nPos : = Fi el dPos( aHeader [ nCont ] [ 2] )
I f ( aHeader [ nCont ] [ 08] <> " M" . And. aHeader [ nCont ] [ 10] <> " V" )
Fi el dPut ( nPos, ( cAl i as) -
>( Fi el dGet ( Fi el dPos( aHeader [ nCont ] [ 2] ) ) ) )
EndI f
Next nCont
TMP- >CTJ _FLAG : = . F.
AdvPl________________________________________________________________111
dbSel ect Ar ea( "CTJ " )
dbSki p( )
EndDo
EndI f
El se
dbSel ect Ar ea( " TMP" )
dbAppend( )
For nCont : = 1 To Len( aHeader )
I f ( aHeader [ nCont ] [ 08] <> " M" . And. aHeader [ nCont ] [ 10] <> " V" )
nPos : = Fi el dPos( aHeader [ nCont ] [ 2] )
Fi el dPut ( nPos, Cr i aVar ( aHeader [ nCont ] [ 2] , . T. ) )
EndI f
Next nCont
TMP- >CTJ _FLAG : = . F.
TMP- >CTJ _SEQUEN: = " 001"
EndI f
dbSel ect Ar ea( " TMP" )
dbGoTop( )
Rest Ar ea( aSaveAr ea)
Ret ur n
/ */
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | CT120Moed| Aut or | Pi l ar S. Al bal adej o | Dat a | 24/ 07/ 00 |
+- - - - - - - - - - - - +- - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Val i da Moeda do Lancament o |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ct b120Moed( ExpC1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1 = Moeda a ser val i dada |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | . T. / . F. |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | CTBA120 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ct 120MoedLC( cMoeda)
Local aCt bMoeda: = {}
Local l Ret : = . T.
aCt bMoeda : = Ct bMoeda( cMoeda)
I f Empt y( aCt bMoeda[ 1] )
Hel p( " " , 1, "NOMOEDA" )
l Ret : = . F.
Endi f
Ret ur n l Ret
Modelo 3
Este modelo de programa a juno dos Modelos 1 e 2. Nele exibido um Browse vertical e um Browse
horizontal (ambos dependentes do dicionrio de dados). As validaes so genericamente herdadas do
dicionrio de dados.

AdvPl________________________________________________________________112


/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ Funcao | FATA010 | Aut or | Eduar do Ri er a | Dat a | 11/ 01/ 00 |
+- - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - - - - +
| Descr i cao | Cadast r o de Pr ocesso de Vendas |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | FATA010( ) |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | Gener i co |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ATUALI ZACOES SOFRI DAS DESDE A CONSTRUCAO NI CI AL |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ogr amador | Dat a | BOPS | Mot i vo da Al t er acao |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| | | | |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
#I NCLUDE "FATA010. CH"
#I NCLUDE "FI VEWI N. CH"
#DEFI NE APOS { 15, 1, 70, 315 }
Funct i on Fat a010( )
/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne Ar r ay cont endo as Rot i nas a execut ar do pr ogr ama +
| - - - - - - - - - - - El ement os cont i dos por di mensao - - - - - - - - - - - - +
| 1. Nome a apar ecer no cabecal ho +
| 2. Nome da Rot i na associ ada +
| 3. Usado pel a r ot i na +
AdvPl________________________________________________________________113
| 4. Ti po de Tr ansacao a ser ef et uada +
| 1 - Pesqui sa e Posi ci ona emumBanco de Dados +
| 2 - Si mpl esment e Most r a os Campos +
| 3 - I ncl ui r egi st r os no Bancos de Dados +
| 4 - Al t er a o r egi st r o cor r ent e +
| 5 - Remove o r egi st r o cor r ent e do Banco de Dados +
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
PRI VATE cCadast r o : = OemToAnsi ( STR0001) / / " Pr ocesso de Venda"
PRI VATE aRot i na : = { { OemToAnsi ( STR0002) , " AxPesqui " , 0, 1}, ; / / "Pesqui sar "
{ OemToAnsi ( STR0003) , " Ft 010Vi sua" , 0, 2}, ; / / " Vi sual "
{ OemToAnsi ( STR0004) , " Ft 010I ncl u" , 0, 3}, ; / / " I ncl ui r "
{ OemToAnsi ( STR0005) , " Ft 010Al t er " , 0, 4}, ; / / " Al t er ar "
{ OemToAnsi ( STR0006) , " Ft 010Excl u" , 0, 5} } / / " Excl usao"

I f ! Empt y( Sel ect ( "AC9" ) )
AAdd( aRot i na, { STR0013, " MsDocument ", 0, 4} )
EndI f
mBr owse( 6, 1, 22, 75, " AC1")
Ret ur n( . T. )

/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Vi sua| Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Tr at ament o da Vi sual i zacao |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Vi sua( ExpC1, ExpN2, ExpN3) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1: Al i as do ar qui vo |
| | ExpN2: Regi st r o do Ar qui vo |
| | ExpN3: Opcao da MBr owse |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ft 010Vi sua( cAl i as, nReg, nOpcx)
Local aAr ea : = Get Ar ea( )
Local oGet Dad
Local oDl g
Local nUsado : = 0
Local nCnt For : = 0
Local nOpcA : = 0
Local l Cont i nua : = . T.
Local l Quer y : = . F.
Local cCadast r o : = OemToAnsi ( STR0001) / / " Pr ocesso de Venda"
Local cQuer y : = ""
Local cTr ab : = "AC2"
Local bWhi l e : = {| | . T. }
Local aObj ect s : = {}
Local aPosObj : = {}
Local aSi zeAut : = MsAdvSi ze( )
PRI VATE aHEADER : = {}
PRI VATE aCOLS : = {}
PRI VATE aGETS : = {}
PRI VATE aTELA : = {}
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemde Var i avei s de Memor i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC1" )
dbSet Or der ( 1)
For nCnt For : = 1 To FCount ( )
M- >&( Fi el dName( nCnt For ) ) : = Fi el dGet ( nCnt For )
Next nCnt For
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemdo aHeader |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SX3" )
dbSet Or der ( 1)
AdvPl________________________________________________________________114
dbSeek( " AC2" )
Whi l e ( ! Eof ( ) . And. SX3- >X3_ARQUI VO == " AC2" )
I f ( X3USO( SX3- >X3_USADO) . And. cNi vel >= SX3- >X3_NI VEL )
nUsado++
Aadd( aHeader , { TRI M( X3Ti t ul o( ) ) , ;
TRI M( SX3- >X3_CAMPO) , ;
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
SX3- >X3_USADO, ;
SX3- >X3_TI PO, ;
SX3- >X3_ARQUI VO, ;
SX3- >X3_CONTEXT } )
EndI f
dbSel ect Ar ea( " SX3" )
dbSki p( )
EndDo
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemdo aCol s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC2" )
dbSet Or der ( 1)
#I FDEF TOP
I f ( TcSr vType( ) ! =" AS/ 400" )
l Quer y : = . T.
cQuer y : = " SELECT *, R_E_C_N_O_ AC2RECNO "
cQuer y += " FROM "+Ret Sql Name( " AC2" ) +" AC2 "
cQuer y += " WHERE AC2. AC2_FI LI AL=' " +xFi l i al ( " AC2" ) +" ' AND "
cQuer y += "AC2. AC2_PROVEN=' " +AC1- >AC1_PROVEN+"' AND "
cQuer y += "AC2. D_E_L_E_T_<>' *' "
cQuer y += " ORDER BY " +Sql Or der ( AC2- >( I ndexKey( ) ) )

cQuer y : = ChangeQuer y( cQuer y)
cTr ab : = " FT010VI S"
dbUseAr ea( . T. , " TOPCONN" , TcGenQr y( , , cQuer y) , cTr ab, . T. , . T. )
For nCnt For : = 1 To Len( aHeader )
TcSet Fi el d( cTr ab, Al l Tr i m( aHeader [ nCnt For ] [ 2] ) , aHeader [ nCnt For , 8] , aHeader [ nCnt
For , 4] , aHeader [ nCnt For , 5] )
Next nCnt For
El se
#ENDI F
AC2- >( dbSeek( xFi l i al ( "AC2" ) +AC1- >AC1_PROVEN) )
bWhi l e : = {| | xFi l i al ( " AC2") == AC2- >AC2_FI LI AL . And. ;
AC1- >AC1_PROVEN == AC2- >AC2_PROVEN }
#I FDEF TOP
EndI f
#ENDI F

Whi l e ( ! Eof ( ) . And. Eval ( bWhi l e) )
aadd( aCOLS, Ar r ay( nUsado+1) )
For nCnt For : = 1 To nUsado
I f ( aHeader [ nCnt For ] [ 10] ! = " V" )
aCol s[ Len( aCol s) ] [ nCnt For ] : = Fi el dGet ( Fi el dPos( aHeader [ nCnt For ] [ 2] ) )
El se
I f ( l Quer y )
AC2- >( dbGot o( ( cTr ab) - >AC2RECNO) )
EndI f
aCol s[ Len( aCol s) ] [ nCnt For ] : = Cr i aVar ( aHeader [ nCnt For ] [ 2] )
EndI f
Next nCnt For
aCOLS[ Len( aCol s) ] [ Len( aHeader ) +1] : = . F.
dbSel ect Ar ea( cTr ab)
dbSki p( )
EndDo
I f ( l Quer y )
dbSel ect Ar ea( cTr ab)
dbCl oseAr ea( )
dbSel ect Ar ea( cAl i as)
EndI f
aObj ect s : = {}
AdvPl________________________________________________________________115
AAdd( aObj ect s, { 315, 50, . T. , . T. } )
AAdd( aObj ect s, { 100, 100, . T. , . T. } )
aI nf o : = { aSi zeAut [ 1 ] , aSi zeAut [ 2 ] , aSi zeAut [ 3 ] , aSi zeAut [ 4 ] , 3, 3 }
aPosObj : = MsObj Si ze( aI nf o, aObj ect s, . T. )
DEFI NE MSDI ALOG oDl g TI TLE cCadast r o Fr omaSi zeAut [ 7] , 00 To aSi zeAut [ 6] , aSi zeAut [ 5] OF
oMai nWnd PI XEL
EnChoi ce( cAl i as , nReg, nOpcx, , , , , aPosObj [ 1] , , 3 )
oGet Dad : = MSGet Dados( ) : New ( aPosObj [ 2, 1] , aPosObj [ 2, 2] , aPosObj [ 2, 3] , aPosObj [ 2, 4] ,
nOpcx, " Ft 010Li nOk" , " Al l waysTr ue" , " " , . F. )
ACTI VATE MSDI ALOG oDl g ON I NI T Enchoi ceBar ( oDl g, {| | oDl g: End( ) }, {| | oDl g: End( ) })
Rest Ar ea( aAr ea)
Ret ur n( . T. )
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010I ncl u| Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Tr at ament o da I ncl usao |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010I ncl u( ExpC1, ExpN2, ExpN3) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1: Al i as do ar qui vo |
| | ExpN2: Regi st r o do Ar qui vo |
| | ExpN3: Opcao da MBr owse |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ft 010I ncl u( cAl i as, nReg, nOpcx)
Local aAr ea : = Get Ar ea( )
Local cCadast r o : = OemToAnsi ( STR0001) / / " Pr ocesso de Venda"
Local oGet Dad
Local oDl g
Local nUsado : = 0
Local nCnt For : = 0
Local nOpcA : = 0
Local aObj ect s : = {}
Local aPosObj : = {}
Local aSi zeAut : = MsAdvSi ze( )
PRI VATE aHEADER : = {}
PRI VATE aCOLS : = {}
PRI VATE aGETS : = {}
PRI VATE aTELA : = {}
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemdas Var i avei s de Memor i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC1" )
dbSet Or der ( 1)
For nCnt For : = 1 To FCount ( )
M- >&( Fi el dName( nCnt For ) ) : = Cr i aVar ( Fi el dName( nCnt For ) )
Next nCnt For
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemda aHeader |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SX3" )
dbSet Or der ( 1)
dbSeek( " AC2" )
Whi l e ( ! Eof ( ) . And. SX3- >X3_ARQUI VO == " AC2" )
I f ( X3USO( SX3- >X3_USADO) . And. cNi vel >= SX3- >X3_NI VEL )
nUsado++
Aadd( aHeader , { TRI M( X3Ti t ul o( ) ) , ;
TRI M( SX3- >X3_CAMPO) , ;
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
SX3- >X3_USADO, ;
SX3- >X3_TI PO, ;
SX3- >X3_ARQUI VO, ;
SX3- >X3_CONTEXT } )
AdvPl________________________________________________________________116
EndI f
dbSel ect Ar ea( " SX3" )
dbSki p( )
EndDo
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemda Acol s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
aadd( aCOLS, Ar r ay( nUsado+1) )
For nCnt For : = 1 To nUsado
aCol s[ 1] [ nCnt For ] : = Cr i aVar ( aHeader [ nCnt For ] [ 2] )
Next nCnt For
aCOLS[ 1] [ Len( aHeader ) +1] : = . F.
aObj ect s : = {}
AAdd( aObj ect s, { 315, 50, . T. , . T. } )
AAdd( aObj ect s, { 100, 100, . T. , . T. } )
aI nf o : = { aSi zeAut [ 1 ] , aSi zeAut [ 2 ] , aSi zeAut [ 3 ] , aSi zeAut [ 4 ] , 3, 3 }
aPosObj : = MsObj Si ze( aI nf o, aObj ect s, . T. )
DEFI NE MSDI ALOG oDl g TI TLE cCadast r o Fr omaSi zeAut [ 7] , 00 To aSi zeAut [ 6] , aSi zeAut [ 5] OF
oMai nWnd PI XEL
EnChoi ce( cAl i as , nReg, nOpcx, , , , , aPosObj [ 1] , , 3 )
oGet Dad : = MSGet Dados( ) : New( aPosObj [ 2, 1] , aPosObj [ 2, 2] , aPosObj [ 2, 3] , aPosObj [ 2, 4] ,
nOpcx, " Ft 010Li nOk" , " Ft 010TudOk" , "" , . T. )
ACTI VATE MSDI ALOG oDl g ;
ON I NI T Enchoi ceBar ( oDl g, {| | nOpcA: =I f ( oGet Dad: TudoOk( ) . And. Obr i gat or i o( aGet s, aTel a) ,
1, 0) , I f ( nOpcA==1, oDl g: End( ) , Ni l ) }, {| | oDl g: End( ) })
I f ( nOpcA == 1 )
Begi n Tr ansact i on
Ft 010Gr v( 1)
I f ( __l SX8 )
Conf i r mSX8( )
EndI f
Eval Tr i gger ( )
End Tr ansact i on
El se
I f ( __l SX8 )
Rol l BackSX8( )
EndI f
EndI f
Rest Ar ea( aAr ea)
Ret ur n( . T. )
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Al t er | Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Tr at ament o da Al t er acao |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Al t er ( ExpC1, ExpN2, ExpN3) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1: Al i as do ar qui vo |
| | ExpN2: Regi st r o do Ar qui vo |
| | ExpN3: Opcao da MBr owse |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ft 010Al t er ( cAl i as, nReg, nOpcx)
Local aAr ea : = Get Ar ea( )
Local cCadast r o : = OemToAnsi ( STR0001) / / " Pr ocesso de Venda"
Local oGet Dad
Local oDl g
Local nUsado : = 0
Local nCnt For : = 0
Local nOpcA : = 0
Local l Cont i nua : = . T.
Local cQuer y : = ""
Local cTr ab : = "AC2"
Local bWhi l e : = {| | . T. }
Local aObj ect s : = {}
Local aPosObj : = {}
AdvPl________________________________________________________________117
Local aSi zeAut : = MsAdvSi ze( )
PRI VATE aHEADER : = {}
PRI VATE aCOLS : = {}
PRI VATE aGETS : = {}
PRI VATE aTELA : = {}
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemdas Var i avei s de Memor i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC1" )
dbSet Or der ( 1)
l Cont i nua : = Sof t Lock( " AC1" )
I f ( l Cont i nua )
For nCnt For : = 1 To FCount ( )
M- >&( Fi el dName( nCnt For ) ) : = Fi el dGet ( nCnt For )
Next nCnt For
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemda aHeader |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SX3" )
dbSet Or der ( 1)
dbSeek( " AC2")
Whi l e ( ! Eof ( ) . And. SX3- >X3_ARQUI VO == " AC2" )
I f ( X3USO( SX3- >X3_USADO) . And. cNi vel >= SX3- >X3_NI VEL )
nUsado++
Aadd( aHeader , { TRI M( X3Ti t ul o( ) ) , ;
TRI M( SX3- >X3_CAMPO) , ;
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
SX3- >X3_USADO, ;
SX3- >X3_TI PO, ;
SX3- >X3_ARQUI VO, ;
SX3- >X3_CONTEXT } )
EndI f
dbSel ect Ar ea( " SX3")
dbSki p( )
EndDo
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemda aCol s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC2" )
dbSet Or der ( 1)
#I FDEF TOP
I f ( TcSr vType( ) ! =" AS/ 400" )
l Quer y : = . T.
cQuer y : = " SELECT *, R_E_C_N_O_ AC2RECNO "
cQuer y += " FROM " +Ret Sql Name( " AC2" ) +" AC2 "
cQuer y += " WHERE AC2. AC2_FI LI AL=' " +xFi l i al ( " AC2") +" ' AND "
cQuer y += " AC2. AC2_PROVEN=' " +AC1- >AC1_PROVEN+" ' AND "
cQuer y += " AC2. D_E_L_E_T_<>' *' "
cQuer y += " ORDER BY " +Sql Or der ( AC2- >( I ndexKey( ) ) )

cQuer y : = ChangeQuer y( cQuer y)
cTr ab : = " FT010VI S"
dbUseAr ea( . T. , " TOPCONN", TcGenQr y( , , cQuer y) , cTr ab, . T. , . T. )
For nCnt For : = 1 To Len( aHeader )
TcSet Fi el d( cTr ab, Al l Tr i m( aHeader [ nCnt For ] [ 2] ) , aHeader [ nCnt For , 8] , ;
Header [ nCnt For , 4] , aHeader [ nCnt For , 5] )
Next nCnt For
El se
#ENDI F
AC2- >( dbSeek( xFi l i al ( " AC2" ) +AC1- >AC1_PROVEN) )
bWhi l e : = {| | xFi l i al ( "AC2" ) == AC2- >AC2_FI LI AL . And. ;
AC1- >AC1_PROVEN == AC2- >AC2_PROVEN }
#I FDEF TOP
EndI f
#ENDI F
Whi l e ( ! Eof ( ) . And. Eval ( bWhi l e) )
aadd( aCOLS, Ar r ay( nUsado+1) )
For nCnt For : = 1 To nUsado
AdvPl________________________________________________________________118
I f ( aHeader [ nCnt For ] [ 10] ! = " V" )
aCol s[ Len( aCol s) ] [ nCnt For ] : =
Fi el dGet ( Fi el dPos( aHeader [ nCnt For ] [ 2] ) )
El se
I f ( l Quer y )
AC2- >( dbGot o( ( cTr ab) - >AC2RECNO) )
EndI f
aCol s[ Len( aCol s) ] [ nCnt For ] : = Cr i aVar ( aHeader [ nCnt For ] [ 2] )
EndI f
Next nCnt For
aCOLS[ Len( aCol s) ] [ Len( aHeader ) +1] : = . F.
dbSel ect Ar ea( cTr ab)
dbSki p( )
EndDo
I f ( l Quer y )
dbSel ect Ar ea( cTr ab)
dbCl oseAr ea( )
dbSel ect Ar ea( cAl i as)
EndI f
EndI f
I f ( l Cont i nua )
aObj ect s : = {}
AAdd( aObj ect s, { 315, 50, . T. , . T. } )
AAdd( aObj ect s, { 100, 100, . T. , . T. } )
aI nf o : = { aSi zeAut [ 1 ] , aSi zeAut [ 2 ] , aSi zeAut [ 3 ] , aSi zeAut [ 4 ] , 3, 3 }
aPosObj : = MsObj Si ze( aI nf o, aObj ect s, . T. )
DEFI NE MSDI ALOG oDl g TI TLE cCadast r o Fr omaSi zeAut [ 7] , 00 To aSi zeAut [ 6] , aSi zeAut [ 5]
;
OF Mai nWnd PI XEL
EnChoi ce( cAl i as , nReg, nOpcx, , , , , aPosObj [ 1] , , 3 )
oGet Dad : =
MSGet Dados( ) : New( aPosObj [ 2, 1] , aPosObj [ 2, 2] , aPosObj [ 2, 3] , aPosObj [ 2, 4] , nOpcx, ;
" Ft 010Li nOk", " Ft 010TudOk" , "" , . T. )
ACTI VATE MSDI ALOG oDl g ;
ON I NI T
Enchoi ceBar ( oDl g, {| | nOpca: =I f ( oGet Dad: TudoOk( ) . And. Obr i gat or i o( aGet s, aTel a) , 1, 0) , ;
I f ( nOpcA==1, oDl g: End( ) , Ni l ) }, {| | oDl g: End( ) })
I f ( nOpcA == 1 )
Begi n Tr ansact i on
Ft 010Gr v( 2)
I f ( __l SX8 )
Conf i r mSX8( )
EndI f
Eval Tr i gger ( )
End Tr ansact i on
El se
I f ( __l SX8 )
Rol l BackSX8( )
EndI f
EndI f
EndI f
Endi f
Rest Ar ea( aAr ea)
Ret ur n( . T. )
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Excl u| Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Tr at ament o da Excl usao |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Excl u( ExpC1, ExpN2, ExpN3) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpC1: Al i as do ar qui vo |
| | ExpN2: Regi st r o do Ar qui vo |
| | ExpN3: Opcao da MBr owse |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
AdvPl________________________________________________________________119
Funct i on Ft 010Excl u( cAl i as, nReg, nOpcx)
Local aAr ea : = Get Ar ea( )
Local cCadast r o : = OemToAnsi ( STR0001) / / " Pr ocesso de Venda"
Local oGet Dad
Local oDl g
Local nUsado : = 0
Local nCnt For : = 0
Local nOpcA : = 0
Local l Cont i nua : = . T.
Local cQuer y : = ""
Local cTr ab : = "AC2"
Local bWhi l e : = {| | . T. }
Local aObj ect s : = {}
Local aPosObj : = {}
Local aSi zeAut : = MsAdvSi ze( )
PRI VATE aHEADER : = {}
PRI VATE aCOLS : = {}
PRI VATE aGETS : = {}
PRI VATE aTELA : = {}
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemdas Var i avei s de Memor i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC1" )
dbSet Or der ( 1)
l Cont i nua : = Sof t Lock( " AC1" )
I f ( l Cont i nua )
For nCnt For : = 1 To FCount ( )
M- >&( Fi el dName( nCnt For ) ) : = Fi el dGet ( nCnt For )
Next nCnt For
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agemda aHeader |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SX3" )
dbSet Or der ( 1)
dbSeek( " AC2")
Whi l e ( ! Eof ( ) . And. SX3- >X3_ARQUI VO == " AC2" )
I f ( X3USO( SX3- >X3_USADO) . And. cNi vel >= SX3- >X3_NI VEL )
nUsado++
Aadd( aHeader , { TRI M( X3Ti t ul o( ) ) , ;
TRI M( SX3- >X3_CAMPO) , ;
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
SX3- >X3_USADO, ;
SX3- >X3_TI PO, ;
SX3- >X3_ARQUI VO, ;
SX3- >X3_CONTEXT } )
EndI f
dbSel ect Ar ea( " SX3")
dbSki p( )
EndDo
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Mont agek da aCol s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC2" )
dbSet Or der ( 1)
#I FDEF TOP
I f ( TcSr vType( ) ! =" AS/ 400" )
l Quer y : = . T.
cQuer y : = " SELECT *, R_E_C_N_O_ AC2RECNO "
cQuer y += " FROM " +Ret Sql Name( " AC2" ) +" AC2 "
cQuer y += " WHERE AC2. AC2_FI LI AL=' " +xFi l i al ( " AC2") +" ' AND "
cQuer y += " AC2. AC2_PROVEN=' " +AC1- >AC1_PROVEN+" ' AND "
cQuer y += " AC2. D_E_L_E_T_<>' *' "
cQuer y += " ORDER BY " +Sql Or der ( AC2- >( I ndexKey( ) ) )

cQuer y : = ChangeQuer y( cQuer y)
cTr ab : = " FT010VI S"
dbUseAr ea( . T. , " TOPCONN", TcGenQr y( , , cQuer y) , cTr ab, . T. , . T. )
For nCnt For : = 1 To Len( aHeader )
AdvPl________________________________________________________________120
TcSet Fi el d( cTr ab, Al l Tr i m( aHeader [ nCnt For ] [ 2] ) , aHeader [ nCnt For , 8] , ;
aHeader [ nCnt For , 4] , aHeader [ nCnt For , 5] )
Next nCnt For
El se
#ENDI F
AC2- >( dbSeek( xFi l i al ( " AC2" ) +AC1- >AC1_PROVEN) )
bWhi l e : = {| | xFi l i al ( "AC2" ) == AC2- >AC2_FI LI AL . And. ;
AC1- >AC1_PROVEN == AC2- >AC2_PROVEN }
#I FDEF TOP
EndI f
#ENDI F
Whi l e ( ! Eof ( ) . And. Eval ( bWhi l e) )
aadd( aCOLS, Ar r ay( nUsado+1) )
For nCnt For : = 1 To nUsado
I f ( aHeader [ nCnt For ] [ 10] ! = " V" )
aCol s[ Len( aCol s) ] [ nCnt For ] : =
Fi el dGet ( Fi el dPos( aHeader [ nCnt For ] [ 2] ) )
El se
I f ( l Quer y )
AC2- >( dbGot o( ( cTr ab) - >AC2RECNO) )
EndI f
aCol s[ Len( aCol s) ] [ nCnt For ] : = Cr i aVar ( aHeader [ nCnt For ] [ 2] )
EndI f
Next nCnt For
aCOLS[ Len( aCol s) ] [ Len( aHeader ) +1] : = . F.
dbSel ect Ar ea( cTr ab)
dbSki p( )
EndDo
I f ( l Quer y )
dbSel ect Ar ea( cTr ab)
dbCl oseAr ea( )
dbSel ect Ar ea( cAl i as)
EndI f
EndI f
I f ( l Cont i nua )
aObj ect s : = {}
AAdd( aObj ect s, { 315, 50, . T. , . T. } )
AAdd( aObj ect s, { 100, 100, . T. , . T. } )
aI nf o : = { aSi zeAut [ 1 ] , aSi zeAut [ 2 ] , aSi zeAut [ 3 ] , aSi zeAut [ 4 ] , 3, 3 }
aPosObj : = MsObj Si ze( aI nf o, aObj ect s, . T. )

DEFI NE MSDI ALOG oDl g TI TLE cCadast r o Fr omaSi zeAut [ 7] , 00 To ;
aSi zeAut [ 6] , aSi zeAut [ 5] OF oMai nWnd PI XEL

EnChoi ce( cAl i as , nReg, nOpcx, , , , , aPosObj [ 1] , , 3 )
oGet Dad : =
MSGet Dados( ) : New( aPosObj [ 2, 1] , aPosObj [ 2, 2] , aPosObj [ 2, 3] , aPosObj [ 2, 4] , nOpcx, ;
" Ft 010Li nOk", " Ft 010TudOk" , "" , . F. )
ACTI VATE MSDI ALOG oDl g ;
ON I NI T
Enchoi ceBar ( oDl g, {| | nOpca: =I f ( oGet Dad: TudoOk( ) , 1, 0) , I f ( nOpcA==1, oDl g: End( ) , Ni l ) }, ;
{| | oDl g: End( ) })
I f ( nOpcA == 1 )
Begi n Tr ansact i on
I f Ft 010Del Ok( )
Ft 010Gr v( 3)
Eval Tr i gger ( )
EndI f
End Tr ansact i on
EndI f
EndI f
Rest Ar ea( aAr ea)
Ret ur n( . T. )

/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Li nOK| Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Val i dacao da l i nha OK |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Li nOk( ) |
AdvPl________________________________________________________________121
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nennhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ft 010Li nOk( )
Local l Ret or no: = . T.
Local nPSt age : = aScan( aHeader , {| x| Al l Tr i m( x[ 2] ) ==" AC2_STAGE" })
Local nPDescr i : = aScan( aHeader , {| x| Al l Tr i m( x[ 2] ) ==" AC2_DESCRI " })
Local nCnt For : = 0
Local nUsado : = Len( aHeader )
I f ( ! aCol s[ n] [ nUsado+1] )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ver i f i ca os campos obr i gat or i os |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f ( nPSt age == 0 . Or . nPDescr i == 0 )
Hel p( " ", 1, " OBRI GAT" )
l Ret or no : = . F.
EndI f
I f ( l Ret or no . And. ( Empt y( aCol s[ n] [ nPSt age] ) . Or . Empt y( aCol s[ n] [ nPDescr i ] ) ) )
Hel p( " ", 1, " OBRI GAT" )
l Ret or no : = . F.
EndI f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ver i f i ca se no h est agi os r epet i dos |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f ( nPSt age ! = 0 . And. l Ret or no )
For nCnt For : = 1 To Len( aCol s)
I f ( nCnt For ! = n . And. ! aCol s[ nCnt For ] [ nUsado+1] )
I f ( aCol s[ n] [ nPSt age] == aCol s[ nCnt For ] [ nPSt age] )
Hel p( " " , 1, "FT010LOK01" )
l Ret or no : = . F.
EndI f
EndI f
Next nCnt For
EndI f
EndI f
Ret ur n( l Ret or no)
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Gr v | Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de Gr avacao do Pr ocesse de Venda |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Gr v( ExpN1) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | ExpN1: Opcao do Menu ( I ncl usao / Al t er acao / Excl usao) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | . T. |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
St at i c Funct i on Ft 010Gr v( nOpc)
Local aAr ea : = Get Ar ea( )
Local aUsr Memo : = I f ( Exi st Bl ock( " FT010MEM" ) , ExecBl ock( " FT010MEM", . F. , . F. ) , {} )
Local aMemoAC1 : = {}
Local aMemoAC2 : = {}
Local aRegi st r o : = {}
Local cQuer y : = ""
Local l Gr avou : = . F.
Local nCnt For : = 0
Local nCnt For 2 : = 0
Local nUsado : = Len( aHeader )
Local nPSt age : = aScan( aHeader , {| x| Al l Tr i m( x[ 2] ) ==" AC2_STAGE" })
Local nPMEMO : = aScan( aHeader , {| x| Al l Tr i m( x[ 2] ) ==" AC2_MEMO" })

I f Val Type( aUsr Memo ) == " A" . And. Len( aUsr Memo ) > 0
AdvPl________________________________________________________________122
For nLoop : = 1 t o Len( aUsr Memo )
I f aUsr Memo[ nLoop, 1 ] == "AC1"
AAdd( aMemoAC1, { aUsr Memo[ nLoop, 2 ] , aUsr Memo[ nLoop, 3 ] } )

El seI f aUsr Memo[ nLoop, 1 ] == " AC2"
AAdd( aMemoAC2, { aUsr Memo[ nLoop, 2 ] , aUsr Memo[ nLoop, 3 ] } )

EndI f
Next nLoop
EndI f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Guar da os r egi st r os emumar r ay par a at ual i zacao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC2" )
dbSet Or der ( 1)
#I FDEF TOP
I f ( TcSr vType( ) ! =" AS/ 400" )
cQuer y : = " SELECT AC2. R_E_C_N_O_ AC2RECNO "
cQuer y += " FROM "+Ret Sql Name( " AC2" ) +" AC2 "
cQuer y += " WHERE AC2. AC2_FI LI AL=' " +xFi l i al ( " AC2" ) +" ' AND "
cQuer y += "AC2. AC2_PROVEN=' " +M- >AC1_PROVEN+" ' AND "
cQuer y += "AC2. D_E_L_E_T_<>' *' "
cQuer y += " ORDER BY " +Sql Or der ( AC2- >( I ndexKey( ) ) )

cQuer y : = ChangeQuer y( cQuer y)
dbUseAr ea( . T. , " TOPCONN" , TcGenQr y( , , cQuer y) , " FT010GRV" , . T. , . T. )
dbSel ect Ar ea( " FT010GRV" )
Whi l e ( ! Eof ( ) )
aadd( aRegi st r o, AC2RECNO)
dbSel ect Ar ea( " FT010GRV")
dbSki p( )
EndDo
dbSel ect Ar ea( " FT010GRV" )
dbCl oseAr ea( )
dbSel ect Ar ea( " AC2" )
El se
#ENDI F
dbSeek( xFi l i al ( " AC2" ) +M- >AC1_PROVEN)
Whi l e ( ! Eof ( ) . And. xFi l i al ( " AC2" ) == AC2- >AC2_FI LI AL . And. ;
M- >AC1_PROVEN == AC2- >AC2_PROVEN )
aadd( aRegi st r o, AC2- >( RecNo( ) ) )
dbSel ect Ar ea( " AC2")
dbSki p( )
EndDo
#I FDEF TOP
EndI f
#ENDI F
Do Case
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| I ncl usao / Al t er acao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Case nOpc ! = 3
For nCnt For : = 1 To Len( aCol s)
I f ( nCnt For > Len( aRegi st r o) )
I f ( ! aCol s[ nCnt For ] [ nUsado+1] )
RecLock( " AC2" , . T. )
EndI f
El se
AC2- >( dbGot o( aRegi st r o[ nCnt For ] ) )
RecLock( "AC2" )
EndI f
I f ( ! aCol s[ nCnt For ] [ nUsado+1] )
l Gr avou : = . T.
For nCnt For 2 : = 1 To nUsado
I f ( aHeader [ nCnt For 2] [ 10] ! = "V" )
Fi el dPut ( Fi el dPos( aHeader [ nCnt For 2] [ 2] ) , aCol s[ nCnt For ] [ nCn
t For 2] )
EndI f
Next nCnt For 2
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Gr ava os campos obr i gat or i os |
AdvPl________________________________________________________________123
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
AC2- >AC2_FI LI AL : = xFi l i al ( " AC2" )
AC2- >AC2_PROVEN : = M- >AC1_PROVEN
I f ( nPMemo ! = 0 . And. ! Empt y( aCol s[ nCnt For ] [ nPMemo] ) )
MSMM( AC2-
>AC2_CODMEM, , , aCol s[ nCnt For ] [ nPMemo] , 1, , , " AC2", " AC2_CODMEM" )
EndI f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Gr ava os campos memo de usuar i o |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
For nLoop : = 1 To Len( aMemoAC2 )
MSMM( AC2- >( Fi el dGet ( aMemoAC2[ nLoop, 1] ) ) , , , ;
DFi el dGet ( aMemoAC2[ nLoop, 2] , nCnt For
) , 1, , , " AC2", aMemoAC2[ nLoop, 1] )
Next nLoop
El se
I f ( nCnt For <= Len( aRegi st r o) )
dbDel et e( )
MSMM( AC2- >AC2_CODMEM, , , , 2)

+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
| Excl ui os campos memo de usuar i o
|
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
For nLoop : = 1 To Len( aMemoAC2 )
MSMM( aMemoAC2[ nLoop, 1] , , , , 2)
Next nLoop

EndI f
EndI f
MsUnLock( )
Next nCnt For
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Excl usao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Ot her Wi se
For nCnt For : = 1 To Len( aRegi st r o)
AC2- >( dbGot o( aRegi st r o[ nCnt For ] ) )
RecLock( " AC2")
dbDel et e( )
MsUnLock( )
MSMM( AC2- >AC2_CODMEM, , , , 2)
Next nCnt For

I f ! Empt y( Sel ect ( " AC9" ) )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Excl ui a amar r acao de conheci ment o |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
MsDocument ( "AC1" , AC1- >( Recno( ) ) , 2, , 3 )
EndI f

EndCase
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| At ual i zacao do cabecal ho |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " AC1" )
dbSet Or der ( 1)
I f ( MsSeek( xFi l i al ( " AC1") +M- >AC1_PROVEN) )
RecLock( " AC1" )
El se
I f ( l Gr avou )
RecLock( " AC1", . T. )
EndI f
EndI f
I f ( ! l Gr avou )
dbDel et e( )
MSMM( AC1- >AC1_CODMEM, , , , 2)

+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
AdvPl________________________________________________________________124
| Excl ui os campos memo de usuar i o |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
For nLoop : = 1 To Len( aMemoAC1 )
MSMM( AC1- >( Fi el dGet ( aMemoAC1[ nLoop, 1 ] ) ) , , , , 2)
Next nLoop
El se
For nCnt For : = 1 To AC1- >( FCount ( ) )
I f ( Fi el dName( nCnt For ) ! =" AC1_FI LI AL" )
Fi el dPut ( nCnt For , M- >&( Fi el dName( nCnt For ) ) )
El se
AC1- >AC1_FI LI AL : = xFi l i al ( " AC1" )
EndI f
Next nCnt For
MSMM( AC1- >AC1_CODMEM, , , M- >AC1_MEMO, 1, , , " AC1" , " AC1_CODMEM")
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Gr ava os campos memo de usuar i o |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
For nLoop : = 1 To Len( aMemoAC1 )
MSMM( AC1- >( Fi el dGet ( aMemoAC1[ nLoop, 1] ) ) , , , ;
M- >&( aMemoAC1[ nLoop, 2] ) , 1, , , " AC1" , aMemoAC1[ nLoop, 1] )
Next nLoop
EndI f
MsUnLock( )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Rest aur a i nt egr i dade da r ot i na |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Rest Ar ea( aAr ea)
Ret ur n( . T. )
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010TudOK| Aut or | Eduar do Ri er a | Dat a | 13. 01. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao TudoOK |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010TudOK( ) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | . T. / . F. |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on Ft 010TudOk( )
Local l Ret : = . T.
Local nPosRel ev : = GDFi el dPos( " AC2_RELEVA" )
Local nPosSt age : = GDFi el dPos( " AC2_STAGE" )
Local nLoop : = 0
Local nTot al : = 0
Local nPosDel : = Len( aHeader ) + 1
I f ! Empt y( AScan( aCol s, { | x| x[ nPosRel ev] > 0 } ) )
For nLoop : = 1 To Len( aCol s )
I f ! aCol s[ nLoop, nPosDel ]
nTot al += aCol s[ nLoop, nPosRel ev ]
El se
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Per mi t e excl ui r apenas se no est i ver emuso por opor t uni dade |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

AD1- >( dbSet Or der ( 5 ) )
I f AD1- >( dbSeek( xFi l i al ( " AD1" ) + M- >AC1_PROVEN +
aCol s[ nLoop, nPosSt age] ) )
Avi so( STR0007, STR0011 + Al l Tr i m( aCol s[ nLoop, nPosSt age] ) + ;
STR0012, { STR0009 }, 2 ) ;
/ / At encao / / "A et apa " / / " nao pode ser excl ui da poi s est a em
uso por uma ou mai s / / opor t uni dades ! "
l Ret : = . F.
Exi t


EndI f
AdvPl________________________________________________________________125
EndI f
Next nLoop

I f l Ret
I f nTot al <> 100
Avi so( STR0007, STR0008, ;
{ STR0009 }, 2 ) / / " At encao ! " ###"A soma dos val or es de r el evanci a
deve ser i gual a 100%/ / ! " ###" Fechar "
l Ret : = . F.
EndI f
EndI f
EndI f
Ret ur n( l Ret )
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Ft 010Del Ok| Aut or | Ser gi o Si l vei r a | Dat a | 18. 01. 2001|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Val i dacao da Excl usao |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Ft 010Del Ok( ) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | . T. / . F. |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FATA010 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
St at i c Funct i on Ft 010Del Ok( )
LOCAL l Ret : = . T.
AD1- >( dbSet Or der ( 5 ) )
I f AD1- >( dbSeek( xFi l i al ( " AD1" ) + M- >AC1_PROVEN ) )
l Ret : = . F.
Avi so( STR0007, STR0010, { STR0009 }, 2 ) / / "At encao"
/ / " Est e pr ocesso de venda nao pode ser excl ui do poi s est a sendo ut i l i zado emuma
ou mai s
/ / opor t uni dades ! " , "Fechar "
EndI f
Ret ur n( l Ret )
Modelos de Relatrios
Existem vrias formas de se gerar um relatrio no sistema, no entanto a forma de se elaborar o programa
no varia muito. Abaixo mostramos um modelo-padro, que utiliza as funes bsicas na gerao de um
relatrio.

/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ Funcao | MATR425 | Aut or | Rodr i go de Sar t or i o | Dat a | 11/ 05/ 95 |
+- - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - - - - +
| Descr i cao | Rel at or i o de Est oque por Lot e |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | MATR425( ) |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | Gener i co |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ATUALI ZACOES SOFRI DAS DESDE A CONSTRUCAO NI CI AL |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ogr amador | Dat a | BOPS | Mot i vo da Al t er acao |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| | | | |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
#i ncl ude ' MATR425. CH'
AdvPl________________________________________________________________126
#i ncl ude ' FI VEWI N. CH'
Funct i on MATR425( )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne Var i avei s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Local cDesc1 : = STR0001 / / " Est e pr ogr ama emi t i r a' uma r el acao coma posi o de "
Local cDesc2 : = STR0002 / / " est oque por Lot e/ Sub- Lot e. "
Local cDesc3 : = ' '
Local cSt r i ng : = ' SB8'
Local Ti t ul o : = STR0003 / / " Posi cao de Est oque por Lot e/ Sub- Lot e"
Local Tamanho : = ' M'
Local wnRel : = ' MATR425'
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s Ti po Pr i vat e padr ao de t odos os r el at or i os |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Pr i vat e aOr d : = {STR0004, STR0005} / / " Por Pr odut o" ###" Por Lot e/ Sub- Lot e"
Pr i vat e aRet ur n : = {STR0006, 1, STR0007, 1, 2, 1, ' ' , 1 } / / " Zebr ado" ###" Admi ni st r acao"
Pr i vat e cPer g : = ' MR425A'
Pr i vat e nLast Key : = 0
Pr i vat e nTi po : = 0
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ver i f i ca as per gunt as sel eci onadas |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Per gunt e( ' MR425A' , . F. )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s ut i l i zadas par a par amet r os |
| mv_par 01 / / Do Pr odut o |
| mv_par 02 / / At e Pr odut o |
| mv_par 03 / / De Lot e |
| mv_par 04 / / At e Lot e |
| mv_par 05 / / De Sub- Lot e |
| mv_par 06 / / At e Sub- Lot e |
| mv_par 07 / / De Local |
| mv_par 08 / / At e Local |
| mv_par 09 / / Li st a Sal do Zer ado ? Li st a/ Nao Li st a |
| mv_par 10 / / Do Ti po |
| mv_par 11 / / At e o Ti po |
| mv_par 12 / / Do Gr upo |
| mv_par 13 / / At e o Gr upo |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Envi a cont r ol e par a SETPRI NT |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
wnRel : = Set Pr i nt ( cSt r i ng, wnRel , cPer g, @Ti t ul o, cDesc1, cDesc2, cDesc3, . F. , aOr d, , Tamanho)
nTi po : = I f ( aRet ur n[ 4] ==1, Get Mv( ' MV_COMP' ) , Get Mv( ' MV_NORM' ) )
I f nLast Key == 27
dbCl ear Fi l t er ( )
Ret ur n Ni l
Endi f
Set Def aul t ( aRet ur n, cSt r i ng)
I f nLast Key == 27
dbCl ear Fi l t er ( )
Ret ur n Ni l
Endi f
Rpt St at us( {| l End| C425I mp( @l End, wnRel , Tamanho, Ti t ul o) }, Ti t ul o)
Ret ur n Ni l
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | C425I mp | Aut or | Rodr i go Sar t or i o | Dat a | 14/ 11/ 95 |
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Chamada do Rel at or i o |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | MATR425 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
St at i c Funct i on C425I mp( l End, wnRel , Tamanho, Ti t ul o)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s especi f i cas dos r el at or i os |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Local cI ndex : = ' '
Local cCond : = ' '
AdvPl________________________________________________________________127
Local cLot eAnt : = ' '
Local cPr odAnt : = ' '
Local cDescAnt : = ' '
Local cSLot Ant : = ' '
Local cAl moAnt : = ' '
Local cSeekSB8 : = ' '
Local cCondSB8 : = ' '
Local cNomAr q : = ' '
Local cPi cSl d : = PesqPi ct ( ' SB8' , ' B8_SALDO' , 12)
Local cPi cEmp : = PesqPi ct ( ' SB8' , ' B8_EMPENHO' , 12)
Local dDat aAnt : = Ct oD( ' / / ' )
Local dVal i Ant : = Ct oD( ' / / ' )
Local nSal do : = 0
Local nEmpenho : = 0
Local nSal doT : = 0
Local nEmpenhoT : = 0
Local nCnt I mpr : = 0
Local nI ndSB8 : = 0
Local l SubLot e : = . F.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s ut i l i zadas par a I mpr essao do Cabecal ho e Rodape |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
Pr i vat e aLi nha : = {}
Pr i vat e Cabec1 : = ' '
Pr i vat e Cabec2 : = ' '
Pr i vat e cBTxt : = Space( 10)
Pr i vat e cBCont : = 0
Pr i vat e Li : = 80
Pr i vat e M_PAG : = 01
/ / - - Condi cao de Fi l t r agemda I ndRegua
cCond : = ' B8_FI LI AL==" ' +xFi l i al ( ' SB8' ) +' " . And. '
cCond += ' B8_PRODUTO>=" ' +mv_par 01+' " . And. B8_PRODUTO<=" ' +mv_par 02+' " . And. '
cCond += ' B8_LOTECTL>=" ' +mv_par 03+' " . And. B8_LOTECTL<=" ' +mv_par 04+' " . And. '
cCond += ' B8_NUMLOTE>=" ' +mv_par 05+' " . And. B8_NUMLOTE<=" ' +mv_par 06+' " . And. '
cCond += ' B8_LOCAL>=" ' +mv_par 07+' " . And. B8_LOCAL<="' +mv_par 08+' " '
I f aRet ur n[ 8] ==1
cI ndex : = ' B8_FI LI AL+B8_PRODUTO+B8_LOCAL+B8_LOTECTL+B8_NUMLOTE'
Ti t ul o : = STR0008 / / " POSI CAO DE ESTOQUE POR LOTE/ SUBLOTE ( POR PRODUTO) "
Cabec1 : = STR0009 / / " PRODUTO DESCRI CAO SUB- LOTE LOTE AL SALDO EMPENHO DATA
DATA "
Cabec2 : = STR0014 / / "
VALI DADE "
El seI f aRet ur n[ 8] == 2
cI ndex : = ' B8_FI LI AL+B8_LOTECTL+B8_NUMLOTE+B8_PRODUTO+B8_LOCAL'
Ti t ul o : = STR0010 / / " POSI CAO DE ESTOQUE POR LOTE/ SUB- LOTE ( POR LOTE) "
Cabec1 : = STR0011 / / " SUB- LOTE LOTE PRODUTO DESCRI CAO AL SALDO EMPENHO DATA
DATA "
Cabec2 : = STR0014 / / "

VALI DADE "
EndI f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pega o nome do ar qui vo de i ndi ce de t r abal ho |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
cNomAr q : = Cr i aTr ab( ' ' , . F. )
/ / - - Set a a Or demCor r et a no Ar qui vo SB1
dbSel ect Ar ea( ' SB1' )
dbSet Or der ( 1)
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Cr i a I ndi ce de Tr abal ho |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( ' SB8' )
I ndRegua( ' SB8' , cNomAr q, cI ndex, , cCond, STR0017) / / " Sel eci onando Regi st r os. . . "
#I FNDEF TOP
dbSet I ndex( cNomAr q+Or dBagExt ( ) )
#ENDI F
dbGoTop( )
Set Regua( Last Rec( ) )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ocessa o Laco de i mpr essao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
AdvPl________________________________________________________________128
Do Whi l e ! Eof ( )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Cancel a a i mpr essao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f l End
@PRow( ) +1, 001 PSay STR0012 / / " CANCELADO PELO OPERADOR"
Exi t
EndI f
l SubLot e : = Rast r o( B8_PRODUTO, ' S' )
/ / - - Def i ne a Quebr a por Pr odut o ou Lot e
I f aRet ur n[ 8] == 1
cSeekSB8 : = B8_FI LI AL+B8_PRODUTO+B8_LOCAL
cCondSB8 : = ' B8_FI LI AL+B8_PRODUTO+B8_LOCAL'
El se
cSeekSB8 : =
B8_FI LI AL+B8_LOTECTL+I f ( l SubLot e, B8_NUMLOTE, ' ' ) +B8_PRODUTO+B8_LOCAL
cCondSB8 : =
' B8_FI LI AL+B8_LOTECTL+' +I f ( l SubLot e, ' B8_NUMLOTE+' , ' ' ) +' B8_PRODUTO+B8_LOCAL'
EndI f
nSal do : = 0
nEmpenho : = 0
nSal doT : = 0
nEmpenhoT : = 0

/ / - - Pr ocessa o Laco da Quebr a
Do Whi l e ! Eof ( ) . And. cSeekSB8 == &( cCondSB8)

/ / - - At ual i za a Regua de I mpr essao
I ncRegua( )

+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Cancel a a I mpr essao |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f l End
@PRow( ) +1, 001 PSay STR0012 / / " CANCELADO PELO OPERADOR"
Exi t
EndI f

/ / - - Sal do do Lot e ou Lot e/ Subl ot e
nSal do += B8_SALDO
nEmpenho += B8_EMPENHO

/ / - - Sal do Tot al da Quebr a
nSal doT += B8_SALDO
nEmpenhoT += B8_EMPENHO

/ / - - Posi ci ona- se na Descr i cao Cor r et a do SB1
I f ! ( cPr odAnt ==B8_PRODUTO)
SB1- >( dbSeek( xFi l i al ( ' SB1' ) +SB8- >B8_PRODUTO, . F. ) )
EndI f

I f SB1- >B1_TI PO < mv_par 10 . Or . SB1- >B1_TI PO > mv_par 11
dbSki p( )
Loop
EndI f

I f SB1- >B1_GRUPO < mv_par 12 . Or . SB1- >B1_GRUPO > mv_par 13
dbSki p( )
Loop
EndI f

/ / - - Sal va Dados do Regi st r o At ual / Passa par a o Pr oxi mo Regi st r o
cPr odAnt : = B8_PRODUTO
cDescAnt : = SubS( SB1- >B1_DESC, 1, 30)
cSLot Ant : = I f ( l SubLot e, B8_NUMLOTE, Space( Len( B8_NUMLOTE) ) )
cLot eAnt : = B8_LOTECTL
cAl moAnt : = B8_LOCAL
dDat aAnt : = B8_DATA
dVal i Ant : = B8_DTVALI D
dbSki p( )

AdvPl________________________________________________________________129
/ / - - I mpr i me Sal do do Lot e ou Lot e/ Subl ot e
I f ! ( cSeekSB8==&( cCondSB8) ) . Or . l SubLot e . Or . ! ( cLot eAnt ==B8_LOTECTL)
/ / - - Ver i f i ca se Li st a Sal do Zer ado
I f mv_par 09==2 . And. Qt dComp( nSal do) ==Qt dComp( 0)
Loop
EndI f
I f Li > 58
Cabec( Ti t ul o, Cabec1, Cabec2, wnRel , Tamanho, nTi po)
EndI f
nCnt I mpr ++
I f aRet ur n[ 8] == 1
@Li , 000 PSay cPr odAnt
@Li , 016 PSay cDescAnt
@Li , 047 PSay cSLot Ant
@Li , 054 PSay cLot eAnt
El seI f aRet ur n[ 8] == 2
@Li , 000 PSay cSLot Ant
@Li , 007 PSay cLot eAnt
@Li , 018 PSay cPr odAnt
@Li , 034 PSay cDescAnt
EndI f
@Li , 065 PSay cAl moAnt
@Li , 068 PSay nSal do Pi ct ur e cPi cSl d
@Li , 081 PSay nEmpenho Pi ct ur e cPi cEmp
@Li , 094 Psay dDat aAnt
@Li , 105 Psay dVal i Ant
Li ++
nSal do : = 0
nEmpenho : = 0
EndI f
EndDo

/ / - - I mpr i me Sal do Tot al da Quebr a
I f nCnt I mpr > 0
I f Li > 58
Cabec( Ti t ul o, Cabec1, Cabec2, wnRel , Tamanho, nTi po)
EndI f
@Li , 000 PSay I f ( aRet ur n[ 8] ==1, STR0013, I f ( l SubLot e, STR0016, STR0015) )
/ / "Tot al do Pr odut o - @Li , 068 PSay nSal doT Pi ct ur e cPi cSl d
@Li , 081 PSay nEmpenhoT Pi ct ur e cPi cEmp
Li ++
@Li , 000 PSay __Pr t Thi nLi ne( )
Li ++
nCnt I mpr : = 0
nSal doT : = 0
nEmpenhoT : = 0
EndI f
EndDo
I f ! ( Li ==80)
Roda( cBCont , cBTxt , Tamanho)
EndI f
/ / - - Rest aur a a I nt egr i dade do SB8
dbSel ect Ar ea( ' SB8' )
Ret I ndex( ' SB8' )
dbCl ear Fi l t er ( )
I f Fi l e( cNomAr q+Or dBagExt ( ) )
f Er ase( cNomAr q+Or dBagExt ( ) )
Endi f
I f aRet ur n[ 5] == 1
Set Pr i nt er To
dbCommi t Al l ( )
Our Spool ( wnRel )
Endi f
MS_Fl ush( )
Ret ur n Ni l
Modelos de Clculos
AdvPl________________________________________________________________130
Existem diversas formas de se gerar uma rotina de clculo no sistema, no entanto o modelo bsico
sempre se mantm. Abaixo mostramos um modelo-padro que utiliza as funes bsicas para tal.

/ */
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ Funcao | FI NA210 | Aut or | Wagner Xavi er | Dat a | 01/ 12/ 92 |
+- - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - - - - +
| Descr i cao | Recal cul a sal dos bancar i os dent r o de umdet er mi nado per i odo |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | FI NA210( ) |
+- - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | Gener i co |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| ATUALI ZACOES SOFRI DAS DESDE A CONSTRUCAO NI CI AL |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Pr ogr amador | Dat a | BOPS | Mot i vo da Al t er acao |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| | | | |
+- - - - - - - - - - - +- - - - - - - - +- - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
#I NCLUDE "FI NA210. CH"
#I NCLUDE "PROTHEUS. CH"
Funct i on Fi nA210( )
LOCAL nOpca : =0
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Def i ne Var i avei s |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
LOCAL oDl g, aSays: ={}, aBut t ons: ={}
Pr i vat e cCadast r o : = OemToAnsi ( STR0004) / / " Reconci l i acao de Sal dos Bancar i os"
Per gunt e( "FI N210" , . F. )
AADD ( aSays, ;
OemToAnsi ( STR0005) ) / / " Est e pr ogr ama t emcomo obj et i vo r ecal cul ar e anal i sar os sal dos"
AADD ( aSays, ;
OemToAnsi ( STR0006) ) / / " Bancar i os di a a di a de umdet er mi nado per i odo at e a dat a base do
"
AADD ( aSays, ;
OemToAnsi ( STR0007) ) / / " si st ema. Ut i l i zando no caso de haver necessi dade de r et r oagi r a
"
AADD ( aSays, ;
OemToAnsi ( STR0008) ) / / " movi ment acao bancar i a. Use como r ef er enci a a dat a emque o sal do
"
AADD ( aSays, ;
OemToAnsi ( STR0009) ) / / " f i cou def asado. "
AADD( aBut t ons, { 1, . T. , {| o| nOpca: = 1, o: oWnd: End( ) }} )
AADD( aBut t ons, { 2, . T. , {| o| o: oWnd: End( ) }} )
AADD( aBut t ons, { 5, . T. , {| | Per gunt e( " FI N210" , . T. ) } } )
For mBat ch( cCadast r o, aSays, aBut t ons )
I f nOpcA == 1
#I FDEF TOP
I f TcSr vType( ) == ' AS/ 400'
Pr ocessa( {| l End| FA210Pr oc( ) }) / / Chamada da f uncao de r econci l i acao
El se
Pr ocessa( {| l End| FA211Pr oc( ) }) / / Chamada da f uncao de r econci l i acao
Endi f
#ELSE
Pr ocessa( {| l End| FA210Pr oc( ) }) / / Chamada da f uncao de r econci l i acao
#ENDI F
Endi f
Ret ur n
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Fa210Pr oc | Aut or | Wagner Xavi er | Dat a | 01. 12. 1992|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de r ecal cul o dos sal dos bancar i os CODEBASE |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Fa210Pr oc ( ) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
AdvPl________________________________________________________________131
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FI NA210 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
Funct i on FA210Pr ocessa( )
LOCAL nSal doI ni
LOCAL nEnt r adas
LOCAL nSai das, nDat a, cCond
LOCAL dDat aMovt o
LOCAL cFi l : =" "
LOCAL l Al l Fi l : =. F.
LOCAL cChave
LOCAL cI ndex : = " "
LOCAL l Sai da : =. F.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s ut i l i zadas par a par amet r os |
| mv_par 01 / / Do Banco |
| mv_par 02 / / At e o Banco |
| mv_par 03 / / Da Agenci a |
| mv_par 04 / / At e a Agenci a |
| mv_par 05 / / Da Cont a |
| mv_par 06 / / At e a Cont a |
| mv_par 07 / / A par t i r da Dat a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( "SA6" )
dbSeek( cFi l i al +mv_par 01 , . T. )
Pr ocRegua( RecCount ( ) )
I f Empt y( xFi l i al ( " SA6" ) ) . AND. ! Empt y( xFi l i al ( " SE5" ) )
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Fi l t r a o ar qui vo pr o t i po e venci ment o |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SE5" )
cI ndex : = Cr i aTr ab( ni l , . f . )
cChave : = "E5_BANCO+E5_AGENCI A+E5_CONTA+DTOS( E5_DTDI SPO) "
cCond : = ' dt os( E5_DTDI SPO) >=" ' +dt os( mv_par 07) +' " '
I ndRegua( " SE5" , cI ndex, cChave, , cCond, OemToAnsi ( STR0015) ) / / " Sel eci onando
Regi st r os. . . "
nI ndexSE5 : = Ret I ndex( " SE5")
#I FNDEF TOP
dbSet I ndex( cI ndex+Or dBagExt ( ) )
#ENDI F
dbSet Or der ( nI ndexSE5+1)
l Sai da : = . T.
dbGoTop( )
l Al l Fi l : = . T.
El se
dbSel ect Ar ea( " SE5" )
cI ndex : = Cr i aTr ab( ni l , . f . )
cChave : = "E5_FI LI AL+E5_BANCO+E5_AGENCI A+E5_CONTA+DTOS( E5_DTDI SPO) "
cCond : = ' dt os( E5_DTDI SPO) >=" ' +dt os( mv_par 07) +' " . and. E5_FI LI AL ==
" ' +xFi l i al ( "SE5" ) +' " '
I ndRegua( " SE5" , cI ndex, cChave, , cCond, OemToAnsi ( STR0015) ) / / " Sel eci onando
Regi st r os. . . "
nI ndexSE5 : = Ret I ndex( " SE5")
#I FNDEF TOP
dbSet I ndex( cI ndex+Or dBagExt ( ) )
#ENDI F
dbSet Or der ( nI ndexSE5+1)
dbGoTop( )
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| I ni ci a r ecal cul o dos sal dos at r aves da movi ment acao bancar i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( "SA6" )
dbSeek( cFi l i al +mv_par 01 , . T. )
Whi l e ! Eof ( ) . and. A6_FI LI AL == cFi l i al . and. A6_COD <= mv_par 02
I ncPr oc( )
/ / Al t er acao par a nao r ecal cul ar o sal do dos cai xas do Loj a, poi s
/ / est es devemser r ecal cul ados at r aves da opcao " Recal cul o de Cai xa" - Adr i ano
dbSel ect Ar ea( " SX5" )
I f ( dbSeek( xFi l i al ( " SX5" ) +"23" +SA6- >A6_COD) ) . or . ( SA6- >A6_Cod == "CL1" )
AdvPl________________________________________________________________132
dbSel ect Ar ea( " SA6")
dbSki p( )
Loop
Endi f
dbSel ect Ar ea( " SA6" )
cBanco : = A6_COD
cAgenci a : = A6_AGENCI A
cCont a : = A6_NUMCON
nSal doI ni : = 0
nEnt r adas: = 0
nSai das : = 0
I f cAgenci a < mv_par 03 . or . cAgenci a > mv_par 04 . or . cCont a < mv_par 05 . or . cCont a
> mv_par 06
dbSki p( )
Loop
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Local i za Sal do de Par t i da. |
| Obser ve que o pr ogr ama r et or na umr egi st r o no banco de |
| dados, por t ant o a dat a de r ef er enci a a dat a emque |
| o sal do f i cou er r ado, nao a dat a cor r et a do sal do. |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SE8" )
dbSeek( cFi l i al +cBanco+cAgenci a+cCont a+Dt os( mv_par 07) , . T. )
dbSki p( - 1 )
I f E8_BANCO ! = cBanco . or . E8_AGENCI A ! = cAgenci a . or . E8_CONTA ! = cCont a . or .
BOF( ) . or . EOF( )
nSal doI ni : = 0
El se
nSal doI ni : = E8_SALATUA
End
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Local i za movi ment acao bancar i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SE5" )
dbSet Or der ( nI ndexSE5+1)
cFi l : = I i f ( l Al l Fi l , " ", xFi l i al ( "SE5" ) )
dbSeek( cFi l +cBanco+cAgenci a+cCont a+Dt os( mv_par 07) , . T. )
Whi l e ! Eof ( ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA == cBanco+cAgenci a+cCont a
I F ! l Al l Fi l . and. E5_FI LI AL ! = xFi l i al ( " SE5" )
Exi t
Endi f
dDat aMovt o : = E5_DTDI SPO
Whi l e ! Eof ( ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA+dt os( E5_DTDI SPO) == ;
cBanco+cAgenci a+cCont a+dt os( dDat aMovt o)
I F ! l Al l Fi l . and. E5_FI LI AL ! = xFi l i al ( " SE5")
Exi t
Endi f
I F E5_TI PODOC $ " DC/ J R/ MT/ CM/ D2/ J 2/ M2/ C2/ V2/ CP/ TL" / / Val or es de Bai xas
dbSki p( )
Loop
Endi f
I f E5_VENCTO > E5_DATA / / I gnor a pr e' dat ados - ger ou t i t ul o
dbSki p( )
Loop
Endi f
I f E5_SI TUACA = " C" / / Cancel ado
dbSki p( )
Loop
Endi f
I f SE5- >E5_MOEDA $ "C1/ C2/ C3/ C4/ C5" . and. Empt y( SE5- >E5_NUMCHEQ)
dbSki p( )
Loop
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Na t r ansf er enci a soment e consi der a nest es numer ar i os |
| No Fi na100 t r at ado dest a f or ma. |
| As t r ansf er enci as TR de t i t ul os p/ Descont o/ Cauo ( FI NA060) |
| no sof r emmesmo t r at ament o dos TR bancar i as do FI NA100 |
| Acl ar acao : Foi i ncl ui do o t i po $ par a os movi ment os en di - - |
| nhei r o emQUALQUER moeda, poi s o R$ nao e r epr esent at i vo |
AdvPl________________________________________________________________133
| f or a do BRASI L. |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f SE5- >E5_TI PODOC $ " TR/ TE" . and. Empt y( SE5- >E5_NUMERO)
I f ! ( E5_MOEDA $ " $ / R$/ DO/ TB/ TC/ CH"+I I f ( cPai sLoc==" BRA", " " , "/ $
") )
dbSki p( )
Loop
Endi f
Endi f
I f E5_TI PODOC $ " TR/ TE" . and. ( Subst r ( E5_NUMCHEQ, 1, 1) ==" *" ;
. or . Subst r ( E5_DOCUMEN, 1, 1) == " *" )
dbSki p( )
Loop
Endi f
I f SE5- >E5_MOEDA == " CH" . and. I sCai xaLoj a( SE5- >E5_BANCO) / / Sangr i a
dbSki p( )
Loop
Endi f
I f SubSt r ( E5_NUMCHEQ, 1, 1) ==" *" / / cheque par a j unt ar ( PA)
dbSki p( )
Loop
Endi f
I f ! Empt y( SE5- >E5_MOTBX)
I f ! MovBcoBx( SE5- >E5_MOTBX)
dbSki p( )
Loop
Endi f
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Bai xa aut omat i ca |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I F E5_TI PODOC = " BA"
dbSki p( )
Loop
Endi f
dbSel ect Ar ea( "SE5" )
I F E5_RECPAG = " R"
nEnt r adas += E5_VALOR
El se
nSai das += E5_VALOR
Endi f
dbSki p( )
End / / Quebr a da dat a
dbSel ect Ar ea( " SE8")
dbSeek( cFi l i al + cBanco+cAgenci a+cCont a+Dt os( dDat aMovt o) )
I F Eof ( )
RecLock( "SE8" , . t . )
El se
RecLock( "SE8" , . f . )
Endi f
Repl ace E8_FI LI AL Wi t h cFi l i al , ;
E8_BANCO Wi t h cBanco, ;
E8_AGENCI A Wi t h cAgenci a, ;
E8_CONTA Wi t h cCont a, ;
E8_DTSALATU Wi t h dDat aMovt o
Repl ace E8_SALATUA Wi t h nSal doI ni +nEnt r adas- nSai das
MsUnl ock( )
dbSel ect Ar ea( " SE5")
I F ! ( SE5- >( Eof ( ) ) ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA ==
cBanco+cAgenci a+cCont a
I F ! l Al l Fi l . and. E5_FI LI AL ! = xFI l i al ( " SE5")
Exi t
Endi f
For nDat a : = dDat aMovt o+1 t o ( ( SE5- >E5_DTDI SPO) - 1)
dbSel ect Ar ea( " SE8" )
I f dbSeek( cFi l i al + cBanco+cAgenci a+cCont a+dt os( nDat a) )
RecLock( " SE8" , . F. , . T. )
dbDel et e( )
MsUnl ock( )
SX2- >( MsUnl ock( ) )
EndI f
AdvPl________________________________________________________________134
dbSel ect Ar ea( " SE5" )
Next
Endi f
I F SE5- >( Eof ( ) ) . or . E5_BANCO+E5_AGENCI A+E5_CONTA ! = cBanco+cAgenci a+cCont a
dbSel ect Ar ea( "SE8" )
dbSeek( cFi l i al + cBanco+cAgenci a+cCont a+dt os( dDat aMovt o+1) , . t . )
Whi l e ! Eof ( ) . and. cFi l i al + cBanco+cAgenci a+cCont a == ;
E8_FI LI AL+E8_BANCO+E8_AGENCI A+E8_CONTA
RecLock( " SE8" , . F. , . T. )
dbDel et e( )
MsUnl ock( )
SX2- >( MsUnl ock( ) )
dbsel ect Ar ea( " SE8" )
dbSki p( )
End
Endi f
dbSel ect Ar ea( " SE5")
End / / Fecha Pr i mei r o Loop do SE5
dbSel ect Ar ea( " SA6" )
RecLock( " SA6" )
Repl ace A6_SALATU Wi t h nSal doI ni +nEnt r adas- nSai das
MsUnLock( )
dbSki p( )
End
dbSel ect Ar ea( " SE5" )
Ret I ndex( " SE5")
Set Fi l t er To
I f ! Empt y( cI ndex)
f er ase( cI ndex+Or dBagExt ( ) )
EndI f
Ret ur n NI L
/ */
+- - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Funcao | Fa211Pr oc | Aut or | Wagner Xavi er | Dat a | 09. 03. 2000|
| - - - - - - - - - - - - +- - - - - - - - - - +- - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - +- - - - - - +- - - - - - - - - - +
| Descr i cao | Funcao de r ecal cul o dos sal dos bancar i os TOP CONNECT |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Si nt axe | Fa211Pr oc ( ) |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Par amet r os | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Ret or no | Nenhum |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Uso | FI NA210 |
+- - - - - - - - - - - - +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
/ */
#I FDEF TOP
Funct i on FA211Pr oc( )
LOCAL nSal doI ni , nEnt r adas
LOCAL nSai das, nDat a
LOCAL cQuer y
LOCAL dDat aMovt o
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Var i avei s ut i l i zadas par a par amet r os |
| mv_par 01 / / Do Banco |
| mv_par 02 / / At e o Banco |
| mv_par 03 / / Da Agenci a |
| mv_par 04 / / At e a Agenci a |
| mv_par 05 / / Da Cont a |
| mv_par 06 / / At e a Cont a |
| mv_par 07 / / A par t i r da Dat a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| I ni ci a r ecal cul o de sal dos at r aves da movi ment acao bancar i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
cQuer y : = " SELECT SA6. R_E_C_N_O_ A6_RECNO, "
cQuer y += " E5_BANCO, E5_AGENCI A, E5_CONTA, E5_DTDI SPO, E5_TI PODOC, E5_MOEDA, "
cQuer y += " E5_NUMCHEQ, E5_MOTBX, E5_NUMERO, E5_RECPAG, E5_VALOR, E5_DOCUMEN"
cQuer y += " FROM " + Ret Sql Name( " SA6" ) + " SA6, " + Ret Sql Name( " SE5" ) + " SE5"
cQuer y += " WHERE A6_FI LI AL = ' " + xFi l i al ( " SA6" ) + " ' "
cQuer y += " AND A6_COD bet ween ' " + mv_par 01 + " ' AND ' " + mv_par 02 + " ' "
AdvPl________________________________________________________________135
cQuer y += " AND A6_AGENCI A bet ween ' " + mv_par 03 + " ' AND ' " + mv_par 04 + " ' "
cQuer y += " AND A6_NUMCON bet ween ' " + mv_par 05 + " ' AND ' " + mv_par 06 + " ' "
cQuer y += " AND SA6. D_E_L_E_T_ <> ' *' "
cQuer y += " AND E5_VENCTO <= E5_DATA"
cQuer y += " AND A6_COD = E5_BANCO"
cQuer y += " AND A6_AGENCI A = E5_AGENCI A"
cQuer y += " AND A6_NUMCON = E5_CONTA"
cQuer y += " AND E5_SI TUACA <> ' C' "
cQuer y += " AND E5_TI PODOC <> ' BA' "
cQuer y += " AND SE5. D_E_L_E_T_ <> ' *' "
I f Empt y( xFi l i al ( " SA6" ) ) . AND. ! Empt y( xFi l i al ( " SE5" ) )
cQuer y += " AND E5_DTDI SPO >= ' " + dt os( mv_par 07) + " ' "
/ / O f i l t r o de f i l i al ent r e ' ' e ' ZZ' f oi adi ci onado par a o SQL ut i l i zar i ndi ce
cQuer y += " AND E5_FI LI AL bet ween ' ' AND ' ZZ' "
El se
cQuer y += " AND E5_DTDI SPO >= ' " + dt os( mv_par 07) + " ' AND E5_FI LI AL = ' " +
xFi l i al ( " SE5" ) + " ' "
Endi f
cQuer y += " ORDER BY E5_BANCO, E5_AGENCI A, E5_CONTA, E5_DTDI SPO"

cQuer y : = ChangeQuer y( cQuer y)
dbUseAr ea( . T. , "TOPCONN" , TcGenQr y( , , cQuer y) , ' TRB210' , . T. , . T. )
TcSet Fi el d( " TRB210" , " E5_DTDI SPO" , " D" )
Whi l e ! Eof ( )
dbSel ect Ar ea( " TRB210" )
cBanco : = E5_BANCO
cAgenci a : = E5_AGENCI A
cCont a : = E5_CONTA
nSal doI ni : = 0
nEnt r adas: = 0
nSai das : = 0
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Local i za Sal do de Par t i da. |
| Obser ve que o pr ogr ama r et or na umr egi st r o no banco de |
| dados, por t ant o a dat a de r ef er enci a a dat a emque |
| o sal do f i cou er r ado, nao a dat a cor r et a do sal do. |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " SE8" )
dbSeek( cFi l i al +cBanco+cAgenci a+cCont a+Dt os( mv_par 07) , . T. )
dbSki p( - 1 )
I f E8_BANCO ! = cBanco . or . E8_AGENCI A ! = cAgenci a . or . E8_CONTA ! = cCont a . or .
BOF( ) . or . EOF( )
nSal doI ni : = 0
El se
nSal doI ni : = E8_SALATUA
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Local i za movi ment acao bancar i a |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
dbSel ect Ar ea( " TRB210" )
Whi l e ! Eof ( ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA == cBanco+cAgenci a+cCont a
dDat aMovt o : = E5_DTDI SPO
Whi l e ! Eof ( ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA+DTOS( E5_DTDI SPO) == ;
cBanco+cAgenci a+cCont a+dt os( dDat aMovt o)
I F E5_TI PODOC $ " DC/ J R/ MT/ CM/ D2/ J 2/ M2/ C2/ V2/ CP/ TL" / / Val or es de Bai xas
dbSki p( )
Loop
Endi f
I f E5_MOEDA $ " C1/ C2/ C3/ C4/ C5" . and. Empt y( E5_NUMCHEQ)
dbSki p( )
Loop
Endi f
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Na t r ansf er enci a soment e consi der a nest es numer ar i os |
| No Fi na100 t r at ado dest a f or ma. |
| As t r ansf er enci as TR de t i t ul os p/ Descont o/ Cauo ( FI NA060) |
| no sof r emmesmo t r at ament o dos TR bancar i as do FI NA100 |
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
I f E5_TI PODOC $ " TR/ TE" . and. Empt y( E5_NUMERO)
I f ! ( E5_MOEDA $ " R$/ DO/ TB/ TC/ CH" )
dbSki p( )
AdvPl________________________________________________________________136
Loop
Endi f
Endi f
I f E5_TI PODOC $ " TR/ TE" . and. ( Subst r ( E5_NUMCHEQ, 1, 1) ==" *" ;
. or . Subst r ( E5_DOCUMEN, 1, 1) == " *" )
dbSki p( )
Loop
Endi f
I f E5_MOEDA == " CH" . and. I sCai xaLoj a( E5_BANCO) / / Sangr i a
dbSki p( )
Loop
Endi f
I f SubSt r ( E5_NUMCHEQ, 1, 1) ==" *" / / cheque par a j unt ar ( PA)
dbSki p( )
Loop
Endi f
I f ! Empt y( E5_MOTBX)
I f ! MovBcoBx( E5_MOTBX)
dbSki p( )
Loop
Endi f
Endi f
I f E5_RECPAG = " R"
nEnt r adas += E5_VALOR
El se
nSai das += E5_VALOR
Endi f
dbSki p( )
End / / Quebr a da dat a
dbSel ect Ar ea( " SE8")
dbSeek( cFi l i al +cBanco+cAgenci a+cCont a+Dt os( dDat aMovt o) )
I F Eof ( )
RecLock( "SE8" , . t . )
El se
RecLock( "SE8" , . f . )
Endi f
Repl ace E8_FI LI AL Wi t h cFi l i al , ;
E8_BANCO Wi t h cBanco, ;
E8_AGENCI A Wi t h cAgenci a, ;
E8_CONTA Wi t h cCont a, ;
E8_DTSALATU Wi t h dDat aMovt o
Repl ace E8_SALATUA Wi t h nSal doI ni +nEnt r adas- nSai das
MsUnl ock( )
dbSel ect Ar ea( " TRB210" )
I F ! ( TRB210- >( Eof ( ) ) ) . and. E5_BANCO+E5_AGENCI A+E5_CONTA ==
cBanco+cAgenci a+cCont a
For nDat a : = dDat aMovt o+1 t o ( ( E5_DTDI SPO) - 1)
dbSel ect Ar ea( " SE8" )
I f dbSeek( cFi l i al + cBanco+cAgenci a+cCont a+dt os( nDat a) )
RecLock( " SE8" , . F. , . T. )
dbDel et e( )
MsUnl ock( )
SX2- >( MsUnl ock( ) )
EndI f
dbSel ect Ar ea( " TRB210")
Next
Endi f
I f TRB210- >( Eof ( ) ) . or . E5_BANCO+E5_AGENCI A+E5_CONTA ! =
cBanco+cAgenci a+cCont a
dbSel ect Ar ea( "SE8" )
dbSeek( cFi l i al +cBanco+cAgenci a+cCont a+dt os( dDat aMovt o+1) , . t . )
Whi l e ! Eof ( ) . and. cFi l i al +cBanco+cAgenci a+cCont a == ;
E8_FI LI AL+E8_BANCO+E8_AGENCI A+E8_CONTA
RecLock( " SE8" , . F. , . T. )
dbDel et e( )
MsUnl ock( )
SX2- >( MsUnl ock( ) )
dbsel ect Ar ea( " SE8" )
dbSki p( )
Enddo
Endi f
AdvPl________________________________________________________________137
dbSel ect Ar ea( " TRB210" )
Enddo / / Fecha Pr i mei r o Loop do SE5
dbSel ect Ar ea( " SA6" )
I f dbSeek( xFi l i al ( " SA6" ) +cBanco+cAgenci a+cCont a)
RecLock( " SA6")
Repl ace A6_SALATU Wi t h nSal doI ni +nEnt r adas- nSai das
MsUnLock( )
EndI f
dbSel ect Ar ea( " TRB210" )
dbSki p( )
Enddo
dbSel ect Ar ea( " TRB210" )
dbCl oseAr ea( )
Ret ur n NI L
#ENDI F


AdvPl________________________________________________________________138
Funes bsicas da Linguagem
AAdd
Adiciona um novo elemento ao final do array.
Sintaxe
AADD( aAlvo, expValor ) --> Valor
Argumento Obrigat. Tipo Descrio
aAlvo Sim A o array ao qual o novo elemento ser adicionado.
expValor Sim Todos uma expresso vlida que ser o valor do novo elemento.

Retorno Descrio
AADD()
avalia expValue e retorna seu Valor. Se expValue no for especificado, AADD() retorna
NIL.
Descrio
AADD() uma funo de array que incrementa o tamanho real do array aAlvo em um. O elemento de
array recentemente criado atribudo o Valor especificado por expValue.

AADD() usado para aumentar dinmicamente uma array. til para listas ou filas criadas
dinamicamente.

Um exemplo bom deste o GetList, array usada pelo sistema para armazenar objetos do tipo Get. Depois
que um READ ou CLEAR GETS executado, a GetList ficar vazia. Cada vez que voc executa um
comando @...GET, o sistema usa AADD() para adicionar um novo elemento array GetList, e atribui
ento um novo objeto GET ao novo elemento.

AADD() similar a ASIZE(), mas apenas adiciona um elemento por vez; ASIZE() pode incrementar ou
decrementar uma array a um determinado tamanho. AADD(), entretanto, tm a vantagem de poder
atribuir um valor ao elemento recentemente adicionado, enquanto que ASIZE() no pode. AADD() pode
tambm parecer similar a AINS(), mas diferente: AINS() move elementos dentro de uma disposio,
mas os ele no muda o tamanho.

AdvPl________________________________________________________________139
Se expValue for uma outra array, o novo elemento em aAlvo conter uma referncia array
especificada por expValue.
Exemplos
aArray : = {} / / Resul t ado: aAr r ay i s an empt y ar r ay
AADD(aArray, 5) / / Resul t ado: aAr r ay i s { 5 }
AADD(aArray, 10) / / Resul t ado: aAr r ay i s { 5, 10 }
AADD(aArray, { 12, 10 }) / / Resul t ado: aAr r ay i s
/ / { 5, 10, { 12, 10 } }
ACopy

Copia os elementos de uma array para outra.
Sintaxe
ACOPY( aOrigem, aDestino , [ nInicio ], [ nQtde ], [ nPosDestino ]) --> aDestino
Argumento Obrigat. Tipo Descrio
aOrigem Sim A
o array que contm os elementos a serem
copiados.
aDestino Sim A
o array que receber a cpia dos
elementos.
nInicio No N
indica qual o ndice do primeiro elemento de
aOrigem que ser copiado. Se no for
especificado, o valor assumido ser 01.
nQtde No N
indica a quantidade de elementos a serem
copiados a partir do array aOrigem.
iniciando-se a contagem a partir da posio
nInicio. Se nQtde no for especificado, todos
os elementos do array aOrigem sero
copiados, iniciando-se a partir da posio
nInicio.
nPosDestino


N
a posio do elemento inicial no array
aDestino que receber os elementos de
aOrigem. Se no especificado, ser
assumido 01.

Retorno Descrio
ACOPY() retorna uma referncia ao array aDestino.
AdvPl________________________________________________________________140
Descrio
ACOPY() uma funo de array que copia elementos do array aOrigem para array aDestino. O array
destino aDestino j deve ter sido declarado e grande o bastante para conter os elementos que sero
copiados.

Se o array aOrigem contiver mais elementos, alguns dos elementos no sero copiados. ACOPY() copia os
valores de todos os dados, incluindo valores nulos (NIL) e cdigos de bloco.

Se um elemento for um subarray, o elemento correspondente no array aDestino, conter o mesmo
subarray. Portanto, ACOPY() no produzir uma cpia completa de array multidimensionais, Para fazer
isso, uso a funo aClone().
Exemplos
Est e exempl o cr i a doi s ar r ays, comumcont edo cada. Os doi s pr i mei r os el ement os do ar r ay
f ont e so ent o copi ados no ar r ay dest i no:
LOCAL nCount : = 2, nSt ar t : = 1, aOne, aTwo
aOne : = { 1, 1, 1 }
aTwo : = { 2, 2, 2 }
ACOPY(aOne, aTwo, nStart, nCount)
/ / Resul t : aTwo i s now { 1, 1, 2 }
AClone
Duplica arrays aninhadas ou multi-dimensionais.
Sintaxe
ACLONE( aOrigem ) --> aDuplicado
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array original que ser duplicado.

Retorno Descrio
aDuplicado Array idntico ao aOrigem, porem sem nenhuma referncia.
Descrio
ACLONE() uma funo de array, que cria duplicatas completas do array aSource. Se aSource contiver
arrays aninhadas, ACLONE() criar o mesmo padro de aninhamento preenchendo com cpias dos valores
contidos em aSource.

ACLONE() similar a ACOPY(), exceto que ACOPY() no duplica arrays aninhadas.
AdvPl________________________________________________________________141
Ao igualarmos dois arrays, eles ficam associados por referncia, utilizando aClone() no existe referncia.
Exemplos
LOCAL aOne, aTwo, aThr ee
aOne : = { 1, 2, 3 } / / Resul t ado: aOne i s {1, 2, 3}
aTwo : = ACLONE(aOne) / / Resul t ado: aTwo i s {1, 2, 3}
aThr ee : = aOne / / Resul t ado: aThr ee i s {1, 2, 3}
aOne[ 1] : = 99 / / Resul t : aOne i s {99, 2, 3}
/ / aTwo cont i nua {1, 2, 3} mai s o aThr ee f i ca { 99, 2, 3 }
ADel
Exclui um elemento de um array.
Sintaxe
ADEL( aOrigem, nPos) --> aOrigem
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array de onde ser excludo um item
nPos Sim A
a posio a partir da 1, do qual ser
excludo um elemento

Retorno Descrio
ADEL() Retorna uma referncia ao aOrigem.
Descrio
ADEL() uma funo de manipulao que elimina uma posio do array, deslocando as posies
posteriores. A ltima posio do array passa a ter o contedo NIL.

Caso a posio a ser eliminada seja um array, este ser eliminado.
Exemplos
LOCAL aAr r ay
aAr r ay : = { 1, 2, 3 } / / Resul t ado: { 1, 2, 3 }
ADEL(aArray, 2) / / Resul t ado: { 1, 3, NI L }
ADir
Preenche vrios arrays com informaes de arquivos e diretrios.
AdvPl________________________________________________________________142
Sintaxe
ADIR([ cArqEspec ], [ aNomeArq ], [ aTamanho ], [ aData ], [ aHora ], [ aAtributo ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cArqEspec No C
Caminho dos arquivos a serem includos na busca de informaes.
Segue o padro para especificao de arquivos, aceitando arquivos no
servidor Protheus e no Cliente. Caracteres como * e ? so aceitos
normalmente. Caso seja omitido, sero aceitos todos os arquivos do
diretrio default ( *.* ).
aNomeArq No A
Array de Caracteres. o array com os nomes dos arquivos
encontrados na busca. O contedo anterior do array apagado.
aTamanho No A Array Numrico. So os tamanhos dos arquivos encontrados na busca.
aData No A
Array de Datas. So as datas de modificao dos arquivos
encontrados na busca.
aHora No
A Array de Caracteres. So os horrios de modificao dos arquivos
encontrados. Cada elemento contm horrio no formato: hh:mm:ss.
aAtributos No A
Array de Caracteres. So os atributos dos arquivos, caso esse array
seja passado como parmetros, sero includos os arquivos com
atributos de Sistema, Ocultos.

Retorno Descrio
> = 0 Quantidade de arquivos encontrados
Descrio
ADir() preenche os arrays passados com os dados dos arquivos encontrados, atravs da mscara
informada. Tanto arquivos locais (Remote) como do servidor podem ser informados. ADir uma funo
obsoleta, utilize sempre Directory().
Exemplos
LOCAL aFi l es[ ADI R( " *. TXT") ]
ADIR("*.TXT", aFiles)
AEVAL( aFi l es, { | el ement | QOUT( el ement ) })
AEval
Executa um code block para cada elemento de um array.
AdvPl________________________________________________________________143
Sintaxe
AEVAL( aArray, bBloco, [ nInicio ], [ nQtde]) --> aArray
Argumento Obrigat. Tipo Descrio
aArray Sim A
o array que ser atravessado pelo
bloco
bBlock Sim
Bloco de
cdigo
o bloco que ser executado para cada
elemento do Array.
nInicio No N
a posio inicial. Se no for
especificada o inicio ser a partir do 1.
nQtde No N
o numero de elementos que devem ser
processados a partir de nInicio. O Valor
padro so todos os elementos do
nInicio at o final.

Retorno Descrio
AEVAL() Retorna uma referncia de aArray.
Descrio
AEVAL() executa um code block para cada elemento de um array, passando cada um como o parmetro
do bloco. muito semelhante ao DBEVAL().

AEVAL() passa cada elemento de um array para o code block sem se preocupar com o tipo.
Exemplos
/ / Exempl o 1
#i ncl ude "Di r ect r y. ch"
/ /
LOCAL aFi l es : = DI RECTORY( " *. dbf " ) , nTot al : = 0
AEVAL( aFi l es, { | aDbf Fi l e | QOUT( PADR( aDbf Fi l e[ F_NAME] , 10) , aDbf Fi l e[ F_SI ZE] ) , ;
nTot al += aDbf Fi l e[ F_SI ZE] ) ;
} )
/ /
?
? " Tot al Byt es: " , nTot al
/ / Exempl o 2
#i ncl ude "Di r ect r y. ch"
/ /
LOCAL aFi l es : = DI RECTORY( " *. dbf " ) , aNames : = {}
AEVAL( aFi l es, { | f i l e | AADD( aNames, f i l e[ F_NAME] ) } )
/ / Exempl o 3
LOCAL aAr r ay[ 6]
AFI LL( aAr r ay, " ol d" )
AEVAL( aAr r ay, ;
{| cVal ue, nI ndex| I F( cVal ue == " ol d", ;
aAr r ay[ nI ndex] : = " new" , ) })

AdvPl________________________________________________________________144
EVAL()
DBEVAL()
AFill
Preenche um array com um determinado valor.
Sintaxe
AFILL( aDestino , expValor, [ nInicio ], [ nQuantidade ]) --> aDestino

Argumento Obrigat. Tipo Descrio
aDestino Sim A o onde os dados sero preenchidos.
expValor Sim Todos
o dado que ser preenchido em todas
as posies informadas, no permitida
a utilizao de arrays.
[nInicio] No N
a posio inicial de onde os dados
sero preenchidos, o valor padro 1.
[nCount] No N
Quantidade de elementos a partir de
[nInicio] que sero preenchidos com
<expValor>, caso no seja informado o
valor ser a quantidade de elementos
at o final do array.

Retorno Descrio
AFILL() Retorna uma referncia para aDestino.
Descrio
AFILL() funo de manipulao de arrays, que preenche os elementos do array com qualquer tipo de
dado. Incluindo code block.

Afill() no deve ser usado para preencher um array com outro array.
Exemplos

LOCAL aLogi c[ 3]
/ / Resul t ado: aLogi c { NI L, NI L, NI L }
AFILL( aLogi c, . F. )
/ / Resul t ado: aLogi c { . F. , . F. , . F. }
AFILL( aLogi c, . T. , 2, 2)
/ / Resul t ado: aLogi c { . F. , . T. , . T. }
AdvPl________________________________________________________________145
AIns
Insere um elemento com contedo NIL em um array.
Sintaxe
AINS( aOrigem, nPos ) --> aIns
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array de onde ser inserido um item.
nPos Sim A
a posio a partir da 1, do qual ser inserido um
elemento

Retorno Descrio
AINS() Retorna uma referncia ao aOrigem.
Descrio
AINS() um funo de manipulao de array que insere um elemento na posio determinada por nPos.

O novo elemento possui contedo igual a NIL. Aps a insero, o ltimo elemento ser excludo.

Para alterar o tamanho de um array, utilize aSize().
Exemplos

LOCAL aAr r ay
aAr r ay : = { 1, 2, 3 } / / Resul t ado: { 1, 2, 3 }
AINS( aAr r ay, 2) / / Resul t ado: { 1, NI L, 2 }
Alias
Verifica qual o Alias.
Sintaxe
ALIAS([ nAreaTrab ]) --> Caracter
AdvPl________________________________________________________________146
Argumento Obrigat. Tipo Descrio
nAreaTrab No N Nmero da rea de trabalho a ser verificada.

Retorno Descrio
"" No existe tabela em uso na rea de trabalho verificada.
cAlias String contendo o Alias da rea de trabalho verificada (em maisculo).
Descrio
Verifica qual o Alias de determinada rea de trabalho; se ela no foi especificada, ser verificado qual o
Alias da rea de trabalho corrente. O Alias definido quando a tabela aberta atravs do parmetro
correspondente (DBUSEAREA()).
Esta funo o inverso da funo SELECT(), pois nesta retornado o nmero da rea de trabalho do
Alias correspondente.
Exemplo
/ / Est e exempl o most r a como o Al i as cor r ent e pode ser apr esent ado par a o usur i o.
dbUseAr ea( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
MessageBox( " O Al i as cor r ent e : " + Alias(), " Al i as" , 0) / / Resul t ado: " O Al i as
cor r ent e : SSS"
Append From
Importa registros de outra tabela ou arquivo texto.
Sintaxe
APPEND FROM Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD
nRecno] [REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ]
Argumento Obrigat. Tipo Descrio
Arquivo Sim
Nome do arquivo cujos registros sero importados,
pode ser apenas o nome ou na forma de uma
string.
Campos No
Lista dos campos a serem copiados, se omitido
sero copiados todos os campos.
CondFor No
Expresso em ADVPL a ser resolvida para que o
registro seja copiado.
CondWhile No
Expresso em ADVPL que determina quando a
cpia deve parar (quando a expresso retornar .F.).
AdvPl________________________________________________________________147
nRecs
No
N Quantos registros devem ser copiados.
nRecno No N Nmero do recno do registro a ser copiado.
RDD No
Nome do RDD utilizado na importao (entre aspas
simples ou dupla), se omitido ser utilizado o RDD
corrente.
cDelimitador No C
Especifica qual caracter foi utilizado como
delimitador para gerar o arquivo do tipo texto.
Descrio
Este comando utilizado para copiar alguns registros do arquivo especificado por "FROM cArquivo"
utilizando-se o driver especificado por "VIA RDD" se especificado.

Se forem especificados os campos de interesse atravs de "FIELDS Campos", apenas eles sero copiados,
caso contrrio todos campos o sero. Se no forem especificadas as condies para que o registro seja
copiado, copia toda a tabela como se estivesse especificada a opo "ALL".

Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR CondFor" e
"WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem copiados atravs da opo
"NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a partir do registro atual com "REST",
mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a cpia. Se desejado copiar
apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".

Alm de copiar registros de uma tabela normal, pode-se copiar registros de um arquivo texto que
contenha os dados desejados. Existem duas formas de gerar estes arquivos textos com COPY TO,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos)
ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do
arquivo texto atravs das opes "SDF" ou "DELIMITED".

Pode-se ainda especificar qual o delimitador utilizado nas strings da seguinte forma:

"DELIMITED WITH BLANK" - as strings no possuem delimitador;
"DELIMITED WITH cDelimitador" - as strings so delimitadas com o caracter especificado;

Caso seja omitido o delimitador ser considerado o delimitador padro (" ").

Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando APPEND FROM par a acr escent ar al guns
campos de r egi st r os ( apenas 10 r egi st r os) de out r a t abel a per t encent es a umescopo
def i ni do a par t i r do r egi st r o at ual par a a t abel a cor r ent e:
USE Cl i ent e VI A " CTREECDX" NEW
APPEND FROM Ami gos FI ELDS Nome, Nasci ment o, End, Tel FOR I dade>20 WHI LE Nome<"VVV" NEXT 10
REST
AdvPl________________________________________________________________148
/ / Est e exempl o demonst r a como se pode ut i l i zar o comando <@>COPY TO par a gr avar os dados
de uma t abel a emumar qui vo do t i po t ext o ( DELI MI TED) e i ncl u - l os a out r a t abel a como
comando APPEND FROM:
USE Ami gos NEW
COPY TO t emp DELI MI TED / / Regi st r o: " J ose" , 19751108, 69411233, 12. 00
COPY TO t emp1 DELI MI TED WI TH BLANK / / Regi st r o: J ose 19751108 69411233 12. 00
COPY TO t emp2 DELI MI TED WI TH "@" / / Regi st r o: @J ose@, 19751108, 69411233, 12. 00
USE Cl i ent e NEW
APPEND FROM t emp DELI MI TED
USE Cl i ent e1 NEW
APPEND FROM t emp1 DELI MI TED WI TH BLANK
USE Cl i ent e2 NEW
APPEND FROM t emp2 DELI MI TED WI TH " @"
/ / Est e exempl o demonst r a como se pode ut i l i zar o comando <@>COPY TO par a gr avar os dados
de uma t abel a emumar qui vo do t i po t ext o ( SDF) e i ncl u - l os a out r a t abel a como comando
APPEND FROM:
USE Ami gos NEW
COPY TO t emp3 SDF / / Regi st r o: J ose 1975110869411233 12. 00
USE Cl i ent e3 NEW
APPEND FROM t emp3 SDF

Array
Cria um array com dados no inicializados.
Sintaxe
ARRAY( nQtdElementos1 , [ nQtdElementosn ]...) --> aArray
Argumento Obrigat. Tipo Descrio
nQtdElementos1 Sim N Quantidade de Elementos da 1 dimenso do array.
[nQtdElementosN] No N
Quantidade de Elementos das demais dimenses do
array.

Retorno Descrio
ARRAY() Retorna um array com as dimenses especificadas.
Descrio
Array() uma funo que retorna um array no inicializado com mltiplas dimenses.

Se mais de um argumento for especificado, ser retornado um array multidimensional

A vantagem de utilizar ARRAY(), ao invs de outras opes, a possibilidade de us-la em code blocks e
expresses.
AdvPl________________________________________________________________149
Exemplo
/ / Exempl o 1 - Doi s mt odos i dnt i cos.
aArray : = ARRAY( 5)
aArray : = { NI L, NI L, NI L, NI L, NI L }
/ / Mt odos equi val ent es.
aArray : = ARRAY( 3, 2)
aArray : = { {NI L, NI L}, {NI L, NI L}, {NI L, NI L} }
aArray : = { ARRAY( 2) , ARRAY( 2) , ARRAY( 2) }

AScan
Busca em um array at que o bloco retorne verdadeiro .T.
Sintaxe
ASCAN( aOrigem, expSearch, [ nStart ], [ nCount ]) --> nStoppedAt

Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array onde ser executada a expresso.
<expSearch> Sim Todos
a posio a partir da 1, do qual ser inserido um
elemento

Argumento Descrio
<aOrigem> Obrigatrio, Array. o array onde ser executada a expresso.
<expSearch> Obrigatrio, Qualquer Tipo. Casis either a simple value to scan for, or a code block.
If <expSearch> is a simple value it can be character, date, logical, or
numeric type.
<nStart> is the starting element of the scan. If this argument is
not specified, the default starting position is one.
<nCount> is the number of elements to scan from the starting
position. If this argument is not specified, all elements from the
starting element to the end of the array are scanned.
Returns
ASCAN() returns a numeric value representing the array position of thelast element scanned. If
<expSearch> is a simple value, ASCAN() returnsthe position of the first matching element, or zero if a
match is notfound. If <expSearch> is a code block, ASCAN() returns the position ofthe element where the
block returned true (.T.).
Description
AdvPl________________________________________________________________150
ASCAN() is an array function that scans an array for a specified valueand operates like SEEK when
searching for a simple value. The<expSearch> value is compared to the target array element beginning
withthe leftmost character in the target element and proceeding until thereare no more characters left in
<expSearch>. If there is no match,ASCAN() proceeds to the next element in the array.Since ASCAN()
uses the equal operator (=) for comparisons, it issensitive to the status of EXACT. If EXACT is ON, the
target arrayelement must be exactly equal to the result of <expSearch> to match.If the <expSearch>
argument is a code block, ASCAN() scans the <aTarget&gtarray executing the block for each element
accessed. As each element isencountered, ASCAN() passes the element's value as an argument to thecode
block, and then performs an EVAL() on the block. The scanningoperation stops when the code block
returns true (.T.), or ASCAN()reaches the last element in the array.
Examples
This example demonstrates scanning a three-element array using
simple values and a code block as search criteria. The code block
criteria shows how to perform a case-insensitive search:
aArray := { "Tom", "Mary", "Sue" }
? ASCAN(aArray, "Mary") // Result: 2
? ASCAN(aArray, "mary") // Result: 0
//
? ASCAN(aArray, { |x| UPPER(x) ;
== "MARY" }) // Result: 2
This example demonstrates scanning for multiple instances of a
search argument after a match is found:
LOCAL aArray := { "Tom", "Mary", "Sue",;
"Mary" }, nStart := 1
//
// Get last array element position
nAtEnd := LEN(aArray)
DO WHILE (nPos := ASCAN(aArray, "Mary", ;
nStart)) > 0
? nPos, aArray[nPos]
//
// Get new starting position and test
// boundary condition
IF (nStart := ++nPos) > nAtEnd
EXIT
ENDIF
ENDDO
This example scans a two-dimensional array using a code block.
AdvPl________________________________________________________________151
Note that the parameter aVal in the code block is an array:
LOCAL aArr:={}
CLS
AADD(aArr,{"one","two"})
AADD(aArr,{"three","four"})
AADD(aArr,{"five","six"})
? ASCAN(aArr, {|aVal| aVal[2] == "four"}) // Returns 2
See Also
AEVAL()
EVAL()
ASize
Acrescenta ou reduz elementos de um array.
Sintaxe
ASIZE( aOrigem , nNovoTamanho ) --> aOrigem
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array que ser modificado.
nNovoTamanho Sim N
o novo tamanho do Array. Caso seja maior do
que tamanho atual, os novos elementos ficaro
com contedo NIL.

Retorno Descrio
ASIZE() Retorna uma referncia ao array aOrigem.
Descrio
ASIZE() uma funo de manipulao de array que aumenta ou diminui o tamanho de um array.

No caso de diminuio, os ltimos elementos sero apagados, em caso de aumento de tamanho, os novos
elementos tero contedo NIL.
Exemplos
aAr r ay : = { 1 } / / Resul t ado: aAr r ay i s { 1 }
ASIZE( aAr r ay, 3) / / Resul t ado: aAr r ay i s { 1, NI L, NI L }
AdvPl________________________________________________________________152
ASIZE( aAr r ay, 1) / / Resul t ado: aAr r ay i s { 1 }
ASort
Ordena um array.
Sintaxe
ASORT( aOrigem, [ nInicio ], [ nQtde ], [ bOrdem ]) --> aOrigem
Argumento Obrigat. Tipo Descrio
aOrigem Sim A o array que ser classificado.
nInicio No N
Onde ser o inicio da ordenao. Caso
seja omitido, ser considerado o 1
elemento do array.
nQtde No N
Quantidade de elementos que sero
ordenados a partir do nInicio. Caso seja
omitido, sero considerados todos
elementos at o final do Array.
bOrder No
Bloco de
cdigo
um bloco de cdigo ( code block )
opcional que indicar a ordem correta
dos elementos. Caso ele no seja
informado, o array ser classificado em
ordem crescente desde que no seja
multidimensional.

Retorno Descrio
ASORT() Retorna uma referncia ao array aOrigem.

Descrio
ASORT() uma funo de manipulao de array que classifica todo ou parcialmente um array de tipo
simples. Os tipos que podem ser classificados automaticamente so: caracter, data, lgico e numrico.

Caso bOrder seja especificado, o code block ser usado para ordernar o array, neste caso, pode-se usar
dados de qualquer tipo. Cada vez que o bloco for avaliado, sero passados dois elementos do array, caso
eles estejam em ordem, deve-se retornar .T.
Exemplos
/ / Exempl o 1
aAr r ay : = { 3, 5, 1, 2, 4 }
ASORT( aAr r ay)
/ / Resul t ado: { 1, 2, 3, 4, 5 }
ASORT( aAr r ay, , , { | x, y| x > y })
AdvPl________________________________________________________________153
/ / Resul t ado: { 5, 4, 3, 2, 1 }
/ / Exempl o 2
aAr r ay : = { " Fr ed" , Kat e", " ALVI N" , " f r i end" }
ASORT( aAr r ay, , , { | x, y| UPPER( x) < UPPER( y) })
/ / Exempl o 3
aKi ds : = { {" Mar y" , 14}, {" J oe" , 23}, {"Ar t " , 16} }
aSor t Ki ds : = ASORT( aKi ds, , , { | x, y| x[ 2] < y[ 2] })
Resul t ado:
{ {" Mar y" , 14}, {" Ar t " , 16}, {" J oe", 23} }
ATail
Retorna o ltimo elemento de um array
Sintaxe
ATAIL( aArray ) --> Element
Argumento Obrigat. Tipo Descrio
aArray Sim A
o array de onde ser retornado o ltimo
elemento.

Retorno Descrio
ATAIL() Retorna o ltimo elemento de um array.
Descrio.
ATAIL() uma funo de manipulao de array que retorna o ltimo elemento de um array. Ela deve ser
usada em substituio da seguinte construo: aArray [LEN( aArray )]
Exemplos

aAr r ay : = {" a" , " b" , " c" , " d" }
? ATAIL( aAr r ay) / / Resul t ado: d
BTVCanOpen
Verifica se a tabela BTrieve pode ser aberta.
Sintaxe
BTVCanOpen( cNome , [ cIndice ])->Lgico
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________154
cNome Sim C Nome da tabela a ser testada.
cIndice No C Nome do arquivo de ndice da tabela a ser
testada.

Retorno Descrio
.F.
No possvel abrir a tabela testada. Principais motivos: No existe o arquivo da
tabela ou do ndice fisicamente, ou as definies da tabela ou ndice em questo
no foram encontradas.
.T. A tabela testada pode ser aberta.
Descrio
Esta funo verifica se a tabela definida pelo parmetro cNome pode ser aberta e, se existir, o parmetro
cIndice verifica, tambm, se o ndice pode ser aberto. Para tanto, testado se os arquivos envolvidos
existem fisicamente, caso afirmativo, verificado se as definies envolvidas so encontradas nos
arquivos do DDF's.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de BTVCanOpen( ) . Se no f al har , a t abel a e o
ndi ce t est ados ser o aber t os. Se f al har , uma mensagem apr esent ada.
I F !BTVCanOpen( " \ dadosadv\ aa1990. dat " , "\ dadosadv\ i nd1. i nd" )
Messagebox( " No poss vel abr i r a t abel a t est ada" , " Er r o" , 0)
BREAK
ELSE
Use " \ dadosadv\ aa1990. dat " SHARED NEW
Or dLi st Add( " \ dadosadv\ i nd1. i nd" )
ENDI F
BTVCreateDDFs
Gera os arquivos de definies (DDFs) compatveis com outras ferramentas que manipulam arquivos
Btrieve (Crystal Reports).
Sintaxe
BTVCreateDDFs ( aTabelas , [ cDiretorio ])->Lgico
Argumento Obrigat. Tipo Descrio
aTabelas Sim A Nomes das tabelas e os respectivos diretrios (opcional).
cDiretorio No C Nome do diretrio (abaixo do root) onde sero criados os novos
DDF's.

Retorno Descrio
AdvPl________________________________________________________________155
.F.
No conseguiu gerar os novos arquivos de definio. Principais erros: RDD
no Btrieve; diretrio no est dentro do Protheus; no pode carregar as
informaes de definio ou no pode gravar os novos arquivos de definio.
.T.
Transformao de definies ocorrida com sucesso.
Descrio
Esta funo transforma as informaes armazenadas nos arquivos DDF's para o padro utilizado por
outras ferramentas, principalmente para gerao de relatrios. Sendo que podem ser selecionadas apenas
as tabelas de interesse atravs do parmetro aTabelas.

Ex: aTabelas := {{"AA3990", "C:\DADOS"},{"AA4990", "C:\DADOS1"},{"AA5990"}}


Se o diretrio no for especificado, ser utilizado o diretrio definido no arquivo FILE.BTV.
Os novos arquivos de definio, FILE.DDF, FIELD.DDF e INDEX.DDF, so gerados no diretrio
especificado pelo parmetro cDiretrio, se ele for omitido, sero gerados no mesmo diretrio dos SXs.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de BTVCr eat eDDFs( ) . Se no f al har , ser o ger ados
os novos ar qui vos de def i ni o. Se f al har , uma mensagem apr esent ada.
b: = {{" AA3990" }, {" SA1990" , " c: \ pr ot heus507\ dadosadv" }}
I F !BTVCreateDDFs( b, " \ t emp" ) / / Ser concat enado como Root Pat h
Messagebox( " No f oi poss vel mont ar o ar r ay comos nomes das t abel as" , " Er r o" , 0)
BREAK
ENDI F

BTVDropIdxs
Apaga os ndices da tabela corrente.
Sintaxe
BTVDropIdxs ()->Lgico
Retorno Descrio
.F.
No conseguiu apagar os ndices. Principais erros: RDD no Btrieve, no achou as definies
no DDF, o arquivo no est exclusivo
.T. Deleo de ndices ocorrida com sucesso
AdvPl________________________________________________________________156
Descrio
A funo BTVDropIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for Btrieve e estiver aberto exclusivo. Para tanto ela executa os seguintes passos:
1. Fecha todos os ndices;
2. Apaga as definies dos ndices nos arquivos do diretrio DDF;
3. Apaga os ndices do arquivo da tabela corrente. Todos os ndices criados de forma permanente
ficam guardados na estrutura da tabela. Quando a tabela for aberta, todos os ndices criados de
forma permanente e o ndice interno sero abertos tambm. Por isso, recomendada a criao de
ndices de forma temporria.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de BTVDr opI dxs( ) . Se no f al har , os ndi ces so
apagados e o pr ocesso cont i nua. Se f al har , uma mensagem apr esent ada.
USE Cl i ent es SHARED NEW
I F !BTVDropIdxs()
Messagebox( " No f oi poss vel del et ar os ndi ces da t abel a cor r ent e" , " Er r o" , 0)
BREAK
ENDI F

BTVTables
Retorna array composto por nomes das tabelas definidas no DDF do Protheus (FILE.BTV).
Sintaxe
BTVTables ()-->Array
Retorno Descrio
NIL No conseguiu montar o array. Principais erros: RDD no Btrieve ou
no conseguiu recuperar as informaes corretamente do arquivo
FILE.BTV do DDFs.
Array Lista com os nomes das tabelas extradas do DDF.
Descrio
Verifica todos os nomes das tabelas armazenados no arquivo FILE.BTV do DDF e retorna um array com
todos eles. Toda tabela criada possui o nome acrescentado neste arquivo de definies.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de BTVTabl es( ) . Se no f al har , mont ado umar r ay
comos nomes das t abel as e esses nomes so most r ados no ser vi dor . Se f al har , uma mensagem
apr esent ada.
a: = BTVTables()
I F a=Ni l
Messagebox( " No f oi poss vel mont ar o ar r ay comos nomes das t abel as" , " Er r o" , 0)
BREAK
ELSE
AdvPl________________________________________________________________157
FOR i : = 1 t o LEN( a)
ConOut ( a[ i ] )
NEXT
ENDI F

CDow
Converte uma data para uma cadeia de caracteres contendo o dia da semana.
Sintaxe
CDOW( dExp ) --> Caracter
Argumento Obrigat. Tipo Descrio
dExp Sim D a data a converter.

Retorno Descrio
Caracter
Nome do dia da semana como uma cadeia de
caracteres. A primeira letra maiscula e as demais
minsculas.
"" Caso a data seja invlida ou nula
Descrio
CDOW() uma funo que converte uma data para uma cadeia de caracteres.
Exemplos
dDat a : = DATE( ) / / Resul t ado: 09/ 01/ 90
cDi aDaSemana : = CDOW(DATE()) / / Resul t ado: Fr i day
cDi aDaSemana : = CDOW(DATE() + 7) / / Resul t ado: Fr i day
cDi aDaSemana : = CDOW(CTOD("06/12/90")) / / Resul t ado: Tuesday
CMonth
Converte uma data para uma cadeia de caracteres contento o nome do ms.
Sintaxe
CMONTH( dData ) --> Caracter
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________158
dData S D a data a converter.

Retorno Descrio
Caracter Retorna o nome do ms em uma cadeia de caracteres. A primeira
letra do retorno em maiscula e o restante do nome, em
minsculas.
"" Caso a data seja invlida ou nula.
Descrio
CMONTH() uma funo de converso de datas que retorna uma cadeia de caracteres com o nome do
ms em ingls.
Exemplos
Estes exemplos ilustram CMONTH():
cMes : = CMONTH(DATE()) / / Resul t ado: Sept ember
cMes : = CMONTH(DATE() + 45) / / Resul t ado: Oct ober
cMes : = CMONTH(CTOD("12/01/94")) / / Resul t ado: December
cMes : = SUBSTR( CMONTH(DATE()) , 1, 3) + STR( DAY( DATE( ) ) ) / / Resul t ado: Sep 1
Commit
Salva em disco as modificaes de todas as tabelas.
Sintaxe
COMMIT
Descrio
Este comando salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o COMMI T par a sal var t odas as al t er aes
r eal i zadas nas r eas de t r abal ho aber t as no moment o.
USE Cl i ent es NEW
DBGOTO( 100)
Nome : = " J ose"
USE For necedor es NEW
DBGOTO( 168)
Nome : = " J oao"
COMMIT/ / Sal va emdi sco as al t er aes r eal i zadas nas t abel as Cl i ent es e For necedor es
AdvPl________________________________________________________________159
Copy To
Copia registros da tabela corrente para uma nova tabela.
Sintaxe
COPY TO Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno]
[REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ]

Argumento Obrigat. Tipo Descrio
Arquivo Sim
Nome do arquivo cujos registros sero exportados,
pode ser apenas o nome ou na forma de uma string
Campos No
Lista dos campos a serem copiados, se omitido
sero copiados todos os campos.
CondFor No
Expresso em ADVPL a ser resolvida para que o
registro seja copiado.
CondWhile No Expresso em ADVPL que determina quando a
cpia deve parar (quando a expresso retornar .F.).
nRecs No N Quando registros devem ser copiados.
nRecno No N Nmero do recno do registro a ser copiado.
RDD No
Nome do RDD utilizado na importao (entre aspas
simples ou dupla), se omitido ser utilizado o RDD
corrente.
cDelimitador No C
Especifica qual caracter foi utilizado como
delimitador para gerar o arquivo do tipo texto.
Descrio
Este comando utilizado para copiar alguns registros da tabela corrente para o arquivo especificado por
"TO cArquivo" utilizando-se o driver especificado por "VIA RDD" se especificado. Se forem especificados os
campos de interesse atravs de "FIELDS Campos" apenas eles sero copiados, caso contrrio todos
campos o sero. Se no forem especificadas as condies para que o registro seja copiado, copia toda a
tabela como se estivesse especificada a opo "ALL".

Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR CondFor" e
"WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem copiados atravs da opo
"NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a partir do registro atual com "REST",
mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a cpia. Se desejado copiar
apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".

AdvPl________________________________________________________________160
Alm de copiar registros para uma tabela normal, pode-se copiar registros para um arquivo texto que
contenha os dados desejados. Existem duas formas de gerar estes arquivos textos com COPY TO,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos)
ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do
arquivo texto atravs das opes "SDF" ou "DELIMITED". Pode-se ainda especificar qual o delimitador
utilizado nas strings da seguinte forma:

"DELIMITED WITH BLANK" - as strings no possuem delimitador;

"DELIMITED WITH cDelimitador" - as strings so delimitadas com o caracter especificado;

Caso seja omitido, o delimitador ser considerado o delimitador padro (" ").
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando COPY TO cr i ar nova t abel a comal guns
campos escol hi dos e al guns r egi st r os ( apenas 10) da t abel a at ual per t encent es a umescopo
def i ni do a par t i r do r egi st r o at ual par a det er mi nada t abel a:
USE Cl i ent e VI A " CTREECDX" NEW
COPY TO Ami gos FI ELDS Nome, Nasci ment o, End, Tel FOR I dade>20 WHI LE Nome<" VVV" NEXT 10 REST
/ / Est e exempl o demonst r a como se pode ut i l i zar o comando COPY TO par a gr avar os dados de
uma t abel a emumar qui vo do t i po t ext o ( DELI MI TED) e i ncl u - l os a out r a t abel a como
comando APPEND FROM:
USE Ami gos NEW
COPY TO t emp DELI MI TED / / Regi st r o: " J ose" , 19751108, 69411233, 12. 00
COPY TO t emp1 DELI MI TED WI TH BLANK / / Regi st r o: J ose 19751108 69411233 12. 00
COPY TO t emp2 DELI MI TED WI TH "@" / / Regi st r o: @J ose@, 19751108, 69411233, 12. 00
USE Cl i ent e NEW
APPEND FROM t emp DELI MI TED
USE Cl i ent e1 NEW
APPEND FROM t emp1 DELI MI TED WI TH BLANK
USE Cl i ent e2 NEW
APPEND FROM t emp2 DELI MI TED WI TH " @"
/ / Est e exempl o demonst r a como se pode ut i l i zar o comando <@>COPY TO par a gr avar os dados
de uma t abel a emumar qui vo do t i po t ext o ( SDF) e i ncl u - l os a out r a t abel a como comando
APPEND FROM:
USE Ami gos NEW
COPY TO t emp3 SDF / / Regi st r o: J ose 1975110869411233 12. 00
USE Cl i ent e3 NEW
APPEND FROM t emp3 SDF

Copy File
Copia Arquivos.
Sintaxe
CopyFile( cOrigem, cDestino) --> NIL

Argumento Obrigat. Tipo Descrio
cOrigem Sim C Nomes dos arquivos a serem copiados, aceita tanto
arquivos locais ( Cliente ), como arquivos que esto
AdvPl________________________________________________________________161
no Servidor. WildCards so aceitos normalmente.
cDestino Sim C
Diretrio com o destino dos arquivos a serem
copiados, podendo tambm ser no servidor ou no
cliente ( estao local ).

Retorno Descrio
NIL Sem retorno.
Descrio
Copia um arquivo, da origem para o destino, os caracteres * e ?, so aceitos normalmente.
Caso a origem esteja no cliente e o destino no servidor os arquivos so copiados para o servidor, o
contrrio tambm valido.
Exemplo
__CopyFile( "C:\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos do cliente para o Servidor
__CopyFile( "\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos no servidor
Copy Structure
Copia a estrutura da tabela corrente para uma nova tabela.
Sintaxe
COPY STRUCTURE [FIELDS Campos] TO Arquivo
Argumento Obrigat. Tipo Descrio
Campos No
Lista dos campos a serem includos na nova tabela,
se omitido sero includos todos os campos.
Arquivo Sim C Nome do arquivo da nova tabela a ser criada.
Descrio
Este comando utilizado para criar nova tabela copiando a estrutura da tabela atual, sendo que pode-se
selecionar apenas os campos de interesse atravs da opo "FIELD Campos" que se omitida, deixa que o
comando copie toda a estrutura.

Semelhante ao funcionamento da funo DBCREATE com a passagem de parmetro DBSTRUCT.

AdvPl________________________________________________________________162
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando COPY STRUCTURE no seu modo mai s usual :
USE Cl i ent e NEW
COPY STRUCTURE FI ELDS Nome, I dade TO NovoCl i ent e
/ / Est e exempl o demonst r a como o comando COPY STRUCTURE pode subst i t ui r o DBCREATE:
USE Cl i ent e NEW
COPY STRUCTURE TO NovoCl i ent e
/ / *** semel hant e a ***
USE Cl i ent e NEW
DBCREATE( "NovoCl i ent e" , DBSTRUCT( ) )

CPYS2T
Copia arquivos do servidor para o cliente ( Remote ).
Sintaxe
CpyS2T( cOrigem, cDestino, [lCompacta]) --> NIL
Argumento Obrigat. Tipo Descrio
cOrigem Sim C
Nomes dos arquivos a serem copiados, aceita
apenas arquivos no servidor, WildCards so aceitos
normalmente.
cDestino Sim C
Diretrio com o destino dos arquivos no remote
(Cliente).
lCompacta No L
Indica se a cpia deve ser feita compactando o
arquivo antes.

Retorno Descrio
.T. Arquivo foi copiado para o cliente com sucesso
.F. Erro na cpia do Arquivo.
Descrio
Copia um arquivo, do servidor para o cliente ( Remote ), os caracteres * e ?, so aceitos normalmente.

Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de maneira compactada e
descompactados antes do uso.
Exemplo
CpyS2T( " \ BKP\ MANUAL. DOC", " C: \ TEMP" , . T. ) / / Copi a ar qui vos do ser vi dor par a o r emot e
l ocal , compact ando ant es de t r ansmi t i r
AdvPl________________________________________________________________163
CpyS2T( " \ BKP\ MANUAL. DOC", " C: \ TEMP" , . F. ) / / Copi a ar qui vos do ser vi dor par a o r emot e
l ocal , semcompact ar ant es de t r ansmi t i r
CPYT2S
Copia Arquivos entre o Cliente ( Terminal ) para o servidor.
Sintaxe
CpyT2S( cOrigem, cDestino, [ lCompacta ]) --> NIL

Argumento Obrigat. Tipo Descrio
cOrigem Sim C
Nomes dos arquivos a serem copiados, aceita
apenas arquivos locais ( Cliente ), WildCards so
aceitos normalmente.
cDestino Sim C
Diretrio com o destino dos arquivos no remote (
Cliente ).
lCompacta No L
Indica se a cpia deve ser feita compactando o
arquivo antes.

Retorno Descrio
.T. Arquivo foi copiado para o cliente com sucesso.
.F. Erro na cpia do Arquivo.
Descrio
Copia um arquivo, do cliente ( Remote ) para o servidor, os caracteres * e ?, so aceitos normalmente.

Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de maneira compacta e
descompactados antes do uso.
Exemplo
CpyT2S( " C: \ TEMP\ MANUAL. DOC" , " \ BKP" , . T. ) / / Copi a ar qui vos do cl i ent e( r emot e ) par a o
Ser vi dor compact ando ant es de t r ansmi t i r
CpyT2S( " C: \ TEMP\ MANUAL. DOC" , " \ BKP" ) / / Copi a ar qui vos do cl i ent e( r emot e ) par a o
Ser vi dor semcompact ar .
CTreeDelIdxs
AdvPl________________________________________________________________164
Deleta os ndices da tabela corrente.
Sintaxe
CTreeDelIdxs()->Lgico
Retorno Descrio
.F. No conseguiu deletar os ndices. Principais erros: RDD no Ctre; no
fechou a tabela; no apagou o arquivo de ndice; no atualizou as
informaes da tabela; no abriu a tabela novamente.
.T. Deleo de ndices ocorrida com sucesso.
Descrio
A funo CtreeDelIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for CTree e estiver exclusiva. Para tanto, ela executa os seguintes passos:
1. Fecha os ndices abertos;
2. Fecha a tabela;
3. Deleta os arquivos de ndice fisicamente;
4. Atualiza as informaes da tabela, removendo os ndices de sua estrutura;
5. Abre novamente a tabela.
Todos os ndices criados de forma permanente ficam guardados na estrutura da tabela. Portanto, no
adianta deletar os arquivos de ndices, pois quando a tabela for aberta, todos os ndices criados de forma
permanente e o ndice interno sero recriados fisicamente (se no existirem); caso contrrio, a tabela no
ser aberta. Por isso, recomendada a criao de ndices de forma temporria.
Exemplo
// Este exemplo demonstra o uso tpico de CtreeDelIdxs(). Se no falhar, os ndices so apagados e o
processo continua. Se falhar, uma mensagem apresentada.

USE Cl i ent es SHARED NEW
I F !CtreeDelIdxs()
Messagebox( " No f oi poss vel del et ar os ndi ces da t abel a cor r ent e" , " Er r o" , 0)
BREAK
ENDI F

CTreeDellnt
Deleta ndice interno da tabela CTree.
Sintaxe
CTreeDelInt( cNome )->Lgico
AdvPl________________________________________________________________165
Argumento Obrigat. Tipo Descrio
cNome Sim C Especifica o nome da tabela cujo ndice interno deve ser
deletado.

Retorno Descrio
.F.
No conseguiu deletar o ndice interno. Principais erros: tabela no est
dentro do diretrio do Protheus; no abriu a tabela ou no deletou o
arquivo de ndice interno.
.T. Deleo do ndice interno ocorrida com sucesso.
Descrio
A funo CtreeDelInt apaga o ndice interno de tabela Ctree, estando a mesma fechada. Para tanto,
so executados os seguintes procedimentos:
1. Abre a tabela especificada pelo parmetro cNome;
2. Verifica o nome do arquivo do ndice interno na tabela;
3. Fecha a tabela;
4. Deleta fisicamente o arquivo do ndice interno.
A tabela deve ser apagada aps a chamada desta funo, pois a tabela CTree no pode ser aberta sem
ndice interno.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de Ct r eeDel I nt ( ) . Sendo que a t abel a
" \ DADOSADV\ SA1990. DTC" deve est ar f echada. Se no f al har , o ndi ce i nt er no apagado e o
pr ocesso cont i nua. Se f al har , uma mensagem apr esent ada.
I F !CtreeDelInt( " \ dadosadv\ sa1990. dt c" )
Messagebox( " No f oi poss vel del et ar o ndi ce da t abel a" , "Er r o", 0)
BREAK
ENDI F
f Er ase( " \ dadosadv\ sa1990. dt c" )
CurDir
Retorna o diretrio corrente.
Sintaxe
CURDIR([ cNovoDir ]) --> cDirAtual
Argumento Obrigat. Tipo Descrio
cNovoDir No C
Caminho com o novo diretrio que ser ajustado
como corrente.

AdvPl________________________________________________________________166
Retorno Descrio
cDirAtual Diretrio corrente, sem a ltima barra.
Descrio
Retorna o diretrio corrente do servidor, caso seja passado um caminho como parmetro, esse diretrio
passar a ser o default.
Exemplo
? CURDIR( "C: \ TEMP" )
Date
Retorna a data do sistema.
Sintaxe
DATE() --> Data
Retorno Descrio
Data Data do sistema.
Descrio
DATE() a funo que retorna a data do atual sistema. O formato de sada controlado pelo comando
SET DATE. O formato padro mm/dd/yy.
Exemplos
Estes exemplos mostram como usar a funo DATE():
dDat a : = DATE() / / Resul t ado: 09/ 01/ 01
dDat a : = DATE() + 30 / / Resul t ado: 10/ 01/ 01
dDat a : = DATE() - 30 / / Resul t ado: 08/ 02/ 90
dDat a : = DATE()
cMes : = CMONTH( dDat a) / / Resul t ado: Sept ember
Day
Retorna o dia do ms como valor numrico.
Sintaxe
DAY( dData ) -->Numrico
AdvPl________________________________________________________________167
Argumento Obrigat. Tipo Descrio
dData Sim D a data a converter.

Retorno Descrio
>=0 e
<=31
Se o ms do argumento dData for fevereiro, anos bissextos so
considerados.
0
Se a data do argumento dData for 29 de fevereiro e o ano no
for bissexto, ou se o argumento dData for vazio.
Descrio
DAY() uma funo de converso de datas usada para converter o valor data em um nmero inteiro que
representa o dia do ms.

Esta funo pode ser usada em conjunto com CMONTH() e YEAR() para formatar datas. Pode ser usada
tambm em diversos clculos envolvendo datas.
Exemplos
Estes exemplos mostram a funo DAY() de diversas maneiras:
dDat a : = DATE( ) / / Resul t ado: 09/ 01/ 01
nDi a : = DAY(DATE()) / / Resul t ado: 1
nDi a : = DAY(DATE()) + 1 / / Resul t ado: 2
nDi a : = DAY(CTOD("12/01/94")) / / Resul t ado: 1
Est e exempl o most r a a f uno DAY( ) usada emconj unt o comCMONTH( ) e
YEAR( ) par a f or mat ar o val or da dat a:
dDat a : = Dat e( )
cDat a : = CMONTH( dDat a) + STR( DAY(dData)) + " , " + STR( YEAR( dDat a) ) / / Resul t ado: J une 15,
2001
DBAppend
Acrescenta um novo registro na tabela corrente.
Sintaxe
DBAppend ([ lLiberaBloqueios ]) ->Nil
Argumento Obrigat. Tipo Descrio
lLiberaBloqueios No L Libera todos os registros bloqueados (locks), valor padro .T.
Descrio
AdvPl________________________________________________________________168
Esta funo acrescenta mais um registro em branco no final da tabela corrente, sempre acrescentado e
bloqueado. Se o parmetro estiver com valor .T., todos os bloqueios de registros anteriores so liberados
para que o novo registro seja acrescentado, caso contrrio, se for .F., todos os bloqueios anteriores so
mantidos.

Se este parmetro no for especificado, o valor padro .T..
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o dbappend l i ber ando e mant endo bl oquei os
ant er i or es.
USE Cl i ent es NEW
FOR i : =1 t o 5
DBAPPEND(.F.)
NOME : = " XXX"
END : " YYY"
NEXT
/ / Os 5 r egi st r os i ncl u dos per manecembl oqueados
DBAPPEND()
/ / Todos os bl oquei os ant er i or es so l i ber ados

DBClearAllFilter
Limpa a condio de filtro de todas as ordem as ordens da lista.
Sintaxe
DBClearAllFilter() ->Nil
Retorno Descrio
NIL Nenhum

Descrio
Esta funo salva as atualizaes realizadas e pendentes de todas as tabelas e depois limpa as condies
de filtro de todas as ordens inclusas na lista. Seu funcionamento oposto ao comando SET FILTER.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar DBCLEARALLFI LTER par a l i mpar a expr esso
de f i l t r o.
USE Cl i ent es NEW
DBSETFI LTER( {| | I dade < 40}, " I dade < 40" ) / / Set a a expr esso de f i l t r o
. . .
DBCLEARALLFILTER() / / Li mpa a expr esso de f i l t r o de t odas as or dens


AdvPl________________________________________________________________169
DBClearFilter
Limpa a condio de filtro.
Sintaxe
DBClearFilter () ->Nil
Retorno Descrio
NIL Nenhum

Descrio
Esta funo salva as atualizaes realizadas e pendentes na tabela corrente e depois limpa todas as
condies de filtro da ordem ativa no momento. Seu funcionamento oposto ao comando SET FILTER.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar DBCLEARFI LTER par a l i mpar a expr esso de
f i l t r o.
USE Cl i ent es NEW
DBSETFI LTER( {| | I dade < 40}, " I dade < 40" ) / / Set a a expr esso de f i l t r o
. . .
DBCLEARFILTER() / / Li mpa a expr esso de f i l t r o
DBCloseAll
Fecha todas as tabelas abertas.
Sintaxe
DBCloseAll () ->Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo salva as atualizaes pendentes, libera todos os registros bloqueados e fecha todas as tabelas
abertas (reas de trabalho) como se chamasse DBCLOSEAREA para cada rea de trabalho.
Exemplo
AdvPl________________________________________________________________170
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBCLOSEALL par a f echar a r ea de
t r abal ho at ual .
USE Cl i ent es NEW
DBSETI NDEX( " Nome" ) / / Abr e o ar qui vo de ndi ce " Nome"
USE For necedor es NEW
DBSETI NDEX( " I dade" ) / / Abr e o ar qui vo de ndi ce " I dade"
. . .
DBCLOSEALL() / / Fecha t odas as r eas de t r abal ho, t odos os i ndi ces e or dens
DBCloseArea
Fecha a rea de trabalho.
Sintaxe
DBCloseArea () ->Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo salva as atualizaes pendentes na tabela corrente, libera todos os registros bloqueados e
fecha a tabela corrente (rea de trabalho). Seu funcionamento semelhante ao comando CLOSE e
oposto funo DBUSEAREA e ao comando USE.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBCLOSEAREA par a f echar a r ea de
t r abal ho at ual .
USE Cl i ent es NEW
DBSETI NDEX( " Nome" ) / / Abr e o ar qui vo de ndi ce " Nome"
. . .
DBCLOSEAREA() / / Fecha a r ea de t r abal ho at ual , t odos os i ndi ces e or dens
DBClearI ndex
Fecha todos os arquivos de ndice da rea de trabalho.
Sintaxe
DBClearIndex () ->Nil
Retorno Descrio
NIL Nenhum

AdvPl________________________________________________________________171
Descrio
Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os arquivos de ndice da
rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao
comando <@>SET INDEX.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar a f uno DBCLEARI NDEX par a f echar os
ndi ces.
USE Cl i ent es NEW
DBSETI NDEX( " Nome" ) / / Abr e o ar qui vo de ndi ce " Nome"
. . .
DBCLEARINDEX() / / Fecha t odos os ar qui vos de ndi ces

DBCommit
Salva em disco todas as modificaes da tabela corrente.
Sintaxe
DBCommit() ->Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo salva em disco todas as atualizaes pendentes na rea de trabalho corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBCOMMI T par a sal var t odas as
al t er aes r eal i zadas na r ea de t r abal ho at ual .
USE Cl i ent es NEW
DBGOTO( 100)
Nome : = " J ose"
USE For necedor es NEW
DBGOTO( 168)
Nome : = " J oao"
DBCOMMIT() / / Sal va emdi sco apenas as al t er aes r eal i zadas na t abel a For necedor es

DBCommitAll
Salva em disco todas as modificaes.
Sintaxe
AdvPl________________________________________________________________172
DBCommitAll () ->Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBCOMMI TALL par a sal var t odas as
al t er aes r eal i zadas nas r eas de t r abal ho aber t as no moment o.
USE Cl i ent es NEW
DBGOTO( 100)
Nome : = " J ose"
USE For necedor es NEW
DBGOTO( 168)
Nome : = " J oao"
DBCOMMITALL() / / Sal va emdi sco as al t er aes r eal i zadas nas t abel as Cl i ent es e
For necedor es
DBCreate
Cria nova tabela.
Sintaxe
DBCREATE( cNome , aEstrutura , [ cDriver ]) --> Nil
Argumento Obrigat. Tipo Descrio
cNome S C Nome do arquivo da tabela a ser criada (abaixo do "RootPath").
aEstrutura S Array Lista com as informaes dos campos para ser criada a tabela.
cDriver N C
Nome do RDD a ser utilizado para a criao da tabela. Se for omitido
ser criada com o corrente.

Retorno Descrio
NIL Nenhum
Descrio
Esta funo utilizada para criar um novo arquivo de tabela cujo nome est especificado atravs do
primeiro parmetro (cNome) e estrutura atravs do segundo (aEstrutura).

AdvPl________________________________________________________________173
A estrutura especificada atravs de um array com todos os campos, onde cada campo expresso
atravs de um array contendo {Nome, Tipo, Tamanho, Decimais}, como visto no exemplo a seguir.
Exemplo
/ / Est e exempl o most r a como se pode cr i ar novo ar qui vo de t abel a at r avs da f uno
DBCREATE:
LOCAL aEst r ut ur a : = {{Cod, N, 3, 0}, {Nome, C, 10, 0}, {I dade, N, 3, 0}, {Nasc, D, 8, 0}, {Pagt o, N, 7, 2}}
DBCREATE( "\ t est e\ ami gos. xxx" , aEst r ut ur a) / / Cr i a a t abel a como RDD cor r ent e
USE "\ t est e\ ami gos. xxx" VI A " DBFCDX" NEW

DBCreateI ndex
Cria um arquivo de ndice.
Sintaxe
DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil
Argumento Obrigat. Tipo Descrio
cNome S C Nome do arquivo de ndice a ser criado.
cExpChave S C
Expresso das chaves do ndice a ser criado na forma de
string.
bExpChave N
Bloco de
Cdigo
Expresso das chaves do ndice a ser criado na forma
executvel.
lUnico N L Cria ndice como nico (o padro .F.).

Retorno
Descrio
Nil
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for
tamanho ou casas decimais, tipo caracter se for nome ou tipo).
Descrio
Esta funo utilizada para criar um novo arquivo de ndice com o nome especificado atravs do primeiro
parmetro, sendo que se o mesmo existir deletado e criado o novo. Para tanto so executados os
passos a seguir:

1. Salva fisicamente as alteraes ocorridas na tabela corrente;

2. Fecha todos os arquivos de ndice abertos;

3. Cria o novo ndice;

4. Seta o novo ndice como a ordem corrente;

AdvPl________________________________________________________________174
5. Posiciona a tabela corrente no primeiro registro do ndice.

Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao
de ndice, pois na criao de ndices no Ctree alterada a estrutura da tabela, precisando para isto a
tabela estar aberta em modo exclusivo.
Exemplo
/ / Est e exempl o most r a como se pode cr i ar novo ar qui vo de ndi ce cr i ando a or demsobr e os
campos Nome e End e no acei t ar dupl i cao:
USE Cl i ent e VI A " DBFCDX" NEW
DBCREATEINDEX ( " \ t est e\ i nd2. cdx" , " Nome+End" , { | | Nome+End }, . T. )
DBDelete
Marca o arquivo corrente como deletado.
Sintaxe
DBDelete () ->Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo marca o arquivo corrente como deletado de modo semelhante ao comando DELETE. Para
filtrar os arquivos marcados pode-se utilizar o comando SET DELETED e para delet-los fisicamente pode-
se utilizar o comando PACK.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar a f uno DBDELETE( ) par a mar car al guns
r egi st r os como del et ados e o PACK par a del et - l os f i si cament e.
USE Cl i ent es NEW
DBGOTO( 100)
DBDELETE()
DBGOTO( 105)
DBDELETE()
DBGOTO( 110)
DBDELETE()
PACK

DBEval
Executa uma expresso para os registros dentro das condies especificadas.
Sintaxe
AdvPl________________________________________________________________175
DBEVAL( bBloco, [ bForCond ], [ bWhileCond ], [ nProxRegs ], [ nRecno ], [ lRestante ]) --> Nil
Argumento Obrigat. Tipo Descrio
bBloco S
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para cada registro
processado.
bForCond N
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para verificar se o
registro em questo est dentro do escopo definido.
bWhileCond N
Bloco de
Cdigo
Expresso na forma executvel a ser resolvida para verificar at
qual registro ser processado (at o bloco retornar .F.).
nProxRegs N N
Nmero de registros a ser processado a partir do registro
corrente.
nRecno N N
Identificao de determinado registro a ser resolvida a expresso
(recno).
lRestante N L Processa o restante dos registro.
Descrio
Esta funo utilizada para executar uma expresso definida pelo bloco de cdigo do primeiro parmetro
para cada registro que est dentro do escopo definido atravs dos blocos de condio de "for" e "while".

O nmero de registros a ser executado ser definido com o parmetro nProxRegs ou se setado o
parmetro lRestante sero executados todos os registros a partir do registro corrente at o final da tabela
corrente. Se for especificado o parmetro nRecno apenas o registro com o recno especificado ser
processado.

Se forem omitidos os blocos de "for" e "while", os mesmos sero considerados .T. como padro, esto
assim todos os registros dentro do escopo.

Se o parmetro lRestante for omitido a tabela inicia o processamento dos registros a partir do topo da
tabela, caso contrrio sero processados os registros a partir do posicionamento corrente da tabela.
Exemplo
/ / Est e exempl o most r a como se pode usar o DBEVAL par a cont ar quant os r egi st r os est o
dent r o do escopo especi f i cado emt oda a t abel a, poi s como o par met r o lRestante f oi
omi t i do a t abel a i r par a o t opo ant es de i ni ci ar a pr ocessar os r egi st r os. Supondo que a
t abel a est sobr e um ndi ce no campo i dade, ser o pr ocessados r egi st r os como Nome cuj a
or demal f abt i ca mai or que "FFFFF" e at encont r ar al gumr egi st r o de i dade i gual a 40:
USE Cl i ent e VI A " DBFCDX" NEW
LOCAL nCount : = 0;
DBGOTO( 100)
DBEVAL( {| | nCount ++}, {| | Nome > "FFFFF" }, {| | I dade < 40})
/ / Est e exempl o most r a como se pode usar o DBEVAL par a cont ar quant os r egi st r os est o
dent r o do escopo especi f i cado ( como o exempl o ant er i or ) a par t i r do r egi st r o at ual ( 100) :
USE Cl i ent e VI A " DBFCDX" NEW
LOCAL nCount : = 0;
DBGOTO( 100)
DBEVAL( {| | nCount ++}, {| | Nome > "FFFFF" }, {| | I dade < 40}, , , . T. )
AdvPl________________________________________________________________176
/ / Est e exempl o most r a como se pode usar o DBEVAL par a col ocar numa var i vel umnome
i ni ci al que est def i ni do emumr egi st r o de r ecno def i ni do ( 100) :
USE Cl i ent e VI A " DBFCDX" NEW
LOCAL cNomeI ni : = " ";
DBEVAL( {| | cNomeI ni : = Nome}, , , , 100)
/ / Est e exempl o most r a como se pode usar o DBEVAL par a ver i f i car qual o r ecno do dci mo
r egi st r o a par t i r do cor r ent e dent r o do escopo def i ni do:
USE Cl i ent e VI A " DBFCDX" NEW
LOCAL nRecno : = 0;
DBGOTO( 100)
DBEVAL( {| | nRecno : = RECNO( ) }, {| | Nome > " FFFFF"}, {| | I dade < 40}, 10, , . T. )

DBF
Verifica qual o Alias corrente.
Sintaxe
DBF() --> Caracter
Retorno Descrio
"" No existe tabela em uso.
cAlias String contendo o Alias corrente.
Descrio
Verifica qual o Alias da rea de trabalho corrente. O Alias definido quando a tabela aberta atravs do
parmetro correspondente (DBUSEAREA()).

Esta funo o inverso da funo SELECT(), pois nesta retornado o nmero da rea de trabalho do
Alias correspondente.
Exemplo
/ / Est e exempl o most r a como o DBF cor r ent e pode ser most r ado par a o usur i o.
dbUseAr ea( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
MessageBox( " O Al i as cor r ent e : " + DBF(), " Al i as" , 0) / / Resul t ado: " O Al i as
cor r ent e : SSS"

DBFieldInfo
Verifica informaes sobre um campo.
Sintaxe
AdvPl________________________________________________________________177
DBFieldInfo ( nInfoTipo , nCampo ) -> Informao do Campo
Argumento Obrigat. Tipo Descrio
nInfoTipo S N Tipo de informao a ser verificada.
nCampo S N Posio do campo a ser verificado.

Retorno Descrio
Nil
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for
tamanho ou casas decimais, tipo caracter se for nome ou tipo).
Descrio
Esta funo utilizada para obter informaes sobre determinado campo da tabela corrente. O tipo
de informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
DBS_DEC Nmero de casas decimais (tipo numrico)
DBS_LEN Tamanho (tipo numrico)
DBS_TYPE Tipo (tipo caracter)

A posio do campo no leva em considerao os campos internos do Protheus (recno e deleted).
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBFI ELDI NFO par a obt er as i nf or maes
do pr i mei r o campo da t abel a Cl i ent es.
USE Cl i ent es NEW
DBFIELDINFO(DBS_NAME, 1) / / Ret or no: Nome
DBFIELDINFO(DBS_TYPE, 1) / / Ret or no: C
DBFIELDINFO(DBS_LEN, 1) / / Ret or no: 10
DBFIELDINFO(DBS_DEC, 1) / / Ret or no: 0

DBFilter
Verifica a expresso de filtro corrente.
Sintaxe
DBFilter () --> Caracter
Retorno Descrio
AdvPl________________________________________________________________178
"" No existe filtro ativo na rea de trabalho atual.
cExpFiltro Expresso do filtro ativo na rea de trabalho atual.
Descrio
Esta funo utilizada para verificar a expresso de filtro ativo na rea de trabalho corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBFI LTER par a ver i f i car a expr esso do
f i l t r o cor r ent e.
USE Cl i ent e I NDEX I nd1 NEW
SET FI LTER TO Nome > " J ose"
DBFILTER() / / r et or na: Nome > " J ose"
SET FI LTER TO Num< 1000
DBFILTER() / / r et or na: Num< 1000
DBGoBottom
Posiciona no ltimo registro lgico.
Sintaxe
DBGoBottom() -> Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo utilizada para posicionar a tabela corrente no ltimo registro lgico. A seqncia lgica
depende da ordem e do filtro ativo sobre a tabela corrente, portanto o ltimo registro lgico pode no ser
o ltimo registro fsico.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBGOBOTTOM par a posi ci onar no l t i mo
r egi st r o f si co.
USE Cl i ent e
DBGOBOTTOM() / / Posi ci ona no l t i mo r egi st r o f si co, poi s no h or demat i va
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBGOBOTTOM par a posi ci onar no l t i mo
r egi st r o l gi co.
USE Cl i ent e I NDEX I nd1 NEW
DBGOBOTTOM() / / Posi ci ona no l t i mo r egi st r o l gi co ( l t i mo r egi st r o na seqnci a ger ada
pel o ndi ce)

AdvPl________________________________________________________________179
DBGoTo
Posiciona em determinado registro.
Sintaxe
DBGoTo( nRegistro ) -> Nil
Argumento Obrigat. Tipo Descrio
nRegistro S N Nmero do registro a ser posicionado.
Descrio
Esta funo utilizada para posicionar a tabela corrente em determinado registro, segundo a ordem fsica
(seqncia sobre o recno).
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBGOTO par a posi ci onar a t abel a
cor r ent e emdet er mi nado r egi st r o.
USE Cl i ent e I NDEX I nd1 NEW
DBGOTO(100) / / Posi ci ona no r egi st r o de r ecno 100

DBGoTop
Posiciona no primeiro registro lgico.
Sintaxe
DBGoTop() -> Nil
Retorno Descrio
NIL Nenhum

Descrio
Esta funo utilizada para posicionar a tabela corrente no primeiro registro lgico. A seqncia lgica
depende da ordem e do filtro ativo sobre a tabela corrente, portanto o primeiro registro lgico pode no
ser o primeiro registro fsico.
Exemplo
AdvPl________________________________________________________________180
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBGOBOTOP par a posi ci onar no pr i mei r o
r egi st r o f si co.
USE Cl i ent e
DBGOTOP() / / Posi ci ona no pr i mei r o r egi st r o f si co, poi s no h or demat i va
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBGOTOP par a posi ci onar no pr i mei r o
r egi st r o l gi co.
USE Cl i ent e I NDEX I nd1 NEW
DBGOTOP() / / Posi ci ona no pr i mei r o r egi st r o l gi co ( pr i mei r o r egi st r o na segnci a ger ada
pel o ndi ce)

DBI nfo
Verifica informaes sobre a tabela corrente.
Sintaxe
DBInfo ( nInfoTipo ) -> Informao da Tabela
Argumen
to
Obriga
t.
Ti
p
o
Descri
o
nInfoTipo S N
Tipo de informao a
ser verificada.

Retorno Descrio
Nil
No h tabela corrente.
Informao da Tabela Informao requisitada
pelo usurio (o tipo depende da informao
requisitada).
Descrio
Esta funo utilizada para obter informaes sobre a tabela corrente. O tipo de informao (primeiro
argumento) escolhido de acordo com as constantes abaixo:

DBI_GETRECSIZE
Tamanho do registro em nmero de bytes similar a RECSIZE (tipo
numrico)
DBI_TABLEEXT Extenso do arquivo da tabela corrente (tipo caracter)
DBI_FULLPATH
Nome da tabela corrente com caminho completo (tipo caracter)
DBI_BOF Verifica se est posicionada no incio da tabela similar a BOF (tipo lgico)
DBI_EOF Verifica se est posicionada no final da tabela similar a EOF (tipo lgico)
DBI_FOUND
Verifica se a tabela est posicionada aps uma pesquisa similar a FOUND (tipo
lgico)
AdvPl________________________________________________________________181
DBI_FCOUNT
Nmero de campos na estrutura da tabela corrente similar a FCOUNT (tipo
numrico)
DBI_ALIAS Nome do Alias da rea de trabalho corrente similar a ALIAS (tipo caracter)
DBI_LASTUPDATE Verifica a data da ltima modificao similar a LUPDATE (tipo data)

Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBI NFO par a obt er as i nf or maes da
t abel a cor r ent e ( Cl i ent es) .
USE Cl i ent es NEW
DBINFO(DBI_FULLPATH) / / Ret or no: C: \ Test e\ Cl i ent es. dbf
DBINFO(DBI_FCOUNT) / / Ret or no: 12
DBGOTOP( )
DBINFO(DBI_BOF) / / Ret or no: . F.
DBSKI P( - 1)
DBINFO(DBI_BOF) / / Ret or no: . T.

DBOrderI nfo
Verifica informaes sobre uma ordem.
Sintaxe
DBOrderInfo ( nInfoTipo , [ cIndice ], [ cOrdem | nPosicao ]) -> Informao da Ordem
Argumento Obrigat. Tipo Descrio
nInfoTipo S N Nome do arquivo de ndice.
cOrdem N C Nome da ordem.
nPosio N N Posio da ordem na lista de ordens ativas.

Retorno Descrio
Nil
No h ordem corrente ou a posio da ordem especificada est invlida.
Informao da Ordem Informao requisitada pelo usurio (pode ser de tipo numrico se for
nmero de ordens no ndice, tipo caracter se for nome do arquivo de ndice).
Descrio
Esta funo utilizada para obter informaes sobre determinada ordem. A especificao da ordem pode
ser realizada atravs de seu nome ou sua posio dentro da lista de ordens, mas se ela no for
especificada sero obtidas informaes da ordem corrente.

O tipo de informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
AdvPl________________________________________________________________182

DBOI_BAGNAME Nome do arquivo de ndice ao qual a ordem pertence (tipo caracter).
DBOI_FULLPATH
Nome do arquivo de ndice (com seu diretrio) ao qual a ordem pertence (tipo
caracter)
DBOI_ORDERCOUNT Nmero de ordens existentes no arquivo de ndice especificado
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBORDERI NFO par a obt er i nf or maes
sobr e o nome do ar qui vo de ndi ce da or demcor r ent e.
DBORDERINFO( DBOI _BAGNAME) / / r et or na: I nd
DBORDERINFO( DBOI _FULLPATH) / / r et or na: C: \ AP6\ Test e\ I nd. cdx
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBORDERI NFO par a obt er i nf or maes
sobr e o nome do ar qui vo de ndi ce de uma or demespeci f i cada.
DBORDERINFO( DBOI _BAGNAME, , 3) / / r et or na: I nd2
DBORDERINFO( DBOI _FULLPATH, , " Nome" ) / / r et or na: C: \ AP6\ Test e\ I nd2. cdx
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBORDERI NFO par a obt er o nmer o de
or dens de det er mi nado ar qui vo de ndi ce.
DBORDERINFO( DBOI _ ORDERCOUNT, "\ Test e\ I nd2. cdx" ) / / r et or na: 3
DBOrderNickName
Torna ativa a ordem com o determinado apelido.
Sintaxe
DBOrderNickName( cApelido ) -> Lgico
Argumento Obrigat. Tipo Descrio
cApelido S C Nome do apelido da ordem a ser setada.

Retorno Descrio
.F.
No conseguiu tornar a ordem ativa.
Principais erros: No existe tabela ativa ou no foi encontrada a ordem com o apelido.
.T. A ordem foi setada com sucesso.
Descrio
Esta funo utilizada para selecionar a ordem ativa atravs de seu apelido. Esta ordem a responsvel
seqncia lgica dos registros da tabela corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBORDERNI CKNAME par a set ar nova or dem.
USE Cl i ent e NEW
SET I NDEX TO Nome, I dade
I F ! DBORDERNICKNAME( " I ndNome" )
AdvPl________________________________________________________________183
Messagebox( " Regi st r o no encont r ado", " Er r o" , 0)
BREAK
ENDI F
DBRecall
Altera o estado deletado do registro atual.
Sintaxe
DBRecall() -> Nil
Retorno Descrio
NIL Nenhum
Descrio
Esta funo utilizada para retirar a marca de registro deletado do registro atual. Para ser executada o
registro atual deve estar bloqueado ou a tabela deve estar aberta em modo exclusivo. Se o registro atual
no estiver deletado, esta funo no faz nada. Ela o oposto da funo DBDELETE que marca o registro
atual como deletado.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBRECALL par a r et or nar o est ado do
r egi st r o at ual par a nor mal .
USE Cl i ent e
DBGOTO( 100)
DBDELETE( )
DELETED( ) / / Ret or na: . T.
DBRECALL()
DELETED( ) / / Ret or na: . F.
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBRECALL par a desf azer t odas as
del ees da t abel a cor r ent e.
USE Cl i ent e
DBGOTOP( )
WHI LE ! EOF( )
DBRECALL()
DBSKI P( )
ENDDO
DBRecordI nfo
Verifica informaes sobre um registro.
Sintaxe
DBRecordInfo ( nInfoTipo ,[ nRegistro ]) -> Informao do Registro
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________184
nInfoTipo S N Tipo de informao a ser verificada.
nRegistro Opcional N Nmero do registro a ser verificado.

Retorno Descrio
Nil
No h tabela corrente ou registro invlido.
Informao do Registro. Informao requisitada pelo usurio (o tipo depende da informao
requisitada).
Descrio
Esta funo utilizada para obter informaes sobre o registro especificado pelo segundo argumento
(recno) da tabela corrente, se esta informao for omitida ser verificado o registro corrente. O tipo de
informao (primeiro argumento) escolhido de acordo com as constantes abaixo:

DBRI_DELETED Estado de deletado. Similar a DELETED (tipo lgico)
DBRI_RECSIZE Tamanho do registro. Similar a RECSIZE (tipo numrico)
DBRI_UPDATED
Verifica se o registro foi alterado e ainda no foi atualizado fisicamente. Similar a
UPDATED (tipo lgico).

Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBRECORDI NFO par a se obt er as
i nf or maes sobr e r egi st r os da t abel a cor r ent e.
USE Cl i ent es NEW
DBGOTO( 100)
DBRECORDINFO( DBRI _DELETED) / / Ret or no: . F.
DBDELETE( )
DBRECORDINFO( DBRI _DELETED) / / Ret or no: . F.
DBRECALL( )
DBRECORDINFO( DBRI _RECSI ZE) / / Ret or no: 230
NOME : = " J OAO"
DBGOTO( 200)
DBRECORDINFO( DBRI _UPDATED) / / Ret or no: . F.
DBRECORDINFO( DBRI _UPDATED, 100) / / Ret or no: . T.
DBReindex
Reconstri todos os ndices da rea de trabalho.
Sintaxe
DBReindex() -> Nil
AdvPl________________________________________________________________185
Retorno Descrio
NIL Nenhum

Descrio
Reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro registro lgico.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBREI NDEX par a r econst r ui r os ndi ces
depoi s que umnovo ndi ce f oi ger ado.
USE Cl i ent es NEW
DBSETI NDEX( " I ndNome")
DBREINDEX()

DBRLock
Bloqueia determinado registro.
Sintaxe
DBRLOCK([ nRegistro ]) --> Lgico
Argumento Obrigat. Tipo Descrio
nRegistro Opcional N Nmero do registro a ser bloqueado.

Retorno Descrio
.F.
No conseguiu bloquear o registro.
Principal motivo: o registro j foi bloqueado por outro usurio.
.T. O registro foi bloqueado com sucesso
Descrio
Esta funo utilizada quando se tem uma tabela aberta e compartilhada e se deseja bloquear um
registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a
funo no altera seu estado.

O usurio pode escolher o registro a ser bloqueado atravs do parmetro (recno), mas se este for omitido
ser bloqueado o registro corrente como na funo RLOCK().

AdvPl________________________________________________________________186
Esta funo o oposto DBRUNLOCK, que libera registros bloqueados.
Exemplo
/ / Est e exempl o most r a duas var i aes do uso de DBRLOCK.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOTO( 100)
DBRLOCK() / / Bl oquei a o r egi st r o at ual ( 100)
DBRLOCK(110) / / Bl oquei a o r egi st r o de nmer o 110

DBRLockList
Retorna uma lista com todos os registros locados na tabela corrente.
Sintaxe
DBRLOCKLIST() --> Array
Retorno Descrio
Nil No existe tabela corrente ou no existe nenhum registro locado.
ListaLock Lista com os recnos dos registros locados na tabela corrente.
Descrio
Esta funo utilizada para verificar quais registros esto locados na tabela corrente. Para tanto,
retornada uma tabela unidimensional com os nmeros dos registros.
Exemplo
/ / Est e exempl o most r a como ut i l i zada a f uno DBRLOCKLI ST par a ver i f i car quai s
r egi st r os est o bl oqueados na t abel a cor r ent e
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOTOP( )
DBRLOCK( ) / / Bl oquei a o pr i mei r o r egi st r o
DBRLOCK( 110) / / Bl oquei a o r egi st r o de nmer o 110
DBRLOCK( 100) / / Bl oquei a o r egi st r o de nmer o 100
DBRLOCKLIST() / / Ret or na: {1, 100, 110}

DBRunLock
Desbloqueia determinado registro.
Sintaxe
DBRUNLOCK([ nRegistro ]) --> Nil
AdvPl________________________________________________________________187
Argumento Obrigat. Tipo Descrio
nRegistro No N Nmero do registro a ser desbloqueado.

Retorno Descrio
NIL Sem retorno.
Descrio
Esta funo utilizada para liberar determinado registro bloqueado.

O usurio pode escolher o registro a ser desbloqueado atravs do parmetro (recno), mas se este for
omitido ser desbloqueado o registro corrente como na funo DBUNLOCK().

Esta funo o oposto DBRLOCK, que bloquea os registros.
Exemplo
/ / Est e exempl o most r a duas var i aes do uso de DBRUNLOCK.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOTO( 100)
DBRUNLOCK() / / Desbl oquei a o r egi st r o at ual ( 100)
DBRUNLOCK(110) / / Desbl oquei a o r egi st r o de nmer o 110

DbSeek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe
DBSeek ( cExp | nExp, [ lSoftSeek ], [ lUltimo ]) --> Lgico
Argumento Obrigat. Tipo Descrio
cExp Sim C
Valor de chave a ser encontrado do tipo caracter (todos os tipos de
expresso de ndice com exceo do ndice com apenas um campo do
tipo numrico).
nExp Sim N
Valor de chave a ser encontrado do tipo numrico (apenas quando a
expresso do ndice possui apenas uma campo do tipo numrico).
lSoftSeek No L
Posiciona no primeiro registro com expresso de chave maior que o
valor procurado. O padro .F.
AdvPl________________________________________________________________188
lUltimo No L Procura a ltima ocorrncia do valor procurado. O padro .F.

Retorno Descrio
.F. No foi encontrado nenhum registro com o valor especificado
.T. Foi encontrado um registro com o valor especificado
Descrio
Esta funo utilizada para encontrar um registro com determinado valor da expresso de chave de
ndice.

Antes da chamada do DBSEEK deve-se certificar de que existe uma ordem ativa no momento com os
campos que se deseja pesquisar o valor.

Se a expresso possuir apenas uma campo numrico, o primeiro parmetro deve ser do tipo numrico,
mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetro (mesmo se forem
apenas dois campos numricos ou do tipo data).

Quando o segundo parmetro for especificado como .T. (softseek), mesmo que a expresso pesquisada
no encontrar nenhum registro com este valor, a tabela ser posicionada no prximo valor maior que o
especificado no primeiro parmetro, mas mesmo posicionando no prximo valor esta funo retornar .F.
(pois no encontrou).

Quando no for especificado este valor ou estiver .F. e falhar o valor de pesquisa, a tabela ser
posicionada em LASTREC + 1 e ser setada a flag de EOF.

Se o terceiro parmetro for especificado com valor .T. a funo posiciona a tabela no ltimo registro com
o valor procurado, caso no seja especificado ou for .F., ser posicionada na primeira ocorrncia.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSEEK par a busca de val or es numr i cos.
USE Cl i ent es NEW
ORDLI STADD ( " / t est e/ i nd1. cdx" ) / / Expr esso Num( campo numr i co)
DBSEEK(100) / / Ret or na: . F.
EOF( ) / / Ret or na: . T.
DBSEEK(100,.T.) / / Ret or na: . F.
EOF( ) / / Ret or na: . F. ( poi s o sof t seek posi ci onou no pr xi mo r egi st r o)
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSEEK par a per cor r er t odos os
r egi st r os de Cl i ent es como nome j oao e venci ment os a par t i r de j anei r o de 2001.
USE Cl i ent es NEW
ORDLI STADD ( " / t est e/ i nd2. cdx" ) / / Expr esso Nome+Venc ( campo car act er + dat a)
DBSEEK("joao200101",.T.) / / Pr ocur a a pr i mei r a ocor r nci a de Nome " j oao" e venci ment o
mai or que J anei r o de 2001
WHI LE ! EOF( ) . AND. Nome == " j oao"
DBSKI P( )
ENDDO

AdvPl________________________________________________________________189
DBSetDriver
Modifica ou verifica o RDD padro.
Sintaxe
DBSetDriver ([ cNovoRddPadro ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cNovoRddPadro No C
Novo nome do RDD a ser definido
como padro.

Retorno Descrio
cAntigoRddPadro Nome do RDD padro corrente
Descrio
Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for
omitido seu parmetro.

Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do
parmetro.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSETDRI VER par a al t er ar o val or do RDD
padr o.
DBSETDRIVER("CTREECDX") / / Ret or na: DBFCDX
DBSETDRIVER() / / Ret or na: CTREECDX

DBSetFilter
Seta uma condio de filtro.
Sintaxe
DBSetFilter( bCondio, cCondio ) --> Nil
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________190
bCondio Sim
Bloco de
Cdigo
Expresso do filtro na forma
executvel.
cCondio Sim C
Expresso do filtro na forma de
string.


Retorno 3Descrio
NIL Sem retorno.

Descrio
Esta funo utilizada para setar um filtro nos registros da tabela corrente especificado atravs do bloco
de cdigo no primeiro parmetro.

Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKIP, etc).
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSETFI LTER par a f i l t r ar t odos os
cl i ent es commenos de 40 anos.
USE Cl i ent e NEW
DBSETFILTER( {| | I dade < 40}, " I dade < 40" )
DBGOTOP( )

DBSetI ndex
Acrescenta todas as ordens de determinado ndice lista.
Sintaxe
DBSetIndex( cArqIndice ) --> Nil
Argumento Obrigat. Tipo Descrio
cArqIndice Sim C Nome do arquivo de ndice, com ou sem diretrio e extenso.

Retorno Descrio
NIL Sem retorno.
AdvPl________________________________________________________________191
Descrio
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.

Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e torna-se ativa.

Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a primeira torna-se ativa.

Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas caso contrrio deve ser especificado.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSETI NDEX par a acr escent ar novos
ndi ces l i st a de or dens.
USE Cl i ent e NEW
DBSETINDEX("Ind1")
DBSETINDEX("\teste\Ind2.cdx")

DBSetNickName
Seta um apelido para determinada ordem ou verifica qual o apelido corrente.
Sintaxe
DBSetNickName( cOrdem,[ cApelido ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cIndice Sim C Nome da ordem que deve receber o apelido.
cApelido No C Nome do apelido da ordem a ser setada.

Retorno Descrio
"" No conseguiu encontrar a ordem especificada, no conseguiu setar o apelido ou no havia
apelido corrente
cApelido Apelido corrente

Descrio
AdvPl________________________________________________________________192
Esta funo utilizada para colocar um apelido em determinada ordem especificada pelo primeiro
parmetro.

Caso seja omitido o nome do apelido a ser dado, a funo apenas verifica o apelido corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSETNI CKNAME par a set ar umnovo
apel i do e ver i f i car qual o apel i do at ual .
USE Cl i ent e NEW
DBSETNICKNAME("IndNome") / / r et or na: " "
DBSETNICKNAME("IndNome","NOME") / / r et or na: ""
DBSETNICKNAME("IndNome") / / r et or na: " NOME"

DBSetOrder
Seleciona a ordem ativa da rea de trabalho.
Sintaxe
DBSetOrder( nPosio ) --> Nil
Argumento Obrigat. Tipo Descrio
nPosio Sim N Posio da ordem na lista de ordens ativas

Retorno Descrio
NIL Sem retorno

Descrio
Esta funo utilizada para selecionar a ordem ativa da rea de trabalho.

Esta ordem a responsvel seqncia lgica dos registros da tabela corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSETORDER par a sel eci onar a or dem
cor r ent e.
USE Cl i ent e NEW
SET I NDEX TO Nome, I dade
DBSETORDER(2)

AdvPl________________________________________________________________193
DBSkip
Desloca para outro registro na tabela corrente.
Sintaxe
DBSkip([ nRegistros ]) --> Nil
Argumento Obrigat. Tipo Descrio
nRegistros No N Nmero de registros a ser deslocado.

Retorno Descrio
NIL Sem retorno.
Descrio
Esta funo utilizada para deslocar para outro registro a partir do registro atual.

O parmetro especifica quantos registros lgicos devem ser deslocados a partir do corrente, se for positivo
desloca em direo ao final da tabela, se for negativo ao incio da tabela e caso seja omitido ir para o
prximo registro (o padro 1).

Caso passe do incio da tabela, posiciona no primeiro registro e seta BOF, caso passe do final da tabela,
posiciona no registro LASTREC + 1 e seta EOF.
Exemplo
/ / Est e exempl o most r a como o DBSKI P pode passar do f i nal da t abel a e do i n ci o da t abel a
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOBOTTOM( )
EOF( ) / / r et or na . F.
DBSKIP()
EOF( ) / / r et or na . T.
DBGOTOP( )
BOF( ) / / r et or na . F.
DBSKIP(-1)
BOF( ) / / r et or na . T.
/ / Est e exempl o most r a como o DBSKI P pode desl ocar 10 r egi st r o emr el ao ao r egi st r o
cor r ent e
DBUSEAREA( . T. , "dbf cdxads", " \ dadosadv609\ sa1990. dbf " , " SSS" , . T. , . F. )
DBGOTO( 100)
DBSKIP(10)
RECNO( ) / / r et or na 110
DBSKIP(-10)
RECNO( ) / / r et or na 100

AdvPl________________________________________________________________194
DBStruct
Retorna a estrutura da tabela corrente.
Sintaxe
DBStruct() --> Array

Retorno Descrio
{} No existe tabela corrente.
aEstrutura Array com todos os campos, onde cada elemento um subarray contendo Nome,
Tipo, Tamanho e Decimais.
Descrio
Esta funo utilizada para verificar a estrutura da tabela corrente da mesma forma que utilizada para
criar a tabela com a funo DBCREATE.

Para isto ela cria um array para gravar as informaes e as retorna.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBSTRUCT par a r ecuper ar a est r ut ur a da
t abel a cor r ent e.
USE Cl i ent e NEW
DBSTRUCT()
/ / Ret or na: {{Cod, N, 3, 0}, {Nome, C, 10, 0}, {I dade, N, 3, 0}, {Nasc, D, 8, 0}, {Pagt o, N, 7, 2}}

DBUnlock
Desbloqueia todos os registros da tabela corrente.
Sintaxe
DBUNLOCK() --> Nil
Retorno Descrio
NIL Sem retorno.
AdvPl________________________________________________________________195
Descrio
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar DBRUNLOCK
para todos os registros da lista DBRLOCKLIST.
Exemplo
/ / Est e exempl o most r a como l i ber ar t odos os r egi st r os bl oqueados da t abel a cor r ent e.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBUNLOCK()

DBUnlockAll
Desbloqueia todos os registros de todas as tabelas abertas.
Sintaxe
DBUNLOCKALL() --> Nil
Retorno Descrio
NIL Sem retorno.
Descrio
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar DBUNLOCK
para todos os registros da lista DBRLOCKLIST de todas as reas de trabalho.
Exemplo
/ / Est e exempl o most r a como l i ber ar t odos os r egi st r os bl oqueados da t abel a cor r ent e.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBUNLOCKALL()

Delete
Marca registros como deletados.
Sintaxe
DELETE [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________196
CondFor No
Expresso em ADVPL a ser resolvida para que o
registro seja marcado como deletado.
CondWhile No
Expresso em ADVPL que determina quando a
"deleo" deve parar (quando a expresso retornar
.F.
nRecs No N
Quando registros devem ser marcados como
deletados.
nRecno No N
Nmero do recno do registro a ser deletado.

Retorno Descrio
NIL Sem retorno.
Descrio
Este comando utilizado para marcar alguns registros da tabela corrente como deletados.

Se no forem especificadas as condies para que o registro seja marcado como deletado, marca toda a
tabela como se estivesse especificada a opo "ALL".

Pode-se especificar um escopo para que os registros sejam marcados atravs das opes "FOR CondFor" e
"WHILE CondWhile".

Pode-se tambm limitar o nmero de registros a serem marcados atravs da opo "NEXT nRecs" e
determinar que a "deleo" dos registros deve-se iniciar a partir do registro atual com "REST", mas caso
contrrio o comando executa um DBGOTOP() antes de iniciar a "deleo".

Se desejado marcar apenas determinado registro pode-se defini-lo atravs da especificao do recno
com "RECORD nRecno".
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando DELETE par a mar car al guns r egi st r os
dent r o de det er mi nado escopo como del et ado. Est e escopo def i ni do por I dade > 20, at
que o nome sej a mai or ou i gual a " VVV" , comea a del eo a par t i r do r egi st r o at ual e
mar ca apenas 10 r egi st r os:
USE Cl i ent e VI A " CTREECDX" NEW
DELETE FOR I dade>20 WHI LE Nome<" VVV" NEXT 10 REST

Deleted
Verifica se o registro foi deletado.
AdvPl________________________________________________________________197
Sintaxe
DELETED() --> Lgico
Retorno Descrio
.F. O registro no foi deletado
.T. O registro foi deletado
Descrio
Quando o registro deletado, permanece fisicamente na tabela, mas fica marcado como "deletado". Esta
funo verifica este estado. Quando executada a funo DBPACK todos os registros marcados como
deletados so apagados fisicamente enquanto a funo DBRECALL marca todos os registros deletados
como no-deletados.
Exemplo
// Este exemplo verifica se determinado registro est deletado, caso positivo, mostra uma mensagem:

USE "\ DADOSADV\ AA1990. DBF" SHARED NEW
DBGOTO( 100)
I F DELETED()
Messagebox( " O r egi st r o at ual f oi del et ado" , " Er r o" , 0)
BREAK
ENDI F


DevOutPict
Imprime o contedo na posio corrente formatando a sada.
Sintaxe
DEVOUTPICT ( xVal, cPicture ) --> NIL
Argumento Obrigat. Tipo Descrio
xVal Sim C, N ou
D
Informar valor a ser impresso.
cPicture Sim C Informar a mscara de formatao do dado.

Retorno Descrio
NIL Nenhum
AdvPl________________________________________________________________198
Descrio
DEVOUTPICT( ) imprime contedo na posio corrente de PROW( ) e PCOL( ), aplicando a mscara
cPicture.
Exemplo
nVal : = 100. 89
DevPos( 10, 10 ) / / conf i gur a l i nha 0, col una 0 par a i mpr esso
/ / @Pr ow( ) , Pcol ( ) PSAY " Mi nha l i nha e " +st r ( Pr ow( ) )
DevOutPict( nVal , " @E 999, 999. 99" ) / / i mpr i me 100, 89

DevPos
Posiciona linha e coluna de impresso.
Sintaxe
DEVPOS( nLin, nCol ) --> NIL
Argumento Obrigat. Tipo Descrio
nLin Sim N Informar nova linha de impresso.
nCol Sim N Informar nova coluna de impresso.

Retorno Descrio
NIL Nenhum
Descrio
DEVPOS( ) modifica a linha e coluna corrente de impresso. Modifica os retornos de PROW() e PCOL( ).
Exemplo
DevPos( 10, 10 ) / / conf i gur a l i nha 0, col una 0 par a i mpr essao
@Pr ow( ) , Pcol ( ) PSAY " Mi nha l i nha e " +st r ( Pr ow( ) )

Directory
Cria um array com dados dos diretrios e dos arquivos.
Sintaxe
AdvPl________________________________________________________________199
DIRECTORY( cDirSpec , [ cAtributos ]) -->Array
Argumento Obrigat. Tipo Descrio
cDirSpec Sim C
Identifica o drive, o caminho de onde as informaes sero
buscadas. O Caminho pode estar no servidor ou no local (Remote).
Especifica os atributos especiais de arquivos/diretrios que devem
ser includos na busca por informaes. Abaixo esto os atributos
aceitos. Note que o atributo normal sempre considerado, desde
que no seja informado.
Atributo Descrio
H Incluir arquivos ocultos (Hidden)
S Incluir arquivos de sistema.
D
Incluir diretrios
cAtributos No C
V Procurar o nome do disco (label)

Retorno Descrio
Retorna um array de subarrays onde cada
subarray contm informaes sobre um arquivo
ou diretrio que correspondem a cDirSpec.
Os subarrays possuem a seguinte estrutura,
definida em directry.ch:
F_NAME Caracter, Nome do arquivo
F_SIZE Numrico, Tamanho do arquivo
F_DATE Data, Data de modificao do arquivo
F_TIME Caracter, Hora de modificao do
arquivo
Array
F_ATTR Caracter, Atributos do arquivo.
Descrio
DIRECTORY() funo que retorna informaes de arquivos/diretrios que correspondam a uma mscara
especifica.

Tanto arquivos no servidor como no cliente (Remote) so aceitos. Os atributos so sempre aditivos.

Utilize Directory() ao invs de ADIR().
AdvPl________________________________________________________________200
Exemplos
#include "Directry.ch"
/ /
aDi r ect or y : = DIRECTORY( "*. *" , " D" )
AEVAL( aDi r ect or y, {| aFi l e| QOUT( aFi l e[ F_NAME] ) } )
DirRemove
Elimina um diretrio.
Sintaxe
DIRREMOVE( cDirNome ) --> lSuccesso
Argumento Obrigat. Tipo Descrio
cDirNome Sim C
Nome do diretrio a ser removido, opcionalmente incluindo o
caminho. O diretrio ser removido no servidor.

Retorno Descrio
.T. O diretrio foi eliminado.
.F. No foi possivel eliminar o diretrio.
Descrio
DIRREMOVE() elimina um diretrio especifico.

Note que necessrio ter direitos suficientes para remover um diretrio, e o diretrio para ser eliminado
precisa estar vazio, sem subdiretrios e arquivos.
Exemplo
DIRREMOVE( " c: \ t est e\ um\ doi s" ) / / El i mi nando umdi r et r i o, semt est ar o r et or no
bResul t : = DIRREMOVE( " c: \ t est e\ um" ) / / El i mi na e t est a o r et or no
I F bResul t
? " I mpossi vel excl ui r o di r et r i o"
ENDI F
DiskSpace
Retorna o espao disponvel em um disco especfico.
AdvPl________________________________________________________________201
Sintaxe
DISKSPACE([ nDrive ]) --> nBytes
Argumento Obrigat. Tipo Descrio
nDrive No N
Nmero do drive, onde 0 o espao do diretrio corrente, e 1 o A:
do cliente, B: o 2 do cliente, etc.

Retorno Descrio
nBytes Nmero de bytes disponveis no disco informado.

Descrio
DISKSPACE() uma funo de ambiente que determina quantos bytes esto disponveis em um
determinado disco.

Ao ser utilizado zero e o diretrio corrente for local, ser retornado o espao disponvel no cliente ( remote
), caso o diretrio corrente esteja no servidor, ser retornado o espao disponvel no servidor.
Exemplos
CURDI R( " \ SI GAADV" ) / / Posi ci ona no di r et or i o SI GAADV do ser vi dor
? DISKSPACE( 0 ) / / Ret or na o espao di sponi vel no ser vi dor .
? DISKSPACE( 1 ) / / Ret or na o espao di sponi vel no dr i ve a: l ocal ( r emot e ) .
CURDI R( " C: \ WI NDOWS" ) / / Posi ci ona no di r et or i o SI GAADV do ser vi dor
? DISKSPACE( 0 ) / / Ret or na o espao di sponi vel na est ao.
Dow
Converte uma data para o valor numrico do dia da semana.
Sintaxe
DOW( dData ) --> Numrico
Argumento Obrigat. Tipo Descrio
dData Sim D o valor da data a converter.

Retorno Descrio
AdvPl________________________________________________________________202
>=0 e
<=7
Retorna um nmero entre zero e sete, representando o dia da semana. O
primeiro dia da semana 1 (Domingo) e o ltimo 7 (Sbado). Se a data
for vazia ou invlida, DOW() retorna zero.
Descrio
DOW() uma funo que converte uma data para o valor numrico que representa o dia da semana. til
quando se deseja fazer clculos semanais. DOW() similar a CDOW(), que retorna o dia da semana como
uma cadeia de caracteres.
Exemplos
Estes exemplos mostram como usar CDOW() e o seu relacionamento com DOW():

dDat a : = DATE( ) / / Resul t ado: 09/ 01/ 01
nDi aDaSemana : = DOW(DATE()) / / Resul t ado: 3
cDi aDaSemana : = CDOW( DATE( ) ) / / Resul t ado: Tuesday
nDi aDaSemana : = DOW(DATE() - 2) / / Resul t ado: 1
cDi aDaSemana : = CDOW( DATE( ) - 2) / / Resul t ado: Sunday

Esta funo de usurio utiliza DOW() para calcular a data da ltima segunda-feira da data informada.

FUNCTI ON Last Monday( dDat a)
RETURN ( dDat a - DOW(dData) + 2)
Dtoc
Converte uma data para cadeia de caracteres.
Sintaxe
DTOC( dData ) --> Caracter
Argumento Obrigat. Tipo Descrio
DData Sim D o valor a converter.

Retorno Descrio
Caracter uma cadeia de caracteres representando o valor da data. O retorno
formatado utilizando-se o formato corrente definido pelo comando SET DATE
FORMAT. O formato padro mm/dd/yy. Para uma data nula ou invlida, o
retorno ser uma cadeia de caracteres com espaos e tamanho igual ao
formato atual.
Descrio
AdvPl________________________________________________________________203
DTOC() converte uma data para uma cadeia de caracteres formatada segundo o padro corrente, definido
pelo comando SET DATE. Se for necessria a utilizao de formatao especial, use a funo
TRANSFORM() <a>.

Em expresses de ndices de arquivo, use DTOS() no lugar de DTOC() para converter datas para cadeia de
caracteres.
Exemplos
cDat a : = DATE( ) / / Resul t ado: 09/ 01/ 90
cDat a : = DTOC(DATE()) / / Resul t ado: 09/ 01/ 90
cDat a : = "Today i s " + DTOC(DATE()) / / Resul t ado: Today i s 09/ 01/ 90
Dtos
Converte uma data para uma cadeia de caracteres no formato yyyymmdd.
Sintaxe
DTOS( dData ) --> Caracter
Argumento Obrigat. Tipo Descrio
dData Sim D o valor da data a converter.

Retorno Descrio
Caracter Retorna uma cadeia de caracteres com oito byte de tamanho no formato yyyymmdd. Quando
dData nulo ou invalido, DTOS() retorna uma cadeia de caracteres com oito espaos. O
valor retornado no afetado pela formato da data corrente.
Descrio
DTOS() uma funo de converso de data que pode ser usada para criar expresses de ndice. O
resultado estruturado visando manter a ordem correta do ndice (ano, ms, dia).
Exemplos
cDat a : = DATE( ) / / Resul t ado: 09/ 01/ 90
cDat a : = DTOS(DATE()) / / Resul t ado: 19900901
nLen : = LEN( DTOS(CTOD(""))) / / Resul t ado: 8

Este exemplo mostra como criado um ndice composto usando DTOS():

USE Vendas NEW
I NDEX ON DTOS(Data) + Vendedor TO Dat aNome
AdvPl________________________________________________________________204
Eject
Fora a impresso de nova pgina no relatrio.
Sintaxe
EJECT( )--> NIL
Retorno Descrio
NIL Sem retorno
Descrio
EJECT( ) efetua o salto de pgina na impresso de relatrio configurando o PROW( ) para 0.
Exemplo
SETPRC( 0, 0) / / i ni ci a i mpr essao na l i nha 0 col una 0
PCOL( 10 ) / / muda par a col una 10
@ROW( ) , PCOL( ) PSAY " Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PRNFLUSH( ) / / For ca i mpr essao ant es do t er mi no da pagi na.
PROW( PROW( ) +2 ) / / Pul a 2 l i nhas
PCOL( 10 )
@PROW( ) , PCOL( ) PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
/ / PROW( 0 ) / / Sal t a a pagi na
EJECT( ) / / Sal t a de pagi na
FECHAREL( ) / / Fecha i mpr essao

ElapTime
Retorna o tempo decorrido entre duas horas.
Sintaxe
ElapTime( cHoraInicial , cHoraFinal ) --> Caracter
Argumento Obrigat. Tipo Descrio
cHoraInicial Sim C Informe a hora inicial no formato
hh:mm:ss, onde hh a hora ( 1 a 24 ),
mm os minutos e ss os segundos
cHoraFinal Sim C Informe a hora final no formato
hh:mm:ss, onde hh a hora ( 1 a 24 ),
mm os minutos e ss os segundos.
AdvPl________________________________________________________________205

Retorno Descrio
Caracter A diferena de tempo no formato hh:mm:ss, onde hh a
hora ( 1 a 24 ), mm os minutos e ss os segundos
Descrio
ElapTime() retorna uma cadeia de caracteres contendo a diferena de tempo no formato hh:mm:ss, onde
hh a hora ( 1 a 24 ), mm os minutos e ss os segundos.
Exemplos
Este exemplo compara ELAPTIME():
cHor aI ni ci o : = TI ME( ) / / Resul t ado: 10: 00: 00
.
. <i nst r ucoes>
.
cEl apsed : = ELAPTIME(TIME(), cHor aI ni ci o)
FClose
Fecha um arquivo binrio e grava os buffers no disco.
Sintaxe
FCLOSE( nHandle ) --> Lgico
Argumento Obrigat. Tipo Descrio
nHandle Sim N Handle a ser fechado

Retorno Descrio
.F. nHandle informado no corresponde a um arquivo aberto
previamente, ou erro na gravao dos buffers pendentes,
verifique atravs de FERROR() maiores detalhes sobre o erro.
.T. Arquivo foi fechado com sucesso.
Descrio
Fecha um manipulador ( handle ) de um arquivo binrio. Este manipulador deve ter sido aberto atravs
das funes FOPEN(), FOPENPORT(), FCREATE().
Exemplo
AdvPl________________________________________________________________206
O exemplo abaixo utiliza o CLOSE para fechar um arquivo.

#i ncl ude "Fi l ei o. ch"
/ /
nHandl e : = FCREATE( "Test f i l e" , FC_NORMAL)
I F !FCLOSE(nHandle)
conout ( " Er r o f echando ar qui vo: " + St r ( FEr r or ( 0 )
ENDI F
FCreate
Cria um arquivo, ou elimina o contedo de um arquivo.
Sintaxe
FCREATE( cArq, [ nAtributo ]) --> nHandle
Argumento Obrigat. Tipo Descrio
cArq S C
Nome do arquivo a ser criado, o caminho pode ser includo. So vlidos
caminhos no local (remote) e no servidor.
nAtributo Opcional N Atributos no qual o arquivo ser criado.

Retorno Descrio
>0 Numrico. O Handle do arquivo para ser usado nas demais funes de arquivo.
-1
Erro na criao do arquivo, verifique FERROR() para obter maiores detalhes do erro.
Descrio
FCREATE() uma funo de baixo-nvel que permite a manipulao direta dos arquivos textos como
binrios.

Ao ser executada FCREATE() cria um arquivo ou elimina o seu contedo, e retorna o handle (Manipulador)
do arquivo, para ser usado nas demais funes.

O Arquivo deve ser fechado atravs da funo FCLOSE().

Os Atributos para criao do arquivo esto abaixo, e esto definidos no header fileio.ch.

AdvPl________________________________________________________________207
FC_NORMAL Criao normal do Arquivo (default/padro).
FC_READONLY Cria o arquivo protegido para gravao.
FC_HIDDEN Cria o arquivo como oculto.
FC_SYSTEM Cria o arquivo como sistema.


Note que se o arquivo existir, o contedo ser truncado para zero bytes.
Exemplo
#i ncl ude "Fi l ei o. ch"
I F ( nHandl e : = FCREATE("Testfile", FC_NORMAL)) == -1
? " Ar qui vo no pode ser cr i ado" , FERROR( )
BREAK
ELSE
FWRI TE( nHandl e, " ol a! ! ! " )
FCLOSE( nHandl e)
ENDI F
FErase
Apaga um arquivo do disco.
Sintaxe
FERASE( cArq ) --> nSucesso
Argumento Obrigat. Tipo Descrio
cArg S C
Apaga um arquivo do disco, aceita caminhos locais (Remote), ou
caminhos no servidor Advanced Protheus.

Retorno Descrio
Arquivo foi apagado com sucesso.
-1 O Arquivo no foi apagado, verifique FERROR() para obter maiores detalhes.
Descrio
Elimina um arquivo. O Arquivo pode estar no servidor ou no local (Remote).

O Arquivo para ser apagado deve estar fechado. No permitido a utilizao de caracteres coringa
(wildcards).
AdvPl________________________________________________________________208
Exemplos
/ / Est e exempl o apaga t odos os ar qui vos . BAK do di r et r i o cor r ent e.
#i ncl ude "Di r ect r y. ch"
AEVAL( DI RECTORY( " *. BAK" ) , { | aFi l e| FERASE(aFile[F_NAME]) })
/ / / Est e exempl o apaga umar qui vo no cl i ent e ( Remot e ) e i mpr i me uma mensagemcaso / /
el e apr esent e er r o.
I F FERASE("AFile.txt") == - 1
? " Fi l e er ase er r or : " , FERROR( )
BREAK
ENDI F
FError
Verifica se houve erros aps uma operao com arquivos binrios.
Sintaxe
FERROR() --> Numrico
Retorno Descrio
0 Operao realizada com sucesso. Sem erros
2 Arquivo no encontrado
3 Caminho no encontrado
4 Muitos arquivos abertos
5 Acessso negado
6 Manipulador Invalido ( Handle )
8 Memria Insuficiente
15 Drive invlido especificado
19 Tentativa de gravar em disco protegido contra-gravao
21 Drive No esta pronto
23 Dados com erro de CRC
29 Erro de gravao
30 Erro de leitura
32 Violao de compartilhamento
33 Erro de Lock
Descrio
FERROR() a funo que retorna o cdigo de erro mais especfico, aps a execuo de funes com
arquivos binrios, tais como: FOPEN(), FCLOSE(), FWRITE(), FREAD().
AdvPl________________________________________________________________209

Se FERROR() retornar zero, indica sucesso na ltima operao.

FERROR() sempre retorna o estado da ultima operao.
Exemplo
#include "Fileio.ch"
/ /
nHandl e : = FCREATE( "Temp. t xt " , FC_NORMAL)
I F FERROR() ! = 0
conout ( " Er r o ao cr i ar o ar qui vo, Er r o: " St r ( FEr r or ( ) )
ENDI F
FieldBlock
Retorna um bloco de cdigo para um campo determinado da tabela corrente.
Sintaxe
FIELDBLOCK( cCampo ) --> Bloco de Cdigo
Argumento Obrigat. Tipo Descrio
cCampo S C Nome do campo a ser retornado o bloco de cdigo.

Retorno Descrio
bBloco Bloco de cdigo. Bloco de cdigo para o campo especificado na tabela corrente.
Descrio
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado. Sendo que
quando o bloco resultante executado sem valor recupera o valor armazenado no campo, mas quando
executado com um valor, seta este valor no determinado campo.

Portanto, o bloco retornado similar a: &("{|Valor| IF(Valor==NIL, Campo, Campo:=Valor)}")
Sendo: Campo = parmetro da funo FIELDBLOCK()
Valor = valor executado no bloco de cdigo
Exemplo
/ / Est e exempl o most r a como se pode usar o FI ELDBLOCK par a cr i ar o bl oco de cdi go par a o
campo Nome da t abel a cor r ent e na var i vel bBl oco:
USE Cl i ent e VI A " DBFCDX" NEW
AdvPl________________________________________________________________210
bBl oco : = FIELDBLOCK("Nome")
FieldWbl
Retorna um bloco de cdigo para um campo determinado especificando a rea de trabalho.
Sintaxe
FIELDWBLOCK(<cCampo>,<nArea>) --> Bloco de Cdigo
Argumento Obrigat. Tipo Descrio
cCampo S C Nome do campo a ser retornado o bloco de cdigo.
cArea S N Nmero da rea de trabalho a ser criado o bloco de cdigo.

Retorno Descrio
bWBloco Bloco de cdigo. Bloco de cdigo para o campo especificado na rea de trabalho determinada.
Descrio
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado em
determinada rea de trabalho. Sendo que quando o bloco resultante executado sem valor recupera o
valor armazenado no campo, mas quando executado com um valor seta esta valor no determinado
campo.
Portanto o bloco retornado similar a:
&("{|Valor| IF(Valor==NIL, nArea->Campo, nArea->Campo:=Valor)}")
Sendo: Campo = parmetro da funo FIELDBLOCK()
nArea = nmero da rea de trabalho especificada no funo FIELDWBLOCK()
Valor = valor executado no bloco de cdigo
Exemplo
/ / Est e exempl o most r a como se pode usar o FI ELDWBLOCK par a cr i ar o bl oco de cdi go par a
o campo Nome da r ea de t r abal ho 3 na var i vel bBloco:
USE Cl i ent e VI A " DBFCDX" NEW
bBl oco : = FI ELDBLOCK( " Nome" , 3)
File
Verifica se um arquivo ou mscara de arquivos existem.
AdvPl________________________________________________________________211
Sintaxe
FILE( cArquivo ) --> lExiste
Argumento Obrigat. Tipo Descrio
cArquivo S C
Nome do arquivo podendo incluir caminhos. Caminhos locais (Remote)
ou caminhos de servidor so aceitos.

Retorno Descrio
.F. O Arquivo ou padro de busca existem.
.T. O Arquivo ou padro no existem.
Descrio
Verifica se existe um arquivo ou um padro de arquivos, no diretrio. Os caracteres * e ?. so aceitos.
Caminhos de servidor e locais so aceitos.
Exemplos
FILE("teste.dbf") / / Ver i f i ca no di r et r i o cor r ent e se exi st e o ar qui vo t est e. dbf
FILE("\SIGAADV\TESTE.dbf") / / / / Ver i f i ca no di r et r i o Si gaadv do ser vi dor se cor r ent e e
se exi st e o ar qui vo t est e. dbf
FILE("C:\TEMP\TESTE.dbf") / / / / Ver i f i ca no di r et r i o Temp do cl i ent e ( Remot e) se exi st e
o ar qui vo t est e. dbf
FOpen
Abre um arquivo binrio.
Sintaxe
FOPEN( cArq , nModo ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Arquivo a ser aberto em modo binrio.
nModo No N
Modo como o arquivo dever ser aberto. O Modo
de abertura um modo composto entre modo de
acesso e modo de compartilhamento. O modo
padro de abertura zero, o que indica sem
compartilhamento e somente leitura.

Retorno Descrio
AdvPl________________________________________________________________212
-1 Erro na abertura do arquivo. Verifique FERROR() para maiores
detalhes do erro
>0 Handle do arquivo, a ser usado com as demais funes de arquivo
Descrio
FOPEN() abre um arquivo de modo binrio, permitindo a leitura ou gravao atrves das funes
FREAD(), FWRITE().

Todo arquivo aberto atravs da FOPEN(), deve ser fechado atravs da FCLOSE().

O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.

Modos de Acesso
FO_READ Apenas Leitura
FO_WRITE Apenas Gravao
FO_READWRITE Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT Modo de compatibilidade ( Padro )
FO_EXCLUSIVE Exclusivo
FO_DENYWRITE No permite que outros abram o arquivo para
gravao
FO_DENYREAD No permite que outros abram o arquivo para
leitura
FO_DENYNONE permite leitura e gravao
FO_SHARED Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a maneira como o
arquivo ser aberto e sua acessibilidade em um ambiente de rede.

Sero aceitos tantos caminhos baseados no servidor, como caminhos locais ( remote ).
Exemplo
Este exemplo usa o FOPEN() para abrir um arquivo para leitura/gravao de maneira compartilhada e
mostra uma mensagem de erro caso a abertura falhe:
AdvPl________________________________________________________________213
#i ncl ude "Fi l ei o. ch"
/ /
nHandl e : = FOPEN("Temp.txt", FO_READWRITE + FO_SHARED)
I F FERROR( ) ! = 0
? " I mpossi vel abr i r o ar qui vo, Er r o : " , FERROR( )
BREAK
ENDI F
FOpenPort
Abre uma porta paralela ou serial.
Sintaxe
FOPENPORT( cPorta , [ cParm ], [ nModo ] ) --> Numrico
Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Dispositivo a ser usado.
cParm Sim C Caractersticas do dispositivo, apenas vlido
para portas seriais. Os parmetros so:
Velocidade (BPS), Paridade, DataBits,
StopBits, Timeout de leitura ( Opcional ).
nModo No N Modo como o dispositivo dever ser aberto. O
Modo de abertura um modo composto entre
modo de acesso e modo de compartilhamento.
O modo padro de abertura zero, o que
indica sem compartilhamento e somente
leitura.

Retorno Descrio
-1 Erro na abertura do arquivo. Verifique FERROR() para maiores detalhes
do erro
>0 Handle do dispositivo, a ser usado com as demais funes de arquivo.
Descrio
FOPENPORT() abre um dispositivo, permitindo a leitura ou gravao atrves das funes FREAD(),
FWRITE().
Todo arquivo aberto atravs da FOPENPORT(), deve ser fechado atravs da funo FCLOSE().
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.
Modos de Acesso
FO_READ Apenas Leitura
AdvPl________________________________________________________________214
FO_WRITE Apenas Gravao
FO_READWRITE Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT Modo de compatibilidade ( Padro )
FO_EXCLUSIVE Exclusivo
FO_DENYWRITE No permite que outros abram o arquivo
para gravao
FO_DENYREAD No permite que outros abram o arquivo
para leitura
FO_DENYNONE permite leitura e gravao.
FO_SHARED Igual ao FO_DENYNONE

O modo de acesso em combinao ( + ) com o modo de compartilhamento determina a maneira como o
arquivo ser aberto e sua acessibilidade em um ambiente de rede.

O dispositivo ser aberto no diretrio corrente, ou seja, caso o diretrio esteja posicionado no cliente, o
dispositivo ser aberto no cliente ( Remote ), caso contrrio ser aberto no servidor.

Os parmetros das portas seriais servem para configurar a comunicao serial e podem ser os seguintes:

Velocidade
(BaudRate)
9600 ( Default ),19200,38400,57600,115200.
Paridade N ( Default, Sem Paridade ), E ( Par ), O ( Impar ).
DataBits 6,7 ou 8 ( Default ) Bits.
StopBits 1 ( default ) ou 2 Bits.
Timeout de leitura 1000 ( Default ), Valores acima de zero. Tempo em milisegundos de
espera por dados a serem lidos.
Exemplo
Este exemplo usa o FOPENPORT() para abrir uma porta de impresso para gravao e mostra uma
mensagem de erro caso a abertura falhe:
#i ncl ude "Fi l ei o. ch"
/ /
nHandl e : = FOPENPORT("LPT1:", "", FO_WRITE)
I F FERROR( ) ! = 0
? " I mpossi vel abr i r a i mpr essor a LPT1, Er r o : " , FERROR( )
BREAK
ENDI F
AdvPl________________________________________________________________215
Este exemplo abre uma porta serial e espera para obter uma leitura da porta.
#i ncl ude "Fi l ei o. ch"
/ /
CURDI R( " C: \ TEMP" ) / / Posi ci onando no di r et r i o cl i ent e ( Remot e )
nHandl e : = FOPENPORT("COM1:", "9600,N,8,1,10000", FO_WRITE)
I F FERROR( ) ! = 0
? " I mpossi vel abr i r a i mpr essor a LPT1, Er r o : " , FERROR( )
BREAK
ENDI F
FREAD(
FRead
L caracteres binrios de um arquivo.
Sintaxe
FREAD( nHandle , @cBuffer , nQtdBytes ) --> Numrico
Argumento Obrigat. Tipo Descrio
nHandle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT()
cBufferVar Sim C o nome de um buffer onde os dados lidos devero ser armazenados.
O tamanho desta varivel deve ser maior ou igual ao tamanho
informado em nQtdBytes. Esta varivel deve ser sempre passada por
referncia. ( @ antes do nome da varivel )
nQtdBytes Sim N Nmero mximo de bytes que devem ser lidos.

Retorno Descrio
Numrico Quantidades de bytes lidos. Caso a quantidade seja menor que a
solicitada, indicar erro ou final de arquivo. Verifique FERROR() para
obter maiores detalhes
Descrio
FREAD() l a partir um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados e
armazena no buffer informado. FREAD() l normalmente caracteres de controle (ASC 128, ASC 0, etc.).

FREAD() ler at o nmero de bytes informado em nQtdBytes; caso acontea algum erro ou o arquivo
chegue ao final, FREAD() retornar um nmero menor que o nQtdBytes.

O buffer passado para leitura deve ser sempre pr-alocado e passado como referncia. Caso contrrio, os
dados no podero ser retornados.

AdvPl________________________________________________________________216
FREAD() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() ou por FWRITE(),
FREADSTR().
Exemplos
Este exemplo l 128 bytes em um buffer.
#def i ne F_BLOCK 128
/ /
cBuf f er : = SPACE( F_BLOCK)
nHandl e : = FOPEN( " Temp. t xt " )
/ /
I F FERROR( ) ! = 0
? " Aber t ur a de ar qui vos comer r o: ", FERROR( )
ELSE
I F FREAD(nHandle, @cBuffer, F_BLOCK) <> F_BLOCK
? " Er r o l endo ar qui vo"
ENDI F
FCLOSE( nHandl e)
ENDI F
FReadStr
L caracteres de um arquivo binrio.
Sintaxe
FREADSTR( nHandle , nQtdBytes ) --> Caracter
Argumento Obrigat. Tipo Descrio
nHandle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT().
nQtdBytes Sim N Nmero mximo de bytes que devem ser lidos.

Retorno Descrio
Retorno varivel Retorna uma string contendo os caracteres lidos.

Descrio
FREADSTR() l de um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT().

FREAD() ler at o nmero de bytes informado em nQtdBytes ou at encontrar um CHR(0). Caso acontea
algum erro ou o arquivo chegue ao final, FREAD() retornar uma string menor do que nQdBytes e
colocar o erro em FERROR().

AdvPl________________________________________________________________217
FREADSTR() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() ou por FWRITE(
), FREAD().
Exemplos
Este exemplo l os 16 caracteres de um arquivo e imprime o seu contedo.
#i ncl ude "Fi l ei o. ch"
/ /
nHandl e : = FOPEN( " New. t xt " , FC_NORMAL)
I F FERROR( ) ! = 0
? " Er r o abr i ndo o ar qui vo" , FERROR( )
ELSE
cSt r i ng : = FREADSTR(nHandle, 16)
? cSt r i ng
FCLOSE( nHandl e)
ENDI F
Frename
Muda o nome de um arquivo.
Sintaxe
FRENAME(cNomeAntigo, cNovoNome) --> nSucesso
Argumento Obrigat. Tipo Descrio
cOldFile S C
Nome do arquivo ser renomeado, aceita caminhos do servidor e
caminhos do cliente.
cNewFile S C
Novo nome do arquivo, aceita tambm caminho do servidor, e caminho
do cliente.

Retorno Descrio
A mudana foi executada com sucesso.
-1
Ocorreu algum erro na mudana de nome, verifique se os dois caminhos esto no
mesmo ambiente. (Local/Local, Servidor/Servidor). Verifique FERROR() para
detalhes do erro.
Descrio
FRENAME() renomeia um arquivo para outro nome, tanto no servidor como na estao. Ao renomear um
arquivo no esquea que esta arquivo dever estar fechado.
Exemplos
/ / Renomeando ar qui vos no cl i ent e.
I F FRENAME( " C: \ TEMP\ Ar qAnt i go. t xt " , " C: \ TEMP\ Ar qNovo. t xt " ) == - 1
? " Er r o ao r enomear " , FERROR( )
ENDI F
AdvPl________________________________________________________________218
/ / Renomeando ar qui vos no Ser vi dor .
I F FRENAME( " \ SI GAADV\ Ar qAnt i go. t xt ", " \ SI GAADV\ Ar qNovo. t xt " ) == - 1
? " Er r o ao r enomear " , FERROR( )
ENDI F
FSeek
Posiciona o arquivo binrio.
Sintaxe
FSEEK( nHandle , nOffset , [ nOrigem ]) --> Numrico
Argumento Obrigat. Tipo Descrio
nHandle Sim N Manipulador obtido atravs das funes FOPEN, FCREATE.
nOffset Sim N Nmero de bytes que o ponteiro do arquivo deve ser movido a partir
da origem informada em nOrigem. O nmero pode ser positivo ou
negativo. O destino no precisa existir no arquivo.
nOrigem No N Indica a partir de qual posio do arquivo, o nOffset ser considerado.

Retorno Descrio
Numrico A nova posio do arquivo.
Descrio
FSEEK() posiciona o ponteiro do arquivo para as prximas operaes de leitura ou gravao. As
movimentaes de ponteiros so relativas nOrigem que pode ter os seguintes valores definidos em
fileio.ch:

FS_SET Ajusta a partir do inicio do arquivo.
FS_RELATIVE Ajuste relativo a posio atual do arquivo.
FS_END Ajuste a partir do final do arquivo

Exemplo
/ / Exempl o cal cul a o t amanho do ar qui vo.
#i ncl ude "Fi l ei o. ch"
/ /
/ / Abr e o ar qui vo apenas par a l ei t ur a
I F ( nHandl e : = FOPEN( " Temp. t xt " ) ) >= 0
/ /
/ / Pega o t amanho do ar qui vo
AdvPl________________________________________________________________219
nLengt h : = FSEEK(nHandle, 0, FS_END)
/ /
FCLOSE( nHandl e)
ELSE
? " Er r o na aber t ur a do ar qui vo" , FERROR( )
ENDI F
FWrite
Grava em um arquivo binrio.
Sintaxe
FWRITE( nHandle , cBuffer , [ nQtdBytes ]) --> Numrico
Argumento Obrigat. Tipo Descrio
nHandle Sim N o manipulador retornado pelas funes FOPEN(), FCREATE(),
FOPENPORT().
cBuffer Sim C o nome de um buffer de onde os dados sero gravados. O tamanho
desta varivel deve ser maior ou igual ao tamanho informado em
nQtdBytes (caso seja informado o tamanho).
nQtdBytes No N Quantidade de bytes a serem gravados.

Retorno Descrio
Numrico Quantidade de bytes efetivamente gravados. Se o retorno for menor que o nQtdBytes,
houve um erro na gravao. Verifique FERROR() para mais detalhes.
Descrio
FWRITE() grava em um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados do
buffer informado. FWRITE() grava normalmente caracteres de controle ( ASC 128, ASC 0, etc. ).

FWRITE() gravar at o nmero de bytes informado em nQtdBytes; caso acontea algum erro, retornar
um nmero menor que o nQtdBytes.

FWRITE() grava a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() ou por
FREAD(), FREADSTR().
Exemplos
Este exemplo copia um arquivo para outro.
#i ncl ude "Fi l ei o. ch"
AdvPl________________________________________________________________220
#def i ne F_BLOCK 512
/ /
cBuf f er : = SPACE( F_BLOCK)
nI nf i l e : = FOPEN( " Temp. t xt " , FO_READ)
nOut f i l e : = FCREATE( " Newf i l e. t xt " , FC_NORMAL)
l Done : = . F.
/ /
DO WHI LE ! l Done
nByt esRead : = FREAD( nI nf i l e, @cBuf f er , F_BLOCK)
I F FWRITE(nOutfile, cBuffer, nBytesRead) < ;
nByt esRead
? " Er r o gr avando: " , FERROR( )
l Done : = . T.
ELSE
l Done : = ( nByt esRead == 0)
ENDI F
ENDDO
/ /
FCLOSE( nI nf i l e)
FCLOSE( nOut f i l e)
GetImpWindows
Retorna lista de impressoras disponveis para impresso.
Sintaxe
GETIMPWINDOWS( lServer ) --> Array
Argumento Obrigat. Tipo Descrio
lServer Sim L Informar .T. se desejar lista de impressoras do Server e .F. se desejar
lista de impressoras do Remote.

Retorno Descrio
Array Array com nome das impressoras disponveis.
Descrio
GETIMPWINDOWS( ) retorna uma lista de impressoras disponveis no spool do Server ou Remote. Se o
Server est em ambiente Unix, a GETIMPWINDOWS( ) retornar a lista com os nomes de impressoras
cadastradas na chave PRINTERSNAME do AP6SRV.INI (ver PREPAREPRINT( )).
Exemplo
aI mpr essor as: = GetImpWindows(.F.) / / r et or na l i st a de i mpr essor as do Wi ndows do r emot e.

GetPortActive
AdvPl________________________________________________________________221
Retorna lista de portas de impresso disponveis.
Sintaxe
GETPORTACTIVE ( lServer ) --> Array
Argumento Obrigat. Tipo Descrio
lServer Sim L Informar .T. se desejar lista de impressoras
do Server e .F. se desejar lista de
impressoras do Remote.

Retorno Descrio
Array Array com nome das impressoras disponveis
Descrio
GETPORTACTIVE( ) retorna uma lista de portas de impresso disponveis do Server ou Remote. Se o
Server est em ambiente Unix, a GETPORTACTIVE( ) retornar uma lista com os nomes de devices
possveis para impresso.
Exemplo
aPor t as: = GetPortActive(.F.) / / r et or na l i st a de por t as de i mpr essao do r emot e.

GetClientDir
Retorna o diretrio onde est instalado o Remote.
Sintaxe
GetClientDir( ) --> cDir
Retorno Descrio
cDir Caracter, diretrio aonde est instalado o remote.
Descrio
Retorna o diretrio onde o Remote est instalado.
Exemplo
? GetClientDir() / / I mpr i me o di r et r i o onde est i nst al ado o r emot e
/ / Exempl o de sa da
/ / c: \ ap6\ bi n\ r emot e
AdvPl________________________________________________________________222

Header
Verifica o tamanho do cabealho da tabela corrente.
Sintaxe
HEADER() --> Numrico
Retorno Descrio
0 No h tabela corrente
nBytes Tamanho do cabealho da tabela corrente em nmero de bytes
Descrio
Esta funo pode ser utilizada em conjunto com as funes RecSize e RecCount para calcular o tamanho
ocupado no disco pela tabela corrente. Pois, o tamanho ser Header+RecSize*RecCount.
Exemplo
/ / Est e exempl o cal cul a o t amanho ocupado pel a t abel a "AA1990. DBF" no di sco ( nmer o de
byt es) :
USE "\ DADOSADV\ AA1990. DBF" SHARED NEW
nCabecal ho : = HEADER()
nDados : = RecSi ze( ) * RecCount ( )
nTamanhoTot al : = nCabecal ho + nDados

I ndexKey
Verifica qual a expresso de chave de um ndice.
Sintaxe
INDEXKEY( nOrdem ) --> Caracter
Argumento Obrigat. Tipo Descrio
nOrdem S N Posio do ndice na lista.

Retorno Descrio
AdvPl________________________________________________________________223
"" No existe ndice para o parmetro nOrdem corrente.
cExpOrdem Expresso de chave da ordem ativa ou especificada pelos parmetros.
Descrio
Esta funo utilizada para verificar qual a expresso de chave de determinado ndice, especificado pela
posio do ndice na lista pelo primeiro parmetro.

Se for passado parmetro igual a 0, ser retornada a expresso de chave do ndice atual.
Exemplo
/ / Est e exempl o most r a como o I NDEXKEY( ) pode r ecuper ar a expr esso do ndi ce at ual :
USE Cl i ent e NEW
I NDEX ON Nome+Cod TO I nd1 FOR Nome+Cod > " AZZZZZZZ"
I NDEX ON Nome TO I nd2 FOR Nome > " CCCCCCC"
INDEXKEY(1) / / Ret or na: Nome+Cod
INDEXKEY(2) / / Ret or na: Nome
INDEXKEY(0) / / Ret or na: Nome - expr esso cor r ent e
IndexOrd
Verifica a posio do ndice corrente.
Sintaxe
INDEXORD() --> Numrico
Retorno Descrio
0 No existe ndice ou tabela corrente
nOrd Posio do ndice corrente na lista
Descrio
Est a f uno r et or na a posi o ocupada pel o ndi ce cor r ent e dent r o da l i st a de ndi ces.
Exemplo
/ / Est e exempl o ver i f i ca qual a posi o do ndi ce cor r ent e dent r o da l i st a
USE Cl i ent e NEW
SET I NDEX TO Nome, End, Cep
INDEXORD() / / Ret ur ns: 1 - o pr i mei r o ndi ce da l i st a
I nitPrint
AdvPl________________________________________________________________224
Inicializa parmetros de impresso de relatrio.
Sintaxe
INITPRINT([ nOutPut ], [ cNameRel ], [ cType ] ,[ lPort ],[ cPathAtu ]) --> NIL
Argumento Obrigat. Tipo Descrio
nOutPut No N Direcionamento da sada de impresso. 1=via Client (padro) e 2=via
Server
cNameRel No C Nome do relatrio que ser exibido no spool de impresso
cType No C Tipo do relatrio. "220" = 220 colunas, "132L"= 132 colunas
landscape (Padro), "132P"= 132 colunas portrait, "080" = 80 colunas
portrait
lPort No L No utilizado
cPathAtu No L No utilizado

Retorno Descrio
NIL Sem retorno
Descrio
INITPRINT() inicializa parmetros de impresso de relatrio. Define onde ser a sada de impresso e qual
vai ser a formatao de sada.
Exemplo
/ * I ni ci al i za r el at r i o par a i mpr i mi r vi a Cl i ent "Meu r el at r i o" emf or mul r i o de 132
col unas
emLandscape */
InitPrint( 1, " Meu r el at r i o" , " 132L" )

IsPrinter
Verifica se impressora est disponvel.
Sintaxe
ISPRINTER( [ xPorta ], [ lSeta ], [ nWhere ], [ @nErrorCode ] ) --> Lgico
Argumento Obrigat. Tipo Descrio
xPorta No C ou
N
Informar a porta que desejamos verificar
"LPT1" (padro), "LPT2" , "COM1", "COM2"
ou 1=LPT1, 2=LPT2.
AdvPl________________________________________________________________225
lSeta No L No utilizado
nWhere No N 1= testa impressora no Remote (default),
2= testa impressora no Server.
nErrorCode No N Retorna o cdigo de erro da impressora

Retorno Descrio
.T. Impressora ativa
.F. Impressora inativa
Descrio
ISPRINTER( ) testa a disponibilidade de impressoras conectadas fisicamente mquina onde est sendo
executado o Server ou Remote Protheus. Dependendo do sistema operacional, o teste pode ser um
Assembler em Windows 95 ou 98, ou a criao de um arquivo em Windows NT,2000 e Unix.

Nos casos onde o teste efetuado por criao de arquivo, o nErrorCode no ser informado.
Exemplo
I f !isPrinter(1,,1,@nErr) / / t est a se i mpr essor a est a conect ada na l pt 1 no Remot e.
MsgBox( " I mpr essor a no conect ada! Er r o: " +St r ( nEr r ) )
endi f
IsCisaSyncOn
Verifica se o uso do CisaSync est habilitado.
Sintaxe
IsCisaSyncON() -> Lgico
Retorno Descrio
.F. No est habilitado.
.T. Est habilitado.
Descrio
Esta funo utilizada para verificar se o uso do CisaSync est habilitado ou no.
Exemplo
AdvPl________________________________________________________________226
/ / Est e exempl o demonst r a como se pode ut i l i zar I sCi saSyncOn ver i f i car se o Ci saSync est
habi l i t ado.
USE Cl i ent e NEW
I F ( ISCISASYNCON())
QOUT( " Ci saSync habi l i t ado" )
ELSE
QOUT( " Ci saSync desabi l i t ado" )
ENDI F
Locate
Pesquisa um registro segundo um determinado escopo.
Sintaxe
LOCATE FOR CondFor [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
CondFor S
Expresso
AdvPl
Expresso em ADVPL a ser resolvida para o registro a ser
aceito.
CondWhile N
Expresso
AdvPl
Expresso em ADVPL que determina quando a busca deve
parar (quando a expresso retornar .F.)
nRecs N N Quando registros devem ser verificados.
nRecno N N Nmero do recno do registro a ser verificado.
Descrio
Este comando utilizado para encontrar um registro com determinado valor dentro de um escopo
especificado na tabela corrente.

Se a pesquisa obteve xito, a flag FOUND retorna .T. e a tabela posicionada no registro encontrado;
caso FOUND retorne .F., a tabela posicionada em EOF.

Se as opes do escopo forem omitidas (CondWhile, nRecs e nRecno), todos os registros so pesquisados,
desde o primeiro como a opo "ALL".

Caso contrrio, a opo "WHILE CondWhile" determina quando a busca deve parar (a expresso retornar
.F.); "NEXT nRecs" determina quantos registros devem ser pesquisados na busca; "RECORD nRecno"
determina o recno do registro a ser verificado na busca; "REST" significa que a busca deve comear a
partir do prximo registro.
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando LOCATE no seu modo mai s usual :
USE Cl i ent e NEW
LOCATE FOR Nome=" J ose"
AdvPl________________________________________________________________227
FOUND( ) / / Ret or na: . T.
EOF( ) / / Ret or na: . F.
RECNO( ) / / Ret or na: 5
LOCATE FOR Nome=" DDDDD"
FOUND( ) / / Ret or na: . F.
EOF( ) / / Ret or na: . T.
RECNO( ) / / Ret or na: 85
/ / Est e exempl o demonst r a como se pode ut i l i zar o comando LOCATE par a l i st a t odos os
Cl i ent e de nome " J ose" comi dade 20 anos:
USE Cl i ent e NEW
DBGOTOP( )
LOCATE FOR I dade=20 WHI LE Nome=" J ose"
DO WHI LE FOUND( )
DBSKI P( )
LOCATE REST FOR I dade=20 WHI LE Nome=" J ose"
ENDDO
LUpdate
Verifica a data da ltima modificao da tabela corrente.
Sintaxe
LUpdate() --> Data
Retorno Descrio
Data em branco No h tabela corrente
Data Data da ltima modificao da tabela corrente (dia, ms e ano)
Descrio
Esta funo verifica qual a data da ltima modificao e fechamento da tabela corrente, caso no exista
tabela corrente retornada uma data em branco.
Exemplo
/ / Most r a a dat a da l t i ma modi f i cao da t abel a cor r ent e, caso no exi st a t abel a
cor r ent e most r a uma mensagemde er r o:
dModi f i cacao : = LUpdate()
I F ( EMPTY( dModi f i cacao) )
Messagebox( " No h t abel a cor r ent e" , " Er r o" , 0)
BREAK
ELSE
CONOUT ( " A dat a da ul t i ma modi f i cacao e: " + DTOS( dModi f i cacao) )
ENDI F

MakeDir

Cria um diretrio.
AdvPl________________________________________________________________228
Sintaxe
MAKEDIR( cNovoDir ) --> Numrico
Argumento Obrigat. Tipo Descrio
CNovoDir Sim C Nome do diretrio a ser criado, incluindo opcionalmente o caminho.

Retorno Descrio
0 Diretrio foi criado com sucesso
- 1 Erro na criao do diretrio
Descrio
Cria um diretrio na estao ou no servidor Advanced Protheus.
Exemplo
MAKEDIR( " c: \ t est e\ um" ) / / Cr i a umdi r et r i o na est acao
nResul t : = MAKEDIR( "\ t est e\ um") / / Cr i a o di r et or i o no ser vi dor Advanced pr ot heus
I F nResul t ! = 0
conout ( " I mpossi vel cr i ar o di r et r i o no ser vi dor Pr ot heus" + St r ( nResul t ) )
ENDI F
MAKEDIR( "t est e" ) / / Exempl o t ambmvl i do ( Cr i ando o di r et r i o no ser vi dor )
MemoLine
Extrai uma linha de uma string ou de um campo memo.
Sintaxe
MEMOLINE( cString, [ nLineLength ], [ nLineNumber ], [ nTabSize ], [ lWrap ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cString Sim C a string original de onde ser extrada a linha.
nLineLength No N Nmero de caracteres por linha. Caso no especificado, assume 79.
nLineNumber No N Nmero da linha a ser retornada. Caso no especificado, assume 1.
nTabSize No N Define o nmero de caracteres para o Tab. Caso no especificado,
assume 4.
lWrap No L Habilita a quebra de linhas de acordo com as palavras. Caso no
especificada, fica habilitado.

AdvPl________________________________________________________________229
Retorno Descrio
Caracter Caracter. Retorna a linha solicitada, caso no exista o nmero de linhas, retorna uma string
em branco.
Descrio
MemoLine() uma funo que retorna uma linha especfica. Caso no exista a linha especificada, retorna
um string em branco.

Caso a quebra de linhas esteja habilitada (lWrap igual .T.) e a palavra esteja no meio da quebra de linha,
esta ser colocada na prxima linha.

MemoLine() usada em conjunto com MLCOUNT() para extrair todas as linhas de um texto.
Exemplos
LOCAL nLi neLengt h : = 40, nTabSi ze : = 3, l Wr ap : = . T.
LOCAL nLi nes, nCur r ent Li ne
/ /
LOCAL cText o : = MEMOREAD( " Text o. TXT" )
nLi nes : = MLCOUNT( cText o, nLi neLengt h, nTabSi ze, l Wr ap)
/ /
FOR nCur r ent Li ne : = 1 TO nLi nes
conout ( MEMOLINE( Cust Not es, nLi neLengt h, nCur r ent Li ne, nTabSi ze, l Wr ap) )
NEXT
MemoRead
L um arquivo texto e retorna uma string.
Sintaxe
MEMOREAD( cFile ) --> Caracter
Argumento Obrigat. Tipo Descrio
cFile Sim C Nome do arquivo texto que dever ser lido. Caminhos podem ser
includos.

Retorno Descrio
varivel Caracter. MEMOREAD() retorna uma string com no mximo 65.535 bytes do arquivo
informado.

Descrio
AdvPl________________________________________________________________230
MemoRead() l um arquivo texto e armazena o contedo em uma varivel string. O arquivo pode conter
no mximo 65.535 bytes.

MemoRead() tentar abrir o arquivo compartilhado e somente para leitura.
Caso o arquivo no possa ser aberto, MemoRead retornar uma string vazia ( "" ).
Exemplos
cSt r i ng = MEMOREAD( "Temp. t xt " )
i f empt y( cSt r i ng )
conout ( " Er r o l endo ar qui vo")
endi f
MemoWrite
Grava uma string para um arquivo em disco.
Sintaxe
MEMOWRITE( cArquivo , cString ) -->Lgico
Argumento Obrigat. Tipo Descrio
cArquivo Sim C o nome do arquivo onde ser gravado, incluindo a extenso e o
caminho.
cString Sim C a string que ser gravada no arquivo.

Retorno Descrio
.T. O Arquivo foi gravado com sucesso
.F. Houve falha na criao e gravao do arquivo, verifique FERROR() para obter detalhes o erro.
Descrio
MEMOWRITE() uma funo que grava o contedo de uma string em um arquivo em disco.
Podem ser usados caminhos tanto no local ( Remote ) como no servidor.
Exemplos
LOCAL cSt r i ng : = " Test e de gr avao"
I F MEMOWRITE( " t est e. t xt " , cSt r i ng)
conout ( " Er r o gr avando t est e. t xt ")
ENDI F
AdvPl________________________________________________________________231
MLCount
Conta o nmero de linhas de uma String.
Sintaxe
MLCOUNT( cString , [ nLineLength ], [ nTabSize ], [ lWrap ]) --> Numrico
Argumento Obrigat. Tipo Descrio
cString Sim C a string original de onde ser extrada a linha.
nLineLength No N Nmero de caracteres por linha. Caso no especificado, assume 79.
nTabSize No N Define o nmero de caracteres para o Tab. Caso no especificado,
assume 4.
lWrap No L Habilita a quebra de linhas de acordo com as palavras. Se no
especificado, fica habilitado.

Retorno Descrio
>=0 Numrico. Nmero de linhas que a string possui.
Descrio
MLCOUNT() retorna o nmero de linhas de uma string baseado nos parmetros informados.
Exemplos
LOCAL nLi neLengt h : = 40, nTabSi ze : = 3, l Wr ap : = . T.
LOCAL nLi nes, nCur r ent Li ne
/ /
LOCAL cText o : = MEMOREAD( " Text o. TXT" )
nLi nes : = MLCOUNT( cText o, nLi neLengt h, nTabSi ze, l Wr ap)
/ /
FOR nCur r ent Li ne : = 1 TO nLi nes
conout ( MEMOLI NE( Cust Not es, nLi neLengt h, nCur r ent Li ne, nTabSi ze, l Wr ap) )
NEXT
Month
Converte o valor da data para o nmero do ms.
Sintaxe
MONTH( dData ) --> Numrico
AdvPl________________________________________________________________232
Argumento Obrigat. Tipo Descrio
dData Sim D o valor da data a ser convertido

Retorno Descrio
>=0 e <=12 Para uma data vlida.
0 Se a data for nula ou invlida
Descrio
MONTH() uma funo de converso que extrai da data o valor numrico do ms.

CMONTH() uma funo semelhante que retorna o nome do ms a partir do valor de dData.
Exemplos
Estes exemplos retornam o ms da data do sistema:
dDat a : = DATE( ) / / Resul t ado: 09/ 01/ 01
nMes : = MONTH(DATE()) / / Resul t ado: 9
nMes : = MONTH(DATE()) + 1 / / Resul t ado: 10
MsCompress
Compacta um ou vrios arquivos em um nico arquivo com extenso .MZP.
Sintaxe
MSCOMPRESS( cArq, [ cDestino ], [ cSenha ] ) --> lSucesso
Ou
MSCOMPRESS( aArquivos, [ cDestino ], [ cSenha ] ) --> lSucesso

Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Arquivo a ser compactado.
aArquivos Sim A Nomes dos arquivos a serem compactados.
cDestino No C
Nome do Arquivo destino, caso a extenso seja omitida ser assumido
.MZP, se no for informado assumir o mesmo nome do cArq com
extenso .MZP ou o nome do 1. Arquivo no Array aArquivos.
AdvPl________________________________________________________________233
cSenha No C Senha a ser utilizada para criptografar o arquivo.

Retorno Descrio
.T. A compactao foi executada com sucesso.
.F. Erro na compactao, verifique o espao disponvel para compactao.

Descrio
MSCOMPRESS() compacta os arquivos informados em um nico arquivo com extenso default .MZP. O
formato proprietrio e multiplataforma.

Caso a senha seja informada apenas com a senha poderemos descompactar os arquivos.
A funo para descompactao a MSDECOMP().
Tanto arquivos no local ( Remote ) como no Servidor so aceitos.
Exemplos
/ / Exempl o 1 Compact a apenas umar qui vo
l Res : = MSCOMPRESS( " AP6SRV. EXE" , "AP6SRV. MZP" )
/ / Exempl o 2 Compact a umdi r et r i o comsenha
aNome : = {}
ADI R( " *. DBF" , aNome )
l Res : = MSCOMPRESS( aNome, " Ar qComp. MZP", " SENHA" )

MsCRC32
Calcula um CRC de uma string.
Sintaxe
MSCRC32( cString ) --> nCRC
Argumento Obrigat. Tipo Descrio
cString Sim C
String de onde ser calculado um CRC32, garantido que para a
mesma string sempre se obter um mesmo nmero, porm, no
garantido que para strings diferentes, os nmeros sejam sempre
diferentes.

Retorno Descrio
AdvPl________________________________________________________________234
nCRC Um nmero indicando o CRC da string informada.
Descrio
MSCRC32() calcula um CRC de uma string informada e retorna um nmero com esse clculo.

Note que strings iguais retornam CRC iguais, porm, nem sempre strings diferentes retornam CRC
diferentes.
Exemplo
cSt r i ng : = MEMOREAD( " ARQ. TXT" )
? MSCRC32( cSt r i ng )
MsCRC32Str
Calcula um CRC de uma string, retornando em formato String.

Sintaxe
MSCRC32STR( cString ) --> cCRC.
Argumento Obrigat. Tipo Descrio
cString Sim C
String de onde ser calculado um CRC32, garantido que para a
mesma string sempre obter um mesmo nmero, mas no
garantido que para strings diferentes os nmeros sejam sempre
diferentes


Retorno Descrio
nCRC Uma string com o CRC da string informada
Descrio
MSCRC32STR() calcula um CRC de uma string informada e retornando uma string com esse clculo.

Note que strings iguais retornam CRC iguais, porm nem sempre strings diferentes retornam CRC
diferentes.
AdvPl________________________________________________________________235
Exemplo
cSt r i ng : = MEMOREAD( " ARQ. TXT" )
? MSCRC32STR( cSt r i ng )

MsDecomp
Descompacta arquivos no formato .MZP (Microsiga Zip).
Sintaxe
MSDECOMP( cArqZip, cPathDestino, [ cSenha ] ) --> lSucesso.
Argumento Obrigat. Tipo Descrio
cArq Sim C Nome do Arquivo a ser descompactado.
cPathDestino No C
Diretrio onde os arquivos devero ser descompactados. Note que
podem ser includos caminhos do servidor como caminhos locais (
Remote ).
cSenha No C Senha a ser utilizada para descriptografar o arquivo.

Retorno Descrio
.T. A descompactao foi executada com sucesso.
.F. Erro na compactao, verifique o espao disponvel para descompactao.

Descrio
MSDECOMP() descompacta o arquivo informado em um diretrio. O Formato proprietrio, e multi-
plataforma, suporta apenas arquivos compactados pela funo MSCOMPRESS().

Caso o arquivo seja protegido por senha, apenas com a senha poderemos descompact-lo.

A funo para compactao a MSCOMPRESS().

Tanto arquivos no local ( Remote ) como no Servidor so aceitos.
Exemplo
AdvPl________________________________________________________________236
/ / Exempl o 1 Descompact a no ser vi dor
l Res : = MSDECOMP( " AP6SRV. MZP", " TEMP" )
/ / Exempl o 2 Descompact a no l ocal ( Remot e )
l Res : = MSCOMPRESS( " c: \ Ar qComp. MZP" , " SENHA" )

OrdCondSet
Seta a condio e o escopo para a ordem corrente.
Sintaxe
ORDCONDSET([ cForCond ],,,,[ bEval ],,,,,, [ lDescendente ],,,,) --> Lgico
Argumento Obrigat. Tipo Descrio
cForCond No C
Expresso na forma textual a ser
resolvida para verificar se o
registro em questo est dentro
do escopo definido
bEval No Bloco de Cdigo
Expresso na forma executvel a
ser resolvida para cada registro
processado. Este bloco deve
retornar tipo lgico
lDescendente No L
Especifica se a ordem deve ser
crescente ou decrescente

Retorno Descrio
.F. No conseguiu setar o filtro
.T. Filtro setado com sucesso
Descrio
Esta funo utilizada para setar uma ordem de registro que esteja dentro de um escopo e de uma
condio especificada. Se todos os parmetros forem omitidos sero aceitos todos os registros da ordem.

Atravs do primeiro parmetro (cForCond) possvel especificar o escopo ao qual o registro deve
pertencer para estar dentro do filtro. Atravs do parmetro bEval, pode-se definir um bloco de cdigo que
deve retornar .T. para que o registro pertena ao filtro a ser setado.

Se o parmetro lDescendente for omitido, a ordem estar crescente, mas se tiver valor .T. ser
decrescente.
Exemplo
AdvPl________________________________________________________________237
/ / Est e exempl o most r a como se pode usar o ORDCONDSET par a execut ar umf i l t r o comi dade
ent r e 20 e 30 anos e nome J oao:
USE Cl i ent e VI A " DBFCDX" NEW
ORDCONDSET( " I dade>20 . AND. I dade<30" , , , , {| | Nome = " J oao" })

OrdCreate
Cria uma ordem em determinado arquivo de ndice.
Sintaxe
ORDCREATE([ cIndice ],[ cOrdem ], cExpChave, [ bExpChave ], [ lUnico ]) --> Nil
Argumento Obrigat. Tipo Descrio
cIndice No * C Nome do arquivo de ndice a ser criada a ordem.
cOrdem No * C Nome da ordem a ser criada.
cExpChave Sim C
Expresso das chaves da ordem a ser criada na forma de
string.
bExpChave No
Bloco de
Cdigo
Expresso das chaves da ordem a ser criada na forma
executvel.
lUnico No
L
Cria ndice como nico (o padro .F.).


*Obs: Os dois primeiros parmetros so opcionais, mas pelo menos um deles tem que estar especificado.

Retorno Descrio
NIL Sem retorno
Descrio
Esta funo utilizada para criar uma nova ordem em determinado arquivo de ndice com o nome
especificado atravs do primeiro parmetro, sendo que, se o mesmo existir, apenas acrescentada a
ordem, mas, caso contrrio, criado o arquivo.

Para tanto, so executados os passos a seguir:

AdvPl________________________________________________________________238
1- Salva fisicamente as alteraes ocorridas na tabela corrente;
2- Fecha todos os arquivos de ndice abertos;
3- Cria o novo arquivo de ndice se no existir;
4- Cria a nova ordem;
5- Seta a nova ordem como a ordem corrente;
6- Posiciona a tabela corrente no primeiro registro do ndice.

Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao
da ordem, pois na criao de ndices no Ctree alterada a estrutura da tabela, sendo necessrio que a
tabela esteja aberta em modo exclusivo.
Exemplo
/ / Est e exempl o most r a como se pode cr i ar novo ar qui vo de ndi ce cr i ando a or demsobr e os
campos Nome e End e no acei t ar dupl i cao:
USE Cl i ent e VI A " DBFCDX" NEW
ORDCREATE ( " \ t est e\ i nd2. cdx" , , " Nome+End", { | | Nome+End }, . T. )
/ / Est e exempl o most r a como se pode cr i ar nova or dem( Tag2) sobr e o campo End que
acei t ar dupl i cao e no ar qui vo de ndi ce j exi st ent e:
USE Cl i ent e VI A " DBFCDX" NEW
ORDCREATE ( " \ t est e\ i nd2. cdx" , "Tag2", " End" , { | | End })

OrdDescend
Verifica ou altera a condio (crescente/decrescente) de uma ordem.
Sintaxe
ORDDESCEND([ cOrdem | nPosicao ],[ cArqIndice ], [ lDecrescente ]) --> Lgico

Argumento Obrigat. Tipo Descrio
cOrdem No C Nome da ordem a ser alterada
nPosicao No N Posio da ordem na lista a ser alterada
cArqIndice No C Nome do arquivo de ndice
lDecrescente No L
Determina se a ordem ser decrescente (.T.) ou crescente (.F.)

Retorno Descrio
AdvPl________________________________________________________________239
.F. A ordem do parmetro est na forma crescente
.T. A ordem do parmetro est na forma decrescente
Descrio
Esta funo pode ser utilizada para apenas verificar o estado da ordem atual, se no for especificado o
parmetro lDecrescente.

Quando especificado o parmetro lDescend, o estado da ordem modificado, sendo que a funo
retorna ao estado anterior da ordem em questo.

Para evitar conflito, no caso de haver mais de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.

A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
Exemplo
/ / Est e exempl o most r a como o ORDBAGNAME pode encont r ar o nome de di f er ent es ndi ces
at r avs da posi o da or demna l i st a:
USE Cl i ent e VI A " DBFCDX" NEW
ORDLI STADD ( " \ t est e\ i nd1. cdx" , " NOME" ) / / A or dem cr i ada na f or ma cr escent e
ORDDESCEND() / / Ret or na: . F.
ORDDESCEND(,,.T.) / / Ret or na: . F. , mas set a a or demat ual ( NOME) como decr escent e
ORDDESCEND() / / Ret or na: . T.
ORDLI STADD ( " \ t est e\ i nd2. cdx" , " NOME" )
ORDDESCEND("NOME","ind1",.F.) / / Ret or na: . T.
ORDDESCEND("NOME","ind1",) / / Ret or na: . F.

OrdKey
Verifica qual a expresso de chave da ordem.
Sintaxe
ORDKEY([ cOrdem | nPosicao ],[ cArqIndice ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cOrdem No C Nome da ordem a ser alterada
nPosicao No N Posio da ordem na lista
AdvPl________________________________________________________________240
cArqIndice No C Nome do ndice

Retorno Descrio
"" No existe ordem corrente.
cExpOrdem Expresso de chave da ordem ativa ou especificada pelos
parmetros.
Descrio
Esta funo utilizada para verificar qual a expresso de chave de determinada ordem.

Caso no sejam especificados os parmetros de identificao da ordem, verificada a ordem corrente.

Para evitar conflito, no caso de haver mais de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.

A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
Exemplo
/ / Est e exempl o most r a como o ORDKEY( ) pode r ecuper ar a expr esso da or demat ual :
USE Cl i ent e NEW
I NDEX ON Nome+Cod TO I nd1 FOR Nome+Cod > " AZZZZZZZ"
ORDKEY("Ind1") / / Ret or na: Nome+Cod

OrdListAdd
Acrescenta uma ou mais ordens lista.
Sintaxe
ORDLISTADD( cArqIndice, [ cOrdem ]) --> Nil
Argumento Obrigat. Tipo Descrio
cArqIndice Sim C Nome do ndice a ser acrescentado, com ou sem diretrio e extenso
AdvPl________________________________________________________________241
cOrdem No C Nome da ordem a ser acrescentada

Retorno Descrio
NIL Sem retorno
Descrio
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.

Quando so especificados os dois argumentos (ndice e ordem), acrescentada apenas a ordem
especificada nos parmetros lista e a mesma torna-se ativa.

Quando especificado apenas o primeiro parmetro, so acrescentadas todas as ordens contidas no
arquivo de ndice especificado neste parmetro lista, e a primeira ordem torna-se ativa.

Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas, caso contrrio, deve ser especificado.
Exemplo
/ / Est e exempl o most r a como se pode acr escent ar uma or demespec f i ca ou t odas as or dens
de det er mi nado ar qui vo de ndi ce l i st a:
USE Cl i ent e VI A " DBFCDX" NEW
OrdListAdd ( " \ t est e\ i nd1. cdx" , " NOME" ) / / Acr escent a apenas a or demNOME
OrdListAdd ( " \ t est e\ i nd2. cdx" ) / / Acr escent a t odas as or dens do ar qui vo i nd2. cdx

PRow
Informa ou muda a linha corrente de impresso.
Sintaxe
PROW( [ nNewLine ] ) --> Numrico
Argumento Obrigat. Tipo Descrio
nNewLine No N Informar a nova linha de impresso.

Retorno Descrio
AdvPl________________________________________________________________242
N Nmero da linha corrente de impresso
Descrio
PROW( ) pode ser utilizado para informar a linha corrente de impresso ou para modific-la. Se a nova
linha informada for menor que a corrente, isto provocar um salto de pgina na impresso.
Exemplo
@PROW( ), 10 PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( PROW( )+2 ) / / Pul a 2 l i nhas
@PROW( ), 10 PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( 0 ) / / Sal t a a pagi na

Pack
Remove todos os registros deletados da tabela.
Sintaxe
PACK
Descrio
Este comando apaga (fisicamente) todos os registros deletados da tabela corrente.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar a f uno DBDELETE() par a mar car al guns
r egi st r os como del et ados e o comando PACK par a del et - l os f i si cament e.
USE Cl i ent es NEW
DBGOTO( 100)
DBDELETE( )
DBGOTO( 105)
DBDELETE( )
DBGOTO( 110)
DBDELETE( )
PACK

PCol
Informa ou muda a coluna corrente de impresso.
Sintaxe
PCOL( [ nNewCol ] ) --> Numrico
AdvPl________________________________________________________________243
Argumento Obrigat. Tipo Descrio
nNewCol No N Informar a nova coluna de impresso.

Retorno Descrio
N Nmero da coluna corrente de impresso.
Descrio
PCOL( ) pode ser utilizado para informar a coluna corrente de impresso ou para modific-la. Se for
informada uma coluna menor que a corrente, sero impressos caracteres de BACKSPACE chr(8) para
forar o retorno do carro de impresso em impressoras matriciais.
Exemplo
PCOL( 10 )
@ROW( ) , PCOL( ) PSAY " Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( PROW( ) +2 ) / / Pul a 2 l i nhas
PCOL( 10 )
@PROW( ) , PCOL( ) PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( 0 ) / / Sal t a a pagi na

PreparePrint
Prepara o relatrio para o inicio da impresso.
Sintaxe
PREPAREPRINT( lWindows, cPrinterName, lDisco, cFile, l_Lpd, nLeftMargin ) --> NIL
Argumento Obrigat. Tipo Descrio
lWindows Sim L Define se a impresso ser via spool do Windows ou diretamente
em porta de impresso.
cPrinterName Sim C Informa o nome da impressora que ser acionada. Se
lWindows=.T., deve-se informar o nome da impressora Windows.
Se lWindow=.F., deve-se informar o nome da porta de impresso
"LPT1","LPT2".
lDisco Sim L Informa se a impresso ser direcionada para gravao em arquivo.
Se lDisco=.T., lWindows e cPrinterName, no tero efeito ento
deve-se informar o nome do arquivo de sada em cFile.
cFile Sim C Informa o nome de arquivo que ser gerado se lDisco=.T..
l_lpd No L Aplicvel somente para Server executando em ambiente Unix.
Informa que a impresso ser direcionada para disco e logo em
AdvPl________________________________________________________________244
seguida direcionada para o LPD (daemon de impresso do Unix).
nLeftMargin No N Margem esquerda do relatrio para ajuste para encadernao em
cm.

Retorno Descrio
NIL Sem retorno.
Descrio
PREPAREPRINT( ) ajusta a impresso do relatrio propriamente dita, define se utilizar o spool do
Windows ou se o relatrio ser direcionado para arquivo. Pode-se ajustar a margem esquerda do relatrio
para encadernaes.

Quando estamos utilizando um servidor em ambiente Unix, pode-se configurar a sada do relatrio para
utilizar o LPD (Line Printer Daemon) do Unix. Ative o parmetro l_lpd para .T., e no arquivo de
configurao do Server (AP6SRV.INI), crie a entrada abaixo:

[SERVERPRINTERS]

PRINTERSNAME=lp1,lp2[...,lp3]

Onde PRINTERSNAME uma lista com os nomes das impressoras cadastradas no \etc\printcap. Para mais
informaes veja manual do Unix para configurao de impressoras. Lembrando que o Unix case-
sensitive quando trata nomes e arquivos.
Exemplo
/ / Envi a a i mpr essao par a a i mpr essor a "Laser J et 4. . " e conf i gur a a mar gemesquer da par a 1
cmpar a di r ei t a
PreparePrint( . T. , "Laser J et 4 i n / / advpr 1" , . F. , " " , . F. , 1 )

PrnFlush
Fora envio do buffer de impresso para a impressora.
Sintaxe
PRNFLUSH( ) --> NIL
Retorno Descrio
NIL Sem retorno
AdvPl________________________________________________________________245
Descrio
Nas impresses, o Protheus bufferiza a impresso em pginas para enviar todo o contedo para a
impressora de forma otimizada. PRNFLUSH( ) fora o envio do buffer de dados para a impressora antes do
previsto pela otimizao de impresso.
Exemplo
SETPRC( 0, 0) / / i ni ci a i mpr esso na l i nha 0 col una 0
PCOL( 10 ) / / muda par a col una 10
@ROW( ) , PCOL( ) PSAY " Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PRNFLUSH( ) / / For ca i mpr esso ant es do t er mi no da pagi na.
PROW( PROW( ) +2 ) / / Pul a 2 l i nhas
PCOL( 10 )
@PROW( ) , PCOL( ) PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( 0 ) / / Sal t a a pagi na
FECHAREL( ) / / Fecha i mpr esso

RDDSetDefault
Modifica ou verifica o RDD padro.
Sintaxe
RDDSetDefault ([ cNovoRddPadro ]) --> Caracter
Argumento Obrigat. Tipo Descrio
cNovoRddPadro No C Novo nome do RDD a ser definido como padro.


Retorno Descrio
cAntigoRddPadro Nome do RDD padro corrente
Descrio
Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for
omitido seu parmetro.

Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do
parmetro.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o RDDSETDEFAULT par a al t er ar o val or do
RDD padr o.
RDDSETDEFAULT( "CTREECDX" ) / / Ret or na: DBFCDX
RDDSETDEFAULT() / / Ret or na: CTREECDX
AdvPl________________________________________________________________246

RealRDD
Retorna qual o driver que realmente est sendo utilizado para abertura dos arquivos locais.
Sintaxe
REALRDD() --> Caracter
Retorno Descrio
"ADS" Advantage Local Server
"ADSSERVER" Advantage Database Server
"CTREE" Ctree - Faircom
"CODEBASE" Codebase
Descrio
O driver "DBFCDX" pode ser utilizado para a abertura de arquivos Codebase, Advantage Database Server,
Advantage Local Server ou Ctree. Depende do que est especificado na chave LOCALFILES do ambiente
utilizado, no arquivo de inicializao do servidor.

REALRDD() retorna o nome do driver que realmente est sendo utilizado para abertura dos arquivos
locais.
Exemplo
i f RealRdd()=" CODEBASE"
conout ( " Mudar aber t ur a dos ar qui vos par a ADS. " )
endi f

Recall
Altera o estado deletado de alguns registros.
Sintaxe
RECALL [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________247
CondFor Sim
Expresso em ADVPL a ser resolvida para o registro ser
aceito.
CondWhile No
Expresso em ADVPL que determina quando a busca deve
parar (quando a expresso retornar .F..
nRecs No N Quando registros devem ser verificados.
nRecno No N Nmero do recno do registro a ser verificado.

Retorno Descrio
NIL Sem retorno
Descrio
Este comando utilizado para retirar a marca de registro deletado de alguns registros.

Para ser executado, os registros em questo devem estar bloqueados ou a tabela deve estar aberta em
modo exclusivo. Se o registro no estiver deletado, este comando no faz nada.

Ele o oposto da funo DBDELETE, que marca o registro atual como deletado.

A seleo dos registros a serem alterados feita da seguinte forma:

se todas as opes forem omitidas ele executado apenas para o registro atual;

se for especificada uma condio de "FOR", o escopo abrange todos os arquivos ("ALL");

o escopo vai at quando a condio de "WHILE" retorna .F.;

o parmetro "NEXT nRecs" determina quantos registros devem ser alterados;

o parmetro "RECORD nRecno" especifica qual recno do registro deve ser alterado;

a opo "REST" determina que sero processados os registros a partir do registro atual. Caso seja
omitida, o comando comea a processar a partir do primeiro registro.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o RECALL par a r et or nar o est ado do
r egi st r o at ual par a nor mal .
USE Cl i ent e
DBGOTO( 100)
DBDELETE( )
DELETED( ) / / Ret or na: . T.
RECALL
DELETED( ) / / Ret or na: . F.
/ / Est e exempl o demonst r a como se pode ut i l i zar o RECALL par a r et or nar o est ado de t odos
os r egi st r os que apr esent ami dade>30.
AdvPl________________________________________________________________248
USE Cl i ent e
RECALL FOR I dade>30
/ / Est e exempl o demonst r a como se pode ut i l i zar o RECALL par a r et or nar o est ado de t odos
os r egi st r os comi dade mai or que 30 e Nome = J oao a par t i r do r egi st r o at ual .
USE Cl i ent e
RECALL FOR I dade>30 WHI LE Nome=" J oao" REST

RecSize
Verifica o tamanho do registro da tabela corrente.
Sintaxe
RECSIZE() --> Numrico
Retorno Descrio
nBytes Tamanho do registro da tabela corrente em nmero de
bytes.
0 No h tabela corrente.
Descrio
Esta funo calcula o tamanho do registro da tabela corrente somando os tamanhos de cada campo mais
um byte da flag de registro deletado mais quatro bytes do campo recno.

Ela pode ser utilizada em conjunto com as funes Header e RecCount para calcular o tamanho ocupado
no disco pela tabela corrente, pois o tamanho ser Header+RecSize*RecCount.
Exemplo
/ / Est e exempl o cal cul a o t amanho ocupado pel a t abel a "AA1990. DBF" no di sco ( nmer o de
byt es) :
USE "\ DADOSADV\ AA1990. DBF" SHARED NEW
nCabecal ho : = HEADER( )
nDados : = RECSIZE() * RECCOUNT( )
nTamanhoTot al : = nCabecal ho + nDados

ReI ndex
Reconstri todos os ndices abertos da rea de trabalho corrente.
Sintaxe
REINDEX
AdvPl________________________________________________________________249
Descrio
Este comando reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro
registro lgico.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o DBREI NDEX par a r econst r ui r os ndi ces
depoi s que umnovo ndi ce f oi ger ado.
USE Cl i ent es NEW
DBSETI NDEX( " I ndNome")
REINDEX

Replace
Modifica o valor de alguns campos e registros da tabela corrente.
Sintaxe
REPLACE Campo WITH Exp [, Campo2 WITH Exp2 ] [FOR CondFor] [WHILE CondWhile] [NEXT
nRecs] [RECORD nRecno] [REST] [ALL]
Argumento Obrigat. Tipo Descrio
Campo Sim Nome do campo a ser alterado
Exp Sim Expresso em ADVPL com valor a ser colocado no campo especificado
CondFor No Expresso em ADVPL a ser resolvida para que o registro seja alterado
CondWhile No
Expresso em ADVPL que determina quando a alterao deve parar
(quando a expresso retornar .F.)
nRecs No
N
Quando registros devem ser alterados
nRecno No N Nmero do recno do registro a ser alterado
Descrio
Este comando utilizado para alterar o valor de determinado campo em alguns registros da tabela
corrente, onde o campo escolhido recebe o valor da expresso para os registros dentro do escopo
definido.

Se no forem especificadas as condies para que o registro seja alterado, modifica toda a tabela, como
se estivesse especificada a opo "ALL".

AdvPl________________________________________________________________250
Pode-se especificar um escopo para que os registros sejam alterados atravs das opes "FOR CondFor" e
"WHILE CondWhile".

Pode-se tambm limitar o nmero de registros a serem alterados atravs da opo "NEXT nRecs" e
determinar que a alterao dos registros deve-se iniciar a partir do registro atual com "REST", mas, caso
contrrio, o comando executa um DBGOTOP() antes de iniciar a alterao.

Se desejado alterar apenas determinado registro pode-se defini-lo atravs da especificao do recno
com "RECORD nRecno".
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando REPLACE al t er ar t odos os r egi st r os
dent r o do escopo, onde o campo " Val or " r eceber " Val or 1+Val or 2- Val or 3*0. 1" e o campo
" Di aTr an" r eceber a dat a at ual . Est e escopo def i ni do por I dade > 20, at que o nome
sej a mai or ou i gual a " VVV" , comea a del eo a par t i r do r egi st r o at ual e mar ca apenas
10 r egi st r os:
USE Cl i ent e VI A " CTREECDX" NEW
REPLACE Val or WI TH Val or 1+Val or 2- Val or 3*0. 1, Di aTr an WI TH Dat e( ) FOR I dade>20 WHI LE
Nome<" VVV" NEXT 10 REST

RLock
Bloqueia o registro corrente da tabela ativa.
Sintaxe
RLOCK() --> Lgico
Retorno Descrio
.F. No conseguiu bloquear o registro. Principal motivo: o registro j est bloqueado por outro
usurio.
.T. O registro foi bloqueado com sucesso.
Descrio
Esta funo utilizada quando se tem uma tabela aberta e compartilhada, e se deseja bloquear um
registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a
funo no altera seu estado.
Exemplo
//Este exemplo utiliza a funo RLOCK() para deletar o registro com o nome "Joao" da tabela de Clientes
indexada por Nome:
USE Cl i ent es I NDEX Nome SHARED NEW
SEEK " J oao"
I F FOUND( )
I F RLOCK()
AdvPl________________________________________________________________251
DELETE
Messagebox( " J oao del et ado", " OK", 0)
ELSE
Messagebox( " Regi st r o ut i l i zado por out r o usur i o" , "Er r o", 0)
ENDI F
ELSE
Messagebox( " Regi st r o no encont r ado" , "Er r o", 0)
ENDI F
CLOSE
/ / Est e exempl o most r a como se pode bl oquear umr egi st r o semque el e est ej a na t abel a
cor r ent e
USE VENDAS NEW
USE CLI ENTES NEW
/ /
I F ! VENDAS- >( RLOCK())
Messagebox( " Regi st r o ut i l i zado por out r o usur i o" , " Er r o" , 0)
BREAK
ENDI F

Seconds
Retorna o nmero de segundos decorridos desde a meia-noite.
Sintaxe
SECONDS() --> Numrico
Retorno Descrio
>=0 e <=86399 Retorna a hora do sistema em segundos. O valor numrico
representa o nmero de segundos decorridos desde a meia-noite,
baseado no relgio de 24 horas e varia de 0 a 86399.
Descrio
Esta funo retorna o nmero de segundos decorridos desde a meia-noite, segundo a hora do sistema.
Est relacionada funo TIME() que retorna a hora do sistema como uma cadeia de caracteres no
formato hh:mm:ss.
Exemplos
Este exemplo compara TIME() e SECONDS():
cHor a : = TI ME( ) / / Resul t ado: 10: 00: 00
cSegundos : = SECONDS() / / Resul t ado: 36000. 00
Est e exempl o usa a f uno SECONDS( ) par a cr onomet r ar o t empo decor r i do:
LOCAL nSt ar t , nEl apsed
nSt ar t : = SECONDS()
.
. <st at ement s>
.
nEl apsed: = SECONDS() - nSt ar t
cEl apsed : = LTRI M( STR( nEl apsed) ) + " seconds"
AdvPl________________________________________________________________252
Seek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe
SEEK Exp [SOFTSEEK]
Argumento Obrigat. Tipo Descrio
Exp Sim
Expresso em ADVPL a ser resolvida para o registro ser
encontrado

Retorno Descrio
NIL Sem retorno
Descrio
Este comando utilizado para encontrar um registro com determinado valor da expresso de chave de
ndice.

Antes da chamada do SEEK deve-se certificar de que existe uma ordem ativa no momento com os campos
que se deseja pesquisar o valor.

Caso a expresso possua apenas um campo numrico, o primeiro parmetro deve ser do tipo numrico,
mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetro (mesmo se forem
apenas dois campos numricos ou do tipo data).

Quando for especificada a opo "SOFTSEEK", mesmo que a expresso pesquisada no encontrar nenhum
registro com este valor, a tabela ser posicionada no prximo valor maior que o especificado no primeiro
parmetro, mas mesmo posicionando no prximo valor, esta funo retornar .F. (pois no encontrou).

Quando no for especificado este valor ou estiver .F. e falhar o valor de pesquisa, a tabela ser
posicionada em LASTREC + 1 e ser setada a flag de EOF.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o SEEK par a busca de val or es numr i cos.
USE Cl i ent es NEW
ORDLI STADD ( " / t est e/ i nd1. cdx" ) / / Expr esso Num( campo numr i co)
SEEK 100 / / Ret or na: . F.
EOF( ) / / Ret or na: . T.
SEEK 100 SOFTSEEK / / Ret or na: . F.
EOF( ) / / Ret or na: . F. ( poi s o sof t seek posi ci onou no pr xi mo r egi st r o)
AdvPl________________________________________________________________253
/ / Est e exempl o demonst r a como se pode ut i l i zar o SEEK par a per cor r er t odos os r egi st r os
de Cl i ent es como nome j oao e venci ment os a par t i r de j anei r o de 2001.
USE Cl i ent es NEW
ORDLI STADD ( " / t est e/ i nd2. cdx" ) / / Expr esso Nome+Venc ( campo car act er + dat a)
SEEK " j oao200101" SOFTSEEK / / Pr ocur a a pr i mei r a ocor r nci a de Nome " j oao" e
venci ment o mai or que J anei r o de 2001
WHI LE ! EOF( ) . AND. Nome == " j oao"
DBSKI P( )
ENDDO

Select
Seleciona nova rea de trabalho.
Sintaxe
SELECT nArea | Alias
Argumento Obrigat. Tipo Descrio
nArea Sim N Nmero da rea de trabalho a ser selecionada.
Alias Sim Nome da identificao da rea de trabalho a ser selecionada (Alias).

Descrio
Este comando utilizado para selecionar uma nova rea de trabalho para deix-la ativa.
Exemplo
/ / Est e exempl o demonst r a como se pode ut i l i zar o SELECT al t er ar a r ea cor r ent e.
USE Cl i ent es ALI AS a1
USE Cl i ent es2 ALI AS a2
SELECT a1 / / ou SELECT 1

Set Filter
Seta ou cancela uma condio de filtro.
Sintaxe
SET FILTER TO [ Condio ]
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________254
Condio No Expresso em ADVPL a ser setada como filtro na ordem corrente

Retorno Descrio
NIL Sem retorno
Descrio
Este comando utilizado para setar um filtro nos registros da tabela corrente especificado atravs da
condio especificada.

Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKIP, etc).

Se o comando chamado com condio em vazio, ser cancelado o filtro existente.
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando SET FI LTER par a set ar novas expr esses
de f i l t r o e r et i r - l as:
USE Cl i ent e VI A " CTREECDX" NEW
SET ORDER TO 2 / / Set a a or demde nome Nome do ndi ce I nd1
SET FILTER TO Idade>30 / / Fi l t r a os r egi st r os comI dade menor que 30
SET FILTER TO

Set Index
Acrescenta todas as ordens de um ou mais arquivos de ndice lista.
Sintaxe
SET INDEX TO [ ArqIndices ] [ ADDITIVE ]
Argumento Obrigat. Tipo Descrio
ArqIndices No
Nome dos arquivos de ndice a serem acrescentados lista de
ordens.

Retorno Descrio
NIL Sem retorno
AdvPl________________________________________________________________255
Descrio
Este comando utilizado para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho quando se especifica "ADDITIVE".

Quando o mesmo omitido, a lista de ordens esvaziada para depois ser acrescentada s ordens dos
ndices.

Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e torna-se ativa.

Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a primeira torna-se ativa.

Quando mais de um arquivo de ndice selecionado, a ordem que torna-se ativa a primeira ordem do
primeiro arquivo.

Quando o comando utilizado sem nenhum parmetro, todas as ordens da lista so apagadas.
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando SET I NDEX par a acr escent ar novas or dens
a l i st a e r et i r - l as depoi s:
USE Cl i ent e VI A " CTREECDX" NEW
SET INDEX TO ind1 / / I ni ci al i za a l i st a comas or dens do ar qui vo de ndi ce " i nd1"
SET INDEX TO ind2 ADDITIVE / / Acr escent a as or dens do ar qui vo de ndi ce " i nd2" na l i st a
SET INDEX TO ind3 / / Li mpa a l i st a e i ni ci al i za comas or dens do ar qui vo " i nd3"
SET INDEX TO / / Li mpa a l i st a de or dens

Set Order
Seleciona uma ordem ativa da rea de trabalho.
Sintaxe
SET ORDER TO [ nPosio | [ TAG cOrdem ] [ IN cIndice ]]
Argumento Obrigat. Tipo Descrio
nPosio No N Posio da ordem na lista de ordens ativas
cOrdem No Nome da ordem a ser setada
cIndice No
Nome do arquivo de ndice a ser ao qual pertence a ordem a ser
setada

AdvPl________________________________________________________________256
Retorno Descrio
NIL Sem retorno
Descrio
Este comando pode ser utilizado apenas para retornar a tabela corrente ordem original (recno), se no
for especificado nenhum parmetro.

Tambm pode ser utilizado para selecionar uma nova ordem para a tabela corrente atravs da posio da
ordem na lista de ordens ativas com o primeiro parmetro ou atravs do nome da ordem especificado
"TAG cOrdem".

Para evitar nomes de ordens duplicados, pode-se especificar a qual arquivo de ndice pertence com "IN
cIndice".
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando SET ORDER par a set ar novas or dens e
r et i r - l as:
USE Cl i ent e VI A " CTREECDX" NEW
SET ORDER TO TAG Nome I N I nd1 / / Set a a or demde nome Nome do ndi ce I nd1
SET ORDER TO 3 / / Set a a t er cei r a or demda l i st a
SET ORDER TO / / Ret i r a as or dens, set ando a or demnat ur al da t abel a


SetPrc
Configura a linha e coluna correntes de impresso.
Sintaxe
SETPRC( nLin, nCol ) --> NIL
Argumento Obrigat. Tipo Descrio
nLin Sim N Informar a nova linha de impresso
nCol Sim N Informar a nova coluna de impresso

Retorno Descrio
NIL Sem retorno.
Descrio
AdvPl________________________________________________________________257
SETPRC( ) modifica a linha e coluna atuais de impresso assim como PCOL( ) e PROW( ) chamados
separadamente.
Exemplo
SETPRC( 0, 0) / / i ni ci a i mpr esso na l i nha 0 col una 0
PCOL( 10 ) / / muda par a col una 10
@ROW( ) , PCOL( ) PSAY " Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( PROW( ) +2 ) / / Pul a 2 l i nhas
PCOL( 10 )
@PROW( ) , PCOL( ) PSAY "Mi nha Li nha nest a pagi na e " + st r ( PROW( ) )
PROW( 0 ) / / Sal t a a pagi na

Skip
Desloca a tabela para outro registro.
Sintaxe
SKIP [nRegistros] [nArea | ALIAS Alias]
Argumento Obrigat. Tipo Descrio
nRegistros No N Nmero de registros a ser deslocados
nArea No N Nmero da rea de trabalho
Alias No Nome da identificao da rea de trabalho


Retorno Descrio
NIL Sem retorno

Descrio
Este comando utilizado para deslocar para outro registro a partir do registro atual.

O parmetro especifica quantos registros lgicos devem ser deslocados a partir do corrente. Se for
positivo desloca em direo ao final da tabela, se for negativo ao incio da tabela e, caso seja omitido, ir
para o prximo registro (o padro 1). Caso passe do incio da tabela, posiciona no primeiro registro e
seta BOF, caso passe do final da tabela, posiciona no registro LASTREC + 1 e seta EOF.

AdvPl________________________________________________________________258
O padro ser utilizado para a tabela corrente, mas pode ser especificada outra rea de trabalho para
execut-lo atravs do nmero "nArea" ou nome "ALIAS Alias".
Exemplo
/ / Est e exempl o most r a como o SKI P pode passar do f i nal da t abel a e do i n ci o da t abel a
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOBOTTOM( )
EOF( ) / / r et or na . F.
SKIP
EOF( ) / / r et or na . T.
DBGOTOP( )
BOF( ) / / r et or na . F.
SKIP -1
BOF( ) / / r et or na . T.
/ / Est e exempl o most r a como o SKI P pode desl ocar 10 r egi st r o emr el ao ao r egi st r o
cor r ent e
DBUSEAREA( . T. , "dbf cdxads", " \ dadosadv609\ sa1990. dbf " , " SSS" , . T. , . F. )
DBGOTO( 100)
SKIP 10
RECNO( ) / / r et or na 110
SKIP -10
RECNO( ) / / r et or na 100
/ / Est e exempl o most r a como o SKI P pode ser execut ado emout r a ar ea de t r abal ho.
DBUSEAREA( . T. , "dbf cdxads", " \ dadosadv609\ sa1990. dbf " , " SSS" , . T. , . F. )
DBGOTO( 100)
DBUSEAREA( . T. , "dbf cdxads", " \ dadosadv609\ sa1110. dbf " , " XXX" , . T. , . F. )
SKIP 10 ALIAS "SSS"
SSS- >RECNO( ) / / r et or na 110
SKIP -10 ALIAS "SSS"
SSS- >RECNO( ) / / r et or na 100

SplitPath
Quebra em diversas partes um arquivo.
Sintaxe
SPLITPATH( cArq, @[cDrive], @[cCaminho], @[cNome], @[cExt] ) --> NIL
Argumento Obrigat. Tipo Descrio
cArq Sim C
Nome do Arquivo a ser quebrado. Opcionalmente, pode incluir
caminho e drive.
cDrive No C
Nome do Drive. Exemplo ( C: ). Caso o Arquivo informado no possua
drive ou o caminho refira-se ao servidor, retorno ser uma string em
branco.
cCaminho No C
Nome do Caminho. Caso o Arquivo informado no possua caminho,
ser uma string em branco.
cNome No C
Nome do Arquivo sem a extenso, caso em cArq no seja especificado
um nome do Arquivo retornar uma string em branco.
AdvPl________________________________________________________________259
cExt No
C Nome do Arquivo sem a extenso, caso em cArq no seja especificado
um Arquivo com extenso retornar uma string em branco

Retorno Descrio
NIL Sem retorno
Descrio
SplitPath() divide um caminho completo em todas as suas subpartes; cArq no necessita conter todas as
partes.

Tanto arquivos locais ( Remote ) quanto arquivos no servidor, podem ser informados.

O caminho, caso informado, incluir uma barra como ltimo caracter.

A extenso inclui sempre o ponto ( . ) antes da extenso.

Todos os parmetros quando passados devem ser por referncia.
Exemplo
Local cAr q : = "C: \ TEMP\ TESTE. EXE"
Local cDr i ve, cDi r , cNome, cExt
SplitPath( cAr q, @cDr i ve, @cDi r , @cNome, @cExt )
? cDr i ve / / Resul t ado : C:
? cDi r / / Resul t ado : \ TEMP\
? cNome / / Resul t ado : TESTE
? cExt / / Resul t ado: . EXE


TCConType
Define o tipo de conexo que ser utilizada entre o Protheus e o TopConnect.
Sintaxe
TCCONTYPE ( cTipo ) --> NIL
Argumento Obrigat. Tipo Descrio
cTipo Sim C Tipo da conexo. Pode ser: "TCPIP" ou "NPIPE"
AdvPl________________________________________________________________260

Retorno Descrio
NIL Sem retorno
Descrio
Determina o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. O valor guardado e
utilizado nas chamadas seguintes de TCLink.
Exemplo
TCConType("NPIPE")
_nCon : = TCLi nk( " MSSQL7/ TOPSQL" , " TOPSERVER1")
I f ( _nCon < 0)
CONOUT( " Fal ha Conexao TOPCONN - Er r o: " + st r ( nCon, 10, 0) )
EndI f
TCDelFile
Apaga um arquivo de um banco de dados.
Sintaxe
TCDELFILE ( cTabela ) --> Lgico
Argumento Obrigat. Tipo Descrio
cTabela Sim C Nome da tabela que deve ser apagada.

Retorno Descrio
.T. Tabela foi excluda com sucesso
.F. Erro. Geralmente porque a tabela est sendo utilizada por outro processo.
Descrio
Apaga um arquivo de um banco de dados relacional via TopConnect.
Exemplo
I f TcCanOpen( " TRB" +SM0- >M0_CODI GO+"0" )
TcDelFile( " TRB"+SM0- >M0_CODI GO+" 0" )
Endi f
AdvPl________________________________________________________________261
TCGenQry
Define a execuo de uma Query.
Sintaxe
TCGENQRY ([ xPar1, xPar2, ], cQuery) --> caracter
Argumento Obrigat. Tipo Descrio
xPar1, xPar2 No Qualquer Parmetros apenas para compatibilizao. No tem funo.
cQuery Sim C Contm a expresso da query que se deseja executar.

Retorno Descrio
"" Sempre retorna uma string vazia.
Descrio
Esta funo determina que a prxima chamada DBUseArea ser a abertura de uma Query e no de
tabela.
Exemplo
cQuer y : = ' SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO f r omSX2990'
dbUseAr ea( . T. , ' TOPCONN' , TCGenQry( , , cQuer y) , ' TRB' , . F. , . T. )
whi l e ! Eof ( )
/ / Pr ocessa
conout ( TRB- >CHAVE)
dbSki p( )
enddo
dbCl oseAr ea( )
TCI svLock
Verifica se o servidor possui sistema de locks virtuais.
Sintaxe
TCISVLOCK () --> Lgico
Retorno Descrio
.T. O servidor possui sistemas de locks virtuais.
AdvPl________________________________________________________________262
.F. O servidor no possui locks virtuais.
Descrio
Atravs de locks virtuais, possvel bloquear uma string. A funo TCISVLOCK verifica se o servidor
TopConnect possui tratamento para locks virtuais.
Exemplo
#i f def TOP
I f TCIsVLock()
TCVUnLock( )
EndI f
#endi f
TCRefresh
Faz refresh em uma tabela.
Sintaxe
TCREFRESH ( cTabela ) --> NIL
Argumento Obrigat. Tipo Descrio
cTabela Sim Lgico Indica nome da tabela que deve ser feito refresh.

Retorno Descrio
NIL No existe retorno.
Descrio
Faz o refresh de uma tabela, atravs de uma leitura forada da tabela no banco de dados. til aps
alteraes diretas no banco (delete, insert).
Exemplo
cTabel a: = " SA1990"
cComando : = " Del et e " + cTabel a +" Wher e R_E_C_N_O_ > 50000 "
TCSql Exec( cComando)
TCRefresh(cTabela)

TCSetBuff
AdvPl________________________________________________________________263
Esta funo foi mantida apenas para compatilizao, no sendo utilizada no AP6.
TCSetConn
Altera a conexo corrente.
Sintaxe
TCSETCONN( nConexaoCorrente ) --> Lgico
Argumento Obrigat. Tipo Descrio
nConexaoCorrente Sim Numrico
Indica o nmero da conexo que deve se tornar a
corrente. Este nmero foi retornada pela funo TCLINK.

Retorno Descrio
.T. Conexo corrente trocada com sucesso
.F. Conexo no encontrada
Descrio
Altera a conexo corrente. Novas tabelas abertas ou criadas utilizaro esta conexo para realizar a
operao. til quando se tem mais de uma conexo com o TopConnect.
Exemplo
_nCon1 : = TCLi nk( " MSSQL7/ TOPSQL1" , " TOPSERVER1" )
I f ( _nCon1 < 0)
CONOUT( " Fal ha Conexao TOPCONN 1 - Er r o: " + st r ( _nCon1, 10, 0) )
r et ur n . F.
EndI f
_nCon2 : = TCLi nk( " MSSQL7/ TOPSQL2" , " TOPSERVER2" )
I f ( _nCon2 < 0)
CONOUT( " Fal ha Conexao TOPCONN 2 - Er r o: " + st r ( _nCon2, 10, 0) )
r et ur n . F.
EndI f
USE CLI ENTES VI A " TOPCONN" NEW/ / Tabel a de cl i ent es ser aber t o em_nCon2
TCSETCONN(_nCon1)
USE PEDI DOS VI A " TOPCONN" NEW / / Tabel a de pedi dos ser aber t o em_nCon2
.
.
.
TCQUI T( )
RETURN . T.

TCSetDummy
AdvPl________________________________________________________________264
Altera o status do modo "dummy"
Sintaxe
TCSETDUMMY ([ lStatus ]) --> Lgico
Argumento Obrigat. Tipo Descrio
lStatus Sim Lgico Indica se deve ligar (.T.) ou desligar (.F.) o modo "dummy" .

Retorno Descrio
.T. Operao com sucesso
.F. Erro na operao.
Descrio
No modo "dummy", o TopConnect faz apenas a abertura dos arquivos, sem executar nenhuma funo de
posicionamento. utilizado para fazer uma abertura mais rpida dos arquivos. Passando .T., entra em
modo "Dummy", .F. volta ao normal.
Exemplo
TCSet Dummy( . t . )
For ni : = 1 t o Nr oTabel as
cTabel a: = " TABELA" +TRI M( STR( NI , 10, 0) )
dbUseAr ea( . T. , " TOPCONN" , cTabel a, cTabel a, . T. , . F. )
next
TCSet Dummy( . F. )
dbsel ect ar ea( " TABELA1" )
DBGOTOP( )
. . . . . . .

TCSetField
Altera o tipo de um campo.
Sintaxe
TCSETFIELD (cAlias, cCampo, cTipo [, nTamanho, nDecimais]) --> nil
Argumento Obrigat. Tipo Descrio
cAlias Sim C Alias da Tabela
cCampo Sim C Nome do Campo
AdvPl________________________________________________________________265
cTipo Sim C
Novo tipo do campo. Pode ser : 'N' (numrico), 'D' (data) ou 'L'
(lgico).
nTamanho No N
Tamanho do campo. S utilizado se o campo for caracter ou
numrico.
nDecimais No
N
Decimais do campo. S utilizado se o campo for numrico.

Retorno Descrio
NIL Sem retorno
Descrio
Quando se faz a abertura de uma tabela via TCquery, todos os campos aparecem como tipo Caracter.
necessrio em seguida acertar o tipo do campo, se ele no for caracter.
Exemplo
aSt r u : = CT2- >( dbSt r uct ( ) )
cCond : = ". T. "
cQuer y : = " SELECT * FROM " + Ret Sql Name( " CT2") + " WHERE"
cQuer y : = ' CT2_FI LI AL = " ' + xFi l i al ( "CT2" ) EndI f

cQuer y : = ChangeQuer y( cQuer y)
dbUseAr ea( . T. , " TOPCONN" , TCGenQr y( , , cQuer y) , ' NovoCT2' , . F. , . T. )

For ni : = 1 t o Len( aSt r u)
I f aSt r u[ ni , 2] ! = ' C'
TCSetField( ' NovoCT2' , aSt r u[ ni , 1] , aSt r u[ ni , 2] , aSt r u[ ni , 3] , aSt r u[ ni , 4] )
Endi f
Next

TCSpExec
Executa uma Stored Procedure.
Sintaxe
TCSPEXEC ( cSProc [, xParam1,...,xParamN])--> [array]
Argumento Obrigat. Tipo Descrio
cSProc Sim C Nome da Stored Procedure.
xParamX No Qualquer Parmetro(s) da Stored Procedure

AdvPl________________________________________________________________266
Retorno Descrio
NIL Nenhum valor retornado pela Stored Procedure ou ocorreu um erro.
array Array contendo os valores de retorno da Stored Procedure.
Descrio
Executa uma Stored Procedure, no banco de dados, com nmero varivel de parmetros.
Exemplo
A Stored Procedure abaixo retorna "Teste" e o parmetro numrico +3:

Cr eat e Pr ocedur e t est e1( @I N_VALUE i nt ,
@OUT_STR char ( 255) , @OUT_VALUE i nt )
WI TH RECOMPI LE
As
Begi n
Sel ect @OUT_STR = " Test e" , @OUT_VALUE = @I N_VALUE + 3
End
GO

Para executar:

aResul t : = TCSPEXEC(xProcedures ('teste1'), 100 )
I F Len( aResul t ) = 0
conout ( " Er r o na execuo da St or ed Pr ocedur e. " )
Endi f
El se
conout ( aResul t [ 1] + st r ( aResul t [ 2] ) )
Endi f



TCSpExist
Verifica se uma Stored Procedure existe.
Sintaxe
TCSPEXIST ( cStoredProc ) --> Lgico
Argumento Obrigat. Tipo Descrio
cStoredProc Sim C Nome da Stored Procedure.

AdvPl________________________________________________________________267
Retorno Descrio
.T. Stored Procedure existe.
.F. Stored Procedure no existe.
Descrio
Verifica a existncia de uma Stored Procedure no Banco de dados atual.
Exemplo
i f TCSPExist("SP000001")
cSt r : = "DROP PROCEDURE " + " SP000001 "
TCSql Exec( cSt r )
endi f



TCSqlError
Retorna o ltimo erro produzido em comandos SQL.
Sintaxe
TCSQLERROR ( )-> Caracter
Retorno Descrio
Caracter Texto com descrio do erro. Se no houve erro, retorna texto vazio.
Descrio
Esta funo obtm as mensagens de erros em ordem inversa. Portanto, s vezes necessrio fazer vrias
chamadas a esta funo para obter todos os erros, caso eles sejam mltiplos.
Exemplo
nRet = TCSQLEXEC( " I NSERT I NTO SALES/ CUSTOMER( NAME) VALUES( ' J OHN DOE' ) ")
I f nRet == 0
conout ( " I nser o execut ada")
El se
conout ( " I nser o comer r o ( s) : " )
cRet = TCSQLERROR()
Do Whi l e ! Empt y( cRet )
conout ( cRet )
cRet = TCSQLERROR()
EndDo
EndI f
AdvPl________________________________________________________________268



TCSrvType
Retorna o tipo de servidor.
Sintaxe
TCSRVTYPE () --> Caracter
Retorno Descrio
"" String vazia se o driver TopConnect no estiver inicializado.
<> "" String contendo o tipo do servidor. Pode ser: "AS/400", "WinNT", "AIX", "HPUX","Linux"
Descrio
Retorna o tipo de servidor onde est o banco de dados.
Exemplo
/ / ut i l i zado par a t est ar se o ambi ent e AS/ 400, poi s al guns comandos so di f er ent es
nest a pl at af or ma.
Ex: Chamada da f uncao de r econci l i ao
I f TcSrvType() == ' AS/ 400'
Pr ocessa( {| l End| FA210Pr ocessa( ) })
El se
Pr ocessa( {| l End| FA211Pr ocessa( ) })
Endi f



TCSysExe
Executa um comando do sistema operacional no servidor TopConnect.
Sintaxe
TCSYSEXE ( cComando ) --> Numrico
AdvPl________________________________________________________________269
Argumento Obrigat. Tipo Descrio
cComando Sim C Comando do Sistema Operacional.

Retorno Descrio
0 Comando executado com sucesso.
<>0 Erro na execuo do comando.
Exemplo
/ / Copi a ar qui vo no AS400
cAnt i go: = " ANTI GO"
cNovo: = " NOVO"
cExpr es : = " CPYF FROMFI LE( " +Al l Tr i m( cAnt i go) +" ) TOFI LE( "
cExpr es += Al l Tr i m( cNovo) +" ) MBROPT( *ADD) FMTOPT( *MAP *DROP) "
i f TCSysExe(cExpres) <> 0
conout ( " Er r o na execuo do comando" )
endi f



;TCUnLink
Finaliza uma conexo com o TopConnect.
Sintaxe
TCUNLINK([ nNroConexao ]) --> Lgico
Argumento Obrigat. Tipo Descrio
nNroConexao No N
Indica qual o nmero da conexo que deve ser finalizada. Se no
for passada, a conexo corrente finalizada.

Retorno Descrio
.T. Execuo com sucesso.
.F. Erro. Geralmente porque a conexo no vlida.
Descrio
AdvPl________________________________________________________________270
Finaliza a conexo especificada com o TopConnect. Se no passar parmetro, finaliza a conexo corrente.
O nmero da conexo a retornada pela funo <@>TCLink.
Exemplo
_nCon1 := TCLink("MSSQL7/TOPSQL1", "TOPSERVER1")
_nCon2 := TCLink("MSSQL7/TOPSQL2", "TOPSERVER2")
.
.
.
TCUNLINK(_nCon1) // Finaliza a conexo _nCon1
TCVUnLock
Libera o bloqueio virtual de uma string.
Sintaxe
TCVUNLOCK ([ cPalavra ]) --> Lgico
Argumento Obrigat. Tipo Descrio
cPalavra No C
String que deve ser liberada. Se no for passada, TODOS os locks
virtuais desta conexo so liberados.

Retorno Descrio
.T. A palavra foi bloqueada.
.F.
No foi possvel desbloquear a palavra, provavelmente porque ela
no estava bloqueada.
Descrio
Retira o bloqueio virtual de uma string ou de todas da conexo.
Exemplo
#i f def TOP
I f TCI sVLock( )
i f ! TCVLock( " Pr ocesso1" )
messagebox( " Nao f oi possi vel bl oquear o pr ocesso1", " " , 0)
r et ur n
endi f

. . . . . . / / Pr ocessa

AdvPl________________________________________________________________271

TCVUnlock("Processo1")
EndI f
#endi f


TCVLock
Bloqueia uma string atravs de lock virtual.
Sintaxe
TCVLOCK ( cPalavra ) --> Lgico
Argumento Obrigat. Tipo Descrio
cPalavra Sim C String que deve ser bloqueada.

Retorno Descrio
.T. A palavra foi bloqueada.
.F.
No foi possvel bloquear a palavra, provavelmente porque ela j foi
bloqueada por outra estao.
Descrio
A funo TCVLOCK bloqueia uma string atravs de lock virtual no servidor .
Exemplo
#i f def TOP
I f TCI sVLock( )
i f !TCVLock("Processo1")
messagebox( " Nao f oi possi vel bl oquear o pr ocesso1" , " ", 0)
endi f
EndI f
#endi f
Time
Retorna a hora do sistema
Sintaxe
TIME() --> cHora
AdvPl________________________________________________________________272
Retorno Descrio
cHora
A hora do sistema como uma cadeia de caracteres no formato
hh:mm:ss onde hh a hora ( 1 a 24 ), mm os minutos e ss os
segundos.
Descrio
TIME() uma funo que retorna a hora do sistema como uma cadeia de caracteres. TIME() est
relacionada com SECONDS() que retorna o valor inteiro representando o nmero de segundos desde a
meia-noite.

SECONDS() geralmente usada no lugar de TIME() para clculos.
Exemplos
Estes exemplos mostram a funo TIME() utilizada em conjunto com SUBSTR() para extrair a hora, os
minutos e os segundos:
cTi me : = TI ME( ) / / Resul t ado: 10: 37: 17
cHor a : = SUBSTR( cTi me, 1, 2) / / Resul t ado: 10
cMi nut os : = SUBSTR( cTi me, 4, 2) / / Resul t ado: 37
cSegundos : = SUBSTR( cTi me, 7, 2) / / Resul t ado: 17
UnLock
Desbloqueia os registros da tabela corrente.
Sintaxe
UnLock [ALL]
Descrio
Este comando utilizado para liberar registros da tabela corrente. Se for passada a opo "ALL" todos os
registros da tabela corrente so liberados. Caso contrrio, s liberado o registro corrente.
Exemplo
/ / Est e exempl o most r a como l i ber ar t odos os r egi st r os bl oqueados da t abel a cor r ent e.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
UNLOCK ALL
/ / Est e exempl o most r a uma var i ao do uso de UNLOCK par a l i ber ar apenas o r egi st r o
cor r ent e.
DBUSEAREA( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
DBGOTO( 100)
UNLOCK / / Desbl oquei a o r egi st r o at ual ( 100)


AdvPl________________________________________________________________273
UpdateI ntName
Atualiza o nome do ndice interno da tabela CTree.
Sintaxe
UpdateIntName ( cNome )->Lgico
Argumento Obrigat. Tipo Descrio
cNome No C
Especifica o nome da tabela cujo ndice interno deve ter o nome
atualizado.

Retorno Descrio
.F.
No conseguiu atualizar o nome do ndice interno. O arquivo no
pode ser aberto em modo exclusivo.
.T. Atualizao do nome de ndice interno ocorrida com sucesso
Descrio
A funo UpdateIntName muda o nome do arquivo de ndice interno de uma tabela Ctree, estando a
mesma fechada. Para tanto ela executa os seguintes passos:

1- Abre a tabela;

2- Verifica as informaes da tabela;

3- Fecha a tabela;

4- Recalcula o nome do ndice interno;

5- Grava o novo nome do ndice interno na tabela;

O nome do ndice interno, que armazenado no diretrio "\CTREEINT\" acima da tabela equivalente,
calculado da seguinte forma:

xxxxxxxxeeeYYYYMMDDhhmmss.int, sendo:
AdvPl________________________________________________________________274
xxxxxxxx - nome do arquivo da tabela
eee - extenso da tabela
YYYYMMDD - data atual
hhmmss - horrio corrente
Na prxima vez em que a tabela aberta, o arquivo deste novo ndice ser criado automaticamente.
Exemplo
/ / Est e exempl o demonst r a o uso t pi co de Updat eI nt Name( ) . Se no f al har , o nome do
ndi ce i nt er no ser at ual i zado e o pr ocesso cont i nua quando ao abr i r a t abel a o novo
ar qui vo de ndi ce i nt er no cr i ado. Se f al har , uma mensagem apr esent ada.
I F !UpdateIntName("\dadosadv\sa1990.dtc")
Messagebox( " No f oi poss vel at ual i zar o nome do ndi ce i nt er no da t abel a" , " Er r o" , 0)
BREAK
ENDI F
USE "\ dadosadv\ sa1990. dt c" SHARED NEW
Use
Abre uma tabela na rea de trabalho atual e os arquivos relacionados a ela.
Sintaxe
USE Tabela [INDEX Indices] [ALIAS Alias] [EXCLUSIVE | SHARED] [NEW] [READONLY] [VIA Driver]]
Argumento Obrigat. Tipo Descrio
Tabela Nome do arquivo da tabela a ser aberta
Indices Nomes dos ndices a serem abertos junto com a tabela
Alias Alias da tabela a ser aberta
Driver Nome do RDD a ser utilizado na abertura da tabela


Retorno Descrio
NIL Sem retorno

Descrio
AdvPl________________________________________________________________275
Este comando associa uma tabela especificada pelo primeiro parmetro (Tabela) rea de trabalho atual
atravs de um driver especificado atravs do parmetro Driver.

Tambm pode abrir os arquivos de ndices relacionados com a tabela.

No caso do Ctree os arquivos de ndices permanentes j so abertos automaticamente, mas nos demais
RDDs deve especificar os arquivos de ndices que se deseja abrir atravs do parmetro Indices.

O Alias pode ser especificado atravs do parmetro Alias. Pode-se especificar se a tabela ser aberta em
modo exclusivo ou compartilhado (atravs das opes "EXCLUSIV" e "SHARED").

O usurio pode optar por abrir a tabela em modo somente leitura atravs da opo "READONLY", onde
nenhuma alterao ser efetivada na tabela. A opo "NEW" determina que a tabela especificada ser
aberta na prxima rea de trabalho disponvel e ser setada como a rea de trabalho corrente.
Exemplo
/ / Est e exempl o demonst r a como ut i l i zar o comando USE par a associ ar uma t abel a ( do t i po
Ct r ee) a pr xi ma r ea de t r abal ho di spon vel e t or n- l a at i va emmodo compar t i l hado e
soment e l ei t ur a:
USE Cliente VIA "CTREECDX" NEW SHARED READONLY

Used
Verifica se existe uma tabela corrente
Sintaxe
Used() --> Lgico
Retorno Descrio
.F. No existe tabela corrente
.T. Existe tabela corrente
Descrio
Esta funo utilizada para verificar se existe alguma tabela aberta no momento.
Exemplo
/ / Est e exempl o ut i l i za a f uno USED( ) par a ver i f i car quando a t abel a est at i va:
USE Cl i ent es NEW
Resul t : = USED() / / Resul t : . T.
CLOSE
AdvPl________________________________________________________________276
Resul t : = USED() / / Resul t : . F.


Year
Converte o valor da data no valor numrico do ano.
Sintaxe
YEAR( dData ) --> nAno
Argumento Obrigat. Tipo Descrio
dData Sim D o valor da data a ser convertido.

Retorno Descrio
nAno
Valor numrico do ano da data especificada em dData incluindo os
dgitos do sculo. O valor retornado no afetado pelos valores
especificados pelos comandos SET DATE ou SET CENTURY.
0 Para uma data invlida ou nula.
Descrio
YEAR() uma funo de converso de data que extrai o valor numrico do ano. YEAR() membro de um
grupo de funes que retornam valores numricos de uma data. O grupo inclui DAY() e MONTH() que
retornam o dia e o ms como valores numricos.
Exemplos
Estes exemplos mostram YEAR() usando a data do sistema:
dDat a : = DATE( ) / / Resul t ado: 09/ 20/ 01
dAno : = YEAR( dDat a) / / Resul t ado: 2001
dAno : = YEAR( dDat a) + 11 / / Resul t ado: 2012

Este exemplo cria uma funo de usurio que usa a funo YEAR() para formatar o valor da data:
cDat a : = Mdy( DATE( ) ) / / Resul t : Sept ember 20, 1990
FUNCTI ON Mdy( dDat e )
RETURN CMONTH( dDat e) + " " + LTRI M( STR( DAY( dDat e) ) ) + " , " + STR( YEAR( dDat e) )
ZAP
AdvPl________________________________________________________________277
Remove todos os registros da tabela.
Sintaxe
ZAP
Descrio
Este comando apaga (fisicamente) todos os registro da tabela corrente.
Exemplo
/ / Est e exempl o most r a como o ZAP pode se ut i l i zado.
dbUseAr ea( . T. , " dbf cdxads" , " \ dadosadv609\ sa1990. dbf " , "SSS" , . T. , . F. )
ZAP

AdvPl________________________________________________________________278
Classes de I nterface Visual
tSrvObject
Classe me de todas as classes de interface.
Caractersticas
Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada diretamente.
Propriedades
Nleft Numrico. Coordenada horizontal em pixels.
Ntop Numrico. Coordenada vertical em pixels.
nWidth Numrico. Largura em pixels.
nHeight Numrico. Altura em pixels.
cCaption Caractere. Ttulo ou contedo do objeto.
cTooltip Caractere. Mensagem exibida quando objeto exibe seu tooltip.
lShowHint Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto.
cMsg
Caractere. Mensagem exibida na barra de status da janela principal quando o objeto ganha
foco.
nClrText Numrico. Cor do texto do objeto.
nClrPane Numrico. Cor do fundo do objeto.
bWhen
Bloco de cdigo. Executado quando h movimentao de foco na janela.
Se retornar .T. o objeto continua habilitado, se retornar .F. o objeto ser desabilitado.
bValid
Bloco de cdigo. Executado quando o contedo do objeto modificado e dever ser validado.
Deve retornar .T. se o contedo vlido e .F. se contedo invlido.
blClicked Bloco de cdigo. Executado quando acionado click do boto esquerdo do mouse sobre o
objeto.
brClicked Bloco de cdigo. Executado quando acionado click do boto direito do mouse sobre o objeto.
blDblClick
Bloco de cdigo. Executado quando acionado duplo click do boto esquerdo do mouse sobre o
objeto.
oWnd Objeto. Janela onde o objeto foi criado.
lVisible Booleano. Se .T. o objeto visvel, se .F. o objeto invisvel.
Cargo Objeto ou varivel. Contedo associado ao objeto.
bLostFocus Bloco de cdigo. Executado quando objeto perde foco.
AdvPl________________________________________________________________279
bGotFocus Bloco de cdigo. Executado quando objeto ganha foco.
Mtodos
SetFocus
Sintaxe
SetFocus( )
Descrio
Fora o foco de entrada de dados mudar para o objeto.
Retorno
NIL
Hide
Sintaxe
Hide( )
Descrio
Torna objeto invisvel.
Retorno
NIL
Show
Sintaxe
Show( )
Descrio
Torna objeto visvel.
Retorno
NIL
Enable
Sintaxe
Enable( )
AdvPl________________________________________________________________280
Descrio
Habilita o objeto.
Retorno
NIL
Disable
Sintaxe
Disable( )
Descrio
Desabilita o objeto.
Retorno
NIL
Refresh
Sintaxe
Refresh( )
Descrio
Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote.


Classes de J anelas
tWindow
Classe de janela principal de programa.
Hierarquia
tSrvObject - >tWindow
Caractersticas
AdvPl________________________________________________________________281
Classe de janela principal de programa, dever existir apenas uma instncia deste objeto na execuo do
programa.
Propriedades
Binit Bloco de cdigo. Executado quando a janela est sendo exibida.
lEscClose Lgico. Se .T. habilita o <ESC> cancelar a execuo da janela.
oCtlFocus Objeto. Objeto contido na janela que est com foco de entrada de dados.
Mtodos
New
Descrio
Mtodo construtor da janela.
Sintaxe
New( [anTop], [anLeft],[anBottom], [anRight], [acTitle], [nPar6], [oPar7] ,[oPar8],[oPar9], [aoParent],
[lPar11], [lPar12], [anClrFore], [anClrBack], [oPar15], [cPar16], [lPar17], [lPar18], [lPar19], [lPar20],
[alPixel] );
Parmetros
AnTop Numrico, opcional. Coordenada vertical superior em pixels ou caracteres.
AnLeft Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres.
AnBottom Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres.
AnRight Numrico, opcional. Coordenada horizontal inferior em pixels ou caracteres.
acTitle Caractere, opcional. Ttulo da janela.
nPar6 Reservado.
oPar7 Reservado.
oPar8 Reservado.
oPar9
Reservado.
AoParent Objeto, opcional. Janela me da janela corrente.
lPar11 Reservado.
lPar12 Reservado.
anClrFore Numrico, opcional. Cor de fundo da janela.
anClrText Numrico, opcional. Cor do texto da janela.
oPar15 Reservado.
cPar16 Reservado.
AdvPl________________________________________________________________282
lPar17 Reservado.
lPar18
Reservado.
lPar19 Reservado.
lPar20 Reservado.
AlPixel
Lgico, opcional. Se .T. (padro) considera coordenadas passadas em pixels, se .F.
considera caracteres.
Retorno
Objeto. A janela construda.
Activate
Descrio
Ativa (exibe) a janela. Chamar esse mtodo apenas uma vez.
Sintaxe
Activate([acShow], [bPar2], [bPar3], [bPar4], [bPar5], [bPar6], [ abInit ], [bPar8], [bPar9], [bPar10],
[bPar11], [bPar12] ,[bPar13], [bPar14], [bPar15], [abValid], [bPar17], [bPar18] ).
Parmetros
AcShow
Caracter, opcional. ICONIZED para janela iconizada ou MAXIMIZED para janela
maximizada.
bPar2 Reservado.
bPar3 Reservado.
bPar4 Reservado.
bPar5 Reservado.
bPar6
Reservado.
AbInit Bloco de cdigo. Executado quando janela est sendo exibida.
bPar8 Reservado.
bPar9 Reservado.
bPar10 Reservado.
bPar11 Reservado.
bPar12 Reservado.
bPar13 Reservado.
bPar14 Reservado.
bPar15 Reservado.
AbValid
Bloco de cdigo. Executado quando a janela for solicitada de fechar. Dever retornar .T.
se o contedo da janela for vlido, ou .F. se no. Se o bloco retornar .F. a janela no
fechar.
bPar17 Reservado.
bPar18 Reservado.
AdvPl________________________________________________________________283
Retorno
NIL
End
Descrio
Solicita encerramento da janela.
Sintaxe
End( )
Retorno
Lgico. .T. se encerrou a janela e .F. se no.
Center
Descrio
Centraliza a janela.
Sintaxe
Center( )
Retorno
NIL

Exemplo
#i ncl ude pr ot heus. ch

USER FUNCTI ON MyPr og( )

Local oWi ndow
Local abI ni t : = {| | msgst op( at i vando! ) }
Local abVal i d: = {| | msgst op( encer r ando! ) , . T. }
oWi ndow: = t Wi ndow( ) : New( 10, 10, 200, 200, Meu pr ogr ama;
, , , , , , , , CLR_WHI TE, CLR_BLACK, , , , , , , . T. )
oWi ndow: Act i vat e( MAXI MI ZED, , , , , , abI ni t , , , , , , , , , abVal i d, , )

Ret ur n ni l
TDialog
Classe de janela de dilogo.
AdvPl________________________________________________________________284
Hierarquia
tSrvObject - >tWindow - >tDialog
Caractersticas
Classe de janela de dilogo de entrada de dados, uso reservado, recomenda-se utilizar a classe MSDialog
que herdada desta classe.
Propriedades
Vide classes ancestrais.
Mtodos
New
Descrio
Mtodo construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8], [nPar9],
[anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16], [nPar17], [anWidth],
[anHeight])
Parmetros
AnTop Numrico, opcional. Coordenada vertical superior em pixels ou caracteres.
anLeft Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres.
anBotom Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres.
anRight Numrico, opcional. Coordenada horizontal direita em pixels ou caracteres.
acCaption Caractere, opcional. Ttulo da janela.
cPar6 Reservado.
nPar7 Reservado.
lPar8 Reservado.
nPar9 Reservado.
anClrText Numrico,opcional. Cor do texto.
anClrBack Numrico,opcional. Cor de fundo.
oPar12 Reservado.
AdvPl________________________________________________________________285
AoWnd
Objeto, opcional. Janela me da janela a ser criada, padro a janela principal do
programa.
AlPixel
Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F. considera
caracteres.
oPar15 Reservado.
oPar16 Reservado.
nPar17 Reservado.
anWidth Numrico, opcional. Largura da janela em pixels.
anHeight Numrico, opcional. Altura da janela em pixels.
Retorno
O Dilogo criado.
Activate
Descrio
Ativa (exibe) o dilogo. Chamar somente uma vez este mtodo.
Sintaxe
Activate([bPar1], [bPar2], [bPar3], [alCentered], [abValid], [lPar6], [abInit], [bPar8], [bPar9] )
Parmetros
bPar1 Reservado.
bPar2
Reservado.
bPar3 Reservado.
alCentered Lgico, opcional. Se .T. exibe a janela centralizada, .F. padro.
AbValid
Bloco de cdigo, opcional. Deve retornar .T. se contedo do dilogo vlido, se
retornar .F. o dilogo no fechar quando solicitada de encerrar.
lPar6 Reservado.
AbInit Bloco de cdigo, opcional. Executado quando o dilogo inicia exibio.
bPar8 Reservado.
bPar9 Reservado.
Retorno
NIL.
End
Descrio
AdvPl________________________________________________________________286
Encerra (fecha) o dilogo.
Sintaxe
End( )
Retorno
Lgico .T. se o dilogo foi encerrado.


MSDialog
Classe de dilogo de entrada de dados.
Hierarquia
tSrvObject - >tWindow - >tDialog - >MSDialog
Caractersticas
MSDialog deve ser utilizada como padro de janela para entrada de dados. MSDialog um tipo de janela
dilogo modal, isto , no permite que outra janela ativa receba dados enquanto esta estiver ativa.
Propriedades
Vide classes ancestrais.
Mtodos
New
Descrio
Mtodo construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8], [nPar9],
[anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16], [lPar17])
Parmetros
AnTop Numrico, opcional. Coordenada vertical superior em pixels ou caracteres.
anLeft Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres.
AdvPl________________________________________________________________287
anBottom Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres.
anRight Numrico, opcional Coordenada horizontal direita em pixels ou caracteres.
acCaption Caractere, opcional. Ttulo do dilogo.
cPar6 Reservado.
nPar7 Reservado.
lPar8 Reservado.
nPar9 Reservado.
anClrText Cor do texto.
anClrBack
Cor do fundo.
oPar12 Reservado.
AoWnd
Objeto, opcional. Janela pai do dilogo, geralmente a janela principal do programa.
AlPixel
Se .T. considera as coordenadas informadas em pixels, se .F. considera as coordenadas
em caracteres.
oPar15 Reservado.
oPar16 Reservado.
lPar17 Reservado.
Retorno
O dilogo construdo.
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

/ / cr i a di l ogo
Local oDl g: =MSDi al og( ) : New( 10, 10, 300, 300, Meu di al ogo;
, , , , , CLR_BLACK, CLR_WHI TE, , , . T. )

/ / at i va di l ogo cent r al i zado
oDl g: Act i vat e( , , , . T. , {| | msgst op( val i dou! ) , . T. }, ;
, {| | msgst op( i ni ci ando) )

Ret ur n


Classes Auxiliares
AdvPl________________________________________________________________288
tFont
Classe que encapsula fonte de edio.
Hierarquia
tFontAbs - >tFont
Descrio
Utilize objeto tFont para modificar a fonte padro de controles visuais.
Mtodos
New
Descrio
Construtor do objeto.
Sintaxe
New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8], [alItalic], [alUnderline])
Parmetros
acName Caractere, opcional. Nome da fonte, o padro Arial.
nPar2 Reservado.
anHeight Numrico, opcional. Tamanho da fonte. O padro -11.
lPar4 Reservado.
AlBold Lgico, opcional. Se .T. o estilo da fonte ser negrito.
nPar6 Reservado.
lPar7 Reservado.
nPar8 Reservado.
alItalic Lgico, opcional. Se .T. o estilo da fonte ser itlico.
alUnderline Lgico, opcional. Se .T. o estilo da fonte ser sublinhado.
Retorno
O objeto criado.
AdvPl________________________________________________________________289
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

Local oDl g, oSay, oFont : = TFont ( ) : New( Cour i er New, , - 14, . T. )
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 200, 200 TI TLE My di al og PI XEL
/ / apr esent a o t Say coma f ont e Cour i er New / /
oSay: = t Say( ) : New( 10, 10, {| | par a exi bi r }, oDl g, , oFont , , ;
, , . T. , CLR_WHI TE, CLR_RED, 100, 20)
oSay: l Tr anspar ent : = . T.
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n



Classes de Componentes

tControl
Classe abstrata me de todos os controles editveis.
Hierarquia
tSrvObject - >tControl
Caractersticas
tControl a classe comum entre todos os componentes visuais editveis.
Propriedades
Align
Numrico. Alinhamento do controle no espao disponibilizado pelo seu objeto parente. 0
= Nenhum (padro), 1= no topo, 2 = no rodap, 3= a esquerda, 4 = a direita e 5 = em
todo o parente.
lModified Lgico. Se .T. indica que o contedo da varivel associada ao controle foi modificado.
lReadOnly
Lgico. Se .T. o contedo da varivel associada ao controle permanecer apenas para
leitura.
hParent Numrico. Handle (identificador) do objeto sobre o qual o controle foi criado.
AdvPl________________________________________________________________290
bChange
Bloco de cdigo. Executado quando o estado ou contedo do controle modificado pela
ao sobre o controle.
Mtodos
SetFocus
Descrio
Fora mudana do foco de entrada de dados para o controle.
Sintaxe
SetFocus( )
Retorno
NIL


Classes de Componentes Visuais
tButton
Classe de boto.
Hierarquia
tSrvObject - >tControl - >tButton
Descrio
Utilize a classe tButton para criar um controle visual do tipo boto.
Propriedades
lProcessing Lgico. Se .T. indica o boto est efetuando uma ao.
bAction Bloco de cdigo. Executado quando o boto pressionado.
Metodos
AdvPl________________________________________________________________291
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth], [anHeight], [nPar8], [aoFont],
[lPar10], [alPixel],[lPar12],[cPar13], [lPar14], [abWhen], [bPar16], [lPar17])
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou carateres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
acCaption Caractere, opcional. Titulo do boto.
aoWnd Objeto, opcional. Janela ou controle onde o boto dever ser criado.
abAction
Bloco de cdigo, opcional. Bloco que dever ser acionado quando o boto for
pressionado.
anWidth Numrico, opcional. Largura do boto em pixels.
anHeight Numrico, opcional. Altura do boto em pixels.
nPar8 Reservado.
aoFont
Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para o ttulo do
boto.
lPar10
Reservado.
alPixel
Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F. (padro)
considera em caracteres.
lPar12 Reservado.
cPar13 Reservado.
lPar14 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
bPar16 Reservado.
lPar17 Reservado.
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test eGet ( )

Local oDl g, oBut t on, oCombo, cCombo, aI t ems: = {i t em1, i t em2, i t em3}
cCombo: = aI t ems[ 2]
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 300, 300 PI XEL TI TLE Meu Combo
oCombo: = t ComboBox( ) : New( 10, 10, {| u| i f ( PCount ( ) >0, cCombo: =u, cCombo) }, ;
AdvPl________________________________________________________________292
aI t ems, 100, 20, oDl g, , {| | MsgSt op( Mudou i t em) }, ;
, , , . T. , , , , , , , , , cCombo)
/ / Bot o par a f echar a j anel a
oBut t on: =t But t on( ) : New( 30, 10, f echar , oDl g, {| | oDl g: End( ) }, ;
100, 20, , , , . T. )
ACTI VATE MSDI ALOG oDl g CENTERED
MsgSt op( O val or +cCombo )

Ret ur n ni l


tCheckBox
Classe de caixa checkbox.
Hierarquia
tSrvObject - >tControl - >tCheckBox
Descrio
Utilize a classe tCheckbox quando desejar criar um controle que possua dois estados .T. ou .F..
Mtodos
New
Descrio
Construtor da classe
Sintaxe
New([anRow], [anCol], [acCaption], [abSetGet], [aoWnd], [anWidth], [anHeight], [nPar8], [abClick],
[aoFont], [abValid], [anClrFore], [anClrBack], [lPar14], [alPixel], [cPar16], [lPar17], [abWhen])
Parmetros
AnRow Numrico, opcional. Coordenada vertical em pixels ou carateres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
acCaption Caractere, opcional. Texto exibido pelo controle.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
lgico, se <var> = .T. ento o controle aparecer checado.
aoWnd Objeto, opcional. Janela ou controle onde o controle dever ser criado.
AdvPl________________________________________________________________293
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
nPar8 Reservado.
abClick
Bloco de cdigo, opcional. Executado quando o controle click do boto esquerdo do
mouse acionado sobre o controle.
aoFont
Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para o texto do
controle.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrFore Numrico, opcional. Cor de fundo do controle.
anClrBack Numrico, opcional. Cor do texto do controle.
lPar14 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
cPar16 Reservado.
lPar17 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Retorno
O objeto construdo.
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

Local oDl g, oBut t on, oCheck, l Check: =. F.
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 300, 300 PI XEL TI TLE Meu pr ogr ama
oCheck: = t CheckBox( ) : New( 10, 10, f unci onou?, ;
{| u| i f ( pcount ( ) >0, l Check: =u, l Check) };
, oDl g, 100, 20, , , , , , , , . T. )
oBut t on: =t But t on( ) : New( 30, 10, f echar , oDl g, {| | oDl g: End( ) }, ;
100, 20, , , , . T. )
ACTI VATE MSDI ALOG oDl g CENTERED
I f l Check
MsgSt op( Funci onou! )
endi f

Ret ur n ni l


AdvPl________________________________________________________________294
tComboBox
Classe de combobox.
Hierarquia
tSrvObject - >tControl - >tComboBox
Descrio
Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em
uma lista vertical, acionada por F4 ou pelo boto esquerdo localizado na parte direita do controle. A
varivel associada ao controle ter o valor de um dos itens selecionados ou no caso de uma lista
indexada, o valor de seu ndice.
Propriedades
aItems
Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a)
Seqencial, exemplo: {item1,item2,...,itemN} ou b) Indexada, exemplo:
{a=item1,b=item2, ..., n=itemN}.
nAt Numrico. Posio do item selecionado.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange],
[abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19],
[bPar20], [cPar21], [acReadVar])
Parmetros
AnRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter. Se a lista for seqencial, o controle atualizar <var> com o contedo do item
selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do
item selecionado.
AdvPl________________________________________________________________295
anItems
Array, opcional. Lista de items, caracteres, a serem exibidos. Pode ter os seguintes
formatos: a) Seqencial, exemplo: {item1,item2,...,itemN} ou b) Indexada,
exemplo: {a=item1,b=item2, ..., n=itemN}.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
nPar8 Reservado.
abChange Bloco de cdigo, opcional. Executado quando o controle modifica o item selecionado.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrBack Numrico, opcional. Cor de fundo do controle.
anClrText Numrico, opcional. Cor do texto do controle.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
cPar15 Reservado.
lPar16 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
lPar18 Reservado.
aPar19
Reservado.
bPar20 Reservado.
cPar21 Reservado.
acReadVar
Caractere, opcional. Nome da varivel que o controle dever manipular, dever ser a
mesma varivel informada no parmetro abSetGet, e ser o retorno da funo
ReadVar( ).
Retorno
O objeto criado.
Select
Descrio
Muda o item selecionado no combobox.
Sintaxe
Select( [anItem] )
Parmetros
anItem Numrico, opcional. Posio do item a ser selecionado.
AdvPl________________________________________________________________296
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test eGet ( )

Local oDl g, oBut t on, oCombo, cCombo, aI t ems: = {i t em1, i t em2, i t em3}
cCombo: = aI t ems[ 2]
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 300, 300 PI XEL TI TLE Meu Combo
oCombo: = t ComboBox( ) : New( 10, 10, {| u| i f ( PCount ( ) >0, cCombo: =u, cCombo) }, ;
aI t ems, 100, 20, oDl g, , {| | MsgSt op( Mudou i t em) }, ;
, , , . T. , , , , , , , , , cCombo)
/ / Bot o par a f echar a j anel a
@40, 10 BUTTON oBut t on PROMPT Fechar OF oDl g PI XEL ACTI ON oDl g: End( )
ACTI VATE MSDI ALOG oDl g CENTERED
MsgSt op( O val or +cCombo )

Ret ur n ni l


tGet
Classe de controle para entrada de dados editveis.
Hierarquia
tSrvObject - >tControl - >tGet
Descrio
Use tGet para criar um controle que armazene ou altere o contedo de uma varivel atravs de digitao.
O contedo da varivel s modicado quando o controle perde o foco de edio para outro controle.
Propriedades
lPassword
Lgico. Se .T. o controle se comporta como entrada de dados de senha, exibindo
asteriscos * para esconder o contedo digitado.
Picture Caractere. Mscara de formatao do contedo a ser exibido.
Mtodos
New
Descrio
AdvPl________________________________________________________________297
Mtodo construtor do controle.
Sintaxe
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [acPict], [abValid], [anClrFore],
[anClrBack], [aoFont], [lPar12], [oPar13], [alPixel], [cPar15], [lPar16], [abWhen], [lPar18], [lPar19],
[abChange], [alReadOnly], [alPassword], [cPar23], [acReadVar], [cPar25], [lPar26], [nPar27], [lPar28])
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:=
u, <var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser
tipo caracter, numrico ou data.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
acPict Caractere, opcional. Mscara de formatao do contedo a ser exibido.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser
validado, deve retornar .T. se o contedo for vlido e .F. quando o contedo for
invlido.
anClrFore Numrico, opcional. Cor de fundo do controle.
anClrBack
Numrico, opcional. Cor do texto do controle.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
lPar12 Reservado.
oPar13 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
cPar15 Reservado.
lPar16 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se
o controle deve permanecer habilitado ou .F. se no.
lPar18 Reservado.
lPar19
Reservado.
abChange
Bloco de cdigo, opcional. Executado quando o controle modifica o valor da varivel
associada.
alReadOnly Lgico, opcional. Se .T. o controle no poder ser editado.
alPassword
Lgico, opcional. Se .T. o controle exibir asteriscos * no lugar dos caracteres
exibidos pelo controle para simular entrada de senha.
cPar23 Reservado.
acReadVar
Caractere, opcional. Nome da varivel que o controle dever manipular, dever ser a
mesma varivel informada no parmetro abSetGet, e ser o retorno da funo
AdvPl________________________________________________________________298
ReadVar( ).
cPar25 Reservado.
lPar26 Reservado.
nPar27 Reservado.
lPar18 Reservado.
Retorno
O controle construdo.
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test eGet ( )

Local oDl g, oGet 1, oBut t on, nGet 1: =0
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 300, 300 PI XEL TI TLE Meu Get
oGet 1: = TGet ( ) : New( 10, 10, {| u| i f ( PCount ( ) >0, nGet 1: =u, nGet 1}}, oDl g, ;
100, 20, @E 999, 999. 99, ;
{| o| nGet 1>1000. 00}, , , , , , . T. , , , , , , , , , , nGet 1)
/ * Temo mesmo ef ei t o
@10, 10 MSGET oGet 1 VAR nGet 1 SI ZE 100, 20 OF oDl g PI XEL PI CTURE @E 999, 999. 99 VALI D
nGet 1>1000. 00
*/
/ / Bot o par a f echar a j anel a
@40, 10 BUTTON oBut t on PROMPT Fechar OF oDl g PI XEL ACTI ON oDl g: End( )
ACTI VATE MSDI ALOG oDl g CENTERED
MsgSt op( O val or +Tr ansf or m( nGet 1, @E 999, 999. 00) )

Ret ur n ni l


tGroup
Classe de painel de grupo de controles.
Hierarquia
tSrvObject - >tControl - >tGroup
Descrio
Utilize a classe tGroup para criar um painel onde controles visuais podem ser agrupados ou classificados.
criada uma borda com ttulo em volta dos controles agrupados.
Mtodos
New
Descrio
AdvPl________________________________________________________________299
Construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [aoWnd], [anClrText], [anClrPane], [alPixel],
[lPar10])
Parmetros
anTop Numrico, opcional. Coordenada vertical superior em pixels ou caracteres.
anLeft Numrico, opcional. Coordenada horizontal esquerda em pixels ou caracteres.
anBottom Numrico, opcional. Coordenada vertical inferior em pixels ou caracteres.
anRight Numrico, opcional. Coordenada horizontal direita em pixels ou caracteres.
acCaption Caractere, opcional. Ttulo do grupo.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anClrText Numrico, opcional. Cor do texto.
anClrPane Numrico, opcional. Cor do fundo.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
lPar10 Reservado.
Retorno
O objeto criado.
Exemplo
#i ncl ude pr ot heus. ch

User f unct i on t est e( )
Local oDl g, oGr oup, oGet 1, oGet 2, cGet 1: =Space( 10) , ;
cGet 2: = Space( 10)
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 TI TLE My t est PI XEL
oGr oup: = t Gr oup( ) : New( 10, 10, 200, 200, gr upo de get s, oDl g, , , . T. )
@10, 10 MSGET oGet 1 VAR cGet 1 SI ZE 100, 10 OF oGr oup PI XEL
@30, 10 MSGET oGet 2 VAR cGet 2 SI ZE 100, 10 OF oGr oup PI XEL
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n ni l


tListbox
AdvPl________________________________________________________________300
Classe de lista de items.
Hierarquia
tSrvObject - >tControl - >tListbox
Descrio
Utilize a classe tListbox para criar uma janela com itens selecionveis e barra de rolagem. Ao selecionar
um item, uma varivel atualizada com o contedo do item selecionado.
Parmetros
NAt Numrico. Indica ou modifica o item selecionado.
aItems Array de items caracteres. Lista do itens selecionveis.
Mtodos
New
Descrio
Contrutor da classe
Sintaxe
New([anRow], [anCol], [abSetGet], [aaItems], [anWidth], [anHeigth], [abChange], [aoWnd], [abValid],
[anClrFore], [anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [cPar16], [lPar17], [abWhen],
[aPar19], [bPar20], [lPar21], [lPar22], [abRightClick] )
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:=
u, <var> )} que o controle utiliza para atualizar a varivel <var>. <var> deve ser
tipo caracter ou numrica.
aaItems Array de items caracteres, opcional. Lista de items selecionveis.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
abChange Bloco de cdigo, opcional. Executado quando o item selecionado alterado.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
abValid Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser
AdvPl________________________________________________________________301
validado, deve retornar .T. se o contedo for vlido e .F. quando o contedo for
invlido.
anClrFore
Numrico, opcional. Cor de fundo do controle.
anClrBack Numrico, opcional. Cor do texto do controle.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
lPar13 Reservado.
abLDBLClick
Bloco de cdigo, opcional. Executado quando acionado duplo click do boto esquerdo
do mouse sobre o controle.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
cPar16 Reservado.
lPar17 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T.
se o controle deve permanecer habilitado ou .F. se no.
aPar19
Reservado.
bPar20 Reservado.
lPar21 Reservado.
lPar22 Reservado.
abRightClick
Bloco de cdigo, opcional. Executado quando acionado click do boto direito do
mouse sobre o controle.
Select
Descrio
Fora a seleo de um item.
Sintaxe
Select( [nItem] )
Parmetros
nItem Numrico, opcional. Item a ser selecionado.
Retorno
NIL
Add
Descrio
Insere ou adiciona novo item.
Sintaxe
Add( cText, nPos )
AdvPl________________________________________________________________302
Parmetros
cText Caractere, obrigatrio. Texto do item.
nPos
Numrico, obrigatrio. Se 0 ou maior que o nmero de itens, insere o item no final da lista.
Se valor entre 1 e nmero de itens, insere o item na posio informada, empurrando o item
anterior para baixo.
Retorno
NIL
Modify
Descrio
Modifica o texto de um item.
Sintaxe
Modify( cText, nPos )
Parmetros
cText Caractere, obrigatrio. Texto novo.
nPos
Numrico, obrigatrio. Posio a ser modificada deve ser maior que 0 e menor ou igual que
o nmero de itens.
Retorno
NIL
Del
Descrio
Apaga um item.
Sintaxe
Del( nPos )
Parmetros
nPos
Numrico, obrigatrio. Posio a ser excluida, deve ser maior que 0 e menor ou igual que o
nmero de itens.
Retorno
NIL
Len
AdvPl________________________________________________________________303
Descrio
Retorna o nmero de itens.
Sintaxe
Len( )
Retorno
Numrico. Nmero de itens.
Reset
Descrio
Apaga todos os itens.
Sintaxe
Reset( )
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

User Funci on Test e( )
Local oDl g, oLi st , nLi st : = 1, aI t ems: ={}
Aadd( aI t ems, I t em1)
Aadd( aI t ems, I t em2)
Aadd( aI t ems, I t em3)
Aadd( aI t ems, I t em4)
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 PI XEL TI TLE Test e
oLi st : = t Li st Box( ) : New( 10, 10, {| u| i f ( Pcount ( ) >0, nLi st : =u, nLi st ) };
, aI t ems, 100, 100, , oDl g, , , , . T. )
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n ni l


tMeter
Classe de rgua de processamento.
Hierarquia
tSrvObject - >tControl - >tMeter
AdvPl________________________________________________________________304
Descrio
Utilize a classe tMeter para criar um controle que exibe uma rgua (gauge) de processamento,
descrevendo o andamento de um processo atraves da exibio de uma barra horizontal.
Parmetros
nTotal Numrico. Nmero total de passos at o preenchimento da rgua de processo.
lPercentage Lgico. Se .T. considera o passo de movimentao em porcentagem.
nClrBar Numrico. Cor da barra de andamento.
Mtodos
New
Descrio
Contrutor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anTotal], [aoWnd], [anWidth], [anHeight], [lPar8], [alPixel],
[oPar10], [cPar11], [alNoPerc], [anClrPane], [nPar14], [anClrBar], [nPar16], [lPar17])
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
numrico.
anTotal
Numrico, opcional. Numero total de passos at o preenchimento da rgua de
processo.
aoWnd Objeto, opcional. Janela ou controle onde o controle sera criado.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
lPar8 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
oPar10 Reservado.
cPar11 Reservado.
alNoPerc Lgico, opcional. Se .T. (padro) no considera os passos de atualizao em
AdvPl________________________________________________________________305
porcentagem.
anClrPane Numrico, opcional. Cor de fundo do controle.
nPar14 Reservado.
anClrBar Numrico, opcional. Cor da barra de andamento.
nPar16 Reservado.
lPar17 Reservado.
Retorno
O objeto construdo.
Set
Descrio
Atualiza a posio da rgua de processamento.
Sintaxe
Set( [nVal] )
Parmetros
nVal Numrico, opcional. Novo valor da posio da rgua de processamento.
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

St at i c l Runni ng: =. F. , l St op: =. F.

User Funct i on Test e( )

Local oDl g, oMet er , nMet er : =0, oBt n1, oBt n2
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 TI TLE Test e
/ / cr i a a r gua
oMet er : = t Met er ( ) : New( 10, 10, {| u| i f ( Pcount ( ) >0, nMet er : =u, nMet er ) };
, 100, oDl g, 100, 20, , . T. )
/ / bot o par a at i var andament o da r gua
@30, 10 BUTTON oBt n1 PROMPT Run OF oDl g PI XEL ACTI ON RunMet er ( oMet er )
@50, 10 BUTTON oBt n2 PROMPT St op OF oDl g PI XEL ACTI ON l St op: =. T.
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n ni l

St at i c Funct i on RunMet er ( oMet er )

I f l Runni ng
Ret ur n
Endi f
l Runni ng: = . T.
/ / i ni ci a a r gua
oMet er : Set ( 0)
AdvPl________________________________________________________________306
Whi l e . T. . and. ! l St op
/ / pr a 1 segundo
Sl eep( 1000)
/ / at ual i za a pi nt ur a da j anel a, pr ocessa mensagens do wi ndows
Pr ocessMessages( )
/ / pega val or cor r ent e da r gua
nCur r ent : = Eval ( oMet er : bSet Get )
nCur r ent +=10
/ / at ual i za r gua
oMet er : Set ( nCur r ent )
i f nCur r ent ==oMet er : nTot al
Ret ur n
endi f
Enddo
l Runni ng: = . F.
l St op: = . F.

Ret ur n


tMultiget
Classe de campo Memo de edio.
Hierarquia
tSrvObject - >tControl - >tMultiGet
Descrio
Utilize a classe tMultiget para criar controle de edio de texto de mltiplas linhas.
Propriedades
lWordWrap Lgico. Se .T., faz quebra automtica de linhas.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [aoFont], [alHScroll], [anClrFore],
[anClrBack], [oPar11], [alPixel], [cPar13], [lPar14], [abWhen], [lPar16], [lPar17], [alReadOnly],
[abValid], [bPar20], [lPar21], [alNoBorder], [alNoVScroll])
Parmetros
AdvPl________________________________________________________________307
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
AnCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:=
u, <var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser
tipo caracter.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
alHScroll Lgico, opcional. Se .T., habilita barra de rolagem horizontal.
anClrFore Numrico, opcional. Cor de fundo do controle.
anClrBack Numrico, opcional. Cor do texto do controle.
oPar11
Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
cPar13 Reservado.
lPar14 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se
o controle deve permanecer habilitado ou .F. se no.
lPar16 Reservado.
lPar17 Reservado.
alReadOnly Lgico, opcional. Se .T. o controle so permitira leitura.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser
validado, deve retornar .T. se o contedo for vlido e .F. quando o contedo for
invlido.
bPar20
Reservado.
lPar21 Reservado.
alNoBorder Lgico, opcional. Se .T. cria controle sem borda.
alNoVScroll Lgico, opcional. Se .T., habilita barra de rolagem vertical.
Retorno
O objeto construdo.
EnableVScroll
Descrio
Habilita a barra de rolagem vertical.
Sintaxe
AdvPl________________________________________________________________308
EnableVScroll( lEnable )
Parmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL

EnableHScroll
Descrio
Habilita a barra de rolagem horizontal.
Sintaxe
EnableHScroll( lEnable )
Parmetros
lEnable Lgico, obrigatrio. Se .T. habilita se .F. desabilita a barra de rolagem.
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )
Local oDl g, oMemo, cMemo: = space( 50)
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 PI XEL TI TLE My t est
oMemo: = t Mul t i get ( ) : New( 10, 10, {| u| i f ( Pcount ( ) >0, cMemo: =u, cMemo) };
, oDl g, 100, 100, , , , , , . T. )
@200, 10 BUTTON oBt n PROMPT Fecha OF oDl g PI XEL ACTI ON oDl g: End( )
ACTI VATE MSDI ALOG oDl g CENTERED
MsgSt op( cMemo)

Ret ur n Ni l


tPanel
Classe de painel esttico.
AdvPl________________________________________________________________309
Hierarquia
tSrvObject - >tControl - >tPanel
Descrio
Utilize a classe tPanel quando desejar criar um painel esttico, onde podem ser criados outros controles
com o objetivo de organizar ou agrupar componentes visuais.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [acText], [aoWnd], [aoFont], [alCentered], [lPar6], [anClrText], [anClrBack],
[anWidth], [anHeight], [alLowered], [alRaised])
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels.
anCol Numrico, opcional. Coordenada horizontal em pixels.
acText Caractere, opcional. Texto a ser exibido ao fundo.
aoWnd Objeto, opcional. Janela ou controle onde ser criado o objeto.
alCentered Lgico, opcional. Se .T. exibe o texto de ttulo ao centro do controle.
lPar6 Reservado.
anClrText Numrico, opcional. Cor do texto do controle.
anClrBack Numrico, opcional. Cor do fundo do controle.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
alLowered Lgico, opcional. Se .T. exibe o painel rebaixado em relao ao controle de fundo.
alRaised
Lgico, opcional. Se .T. exibe a borda do controle rebaixada em relao ao controle de
fundo.
Retorno
O objeto construdo.
AdvPl________________________________________________________________310
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

Local oDl g, oPanel , oBt n1, oBt n2
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 PI XEL TI TLE My t est
/ / cr i a o pai nel
oPanel : = t Panel ( ) : New( 10, 10, , oDl g, , , , , CLR_BLUE, 100, 100)
/ / cr i a bot o sobr e o pai nel
@10, 10 BUTTON oBt n1 PROMPT hi de OF oPanel ACTI ON oPanel : Hi de( )
/ / cr i a bot o f or a o pai nel
@200, 10 BUTTON oBt n2 PROMPT show OF oDl g ACTI ON oPanel : Show( )
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n
tRadMenu
Classe de radio group.
Hierarquia
tSrvObject - >tControl - >tRadMenu
Descrio
Utilize a classe tRadMenu para criar um controle que possibilita escolha de item atravs de uma lista.
Propriedades
nOption Numrico. Item selecionado.
aItems Array de caracteres. Lista de items selecionveis.
Mtodos
New
Descrio
Construtor do objeto.
Sintaxe
New([anRow], [anCol], [aacItems], [abSetGet], [aoWnd], [aPar6], [abChange], [anClrText], [anClrPan],
[cPar10], [lPar11], [abWhen], [anWidth], [anHeight], [abValid], [lPar16], [lPar17], [alPixel])
Parmetros
AdvPl________________________________________________________________311
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
aacItems Array de caracteres, opcional. Lista de opes.
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:=
u, <var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser
tipo numrico.
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
aPar6 Reservado.
abChange Bloco de cdigo, opcional. Executado quando o item selecionado alterado.
anClrText Numrico, opcional. Cor do texto do controle
anClrPan Numrico, opcional. Cor de fundo do controle.
cPar10
Reservado.
lPar11 Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados
est sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T.
para que o controle permanea habilitado, ou .F. se no.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deva ser validado,
retornando .T. se o contedo for vlido, e .F. quando invlido.
lPar16 Reservado.
Lpar17 Reservado.
alPixel
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
Retorno
O objeto construdo.
EnableItem
Descrio
Habilita ou desabilita item.
Sintaxe
EnableItem( [nItem], [lEnable])
Parmetros
nItem Numrico, opcional. Item selecionado.
AdvPl________________________________________________________________312
lEnable Lgico, opcional. Se .T. habilita o item se .F. desabilita o item.
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )
Local oDl g, oBut t on, oRadi o, nRadi o: =1, ;
aOpt i ons: ={escol ha1, escol ha2}
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 300, 300 PI XEL TI TLE Meu Get
oRadi o: = t RadMenu( ) : New( 10, 10, aOpt i ons, ;
{| u| i f ( PCount ( ) >0, nRadi o: =u, nRadi o) }, ;
oDl g, , , , , , , , 100, 20, , , , . T. )
@40, 10 BUTTON oBut t on PROMPT 7Fechar OF oDl g PI XEL ACTI ON oDl g: End( )
ACTI VATE MSDI ALOG oDl g CENTERED
MsgSt op( Escol heu +aOpt i ons[ nRadi o] )

Ret ur n ni l
tSay
Classe de label.
Hierarquia
tSrvObject - >tControl - >tSay
Descrio
O objeto tipo tSay exibe o contedo de texto esttico sobre uma janela ou controle.
Parmetros
lWordWrap
Lgico. Se .T. quebra o texto em vrias linhas de maneira a enquadrar o contedo
na rea determinada para o controle, sendo o padro .F.
lTransparent
Lgico. Se .T. a cor de fundo do controle ignorada assumindo o contedo ou cor do
controle ou janela ao fundo, sendo o padro .T.
Mtodos
New
Descrio
Mtodo construtor do controle.
AdvPl________________________________________________________________313
Sintaxe
New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont], [lPar7], [lPar8], [lPar9], [alPixels],
[anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16], [lPar17], [lPar18], [lPar19])
Parmetros
anRow Numrico, opcional. Coordenada vertical em pixels ou caracteres.
anCol Numrico, opcional. Coordenada horizontal em pixels ou caracteres.
abText
Codeblock, opcional. Quando executado deve retornar uma cadeia de caracteres a ser
exibida.
aoWnd Objeto, opcional. Janela ou dilogo onde o controle ser criado.
acPicture Caractere, opcional. Picture de formatao do contedo a ser exibido.
aoFont
Objeto, opcional. Objeto tipo tFont para configurao do tipo de fonte que ser
utilizado para exibir o contedo.
lPar7 Reservado.
lPar8 Reservado.
lPar9 Reservado.
alPixels
Lgico, opcional. Se .T. considera coordenadas passadas em pixels se .F., padro,
considera as coordenadas passadas em caracteres.
anClrText Numrico, opcional. Cor do contedo do controle.
anClrBack Numrico, opcional. Cor do fundo do controle.
anWidth Numrico, opcional. Largura do controle em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
lPar15 Reservado.
lPar16 Reservado.
lPar17 Reservado.
lPar18 Reservado.
lPar19
Reservado.
Retorno
O controle criado.
SetText
Descrio
Modifica o contedo a ser exibido pelo controle.
Sintaxe
SetText( [xVal] )
AdvPl________________________________________________________________314
Parmetros
xVal Caracter / Numrico / Data, Opcional. Valor a ser exibido.
Retorno
NIL
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

Local oDl g, oSay
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 200, 200 TI TLE My di al og PI XEL
oSay: = t Say( ) : New( 10, 10, {| | par a exi bi r }, oDl g, , , , ;
, , . T. , CLR_WHI TE, CLR_RED, 100, 20)
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n


tScrollbox
Classe de rea de scroll.
Hierarquia
tSrvObject - >tControl - >tScrollbox
Descrio
Utilize a classe tScrollbox para criar um painel com scroll deslizantes nas laterais do controle.
Mtodos
New
Descro
Construtor da classe
Sintaxe
New([aoWnd], [anTop], [anLeft], [anHeight], [anWidth], [alVertical], [alHorizontal], [alBorder])
Parmetros
AdvPl________________________________________________________________315
aoWnd Objeto, opcional. Janela ou controle onde o controle ser criado.
anTop Numrico, opcional. Coordenada vertical em pixels.
anLeft Numrico, opcional. Coordenada horizontal em pixels.
anHeight Numrico, opcional. Altura do controle em pixels.
anWidth Numrico, opcional. Largura do controle em pixels.
alVertical Lgico, opcional. Se .T. exibe a barra de scroll vertical.
alHorizontal Lgico, opcional. Se .T. exibe a barra de scroll horizontal.
alBorder Lgico, opcional. Se .T. exibe a borda do controle.
Retorno
O objeto criado.
Exemplo
#i ncl ude pr ot heus. ch

User Funct i on Test e( )

Local oDl g, oScr , oGet 1, oGet 2, oGet 3
Local cGet 1, cGet 2, cGet 3
cGet 1: = Space( 10)
cGet 2: = Space( 10)
cGet 3: = Space( 10)
DEFI NE MSDI ALOG oDl g FROM 0, 0 TO 400, 400 PI XEL My t est
oScr : = TScr ol l Box( ) : New( oDl g, 10, 10, 200, 200, . T. , . T. , . T. )
/ / cr i a cont r ol es dent r o do scr ol l box
@10, 10 MSGET oGet 1 VAR cGet 1 SI ZE 100, 10 OF oScr PI XEL
@50, 10 MSGET oGet 2 VAR cGet 2 SI ZE 100, 10 OF oScr PI XEL
@150, 100 MSGET oGet 3 VAR cGet 3 SI ZE 100, 10 OF oScr PI XEL
ACTI VATE MSDI ALOG oDl g CENTERED

Ret ur n ni l


AdvPl________________________________________________________________316
Infra-estrutura

Bem-vindo documentao das funes genricas e objetos disponveis no RPO padro do Advanced
Protheus.

Esta documentao aborda os seguintes tpicos:

Funes de Infra-Estrutura

Objetos de Infra- Estrutura

@ 2001 Microsiga Software S.A.
Todos os direitos reservados



MsGetDados
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em um vetor.
Caractersticas
A MsGetDados precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.

Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao que esta sendo
executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no formato:
Elemento Contedo
1 Ttulo
2 Rotina
AdvPl________________________________________________________________317
3 Reservado
4
Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 - alterao;
5 - excluso)
5
Acesso relacionado a rotina, se esta posio no for informada
nenhum acesso ser validado


aHeader
Vetor com informaes das colunas no formato:
Elemento Contedo
1 Ttulo
2 Campo
3 Mscara
4 Tamanho
5 Decimal
6 Validao
7 Reservado
8 Tipo
9 Reservado
10 Reservado


aCols
Vetor com as linhas a serem editadas. As colunas devem ser construdas com base no aHeader mais uma
ultima com valor lgico que determina se a linha foi excluda.

lRefresh
Varivel tipo lgica para uso reservado.
A MsGetDados cria a varivel publica n que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDados (cLinhaOk, cTudoOk, ...) no podero ser
declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver cadastrado no
Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
AdvPl________________________________________________________________318
Cria o objeto MsGetDados.
Sintaxe
MSGETDADOS():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [ cTudoOk ], [
cIniCpos ], [ lApagar ], [ aAlter ], [ uPar1 ], [ lVazio ], [ nMax ], [ cCampoOk ], [ cSuperApagar ], [ uPar2
], [ cApagaOk ], [ oWnd ] ) -> objeto
Argumentos Descrio
nSuperior
Distancia entre a MsGetDados e o extremidade superior do
objeto que a contm.
nEsquerda
Distancia entre a MsGetDados e o extremidade esquerda do
objeto que a contm.
nInferior
Distancia entre a MsGetDados e o extremidade inferior do objeto
que a contm.
nDireita
Distancia entre a MsGetDados e o extremidade direita do objeto
que a contm.
nOpc
Posio do elemento do vetor aRotina que a MsGetDados usar
como referencia.
cLinhaOk
Funo executada para validar o contexto da linha atual do
aCols.
cTudoOk
Funo executada para validar o contexto geral da MsGetDados
(todo aCols).
cIniCpos
Nome dos campos do tipo caracter que utilizaro incremento
automtico. Este parmetro deve ser no formato +<nome do
primeiro campo>+<nome do segundo campo>+....
lApagar Habilita deletar linhas do aCols. Valor padro falso.
aAlter Vetor com os campos que podero ser alterados.
uPar1 Parmetro reservado.
lVazio
Habilita validao da primeira coluna do aCols para esta no
poder estar vazia. Valor padro falso.
nMax Nmero mximo de linhas permitidas. Valor padro 99.
cCampoOk Funo executada na validao do campo.
cSuperApagar
Funo executada quando pressionada as teclas
<Ctrl>+<Delete>.
uPar2 Parmetro reservado.
cApagaOk Funo executada para validar a excluso de uma linha do aCols.
oWnd Objeto no qual a MsGetDados ser criada.
Retorno
Objeto.

AdvPl________________________________________________________________319

ForceRefresh
Descrio
Atualiza a MsGetDados com o aCols e posiciona na primeira linha.

Sintaxe

oObjeto:ForceRefresh()


Hide
Descrio
Esconde a MsGetDados.

Sintaxe

oObjeto:Hide()

Show
Descrio
Mostra a MsGetDados.

Sintaxe

oObjeto:Show()
Exemplo
User Funct i on Exempl o( )
Local nI
Local oDl g
Local oGet Dados
Local nUsado : = 0
Pr i vat e l Ref r esh : = . T.
Pr i vat e aHeader : = {}
Pr i vat e aCol s : = {}
Pr i vat e aRot i na : = {{" Pesqui sar " , "AxPesqui " , 0, 1}, ;
{" Vi sual i zar " , " AxVi sual ", 0, 2}, ;
{" I ncl ui r ", " AxI ncl ui " , 0, 3}, ;
{" Al t er ar ", " AxAl t er a" , 0, 4}, ;
{" Excl ui r ", " AxDel et a" , 0, 5}}
DbSel ect Ar ea( " SX3" )
DbSet Or der ( 1)
DbSeek( " SA1" )
Whi l e ! Eof ( ) . and. SX3- >X3_ARQUI VO == " SA1"
I f X3Uso( SX3- >X3_USADO) . and. cNi vel >= SX3- >X3_NI VEL
nUsado++
Aadd( aHeader , {Tr i m( X3Ti t ul o( ) ) , ;
SX3- >X3_CAMPO, ;
AdvPl________________________________________________________________320
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
" " , ;
SX3- >X3_TI PO, ;
" " , ;
" " })
EndI f
DbSki p( )
End
Aadd( aCol s, Ar r ay( nUsado+1) )
For nI : = 1 To nUsado
aCol s[ 1] [ nI ] : = Cr i aVar ( aHeader [ nI ] [ 2] )
Next
aCol s[ 1] [ nUsado+1] : = . F.
DEFI NE MSDI ALOG oDl g TI TLE " Exempl o" FROM 00, 00 TO 300, 400 PI XEL
oGet Dados : = MSGETDADOS():NEW(05, 05, 145, 195, 4, " U_LI NHAOK" , " U_TUDOOK" ,
" +A1_COD" , . T. , {" A1_NOME" }, , . F. , 200, " U_FI ELDOK" , "U_SUPERDEL" , , " U_DELOK" , oDl g)
ACTI VATE MSDI ALOG oDl g CENTERED
Ret ur n

User Funct i on LI NHAOK( )
ApMsgStop( "LI NHAOK" )
Ret ur n . T.

User Funct i on TUDOOK( )
ApMsgSt op( " LI NHAOK" )
Ret ur n . T.

User Funct i on DELOK( )
ApMsgSt op( " DELOK" )
Ret ur n . T.

User Funct i on SUPERDEL( )
ApMsgSt op( " SUPERDEL")
Ret ur n . T.

User Funct i on FI ELDOK( )
ApMsgSt op( " FI ELDOK" )
Ret ur n . T.
MsGetDb
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em uma tabela
temporria.
Caractersticas
A MsGetDB precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.

Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao que esta sendo
executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no formato:
Elemento Contedo
1 Ttulo
AdvPl________________________________________________________________321
2 Rotina
3 Reservado
4
Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 - alterao;
5 - excluso)
5
Acesso relacionado a rotina, se esta posio no for informada
nenhum acesso ser validado

aHeader
Vetor com informaes das colunas no formato:
Elemento Contedo
1 Ttulo
2 Campo
3 Mscara
4 Tamanho
5 Decimal
6 Validao
7 Reservado
8 Tipo
9 Reservado
10 Reservado

lRefresh
Varivel tipo lgica para uso reservado.
A tabela temporria utilizada pela MsGetDB dever ser criada com base no aHeader mais um ltimo
campo tipo lgico que determina se a linha foi excluda.
A MsGetDB cria a varivel publica nBrLin que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDB (cLinhaOk, cTudoOk, ...) no podero ser
declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver cadastrado no
Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
Cria o objeto MsGetDB.
Sintaxe
AdvPl________________________________________________________________322
MSGETDB():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [ cTudoOk ], [ cIniCpos ], [
lApagar ], [ aAlter ], [ nCongelar ], [ lVazio ], [ uPar1 ], cTRB, [ cCampoOk ], [ lCondicional ], [ lAdicionar ],
[ oWnd ], [ lDisparos ], [ uPar2 ], [ cApagarOk ], [ cSuperApagar ] ) -> objeto
Argumentos Descrio
nSuperior
Distancia entre a MsGetDB e o extremidade superior do objeto
que a contm.
nEsquerda
Distancia entre a MsGetDB e o extremidade esquerda do objeto
que a contm.
nInferior
Distancia entre a MsGetDB e o extremidade inferior do objeto
que a contm.
nDireita
Distancia entre a MsGetDB e o extremidade direita do objeto que
a contm.
nOpc
Posio do elemento do vetor aRotina que a MsGetDB usar
como referncia.
cLinhaOk
Funo executada para validar o contexto da linha atual do
aCols.
cTudoOk
Funo executada para validar o contexto geral da MsGetDB
(todo aCols).
cIniCpos
Nome dos campos do tipo caracter que utilizaro incremento
automtico. Este parmetro deve ser no formato +<nome do
primeiro campo>+<nome do segundo campo>+....
lApagar Habilita a opo de deletar linhas do aCols. Valor padro falso.
aAlter Vetor com os campos que podero ser alterados.
nCongelar Indica qual coluna no ficara congelada na exibio.
lVazio
Habilita validao da primeira coluna do aCols para esta no
poder estar vazia. Valor padro falso.
uPar1 Parmetro reservado.
cTRB Alias da tabela temporria.
cCampoOk Funo executada na validao do campo.
lConditional Reservado
lAdacionar
Indica se a MsGetDB ira criar uma linha em branco automaticamente
quando for incluso.
oWnd Objeto no qual a MsGetDB ser criada.
lDisparos
Indica se ser utilizado o Dicionrio de Dados para consulta
padro, inicializao padro e gatilhos.
uPar2 Parmetro reservado.
cApagarOk Funo executada para validar a excluso de uma linha do aCols.
cSuperApagar
-Funo executada quando pressionada as teclas
<Ctrl>+<Delete>.
AdvPl________________________________________________________________323
Retorno
Objeto.


ForceRefresh
Descrio
Atualiza a MsGetDB com a tabela e posiciona na primeira linha.
Sintaxe
ForceRefresh()
Exemplo
User Funct i on Exempl o( )
Local nI
Local oDl g
Local oGet DB
Local nUsado : = 0
Local aSt r uct : = {}
Pr i vat e l Ref r esh : = . T.
Pr i vat e aHeader : = {}
Pr i vat e aCol s : = {}
Pr i vat e aRot i na : = {{" Pesqui sar " , "AxPesqui " , 0, 1}, ;
{" Vi sual i zar " , " AxVi sual ", 0, 2}, ;
{" I ncl ui r ", " AxI ncl ui " , 0, 3}, ;
{" Al t er ar ", " AxAl t er a" , 0, 4}, ;
{" Excl ui t ", " AxDel et a" , 0, 5}}
DbSel ect Ar ea( " SX3" )
DbSet Or der ( 1)
DbSeek( " SA1" )
Whi l e ! Eof ( ) . and. SX3- >X3_ARQUI VO == " SA1"
I f X3Uso( SX3- >X3_USADO) . and. cNi vel >= SX3- >X3_NI VEL
nUsado++
Aadd( aHeader , {Tr i m( X3Ti t ul o( ) ) , ;
SX3- >X3_CAMPO, ;
SX3- >X3_PI CTURE, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL, ;
SX3- >X3_VALI D, ;
" " , ;
SX3- >X3_TI PO, ;
" " , ;
" " })
Aadd( aSt r uct , {SX3- >X3_CAMPO, ;
SX3- >X3_TI PO, ;
SX3- >X3_TAMANHO, ;
SX3- >X3_DECI MAL})
EndI f
DbSki p( )
End
Aadd( aSt r uct , {"FLAG", " L" , 1, 0})
cCr i aTr ab : = Cr i aTr ab( aSt r uct , . T. )
DbUseAr ea( . T. , __Local Dr i ver , cCr i aTr ab, , . T. , . F. )
DEFI NE MSDI ALOG oDl g TI TLE " Exempl o" FROM 00, 00 TO 300, 400 PI XEL
oGet DB : = MSGETDB():NEW(05, 05, 145, 195, 3, " U_LI NHAOK" , " U_TUDOOK" , " +A1_COD" , . T. ,
{" A1_NOME"}, 1, . F. , , cCr i aTr ab, "U_FI ELDOK", , . T. , oDl g, . T. , , " U_DELOK",
" U_SUPERDEL" )
ACTI VATE MSDI ALOG oDl g CENTERED
DbSel ect Ar ea( cCr i aTr ab)
DbCl oseAr ea( )
Ret ur n
AdvPl________________________________________________________________324

User Funct i on LI NHAOK( )
ApMsgSt op( " LI NHAOK" )
Ret ur n . T.

User Funct i on TUDOOK( )
ApMsgSt op( " LI NHAOK" )
Ret ur n . T.

User Funct i on DELOK( )
ApMsgSt op( " DELOK" )
Ret ur n . T.

User Funct i on SUPERDEL( )
ApMsgSt op( " SUPERDEL")
Ret ur n . T.

User Funct i on FI ELDOK( )
ApMsgSt op( " FI ELDOK" )
Ret ur n . T.



MsmGet
Conjunto de objetos tipo MsGet/MsCombo para cadastramento de dados baseado no Dicionrio de Dados.
Caractersticas
A MsMGet tambm poder criada a partir da funo Enchoice a qual recebe os mesmos parmetros do
mtodo New porm no retorna o objeto criado.
A MsMGet se baseia no Dicionrio de Dados para verificar campos obrigatrios, validaes, gatilhos,
consulta padro etc. assim como para a criao das Pastas de Cadastro.
A MsMGet pode usar tanto variveis de memria do tipo Private como diretamente os campos da tabela a
que se refere.
Mtodos
New
Descrio
Cria o objeto MsMGet.
Sintaxe
MSMGET():NEW( cAlias, nReg, nOpc, [ uPar1 ], [ uPar2 ], [ uPar3 ], [ aACho ], [ aPos ], [ aCpos ], [
uPar4 ], [ uPar5 ], [ uPar6 ], [ uPar7 ], [ oWnd ], [ uPar8 ], [ lMemoria ], [ lColuna ], [ uPar9 ], [
lSemPastas ] ) -> objeto
Argumentos Descrio
cAlias Alias do dados a serem cadastrados.
AdvPl________________________________________________________________325
nReg Nmero do registro da tabela a ser editado.
uPar1 Parmetro reservado.
uPar2 Parmetro reservado.
uPar3 Parmetro reservado.
aAcho Vetor com os campos que sero apresentados pela MsMGet.
aPos
Vetor com as coordenadas onde a MsMGet ser criada no
formato {coord. superior, coord. esquerda, coord. direita,
coord. inferior}.Funo executada para validar o contexto
da linha atual do aCols.
aCpos Vetor com os campos que podero ser alterados.
uPar4
Parmetro reservado. Nome dos campos do tipo caracter
que utilizaro incremento automtico. Este parmetro deve
ser no formato +<nome do primeiro campo>+<nome do
segundo campo>+....
uPar5 Parmetro reservado.
uPar6 Parmetro reservado.
uPar7 Parmetro reservado.
oWnd Objeto no qual a MsMGet ser criada.
uPar8 Parmetro reservado.
lMemoria
Indica se ser usado variveis de memria ou os campos da
tabela para cadastramento dos dados. Valor padro falso.
lColuna
Indica se a MsMGet sera apresentada com um objeto por
linha (uma coluna). Valor padro falso. Parmetro
reservado.
uPar9 Parmetro reservado.
lSemPastas
Indica se no ser usado as Pastas de Cadastro na MsMGet.
Funo executada para validar a excluso de uma linha do
aCols.
Retorno
Objeto.


Refresh
Descrio
Atualiza os objetos contidos na MsMGet.
Sintaxe
Refresh()
AdvPl________________________________________________________________326


Hide
Descrio
Esconde a MsMGet.
Sintaxe
Hide()

Show
Descrio
Mostra a MsMGet.
Sintaxe
Show()

Exemplo
User Funct i on Exempl o( )
Local i
Local oDl g
Local oMsMGet
Local l I ni t
Local cCampo
DbSel ect Ar ea( " SA1" )
For i : = 1 To FCount ( )
cCampo : = Fi el d( i )
l I ni t : = . F.
I f Exi st I ni ( cCampo)
l I ni t : = . t .
M- >&( cCampo) : = I ni t Pad( SX3- >X3_RELACAO)
I f Val Type( M- >&( cCampo) ) = "C"
M- >&( cCampo) : = Padr ( M- >&( cCampo) , SX3- >X3_TAMANHO)
EndI f
I f M- >&( cCampo) == NI L
l I ni t : = . F.
EndI f
EndI f
I f ! l I ni t
M- >&( cCampo) : = Fi el dGet ( i )
I f Val Type( M- >&( cCampo) ) = "C"
M- >&( cCampo) : = Space( Len( M- >&( cCampo) ) )
El seI f Val Type( M- >&( cCampo) ) = " N"
M- >&( cCampo) : = 0
El seI f Val Type( M- >&( cCampo) ) = " D"
M- >&( cCampo) : = Ct oD( " / / " )
El seI f Val Type( M- >&( cCampo) ) = " L"
M- >&( cCampo) : = . F.
EndI f
EndI f
Next
DEFI NE MSDI ALOG oDl g TI TLE " Exempl o" FROM 00, 00 TO 19, 80
MSMGET():NEW(" SA1" , 0, 3, , , , , , , , , , , , , . T. )
ACTI VATE MSDI ALOG oDl g CENTERED ON I NI T Enchoi ceBar ( oDl g, {| | oDl g: End( ) }, {| | oDl g: End( ) })
AdvPl________________________________________________________________327
Ret ur n
MBrowse
Monta um Browse com menu de opes.
Sintaxe
MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [ uPar5 ], [ cFun ], [
nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) -> nil
Argumento Obrigat. Tipo Descrio
uPar1 No N Parmetro reservado.
uPar2 No N Parmetro reservado.
uPar3 No N Parmetro reservado.
uPar4 No N Parmetro reservado.
CAlias Sim C Alias do arquivo a ser visualizado no browse.
AFixos No A
Contendo os nomes dos campos fixos pr-definidos pelo
programador, obrigando a exibio de uma ou mais colunas.
CCpo No C
Campo a ser validado se est vazio ou no para exibio do bitmap
de status.
uPar5 No N Parmetro reservado.
cFun No C
Funo que retornar um valor lgico para exibio do bitmap de
status.
nPadrao No N
Nmero da rotina a executada quando for efetuado um duplo clique
em um registros do browse. Caso no seja informado o padro
ser executada visualizao ou pesquisa.
aCores No A
Este vetor possui duas dimenses, a primeira a funo de
validao para exibio do bitmap de status, e a segunda o bitmap
a ser exibido.
cExpIni No C
Funo que retorna o contedo inicial do filtro baseada na chave de
ndice selecionada.
cExpFim No C
Funo que retorna o contedo final do filtro baseada na chave de
ndice selecionada.
nCongela No N Coluna a ser congelado no browse.
Descrio
AdvPl________________________________________________________________328
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo.
Apenas um dos parmetros ( cCpo, cFun, aColors ) deve ser informado.
(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada
(incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visualizao; 3 -
incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio no for informada
no validar os acessos.
Exemplo
Pr i vat e cCadast r o : = ' Cadast r o de Cl i ent es'
Pr i vat e aRot i na : = { { ' Pesqui sar ' , ' AxPesqui ' , 0, 1 }, ;
{ ' Vi sual i zar ' , ' AxVi sual ' , 0, 2 }, ;
{ ' I ncl ui r ' , ' AxI ncl ui ' , 0, 3 }, ;
{ ' Al t er ar ' , ' AxAl t er a' , 0, 4 }, ;
{ ' Excl ui r ' , ' AxExcl ui r ' , 0, 5 }}
MBROWSE( , , , , ' SA1' , , ' ! A1_COD' , , , 4 )
Funes
AllGroups
Retorna vetor contendo informaes dos grupos de usurios.
Sintaxe
ALLGROUPS() -> array
Descrio
A funo AllGroups() retorna um vetor principal onde cada elemento refere-se a um grupo de usurios
do sistema, estes elementos so compostos de um vetor multidimensional subdividindo as
informaes dos grupos. Sua estrutura composta de:
Elemento Descrio Tipo Qtd.
1
1 ID C 6
2 Nome C 20
3 Vetor com horrios de acesso A
4 Data de validade D 8
5 Quantas vezes para expirar N 4
6 Autorizado a alterar a senha L 1
AdvPl________________________________________________________________329
7 Idioma N 1
8 Diretrio C 100
9 Impressora C
10 Acessos C 512
11 Vetor com empresas A

12 Data da ltima alterao D 8
13 Tipo de impresso N 1
14 Formato N 1
15 Ambiente N 1
16 Opo de impresso L 1
17 Acesso a outros Dir de impresso L 1
2
1 Mdulo+nvel+menu C
Exemplo
Local aGr upos: = {}
aGr upos: = ALLGROUPS()



AllUsers
Retorna vetor contendo informaes dos usurios do sistema.
Sintaxe
ALLUSERS() -> array
Descrio
A funo AllUsers() retorna um vetor principal onde cada elemento refere-se a um usurio do sistema,
estes elementos so compostos de um vetor multidimensional subdividindo as informaes dos
usurios. Sua estrutura composta de:
Elemento Descrio Tipo Qtd.
1
1 ID C 6
AdvPl________________________________________________________________330
2 Nome C 15
3 Senha C 6
4 Nome Completo C 30
5 Vetor com n ltimas senhas A --
6 Data de validade D 8
7 Quantas vezes para expirar N 4
8 Autorizado a alterar a senha L 1
9 Alterar a senha no prximo logon L 1
10 Vetor com os grupos A --
11 ID do superior C 6

12 Departamento C 30
13 Cargo C 30
14 E-Mail C 130
15 Nmero de acessos simultneos N 4
16 Data da ltima alterao D 8
17 Usurio bloqueado L 1
18 Nmero de dgitos para o ano N 1
19 Listner de ligaes L 1
20 Ramal C 4
2
1 Vetor com horrios de acesso A --
2 Idioma N 1
3 Diretrio C 100
4 Impressora C --
5 Acessos C 512
6 Vetor com empresas A --
7 Ponto de entrada C 10
8 Tipo de impresso N 1
9 Formato N 1
10 Ambiente N 1
11 Prioridade p/ config. do grupo L 1
12 Opo de impresso C 50
13 Acesso a outros dir de impresso L 1
3
1 Mdulo+nvel+menu C
Exemplo
Local aUsuar i o: = {}
aUsuar i o: = ALLUSERS()
AdvPl________________________________________________________________331
APMsgAlert
Exibe uma mensagem em um dilogo
Sintaxe
APMSGALERT( cMsg, [ cTitulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
Exemplo
APMSGALERT(At eno)
APMsgI nfo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGINFO( cMsg, [ cTitulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
Exemplo
APMSGINFO(At eno)
AdvPl________________________________________________________________332
APMsgNoYes
Exibe uma mensagem em um dilogo
Sintaxe
APMSGNOYES( cMsg, [ cTitulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida.
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso cancele a funo retornar verdadeiro, seno retornar falso.
Exemplo
I f ! APMSGNOYES(Abandonar ?)
Ret ur n
EndI f
APMsgStop
Exibe uma mensagem em um dilogo
Sintaxe
APMSGSTOP( cMsg , [ cTitulo ] ) -> nil
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida.
Ctitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem crtica.
Exemplo
APMSGSTOP(At eno)
AdvPl________________________________________________________________333
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
Exemplo
I f APMSGYESNO(Abandonar ?)
Ret ur n
EndI f
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cMsg Sim C Mensagem a ser exibida
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
Exemplo
I f APMSGYESNO(Abandonar ?)
AdvPl________________________________________________________________334
Ret ur n
EndI f
Cabec
Imprime cabealho personalizado nos relatrios.
Sintaxe
CABEC( cTitulo, cCabec1, cCabec2, cPrograma, cTamanho, [ nFormato ], [ uPar ], [ lPerg ] ) -> nil
Argumento Obrigat. Tipo Descrio
cTitulo Sim C Ttulo do relatrio.
cCabec1 Sim C Primeira linha do cabealho.
cCabec2 Sim C Segunda linha do cabealho.
cPrograma Sim C Nome do relatrio.
cTamanho Sim C Tamanho da pgina P,M,G.
nFormato No N Para imprimir comprimido informe 15
uPar No U Reservado
lPerg No L Se verdadeiro, (.T.) imprime as perguntas no incio do relatrio.
Descrio
A funo Cabec() imprime o cabealho personalizado de acordo com o contedo dos parmetros cCabec1
e cCabec2. O logo impresso no cabealho uma imagem de extenso .bmp, cujo nome est associado
com o empresa corrente. Ex: LGRL01.BMP, 01 a empresa.
Exemplo
User Funct i on <nome- da- f uno>( )
Local cPr ogr am: = ' Exempl o' / / nome do r el at r i o
Local cAl i as : = ' XXX' / / al i as do ar qui vo
Local cPer g : = ' XXXXXX' / / gr upo de per gunt as
Local cTi t ul o : = ' Ti t ul o do r el at r i o'
Local cDesc1 : = ' Descr i o'
Local cDesc2 : = ' cont i nuao da descr i o'
Local cDesc3 : = ' cont i nuao da descr i o'
Local l Di c : = . F. / / no ut i l i za di ci onr i o
Local aOr d : = { ' 1 Or dem' , ' 2 or dem' , ' 3 or dem' }
Local l Compr es : =. F.
Local cTam: = "G"
Pr i vat e m_pag : = 1
AdvPl________________________________________________________________335
Pr i vat e aRet ur n : = { " Zebr ado", 1, "Admi ni st r ao" , 1, 2, 1, " " , 1 }
Pr i vat e wr el
Per gunt e( cPer g, . F. )
wr el : = SetPrint( cAl i as, cPr ogr am, cPer g, @cTi t ul o, cDesc1, cDesc2, cDesc3, l Di c, aOr d ,
l Compr es, cTam)
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
SetDefault( aRet ur n, cAl i as )
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
RptStatus( {| l Fi m| I mpr i me( @l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho ) }, cTi t ul o )
Ret ur n

/ / r ot i na de i mpr esso
St at i c Funct i on I mpr i me( l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho )
Local nLi n : = 80
Local cCabec1 : = ' Cabecal ho 1'
Local cCabec2 : = ' Cabecal ho 2'
dbSel ect Ar ea( cAl i as )
SetRegua( RecCount ( ) )
Whi l e ! Eof ( ) . And. ( XX_COD >= MV_PAR01 . And. XX_COD <= MV_PAR02 )
I f l Fi m
@Pr ow( ) +1, 001 PSAY " CANCELADO PELO OPERADOR"
Exi t
EndI f
I f nLi n > 58
CABEC( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
nLi n : = 8
EndI f
@nLi n, 000 PSAY __Pr t Fat Li ne( )
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
I ncRegua( )
dbSki p( )
End
I F nLi n ! = 80
nLi n++
I f nLi n > 60
CABEC( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
Endi f
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
Roda( , , cTamanho ) / / Rodap
EndI f
AdvPl________________________________________________________________336
I f aRet ur n[ 5] = 1
Set Printer TO
dbCommi t Al l ( )
OurSpool( wr el )
Endi f
MS_FLUSH( )
Ret ur n
Capital
Corrige maisculas e minsculas de uma frase.
Sintaxe
CAPITAL( cTexto ) -> caracter
Argumento Obrigat. Tipo Descrio
cTexto Sim C Texto a ser corrigido.
Descrio
Esta funo coloca a primeira letra de cada palavra em maiscula e o restante em minscula em toda a
frase.
Exemplo
APMsgInfo( CAPITAL(Fr AsE I nCoRr Et A) )


CloseBrowse
Fecha a MBrowse ou a MarkBrow.
Sintaxe
CLOSEBROWSE() -> lgico
Descrio
Esta funo fecha a MBrowse ou MarkBrow dependendo de qual estiver ativa.
AdvPl________________________________________________________________337
Conpad1
Exibe a tela de consulta padro.
Sintaxe
CONPAD1( [ uPar1 ], [ uPar2 ], [ uPar3 ], cAlias, [ cCampoRet ], [ uPar4 ], [ lVisual ] ) -> lgico
Argumento Obrigat. Tipo Descrio
uPar No U Parmetro reservado.
uPar2 No U Parmetro reservado.
uPar3 No U Parmetro reservado.
cAlias Sim C
Consulta padro cadastrada no Dicionrio de Dados (SXB) a ser
utilizada.
cCampoRet No C Nome da varivel ou campo que receber o retorno da consulta padro.
uPar4 No U Parmetro Reservado.
lVisual No L Indica se ser somente para visualizao.
Descrio
Esta funo exibe a tela de consulta padro baseada no Dicionrio de Dados (SXB).
Exemplo
CONPAD1(, , , SA1, , , . F. )


Enchoicebar
Cria barra de botes padro na janela
Sintaxe
ENCHOICEBAR( oDlg, bOk, bCancelar, [ lMensApag ] , [ aBotoes ] ) -> nil
Argumento Obrigat. Tipo Descrio
oDlg Sim O Janela onde a barra ser criada.
AdvPl________________________________________________________________338
bOk Sim B Bloco executado quando clicado boto Ok.
bCancelar Sim B Bloco executado quando clicado.
lMensApag No L
Indica se ao clicar no boto Ok aparecer uma tela de confirmao de
excluso. Valor padro falso
aBotoes No A
Vetor com informaes para criao de botes adicionais na barra no
formato {bitmap, bloco de cdigo, mensagem}.
Descrio
Esta funo cria uma barra com botes padro e outros passados como parmetro na janela tambem
passada por parmetro. A EnchoiceBar dever ser chamada antes do ACTIVATE da janela.
Exemplo
User Funct i on <nome- do- pr ogr ama>( )
Local oDl g
DEFI NE MSDI ALOG oDl g TI TLE " Exempl o" FROM 00, 00 TO 300, 400 PI XEL
ACTI VATE MSDI ALOG oDl g CENTERED ON I NI T, ;
ENCHOICEBAR(oDl g, {| | APMsgInfo( Ok) }, {| | ApMsgI nf o( Cancel ar ) }, , {{BMPI NCLUI R, {| |
APMsgI nf o( Test e) }, Test e}})
Ret ur n




FileNoExt
Retorna o nome de um arquivo sem a extenso.
Sintaxe
FILENOEXT( cTexto ) -> caracter
Argumento Obrigat. Tipo Descrio
cTexto Sim C Texto contendo o nome do arquivo
Descrio
A funo FileNoExt() retorna o nome de um arquivo contido em uma string, ignorando a extenso.
Exemplo
Local cSt r i ng : = ' \ SI GAADV\ ARQZZZ. DBF'
cSt r i ng : = FileNoExt( cSt r i ng )
/ / r et or no \ SI GAADV\ ARQZZZ
AdvPl________________________________________________________________339
Final
Utilizada para finalizar o sistema.
Sintaxe
FINAL( [ cMensagem1 ], [ cMensagem2 ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cMensagem1 No C Primeira mensagem.
cMensagem2 No C Segunda mensagem.
Descrio
Esta funo executa operaes bsicas que garantem a integridade dos dados ao finalizar o sistema
desmontando as transaes (se houver), desbloqueando os semforos e fechando as tabelas abertas.
Exemplo
User Funct i on <nome- do- pr ogr ama>( cUsuar i o, cSenha )
Local cMensag1 : = Usur i o i nvl i do!
Local cMensag2 : = Opo di spon vel par a usur i os Admi ni st r ador es!
I f ! PswAdmin( cUsuar i o, cSenha )
FINAL( cMensag1, cMensag2 )
EndI f
Ret ur n



FTPConnect
Cria conexo com servidor FTP.
Sintaxe
FTPCONNECT( cServidor, nPorta, cUsuario, cSenha ) -> lgico
Descrio
A funo FTPConnect() retorna verdadeiro se a operao for realizada com sucesso. Se existir uma
conexo ativa e for solicitada uma nova, retornar falso.
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________340
cServidor Sim C Endereo do servidor
nPorta No N
Nmero da porta utilizada para conectar no servidor, por default
utiliza a porta padro de FTP.
cUsuario No C
Nome do usurio utilizado para conectar no servidor. Por default
utiliza o usurio "Anonymous".
cSenha No C
Senha do usurios utilizado para conectar no servidor. Por default
utiliza o usurio "Anonymous".
Exemplo
Local cSer vi dor
Local cCur Di r
cSer vi dor : = ' f t p. cami nhodoser vi dor . com. br '
I f ! FTPCONNECT( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
FTPDirChange
Altera o diretrio corrente do FTP.
Sintaxe
FTPDIRCHANGE( cDiretorio ) -> lgico
Argumento Obrigat. Tipo Descrio
cDiretorio Sim C Nome do diretrio.
Descrio
A funo FTPDirChange () retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cSer vi dor
Local aAr qs
Local aDi r s
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
I f FTPDirChange(' di r et or i o' )
aDi r s : = FTPDirectory( ' *. *' , ' D' )
aAr qs : = FTPDi r ect or y( ' *. *' )
EndI f
AdvPl________________________________________________________________341
FTPDirectory
Cria um vetor com informaes de diretrios e arquivos do FTP.
Sintaxe
FTPDIRECTORY( cMascara, [ cAtributo ] ) -> array
Argumento Obrigat. Tipo Descrio
cMascara Sim C Mscara dos arquivos a serem pesquisados.
cAtributo No C
Se for informado D a funo retornar somente diretrios, se no for
informado retornar somente arquivos.
Descrio
A funo FTPDirectory() retorna um vetor contendo informaes dos diretrios e arquivos contidos no FTP.
Exemplo
Local cSer vi dor
Local aAr qs
Local aDi r s
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
I f FTPDirChange( ' di r et or i o' )
aDi r s : = FTPDIRECTORY( ' *. *' , ' D' )
aAr qs : = FTPDIRECTORY( ' *. *' )
EndI f
FTPDisconnect
Elimina conexo atual.
Sintaxe
FTPDISCONNECT() -> lgico
Descrio
A funo FTPDisconnect() retornar verdadeiro (.T.) se a operao for realizada com sucesso. Se no
existir uma conexo a funo retornar falso (.F.). Se a operao for realizada com sucesso a funo
retorna verdadeiro (.T.).
AdvPl________________________________________________________________342
Exemplo
Local cSer vi dor
Local aAr qs
Local aDi r s
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDISCONNECT()
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
FTPDirChange( ' di r et or i o' )
aDi r s : = FTPDirectory( ' *. *' , ' D' )
aAr qs : = FTPDi r ect or y( ' *. *' )
FTPDownload
Copia um arquivo no servidor FTP para o servidor local.
Sintaxe
FTPDOWNLOAD( cArqDest, cArqOrig ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqDest Sim C Caminho e nome do arquivo a ser gravado na mquina.
CArqOrig Sim C Arquivo no servidor a ser copiado.
Descrio
A funo FTPDownload() copia um arquivo no servidor FTP para uma mquina local em um diretrio
(informado no parmetro cArqDest) abaixo do RootPath do Protheus.
Exemplo
Local cSer vi dor
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
I f FTPDirChange( ' di r et or i o' )
I f ! FTPDOWNLOAD( ' \ DI RETORI O\ ARQ00001. ARQ' , ' ARQ00001. ARQ' )
APMsgInfo( ' Pr obl emas ao copi ar ar qui vo! ' )
EndI f
EndI f
FTPErase
Apaga arquivo no servidor FTP.
AdvPl________________________________________________________________343
Sintaxe
FTPERASE( cArquivo ) -> lgico
Argumento Obrigat. Tipo Descrio
cArquivo Sim C Nome do arquivo
Descrio
A funo FTPErase() apaga arquivo no diretrio corrente do FTP. Se a operao for realizada com sucesso
a funo retornar verdadeiro (.T.).
Exemplo
Local cSer vi dor
Local aAr qs
Local aDi r s
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
I f FTPDirChange( ' di r et or i o' )
I f ! FTPERASE( Ar qui vo. ext )
APMsgInfo( Pr obl emas ao apagar o ar qui vo! )
EndI f
EndI f
FTPGetCurDir
Retorna o diretrio corrente no FTP.
Sintaxe
FTPGETCURDIR() -> caracter
Exemplo
Local cSer vi dor
Local cCur Di r
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
cCur Di r : = FTPGETCURDIR()
FTPRenameFile
AdvPl________________________________________________________________344
Renomeia arquivo no servidor FTP.
Sintaxe
FTPRENAMEFILE( cArqAtual, cArqNovo ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqAtual
Sim C Nome do arquivo a ser renomeado.
cArqDest Sim C Novo nome do arquivo.
Descrio
A funo FTPRenameFile() renomeia um arquivo no diretrio corrente do servidor FTP. Se a operao for
realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo
Local cSer vi dor
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDisconnect( )
I f ! FTPConnect( cSer vi dor )
APMsgInfo( ' Fal ha na conexo! ' )
EndI f
I f FTPDirChange( ' di r et or i o' )
I f ! FTPRENAMEFILE( ' ARQ00001. ARQ' , ' ARQ00002. ARQ' )
APMsgI nf o( ' Pr obl emas ao r enomear ar qui vo! ' )
EndI f
EndI f
FTPUpload
Copia um arquivo na mquina local para o servidor FTP.
Sintaxe
FTPUPLOAD( cArqOrig, cArqDest ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqOri Sim C
Caminho e nome do arquivo na mquina a ser copiado para o servidor
FTP.
cArqDest Sim C Nome do arquivo a ser gravado no servidor FTP.
Descrio
A funo FTPUpload() copia um arquivo na mquina local para o diretrio corrente no servidor FTP. O
arquivo a ser copiado deve estar abaixo do RootPath do Protheus. Se a operao for realizada com
sucesso a funo retornar verdadeiro (.T.).
AdvPl________________________________________________________________345
Exemplo
Local cSer vi dor
cSer vi dor : = ' f t p. cami nhodoser i vor . com. br '
FTPDi sconnect ( )
I f ! FTPConnect ( cSer vi dor )
APMsgI nf o( ' Fal ha na conexo! ' )
EndI f
I f FTPDi r Change( ' di r et or i o' )
I f ! FTPUPLOAD( ' \ DI RETORI O\ ARQ00001. ARQ' , ' ARQ00001. ARQ' )
APMsgI nf o( ' Pr obl emas ao copi ar ar qui vo! ' )
EndI f
EndI f
FunDesc
Retorna descrio de uma opo do menu.
Sintaxe
FUNDESC() -> caracter
Descrio
A funo FunName() retornar a descrio de uma opo selecionada no menu do Siga.
Exemplo
Local cDescr
cDescr : = FUNDESC()
FunName
Retorna nome de uma funo do menu.
Sintaxe
FUNNAME() -> caracter
Descrio
A funo FunName() retornar o nome de uma funo executada a partir de um menu do Siga
Exemplo
Local cFunct i on
cFunct i on : = FUNNAME()
AdvPl________________________________________________________________346
GetCountryList
Retorna vetor contendo informaes dos pases localizados.
Sintaxe
GETCOUNTRYLIST() -> array
Descrio
O vetor retornado possui trs dimenses, a primeira refere-se a sigla dos pases, o segundo ao nome do
pas e o terceiro a identificao do pas com dois dgitos.
Exemplo
Local aAr r ay : = GETCOUNTRYLIST()
Local cSi gl a : = GetMv( MV_PAI SLOC )
Local nPos
nPos : = Ascan( aAr r ay, {| d| d[ 1] == Upper ( cSi gl a) } )
I f nPos > 0
APMsgInfo( Pa s de l ocal i zao + aAr r ay[ nPos, 2] )
EndI f



GetMark
Retorna string de caracteres aleatrios.
Sintaxe
GETMARK( [ lMaiusc ] ) -> caracter
Argumento Obrigat. Tipo Descrio
lMaiusc No L Se verdadeiro (.T.) retorna somente caracteres em maisculos.
Descrio
A GetMark() utilizada junto a funo MarkBrow() onde so utilizados combinaes de caracteres para
controle de marcas.
Exemplo
Funct i on <nome- da- f uno>( )
Local aCampos : = {{' CB_OK' , , ' ' }, ;
{' CB_USERLI B' , , ' Usur i o' }, ;
AdvPl________________________________________________________________347
{' CB_TABHORA' , , ' Hor a' }, ;
{' CB_DTTAB' , , ' Dat a' }}
Pr i vat e cMar ca : = GETMARK()
Pr i vat e cCadast r o : = ' Cadast r o de Cont r at o'
Pr i vat e aRot i na : = { { ' Pesqui sar ' , ' AxPesqui ' , 0, 1 }}
MarkBrow( ' SCB' , ' CB_OK' , ' ! CB_USERLI B' , aCampos, , cMar ca, ' Mar kAl l ( ) ' , , , , ' Mar k( ) ' )
Ret ur n
GetMv
Retorna o contedo de um parmetro cadastrado no SX6.
Sintaxe
GETMV( cPar01, [ lPar02 ], [ uPar03 ] ) -> varivel
Argumento Obrigat. Tipo Descrio
cPar1 Sim C Nome do parmetro a ser pesquisado
lPar02 No L
Define se a GetMv deve retornar o contedo do parmetro, .F. (
Falso ) ou apenas verificar se o parmetro existe, .T. ( Verdadeiro ).
Valor default .F. ( Falso ).
uPar03 No U
Valor default que deve ser retornado pela GetMv quando os
parmetro solicitado no existir. O valor desse parmetro pode ser
caracter, numrico, lgico ou data.
Descrio
O retorno da funo depende do tipo informado na cadastro do parmetro e da configurao dos
argumentos lPar02 e uPar03.
Se lPar02 for passado como .T. ( Verdadeiro ), o retorno da funo ser um valor lgico indicando se o
parmetro existe.
Quando uPar03 for informado, caso o parmetro informado em cPar01 no exista, o retorno da funo
ser o valor informado em uPar03 caso contrrio retorna o contedo do parmetro. Se uPar03 for
informado o contedo de lPar02 ser desconsiderado.
Exemplo
Local cVal or : = " "
/ / Ret or na o cont edo do par met r o
cVal or : = GETMV( " MV_ESTADO" )
/ / Ver i f i ca se o par met r o exi st e
I f ( GETMV( " MV_ESTADO" , . T. ) )
ApMsgInfo( " O Par met r o MV_ESTADO exi st e ! " )
El se
ApMsgSt op( "O Par met r o MV_ESTADO no exi st e ! " )
EndI f
/ / Ret or na o cont edo do par met r o
/ / se no encont r ar r et or na o val or def aul t passado
cVal or : = GETMV( " MV_ESTADO" , , " SP" )

AdvPl________________________________________________________________348


I ncProc
Incrementa rgua de progresso.
Sintaxe
INCPROC() -> nil
Descrio
Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc()
Exemplo
User Funct i on <nome- da- f uno>( )
Local bAcao : = {| l Fi m| Exempl o( @l Fi m) }
Local cTi t ul o : = ' '
Local cMsg : = ' Pr ocessando'
Local l Abor t a : = . T.
Processa( bAcao, cTi t ul o, cMsg, l Abor t a )
Ret ur n

St at i c Funct i on Exempl o( l Fi m)
Local nI
ProcRegua( 10000)
For nI : = 1 To 10000
I f l Fi m
Exi t
EndI f
INCPROC()
Next nI
Ret ur n
IncRegua
Incrementa valores na rgua de progresso criada pela funo RptStatus().
Sintaxe
INCREGUA() -> nil
Descrio
Aps executar as funes RptStatus() e SetRegua(), para incrementar valores na rgua utilizamos a
funo IncRegua().
Exemplo
AdvPl________________________________________________________________349
User Funct i on <nome- da- f uno>( )
Local cPr ogr am: = ' Exempl o' / / nome do r el at r i o
Local cAl i as : = ' XXX' / / al i as do ar qui vo
Local cPer g : = ' XXXXXX' / / gr upo de per gunt as
Local cTi t ul o : = ' Ti t ul o do r el at r i o'
Local cDesc1 : = ' Descr i o'
Local cDesc2 : = ' cont i nuao da descr i o'
Local cDesc3 : = ' cont i nuao da descr i o'
Local l Di c : = . F. / / no ut i l i za di ci onr i o
Local aOr d : = { ' 1 Or dem' , ' 2 or dem' , ' 3 or dem' }
Local l Compr es : =. F.
Local cTam: = "G"
Pr i vat e m_pag : = 1
Pr i vat e aRet ur n : = { " Zebr ado", 1, "Admi ni st r ao" , 1, 2, 1, " " , 1 }
Pr i vat e wr el
Pergunte( cPer g, . F. )
wr el : = SetPrint( cAl i as, cPr ogr am, cPer g, @cTi t ul o, cDesc1, cDesc2, cDesc3, l Di c, aOr d ,
l Compr es, cTam)
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
SetDefault( aRet ur n, cAl i as )
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
RptStatus( {| l Fi m| I mpr i me( @l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho ) }, cTi t ul o )
Ret ur n

/ / r ot i na de i mpr esso
St at i c Funct i on I mpr i me( l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho )
Local nLi n : = 80
Local cCabec1 : = ' Cabecal ho 1'
Local cCabec2 : = ' Cabecal ho 2'
dbSel ect Ar ea( cAl i as )
SetRegua( RecCount ( ) )
Whi l e ! Eof ( ) . And. ( XX_COD >= MV_PAR01 . And. XX_COD <= MV_PAR02 )
I f l Fi m
@Pr ow( ) +1, 001 PSAY " CANCELADO PELO OPERADOR"
Exi t
EndI f
I f nLi n > 58
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
nLi n : = 8
EndI f
@nLi n, 000 PSAY __Pr t Fat Li ne( )
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
INCREGUA()
dbSki p( )
End
I F nLi n ! = 80
nLi n++
I f nLi n > 60
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
Endi f
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
Roda( 0, cTi t ul o, cTamanho ) / / Rodap
EndI f
I f aRet ur n[ 5] = 1
Set Printer TO
dbCommi t Al l ( )
OurSpool( wr el )
Endi f
MS_FLUSH( )
AdvPl________________________________________________________________350
Ret ur n
I ndRegua
Cria ndice temporrio com expresso de filtro.
Sintaxe
INDREGUA( cAlias, cIndice, cExpress, [ xOrdem] , [ cFor ], [ cMens ], [ lExibir ] ) -> nil
Argumento Obrigat. Tipo Descrio
cAlias No C Alias da tabela que o ndice ser criado.
cIndece Sim C Nome do arquivo para criao do ndice.
cExpress Sim C Expresso do ndice.
xOrdem No C Indica se a ordem ser crescente ou decrescente.
lExibir No L Indica se exibir o dilogo de progresso.
cFor No C Expresso de filtro.
cMens No C Mensagem do dilogo de progresso.
Descrio
Esta funo cria um ndice temporrio para o alias especificado podendo ou no ter um filtro e tambem
podendo ser decrescente se o parmetro xOrdem for especificado como D. Durante a criao do ndice
um dilogo com uma barra de progresso ser criada podendo esta ser omitida.
Exemplo
User Funct i on Exempl o( )
Local cAr qui vo
Local cChave
Local cFor
Local nI ndex
DbSel ect Ar ea( " SA1" )
cAr qui vo : = Cr i aTr ab( , . F. )
cChave : = " A1_NOME"
cFor : = " ! Empt y( A1_NOME) "
INDREGUA("SA1" , cAr qui vo, cChave, , cFor )
DbSel ect Ar ea( " SA1" )
nI ndex : = Ret I ndex( "SA1" )
#I FNDEF TOP
DbSet I ndex( cAr qui vo+Or dBagExt ( ) )
#ENDI F
DbSet Or der ( nI ndex+1)
.
.
.
DbSel ect Ar ea( " SA1" )
Ret I ndex( "SA1" )
FEr ase( cAr qui vo+Or dBagExt ( ) )
AdvPl________________________________________________________________351
Ret ur n
MarkBRefresh
Atualiza a MarkBrow.
Sintaxe
MARKBREFRESH() -> nil
Descrio
Esta funo atualiza o browse da MarkBrow.
MarkBrow
Monta um Browse onde as linhas podem ser marcadas ou desmarcadas.
Sintaxe
MARKBROW( cAlias, cCampo, [ cCpo ], [ aCampos ], [ lInverte ], cMarca, [ cCtrlM ], [ uPar ], [
cExpIni ], [ cExpFim ], [ cAval ] ) -> nil
Argumento Obrigat. Tipo Descrio
cAlias Sim C Alias do arquivo a ser exibido no browse.
cCampo Sim C Campo do arquivo onde ser feito o controle (gravao) da marca.
cCpo No C
Campo onde ser feita a validao para marcao e exibio do
bitmap de status.
aCampos No A Colunas a serem exibidas.
lInvert No L Inverte a marcao.
cMarca Sim C String a ser gravada no campo especificado para marcao.
cCtrlM No C Funo a ser executada caso deseje marcar todos elementos.
uPar No L Parmetro reservado.
cExpIni No C
Funo que retorna o contedo inicial do filtro baseada na chave de
ndice selecionada.
cExpFim No C
Funo que retorna o contedo final do filtro baseada na chave de
ndice selecionada.
AdvPl________________________________________________________________352
cAval No C Funo a ser executada no duplo clique em um elemento no browse.
Descrio
A funo MarkBrow() permite que os elementos de um browse sejam marcados ou desmarcados.
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo.
O vetor informado no parmetro aCampos deve conter as seguintes dimenses: 1 nome do campo; 2
- Nada (Nil); 3 - Ttulo do campo; 4 - Mscara (picture).
(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada
(incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visualizao; 3 -
incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio no for informada
nenhum acesso ser validado.
Exemplo
Funct i on <nome- da- f uno>( )
Local aCampos : = { {' CB_OK' , , ' ' }, ;
{' CB_USERLI B' , , ' Usur i o' }, ;
{' CB_TABHORA' , , ' Hor a' }, ;
{' CB_DTTAB' , , ' Dat a' }}
Pr i vat e cMar ca : = Get Mar k( )
Pr i vat e cCadast r o : = ' Cadast r o de Cont r at o'
Pr i vat e aRot i na : = { { ' Pesqui sar ' , ' AxPesqui ' , 0, 1 }}
MARKBROW( ' SCB' , ' CB_OK' , ' ! CB_USERLI B' , aCampos, , cMar ca, ' Mar kAl l ( ) ' , , , , ' Mar k( ) ' )
Ret ur n

/ / Gr ava mar ca no campo
Funct i on Mar k( )
I f I sMar k( ' CB_OK' , cMar ca )
RecLock( ' SCB' , . F. )
Repl ace CB_OK Wi t h Space( 2)
MsUnLock( )
El se
RecLock( ' SCB' , . F. )
Repl ace CB_OK Wi t h cMar ca
MsUnLock( )
EndI f
Ret ur n

/ / Gr ava mar ca emt odos os r egi st r os val i dos
Funct i on Mar kAl l ( )
Local nRecno : = Recno( )
dbSel ect Ar ea( ' SCB' )
dbGot op( )
Whi l e ! Eof ( )
Mar k( )
dbSki p( )
End
dbGot o( nRecno )
Ret ur n
Ms_Flush
Descarrega spool de impresso.
AdvPl________________________________________________________________353
Sintaxe
MS_FLUSH() -> nil
Descrio
Aps os comandos de impresso as informaes ficam armazenadas no spool e so descarrega em seus
destinos atravs da funo Ms_Flush().
Exemplo
User Funct i on <nome- da- f uno>( )
Local cPr ogr am: = ' Exempl o' / / nome do r el at r i o
Local cAl i as : = ' XXX' / / al i as do ar qui vo
Local cPer g : = ' XXXXXX' / / gr upo de per gunt as
Local cTi t ul o : = ' Ti t ul o do r el at r i o'
Local cDesc1 : = ' Descr i o'
Local cDesc2 : = ' cont i nuao da descr i o'
Local cDesc3 : = ' cont i nuao da descr i o'
Local l Di c : = . F. / / no ut i l i za di ci onr i o
Local aOr d : = { ' 1 Or dem' , ' 2 or dem' , ' 3 or dem' }
Local l Compr es : =. F.
Local cTam: = "G"
Pr i vat e m_pag : = 1
Pr i vat e aRet ur n : = { " Zebr ado", 1, "Admi ni st r acao" , 1, 2, 1, " " , 1 }
Pr i vat e wr el
Pergunte( cPer g, . F. )
wr el : = Set Pr i nt ( cAl i as, cPr ogr am, cPer g, @cTi t ul o, cDesc1, cDesc2, cDesc3, l Di c, aOr d ,
l Compr es, cTam)
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
SetDefault( aRet ur n, cAl i as )
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
RptStatus( {| l Fi m| I mpr i me( @l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho ) }, cTi t ul o )
Ret ur n

/ / r ot i na de i mpr esso
St at i c Funct i on I mpr i me( l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho )
Local nLi n : = 80
Local cCabec1 : = ' Cabecal ho 1'
Local cCabec2 : = ' Cabecal ho 2'
dbSel ect Ar ea( cAl i as )
SetRegua( RecCount ( ) )
Whi l e ! Eof ( ) . And. ( XX_COD >= MV_PAR01 . And. XX_COD <= MV_PAR02 )
I f l Fi m
@Pr ow( ) +1, 001 PSAY " CANCELADO PELO OPERADOR"
Exi t
EndI f
I f nLi n > 58
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
nLi n : = 8
EndI f
@nLi n, 000 PSAY __Pr t Fat Li ne( )
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
IncRegua( )
dbSki p( )
End
I F nLi n ! = 80
AdvPl________________________________________________________________354
nLi n++
I f nLi n > 60
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
Endi f
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
Roda( 0, cTi t ul o, cTamanho ) / / Rodap
EndI f
I f aRet ur n[ 5] = 1
Set Printer TO
dbCommi t Al l ( )
OurSpool( wr el )
Endi f
MS_FLUSH( )
Ret ur n
MsAppend
Adiciona registros de um arquivo para outro.
Sintaxe
MSAPPEND( [ cArqDest ], cArqOrig ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqDest No C
Se o RDD corrente for DBFCDX os registros sero adicionados na rea
selecionada, caso contrrio o arquivo destino ter que ser informado.
cArqOrig No C Nome do arquivo origem contendo os registros a serem adicionados.
Descrio
A funo MsAppend() adiciona registros de um arquivo para outro, respeitando a estrutura das tabelas. Se
a operao for realizada com sucesso o funo retornar verdadeiro (.T.).
Exemplo
dbSel ect Ar ea( XXX )
MSAPPEND(, ARQ00001 )
MsCopyFile
Executa copia binria de um arquivo.
Sintaxe
MSCOPYFILE( cArqOrig, cArqDest ) -> lgico
Argumento Obrigat. Tipo Descrio
AdvPl________________________________________________________________355
cArqOrig Sim C Nome do arquivo origem e a extenso.
cArqDest Sim C Nome do arquivo destino e a extenso.
Descrio
Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo
Local cAr qOr i g : = ' ARQ00001. DBF'
Local cAr qDest : = ' ARQ00002. XXX'
I f MSCOPYFILE( cAr qOr i g, cAr qDest )
APMsgInfo( ' Copi a r eal i zada comsucesso! ' )
EndI f
MsCopyTo
Realiza copia de um arquivo de dados.
Sintaxe
MSCOPYTO( [ cArqOrig ], cArqDest ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqOrig No C
Nome do arquivo origem e a extenso se o ambiente for Top o
parmetro passar a ser obrigatrio.
cArqDest Sim C Nome do arquivo destino e a extenso.
Descrio
A funo MsCopyTo() copia os registros de uma base de dados para outra, criando o arquivo destino de
acordo com a estrutura da base de dados origem.
Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.)
Exemplo
Local cAr qDest : = ' SX2ZZZ. DBF'
DbSel ect Ar ea( ' SX2' )
I f MSCOPYTO( , cAr qDest )
APMsgInfo( ' Copi a r eal i zada comsucesso! ' )
El se
APMsgI nf o( ' Pr obl emas ao copi ar o ar qui vo SX2! ' )
EndI f
AdvPl________________________________________________________________356
MsCreate
Cria arquivo de dados.
Sintaxe
MSCREATE( cArquivo, aEstrut ,[ cDriver ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cArquivo No C Nome do arquivo.
aEstrut Sim A Estrutura do arquivo.
cDriver No C RDD do arquivo.
Descrio
A funo MsCreate() cria um arquivo (tabela) de acordo com a estrutura informada no parmetro aStrut
(*). Se o parmetro cDriver no for informado o RDD corrente ser assumido como padro. Para criao
de tabelas no TopConnect necessrio estar conectado ao banco e o environment do Protheus ser TOP.
Se o arquivo for criado com sucesso a funo retornar verdadeiro (.T.).
(*) vetor contendo a estrutura da tabela: 1 - caracter, nome do campo; 2 - caracter, tipo do campo; 3
- numrico, tamanho do campo; 4 - numrico, decimais.
Exemplo
Local cTar get : = ' \ si gaadv\ '
Local aSt r ut
aSt r ut : = { { ' Campo' , ' C' , 40, 0 } }
I f MSCREATE( cTar get +' ARQ1001' , aSt r ut )
APMsgInfo( ' Cr i ado comsucesso! ' )
El se
APMsgI nf o( ' Pr obl emas ao cr i ar o ar qui vo! ' )
EndI f
MsErase
Deleta arquivo.
Sintaxe
MSERASE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cArquivo Sim C Nome do arquivo e a extenso.
AdvPl________________________________________________________________357
cIndice No C Nome do arquivo de ndice e a extenso.
cDriver No C
RDD do arquivo, se no for informado assumir o RDD corrente como
padro.
Descrio
A funo MsErase() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cAr qui vo : = ' SX2ZZZ. DBF'
Local cI ndi ce : = ' SX2ZZZ' + Or dBagExt ( )
I f MSERASE( cAr qui vo, cI ndi ce )
APMsgInfo( ' Ar qui vo del et ado comsucesso! ' )
El se
APMsgI nf o( ' Pr obl emas ao del et ar ar qui vo! ' )
EndI f
MsFile
Verifica existncia de um arquivo.
Sintaxe
MSFILE( cArquivo, [ cIndice ], [ cDriver ] ) ->lgico
Argumento Obrigat. Tipo Descrio
cArquivo Sim C Nome do arquivo origem e a extenso.
cIndice No C Nome do arquivo de ndice e a extenso.
cDriver No C
RDD do arquivo, se no for informado assumir o RDD corrente como
padro.
Descrio
A funo MsFile() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cAr qui vo : = ' SX2ZZZ. DBF'
Local cI ndi ce : = ' SX2ZZZ' + Or dBagExt ( )
I f ! MSFILE( cAr qui vo, cI ndi ce )
APMsgInfo( ' Ar qui vo no encont r ado! ' )
EndI f
AdvPl________________________________________________________________358
MsRename
Renomeia arquivo de acordo com RDD corrente.
Sintaxe
MSRENAME( cArqOrig, cArqDest ) -> lgico
Argumento Obrigat. Tipo Descrio
cArqOrig Sim C Nome do arquivo origem e a extenso.
cArqDest Sim C Nome do arquivo destino e a extenso.
Descrio
A funo MsRename() retornar verdadeiro (.T.) se efetuar a operao com sucesso.
Exemplo
Local cTar get : = ' \ si gaadv\ '
Local cAr qOr i g : = ' ARQ00001. DBF'
Local cAr qDest : = ' ARQ00002. DBF'
I f MSRENAME( cTar get + cAr qOr i g, cTar get + cAr qDest )
APMsgInfo( ' Ar qui vo r enomeado comsucesso! ' )
El se
APMsgI nf o( ' Pr obl emas ao r enomear o ar qui vo ' + cAr qOr i g + ' ! ' )
EndI f
MsUnlock
Libera lock de registro.
Sintaxe
MSUNLOCK() -> nil
Descrio
A funo MsUnlock() libera os registros bloqueados pela funo RecLock().
No retorna valores.
Exemplo
RecLock( ' XXX' , . F. )
Repl ace Campo Wi t h ' 000001'
MSUNLOCK()
AdvPl________________________________________________________________359
OurSpool
Gerenciador de impresso.
Sintaxe
OURSPOOL( [ cArquivo ] ) -> nil
Argumento Obrigat. Tipo Descrio
cArquivo Sim C Relatrio gerado em disco
Descrio
A funo OurSpool() executa o gerenciador de impresso do Siga, carregando os relatrios gerados no
diretrio configurado atravs parmetro MV_RELT no dicionrio SX6. Caso quiser visualizar um relatrio
especfico, informe o nome no parmetro cArquivo.
Exemplo
User Funct i on <nome- da- f uno>( )
Local cPr ogr am: = ' Exempl o' / / nome do r el at r i o
Local cAl i as : = ' XXX' / / al i as do ar qui vo
Local cPer g : = ' XXXXXX' / / gr upo de per gunt as
Local cTi t ul o : = ' Ti t ul o do r el at r i o'
Local cDesc1 : = ' Descr i o'
Local cDesc2 : = ' cont i nuao da descr i o'
Local cDesc3 : = ' cont i nuao da descr i o'
Local l Di c : = . F. / / no ut i l i za di ci onr i o
Local aOr d : = { ' 1 Or dem' , ' 2 or dem' , ' 3 or dem' }
Local l Compr es : =. F.
Local cTam: = "G"
Pr i vat e m_pag : = 1
Pr i vat e aRet ur n : = { " Zebr ado", 1, "Admi ni st r acao" , 1, 2, 1, " " , 1 }
Pr i vat e wr el
Pergunte( cPer g, . F. )
wr el : = SetPrint( cAl i as, cPr ogr am, cPer g, @cTi t ul o, cDesc1, cDesc2, cDesc3, l Di c, aOr d ,
l Compr es, cTam)
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
SetDefault( aRet ur n, cAl i as )
I f nLast Key == 27
Set Fi l t er To
Ret ur n
EndI f
RptStatus( {| l Fi m| I mpr i me( @l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho ) }, cTi t ul o )
Ret ur n

/ / r ot i na de i mpr esso
St at i c Funct i on I mpr i me( l Fi m, cAl i as, cTi t ul o, cPr ogr am, cTamanho )
Local nLi n : = 80
Local cCabec1 : = ' Cabecal ho 1'
Local cCabec2 : = ' Cabecal ho 2'
dbSel ect Ar ea( cAl i as )
SetRegua( RecCount ( ) )
Whi l e ! Eof ( ) . And. ( XX_COD >= MV_PAR01 . And. XX_COD <= MV_PAR02 )
AdvPl________________________________________________________________360
I f l Fi m
@Pr ow( ) +1, 001 PSAY " CANCELADO PELO OPERADOR"
Exi t
EndI f
I f nLi n > 58
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
nLi n : = 8
EndI f
@nLi n, 000 PSAY __Pr t Fat Li ne( )
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n++, 001 PSAY . . .
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
I ncRegua( )
dbSki p( )
End
I F nLi n ! = 80
nLi n++
I f nLi n > 60
Cabec( cTi t ul o, cCabec1, cCabec2, cPr ogr am, cTamanho, 15 ) / / cabeal ho
Endi f
@nLi n, 000 PSAY __Pr t Thi nLi ne( )
Roda( 0, cTi t ul o, cTamanho ) / / Rodap
EndI f
I f aRet ur n[ 5] = 1
Set Pr i nt er To
dbCommi t Al l ( )
OURSPOOL( wr el )
Endi f
MS_FLUSH( )
Ret ur n
Pergunte
Inicializa as variveis de pergunta (mv_par??).
Sintaxe
PERGUNTE( cPergunta , [ lPerg ] , [ cTitulo ] ) -> lgico
Argumento Obrigat. Tipo Descrio
cPergunta Sim C Pergunta cadastrada no dicionrio de dados ( SX1) a ser utilizada.
lPerg No L Indica se exibir a tela para edio.
cTitulo No C Ttulo do dilogo.
Descrio
Esta funo inicializa as variveis de pergunta (mv_par01,...) baseado na pergunta cadastrado no
Dicionrio de Dados (SX1). Se o parmetro lAsk no for especificado ou for verdadeiro ser exibida a tela
para edio da pergunta e se o usurio confirmar as variveis sero atualizadas e a pergunta no SX1
tambm ser atualizada.
Exemplo
AdvPl________________________________________________________________361
PERGUNTE(CON010)



Processa
Cria dilogo com uma rgua de progresso.
Sintaxe
PROCESSA( bAcao, [ cTitulo ] , [ cMsg ], [ lAborta] ) -> nil
Argumento Obrigat. Tipo Descrio
bAcao Sim C Funo a ser executada.
cMsg No C Mensagem a ser exibida a baixo da rgua de progresso
cTitulo No C Ttulo de janela
lAborta No L Habilita boto cancelar.
Descrio
A funo Processa() cria um dilogo onde a execuo de um determinada funo pode ser acompanhada
atravs de uma rgua de progresso. Para atribuir o valor total da rgua utilizamos a funo ProcRegua()
e para incrementar a rgua utilizamos a funo IncProc().
Exemplo
User Funct i on <nome- da- f uno>( )
Local bAcao : = {| l Fi m| Exempl o( @l Fi m) }
Local cTi t ul o : = ' '
Local cMsg : = ' Pr ocessando'
Local l Abor t a : = . T.
PROCESSA( bAcao, cTi t ul o, cMsg, l Abor t a )
Ret ur n

St at i c Funct i on Exempl o( l Fi m)
Local nI
ProcRegua( 10000)
For nI : = 1 To 10000
I f l Fi m
Exi t
EndI f
IncProc( )
Next nI
Ret ur n
AdvPl________________________________________________________________362
ProcRegua
Atribui o valor total da rgua de progresso cria pela pela funo Processa().
Sintaxe
PROCREGUA( nTotal ) -> nil
Argumento Obrigat. Tipo Descrio
nTotal Sim N Valor total da rgua.
Descrio
Aps atribuir o valor total da rgua, para incrementar utilizamos a funo IncProc().
Exemplo
User Funct i on <nome- da- f uno>( )
Local bAcao : = {| l Fi m| Exempl o( @l Fi m) }
Local cTi t ul o : = ' '
Local cMsg : = ' Pr ocessando'
Local l Abor t a : = . T.
Pr ocessa( bAcao, cTi t ul o, cMsg, l Abor t a )
Ret ur n

St at i c Funct i on Exempl o( l Fi m)
Local nI
PROCREGUA( 10000)
For nI : = 1 To 10000
I f l Fi m
Exi t
EndI f
I ncPr oc( )
Next nI
Ret ur n
PswAdmin
Verifica se um usurio pertence ao grupo de administradores.
Sintaxe
PSWADMIN( cUsuario, cSenha ) -> numrico
Argumento Obrigat. Tipo Descrio
cUsuario Sim C Nome do usurio.
cSenha Sim C Senha do usurio.
AdvPl________________________________________________________________363
Descrio
A funo PswAdmin() retorna 0 (zero) se o usurio for do grupo de administradores, 1 (um) para usurio
no administrador e 2 (dois) se for senha invlida.
Exemplo
User Funct i on <nome- da- f uno>( cUsuar i o, cSenha )
Local l Admi nst : = . F.
Local nRet
nRet : = PSWADMI N( cUsuar i o, cSenha )
I f nRet == 0
l Admi nst : = . T.
El seI f nRet == 1
APMsgI nf o( Usur i o no Admi ni st r ador ! )
El seI f nRet == 2
APMsgI nf o( Senha i nval i da ! )
EndI f
Ret ur n l Admi nst
PswI D
Retorna o ID do usurio ou do grupo de usurio.
Sintaxe
PSWID() -> caracter
Descrio
Utilizada para retornar o ID do usurio ou do grupo de usurios aps ter posicionado o arquivo de senha
com a funo PswSeek().
Exemplo
User Funct i on <nome- da- f uno>( cUsuar i o )
Local cUser I D
PswOrder( 2)
I f PswSeek( cUsuar i o, . T. )
cUser I d : = PSWID() / / Ret or na o I D do usur i o
EndI f
Ret ur n
PswName
Verifica senha de usurio.
Sintaxe
PSWNAME( cSenha ) -> lgico
AdvPl________________________________________________________________364
Argumento Obrigat. Tipo Descrio
cSenha Sim C Senha do usurio.
Descrio
A funo PswName() verifica se a senha informada no parmetro cSenha pertence ao usurio posicionado
no arquivo de senha, se pertencer retornar verdadeiro(.T.).
Exemplo
User Funct i on <nome- da- f uno>( cUsuar i o, cSenha )
Local l Ok
PswOrder( 2)
I f PswSeek( cUsuar i o, . T. )
l Ok : = PSWNAME( cSenha )
EndI f
Ret ur n l Ok
PswOrder
Posiciona a ordem de indexao do arquivo de senhas.
Sintaxe
PSWORDER( nOrdem ) -> nil
Argumento Obrigat. Tipo Descrio
nOrdem Sim N Ordem de indexao.
Descrio
A funo PswOrder() posiciona a ordem de indexao de acordo com o parametro nOrdem, onde:

1 ID;
2 usurio;
3 senha;e
4 e-mail.
Exemplo
User Funct i on <nome- da- f uno>( cUsuar i o )
Local cUser I D
PSWORDER(2)
I f PswSeek( cUsuar i o, . T. )
cUser I d : = PswI D( ) / / Ret or na o I D do usur i o
AdvPl________________________________________________________________365
EndI f
Ret ur n
PswRet
Retorna vetor contendo informaes do Usurio ou do Grupo de Usurios.
Sintaxe
PSWRET() -> array
Descrio
A funo PswRet() retorna dois tipos de vetores distintos, de acordo com o posicionamento do arquivo de
senha. Se no segundo parmetro da funo PswSeek() for informado .T. a PswRet() retornar um vetor
com informaes do Usurios,