Escolar Documentos
Profissional Documentos
Cultura Documentos
Verso 1.0
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________2
2
ndice
A Tecnologia Protheus........................................................................................................... 17
Caractersticas da Tecnologia Protheus............................................................................. 17
As Camadas do Advanced Protheus................................................................................... 17
Servidor de Aplicao........................................................................................................ 18
Terminal Thin-Client........................................................................................................... 18
Dados.................................................................................................................................... 18
Repositrio de Apos.......................................................................................................... 18
Estruturao............................................................................................................................. 19
Aestrutura de diretrios do Advanced Protheus......................................................... 19
Verso AP5....................................................................................................................... 19
Verso AP6....................................................................................................................... 19
Aplicativos do Advanced Protheus.................................................................................. 20
Protheus Server .............................................................................................................. 20
Remote............................................................................................................................. 20
IDE..................................................................................................................................... 20
Monitor.............................................................................................................................. 20
Nomenclaturas Utilizadas.................................................................................................. 21
Topologia de Rede.................................................................................................................. 21
Caractersticas e Possibilidades de Topologias de Rede............................................ 21
IDE - Integrated Development Environment.................................................................... 23
Caractersticas do IDE....................................................................................................... 23
Monitor...................................................................................................................................... 24
Informaes Bsicas das Conexes................................................................................ 24
Btrieve....................................................................................................................................... 24
Informaes Bsicas.......................................................................................................... 24
Configurao do Btrieve/PervasiveSQL2000: ............................................................... 25
CTree......................................................................................................................................... 27
Informaes Bsicas.......................................................................................................... 27
ndices................................................................................................................................... 27
Sistemas Operacionais e Plataformas (verso AP6 e posteriores) .............................. 28
Sistemas Operacionais e Plataformas............................................................................ 28
Plataformas e SO's suportados.................................................................................... 28
Novos SO's a seremsuportados................................................................................. 28
AdPl Guia de Programao................................................................................................ 29
A LinguagemAdvPl................................................................................................................. 29
Programao ComInterface Prpria como Usurio.................................................. 29
Programao SemInterface Prpria como Usurio.................................................. 29
Programao por Processos......................................................................................... 30
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________3
3
Programao de RPC..................................................................................................... 30
Programao Web.......................................................................................................... 30
Programao TelNet...................................................................................................... 30
Sintaxe da Linguagem........................................................................................................... 30
Edio de Programas............................................................................................................. 30
Criao de umPrograma...................................................................................................... 30
Linhas de Programa........................................................................................................... 31
Linhas de Comando....................................................................................................... 31
Linhas de Comentrio.................................................................................................... 31
Linhas Mistas................................................................................................................... 32
Tamanho da Linha.............................................................................................................. 32
Estrutura de umPrograma................................................................................................... 32
Area de Identificao..................................................................................................... 33
Area de Ajustes Iniciais................................................................................................. 33
OCorpo do Programa........................................................................................................ 34
Area de Encerramento................................................................................................... 34
Variveis de Memria............................................................................................................. 34
Tipos de Dados........................................................................................................................ 34
Numrico.............................................................................................................................. 34
Lgico.................................................................................................................................... 35
Caracter................................................................................................................................ 35
Data....................................................................................................................................... 35
Matriz (Array) ...................................................................................................................... 35
Bloco de Cdigo.................................................................................................................. 35
Criao e Atribuio de Variveis........................................................................................ 36
Matrizes..................................................................................................................................... 38
Matrizes como Estruturas................................................................................................. 39
Cuidados comMatrizes...................................................................................................... 41
Inicializando Matrizes............................................................................................................. 41
Se o tamanho da matriz conhecido............................................................................. 41
Se o tamanho da matriz no conhecido.................................................................... 42
Blocos de Cdigo..................................................................................................................... 42
UmPrimeiro Lembrete...................................................................................................... 42
Outro Lembrete................................................................................................................... 43
Lista de Expresses............................................................................................................ 44
Duas Linhas de Cdigo.................................................................................................. 44
Duas Linha de Cdigo emUma , Utilizando Ponto-e-Vrgula............................... 44
Convertendo para uma Lista de Expresses............................................................ 44
Onde Pode-se Utilizar uma Lista de Expresses?.................................................... 45
De Listas de Expresses para Blocos de Cdigo......................................................... 45
Executando umBloco de Cdigo................................................................................ 46
Passando Parmetros.................................................................................................... 47
Utilizando Blocos de Cdigo......................................................................................... 47
Escopo de Variveis................................................................................................................ 48
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________4
4
O Contexto de Variveis dentro de umPrograma........................................................... 48
Variveis Locais....................................................................................................................... 49
Variveis Estticas.................................................................................................................. 50
Variveis Privadas................................................................................................................... 50
Variveis Pblicas................................................................................................................... 51
Diferenciao entre variveis e nomes de campos......................................................... 52
Operadores da Linguagem................................................................................................... 53
Operadores Comuns............................................................................................................... 53
Operadores Matemticos.................................................................................................. 53
Operadores de String......................................................................................................... 54
Operadores Relacionais..................................................................................................... 54
Operadores Lgicos............................................................................................................ 54
Operadores de Atribuio..................................................................................................... 55
Atribuio Simples.............................................................................................................. 55
Atribuio emLinha........................................................................................................... 55
Atribuio Composta.......................................................................................................... 56
Operadores de Incremento/Decremento........................................................................... 56
Operadores Especiais............................................................................................................. 57
Ordemde Precedncia dos Operadores............................................................................ 58
Alterao da Precedncia.................................................................................................. 58
Macro Substituio................................................................................................................. 59
Estruturas de Controle........................................................................................................... 60
Controlando o Fluxo............................................................................................................... 60
Estruturas de Repetio........................................................................................................ 60
Repetio de Comandos........................................................................................................ 60
O Comando FOR...NEXT........................................................................................................ 60
O Comando WHILE...ENDDO............................................................................................... 62
Estruturas de Deciso............................................................................................................ 63
Desviando a Execuo........................................................................................................... 63
O Comando IF...ENDIF.......................................................................................................... 63
O Comando DOCASE...ENDCASE....................................................................................... 64
Informaes Adicionais.......................................................................................................... 65
Lista de Palavras Reservadas............................................................................................... 65
Tcnicas de Programao Eficiente emAdvPl.................................................................. 66
Criao de Funes Segundo a Necessidade............................................................... 67
Codificao Auto-Documentvel...................................................................................... 68
Utilizao de Solues Simples........................................................................................ 68
Opo por Flexibilidade..................................................................................................... 69
Opo da Praticidade ao Drama...................................................................................... 69
Utilizao de Operadores de Incremento/Decremento.............................................. 69
Evitar Passos Desnecessrios.......................................................................................... 70
Utilizao de Alternativas.................................................................................................. 71
Utilizao de Arquivos de Cabealho Quando Necessrio......................................... 72
Constantes emMaisculo................................................................................................. 72
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________5
5
Utilizao de Identao..................................................................................................... 72
Utilizao de Espaos emBranco.................................................................................... 73
Quebra de Linhas Muito Longas...................................................................................... 73
Capitulao de Palavras-Chave....................................................................................... 74
Utilizao da Notao Hngara....................................................................................... 74
Utilizao de Nomes Significantes para Variveis....................................................... 74
Utilizao de Comentrios................................................................................................ 74
Criao de Mensagens Sistmicas Significantes e Consistentes.............................. 75
Evitar Abreviao de Comandos em4 letras................................................................ 75
Evitar "Disfarces" no Cdigo............................................................................................ 75
Evitar Cdigo de Segurana Desnecessrio.................................................................. 76
Isolamento de Strings de Texto...................................................................................... 77
Tabela de Pictures de Formatao..................................................................................... 77
Comando SAY/PSAY........................................................................................................... 77
Comando GET...................................................................................................................... 77
Programao do AdvPl para o ERP Siga Advanced Protheus....................................... 78
Prefcio..................................................................................................................................... 78
OQue Fazer umPrograma comInteligncia............................................................ 79
Programando Simples, mas Certo................................................................................... 80
Erros que Podemser Evitados......................................................................................... 80
AImportncia de Programas Documentados............................................................... 81
Cabealho de Programa / Funo................................................................................... 81
Criao de Variveis............................................................................................................... 82
ADeclarao........................................................................................................................ 82
OTipo de Varivel.............................................................................................................. 82
Tipos Existentes.............................................................................................................. 82
Inicializao.......................................................................................................................... 83
Padronizao de Variveis................................................................................................ 83
Criando uma Varivel Utilizando a Funo CRI AVAR() .............................................. 83
Variveis de Relatrios...................................................................................................... 84
Cuidados como Posicionamento de Registros................................................................. 85
Funo Posicione................................................................................................................ 86
Funo Existcpo.................................................................................................................. 86
Restaurando ndice e limpando filtros........................................................................... 86
Outros Cuidados...................................................................................................................... 87
Confrontando relatrios e consultas............................................................................... 87
Problemas comLooping de Programas......................................................................... 87
Manipulao de Arquivos Externos ao Protheus.......................................................... 88
Desenvolvendo Telas......................................................................................................... 89
Salvando Arrays padres................................................................................................. 90
Pontos de Entrada.................................................................................................................. 90
Objetivo dos Pontos de Entrada...................................................................................... 90
Quando criar umPonto de Entrada................................................................................ 90
Sintaxe para criar umPonto de Entrada:.................................................................. 91
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________6
6
Procedimentos para sua criao..................................................................................... 91
Contabilizando......................................................................................................................... 91
AFuno HeadProva.......................................................................................................... 92
Afuno DetProva() .......................................................................................................... 92
Afuno RodaProva() ....................................................................................................... 92
Atualizando SX(ATUSX)........................................................................................................ 93
Exemplo de atualizao no SX: ....................................................................................... 93
SX1 - Parmetros Genricos............................................................................................ 93
SX2 - Mapeamento dos arquivos.................................................................................... 93
SX3 - Dicionrio de Dados................................................................................................ 94
SX5 - Tabelas Genricas................................................................................................... 94
SX6 - Parmetros................................................................................................................ 94
SX7 Gatilhos..................................................................................................................... 94
SXE/SXF - Seqncia. de documentos........................................................................... 94
SINDEX- Arquivo de ndices............................................................................................. 94
Controle de Transao (TTS)............................................................................................... 94
Oque ................................................................................................................................. 94
Quando usar........................................................................................................................ 94
Como usar............................................................................................................................ 94
Onde no usar..................................................................................................................... 95
Comandos Definidos pelo Usurio (UDCs)...................................................................... 95
Uso de Strings..................................................................................................................... 96
Conceito de Filial e Compartilhamento de Arquivos....................................................... 97
Arquivos Compartilhados.................................................................................................. 97
Arquivos Exclusivos............................................................................................................ 97
Tcnicas para Filtragem.................................................................................................... 98
Chaves Primrias................................................................................................................ 98
Chaves Estrangeiras........................................................................................................... 98
Integridade Referencial..................................................................................................... 98
Utilizando Rotinas Automticas........................................................................................... 99
Controle de Semforo............................................................................................................ 99
Atualizao do SourceSafe.................................................................................................. 100
Procedimentos de Localizaes......................................................................................... 100
Procedimentos a seremcumpridos emalterao / desenvolvimento de
programas : ....................................................................................................................... 100
Programando comSchedule de Relatrios..................................................................... 101
Modelos de Programas Padronizados............................................................................... 101
Modelo 1................................................................................................................................. 102
Modelo 2................................................................................................................................. 104
Modelo 3................................................................................................................................. 112
Modelos de Relatrios.......................................................................................................... 126
Modelos de Clculos............................................................................................................. 130
Funes bsicas da Linguagem......................................................................................... 139
AAdd........................................................................................................................................ 139
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________7
7
ACopy...................................................................................................................................... 140
AClone..................................................................................................................................... 141
ADel ......................................................................................................................................... 142
ADir.......................................................................................................................................... 142
AEval........................................................................................................................................ 143
AFill .......................................................................................................................................... 145
AIns.......................................................................................................................................... 146
Alias.......................................................................................................................................... 146
Append From......................................................................................................................... 147
Array........................................................................................................................................ 149
AScan....................................................................................................................................... 150
ASize........................................................................................................................................ 152
ASort........................................................................................................................................ 153
ATail......................................................................................................................................... 154
BTVCanOpen.......................................................................................................................... 154
BTVCreateDDFs..................................................................................................................... 155
BTVDropIdxs.......................................................................................................................... 156
BTVTables............................................................................................................................... 157
CDow....................................................................................................................................... 158
CMonth.................................................................................................................................... 158
Commit.................................................................................................................................... 159
Copy To................................................................................................................................... 160
Copy File................................................................................................................................. 161
Copy Structure....................................................................................................................... 162
CPYS2T.................................................................................................................................... 163
CPYT2S.................................................................................................................................... 164
CTreeDelIdxs......................................................................................................................... 164
CTreeDellnt ............................................................................................................................ 165
CurDir ...................................................................................................................................... 166
Date......................................................................................................................................... 167
Day........................................................................................................................................... 167
DBAppend............................................................................................................................... 168
DBClearAllFilter...................................................................................................................... 169
DBClearFilter.......................................................................................................................... 170
DBCloseAll............................................................................................................................... 170
DBCloseArea........................................................................................................................... 171
DBClearIndex......................................................................................................................... 171
DBCommit............................................................................................................................... 172
DBCommitAll .......................................................................................................................... 172
DBCreate................................................................................................................................. 173
DBCreateIndex...................................................................................................................... 174
DBDelete................................................................................................................................. 175
DBEval..................................................................................................................................... 175
DBF........................................................................................................................................... 177
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________8
8
DBFieldInfo............................................................................................................................. 177
DBFilter.................................................................................................................................... 178
DBGoBottom.......................................................................................................................... 179
DBGoTo................................................................................................................................... 180
DBGoTop................................................................................................................................. 180
DBInfo..................................................................................................................................... 181
DBOrderInfo........................................................................................................................... 182
DBOrderNickName................................................................................................................ 183
DBRecall.................................................................................................................................. 184
DBRecordInfo........................................................................................................................ 184
DBReindex.............................................................................................................................. 185
DBRLock.................................................................................................................................. 186
DBRLockList ........................................................................................................................... 187
DBRunLock............................................................................................................................. 187
DbSeek.................................................................................................................................... 188
DBSetDriver............................................................................................................................ 190
DBSetFilter.............................................................................................................................. 190
DBSetIndex............................................................................................................................ 191
DBSetNickName.................................................................................................................... 192
DBSetOrder............................................................................................................................ 193
DBSkip..................................................................................................................................... 194
DBStruct.................................................................................................................................. 195
DBUnlock................................................................................................................................ 195
DBUnlockAll............................................................................................................................ 196
Delete...................................................................................................................................... 196
Deleted.................................................................................................................................... 198
DevOutPict.............................................................................................................................. 198
DevPos.................................................................................................................................... 199
Directory................................................................................................................................. 200
DirRemove.............................................................................................................................. 201
DiskSpace............................................................................................................................... 202
Dow.......................................................................................................................................... 202
Dtoc.......................................................................................................................................... 203
Dtos.......................................................................................................................................... 204
Eject......................................................................................................................................... 205
ElapTime................................................................................................................................. 205
FClose...................................................................................................................................... 206
FCreate.................................................................................................................................... 207
FErase...................................................................................................................................... 208
FError....................................................................................................................................... 209
FieldBlock................................................................................................................................ 210
FieldWbl .................................................................................................................................. 211
File............................................................................................................................................ 212
FOpen...................................................................................................................................... 213
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________9
9
FOpenPort............................................................................................................................... 214
FRead....................................................................................................................................... 216
FReadStr................................................................................................................................. 217
Frename.................................................................................................................................. 218
FSeek....................................................................................................................................... 219
FWrite...................................................................................................................................... 220
GetImpWindows.................................................................................................................... 222
GetPortActive......................................................................................................................... 222
GetClientDir............................................................................................................................ 223
Header..................................................................................................................................... 223
IndexKey................................................................................................................................. 224
IndexOrd................................................................................................................................. 225
InitPrint ................................................................................................................................... 225
IsPrinter .................................................................................................................................. 226
IsCisaSyncOn......................................................................................................................... 227
Locate...................................................................................................................................... 227
LUpdate................................................................................................................................... 229
MakeDir................................................................................................................................... 229
MemoLine............................................................................................................................... 230
MemoRead.............................................................................................................................. 231
MemoWrite............................................................................................................................. 232
MLCount.................................................................................................................................. 232
Month...................................................................................................................................... 233
MsCompress........................................................................................................................... 234
MsCRC32................................................................................................................................. 235
MsCRC32Str............................................................................................................................ 236
MsDecomp.............................................................................................................................. 236
OrdCondSet............................................................................................................................ 237
OrdCreate............................................................................................................................... 238
OrdDescend............................................................................................................................ 240
OrdKey.................................................................................................................................... 241
OrdListAdd.............................................................................................................................. 242
PRow........................................................................................................................................ 243
Pack......................................................................................................................................... 244
PCol.......................................................................................................................................... 244
PreparePrint........................................................................................................................... 245
PrnFlush.................................................................................................................................. 246
RDDSetDefault....................................................................................................................... 247
RealRDD.................................................................................................................................. 247
Recall....................................................................................................................................... 248
RecSize.................................................................................................................................... 249
ReIndex................................................................................................................................... 250
Replace.................................................................................................................................... 250
RLock....................................................................................................................................... 252
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________10
10
Seconds................................................................................................................................... 253
Seek......................................................................................................................................... 253
Select....................................................................................................................................... 254
Set Filter.................................................................................................................................. 255
Set Index................................................................................................................................ 256
Set Order................................................................................................................................ 257
SetPrc...................................................................................................................................... 258
Skip.......................................................................................................................................... 258
SplitPath.................................................................................................................................. 260
TCConType............................................................................................................................. 261
TCDelFile................................................................................................................................. 262
TCGenQry............................................................................................................................... 262
TCIsvLock............................................................................................................................... 263
TCRefresh............................................................................................................................... 263
TCSetBuff................................................................................................................................ 264
TCSetConn.............................................................................................................................. 264
TCSetDummy......................................................................................................................... 265
TCSetField............................................................................................................................... 266
TCSpExec................................................................................................................................ 267
TCSpExist................................................................................................................................ 268
TCSqlError.............................................................................................................................. 269
TCSrvType.............................................................................................................................. 269
TCSysExe................................................................................................................................ 270
;TCUnLink............................................................................................................................... 271
TCVUnLock............................................................................................................................. 271
TCVLock.................................................................................................................................. 272
Time......................................................................................................................................... 273
UnLock..................................................................................................................................... 274
UpdateIntName..................................................................................................................... 274
Use........................................................................................................................................... 275
Used......................................................................................................................................... 277
Year.......................................................................................................................................... 277
ZAP........................................................................................................................................... 278
Classes de Interface Visual................................................................................................. 279
tSrvObject............................................................................................................................... 279
Caractersticas................................................................................................................... 279
Propriedades...................................................................................................................... 279
Mtodos.............................................................................................................................. 280
SetFocus......................................................................................................................... 280
Hide................................................................................................................................. 280
Show................................................................................................................................ 280
Enable............................................................................................................................. 280
Disable............................................................................................................................ 281
Refresh............................................................................................................................ 281
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________11
11
Classes de J anelas................................................................................................................ 281
tWindow.................................................................................................................................. 281
Hierarquia........................................................................................................................... 281
Caractersticas................................................................................................................... 281
Propriedades...................................................................................................................... 282
Mtodos.............................................................................................................................. 282
New.................................................................................................................................. 282
Activate........................................................................................................................... 283
End................................................................................................................................... 284
Center.............................................................................................................................. 284
Exemplo.......................................................................................................................... 284
TDialog.................................................................................................................................... 284
Hierarquia........................................................................................................................... 285
Caractersticas................................................................................................................... 285
Propriedades...................................................................................................................... 285
Mtodos.............................................................................................................................. 285
New.................................................................................................................................. 285
Activate........................................................................................................................... 286
End................................................................................................................................... 287
MSDialog................................................................................................................................. 287
Hierarquia........................................................................................................................... 287
Caractersticas................................................................................................................... 287
Propriedades...................................................................................................................... 287
Mtodos.............................................................................................................................. 287
New.................................................................................................................................. 287
Classes Auxiliares.................................................................................................................. 289
tFont ........................................................................................................................................ 289
Hierarquia........................................................................................................................... 289
Descrio............................................................................................................................ 289
Mtodos.............................................................................................................................. 289
New.................................................................................................................................. 289
Exemplo.............................................................................................................................. 290
Classes de Componentes.................................................................................................... 290
tControl ................................................................................................................................... 290
Hierarquia........................................................................................................................... 290
Caractersticas................................................................................................................... 290
Propriedades...................................................................................................................... 290
Mtodos.............................................................................................................................. 291
SetFocus......................................................................................................................... 291
Classes de Componentes Visuais...................................................................................... 291
tButton.................................................................................................................................... 291
Hierarquia........................................................................................................................... 291
Descrio............................................................................................................................ 291
Propriedades...................................................................................................................... 291
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________12
12
Metodos.............................................................................................................................. 292
New.................................................................................................................................. 292
Exemplo.............................................................................................................................. 293
tCheckBox............................................................................................................................... 293
Hierarquia........................................................................................................................... 293
Descrio............................................................................................................................ 293
Mtodos.............................................................................................................................. 293
New.................................................................................................................................. 293
Exemplo.............................................................................................................................. 294
tComboBox............................................................................................................................. 295
Hierarquia........................................................................................................................... 295
Descrio............................................................................................................................ 295
Propriedades...................................................................................................................... 295
Mtodos.............................................................................................................................. 295
New.................................................................................................................................. 295
Select............................................................................................................................... 296
Exemplo.............................................................................................................................. 297
tGet.......................................................................................................................................... 297
Hierarquia........................................................................................................................... 297
Descrio............................................................................................................................ 297
Propriedades...................................................................................................................... 297
Mtodos.............................................................................................................................. 298
New.................................................................................................................................. 298
Exemplo.............................................................................................................................. 299
tGroup..................................................................................................................................... 299
Hierarquia........................................................................................................................... 299
Descrio............................................................................................................................ 300
Mtodos.............................................................................................................................. 300
New.................................................................................................................................. 300
Exemplo.............................................................................................................................. 300
tListbox.................................................................................................................................... 301
Hierarquia........................................................................................................................... 301
Descrio............................................................................................................................ 301
Parmetros......................................................................................................................... 301
Mtodos.............................................................................................................................. 301
New.................................................................................................................................. 301
Select............................................................................................................................... 302
Add................................................................................................................................... 303
Modify............................................................................................................................. 303
Del.................................................................................................................................... 303
Len................................................................................................................................... 304
Reset ............................................................................................................................... 304
Exemplo.............................................................................................................................. 304
tMeter...................................................................................................................................... 305
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________13
13
Hierarquia........................................................................................................................... 305
Descrio............................................................................................................................ 305
Parmetros......................................................................................................................... 305
Mtodos.............................................................................................................................. 305
New.................................................................................................................................. 305
Set.................................................................................................................................... 306
Exemplo.............................................................................................................................. 306
tMultiget.................................................................................................................................. 307
Hierarquia........................................................................................................................... 307
Descrio............................................................................................................................ 307
Propriedades...................................................................................................................... 307
Mtodos.............................................................................................................................. 308
New.................................................................................................................................. 308
EnableVScroll................................................................................................................. 309
EnableHScroll................................................................................................................. 309
Exemplo.............................................................................................................................. 310
tPanel....................................................................................................................................... 310
Hierarquia........................................................................................................................... 310
Descrio............................................................................................................................ 310
Mtodos.............................................................................................................................. 310
New.................................................................................................................................. 310
Exemplo.............................................................................................................................. 311
tRadMenu............................................................................................................................... 311
Hierarquia........................................................................................................................... 311
Descrio............................................................................................................................ 311
Propriedades...................................................................................................................... 312
Mtodos.............................................................................................................................. 312
New.................................................................................................................................. 312
EnableItem..................................................................................................................... 313
Exemplo.............................................................................................................................. 313
tSay.......................................................................................................................................... 313
Hierarquia........................................................................................................................... 313
Descrio............................................................................................................................ 314
Parmetros......................................................................................................................... 314
Mtodos.............................................................................................................................. 314
New.................................................................................................................................. 314
SetText............................................................................................................................ 315
Exemplo.............................................................................................................................. 315
tScrollbox................................................................................................................................ 316
Hierarquia........................................................................................................................... 316
Descrio............................................................................................................................ 316
Mtodos.............................................................................................................................. 316
New.................................................................................................................................. 316
Exemplo.............................................................................................................................. 316
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________14
14
Infra-estrutura....................................................................................................................... 318
MsGetDados........................................................................................................................... 318
MsGetDb................................................................................................................................. 322
MsmGet................................................................................................................................... 326
MBrowse................................................................................................................................. 329
Funes................................................................................................................................... 330
AllGroups................................................................................................................................. 330
AllUsers................................................................................................................................... 331
APMsgAlert............................................................................................................................. 333
APMsgInfo.............................................................................................................................. 333
APMsgNoYes.......................................................................................................................... 334
APMsgStop.............................................................................................................................. 334
APMsgYesNo.......................................................................................................................... 335
APMsgYesNo.......................................................................................................................... 335
Cabec....................................................................................................................................... 336
Capital ..................................................................................................................................... 338
CloseBrowse........................................................................................................................... 338
Conpad1.................................................................................................................................. 339
Enchoicebar............................................................................................................................ 339
FileNoExt................................................................................................................................. 340
Final ......................................................................................................................................... 341
FTPConnect............................................................................................................................ 341
FTPDirChange........................................................................................................................ 342
FTPDirectory.......................................................................................................................... 343
FTPDisconnect....................................................................................................................... 343
FTPDownload......................................................................................................................... 344
FTPErase................................................................................................................................. 344
FTPGetCurDir......................................................................................................................... 345
FTPRenameFile...................................................................................................................... 345
FTPUpload.............................................................................................................................. 346
FunDesc.................................................................................................................................. 347
FunName................................................................................................................................ 347
GetCountryList....................................................................................................................... 348
GetMark................................................................................................................................... 348
GetMv...................................................................................................................................... 349
IncProc.................................................................................................................................... 350
IncRegua................................................................................................................................. 350
IndRegua................................................................................................................................ 352
MarkBRefresh......................................................................................................................... 353
MarkBrow................................................................................................................................ 353
Ms_Flush................................................................................................................................. 354
MsAppend............................................................................................................................... 356
MsCopyFile............................................................................................................................. 356
MsCopyTo............................................................................................................................... 357
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________15
15
MsCreate................................................................................................................................. 358
MsErase................................................................................................................................... 358
MsFile....................................................................................................................................... 359
MsRename.............................................................................................................................. 360
MsUnlock................................................................................................................................. 360
OurSpool................................................................................................................................. 361
Pergunte................................................................................................................................. 362
Processa.................................................................................................................................. 363
ProcRegua.............................................................................................................................. 364
PswAdmin............................................................................................................................... 364
PswID...................................................................................................................................... 365
PswName................................................................................................................................ 365
PswOrder................................................................................................................................ 366
PswRet..................................................................................................................................... 367
PswSeek.................................................................................................................................. 367
ReadVar................................................................................................................................... 368
RetAcsName........................................................................................................................... 368
RetExtHlp................................................................................................................................ 369
RetExtHls................................................................................................................................ 369
RetExtHpr ............................................................................................................................... 370
RetExtMnu.............................................................................................................................. 370
RetFileName........................................................................................................................... 371
Roda......................................................................................................................................... 371
RptStatus................................................................................................................................ 373
SetDefault............................................................................................................................... 374
SetPrint.................................................................................................................................... 376
SetRegua................................................................................................................................ 378
SixDescricao........................................................................................................................... 380
VerSenha................................................................................................................................ 380
X1Def01.................................................................................................................................. 381
X1Def02.................................................................................................................................. 381
X1Def03.................................................................................................................................. 382
X1Def04.................................................................................................................................. 382
X1Def05.................................................................................................................................. 383
X1Pergunt............................................................................................................................... 383
X2Nome................................................................................................................................... 384
X3CBox.................................................................................................................................... 385
X3Descric................................................................................................................................ 385
X3Picture................................................................................................................................. 386
X3Titulo................................................................................................................................... 386
X3Uso...................................................................................................................................... 386
X5Descri.................................................................................................................................. 387
X6Conteud.............................................................................................................................. 388
X6Desc1.................................................................................................................................. 388
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________16
16
X6Desc2.................................................................................................................................. 389
X6Descric................................................................................................................................ 389
XADescric................................................................................................................................ 390
XBDescri.................................................................................................................................. 390
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________17
17
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________18
18
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________19
19
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________20
20
configurao.
\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.
I DE
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________21
21
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 Mi scel neas | Sobr e 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________22
22
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________23
23
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 Proj etos. 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;
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________24
24
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.
I nformaes 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
I nformaes 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________25
25
"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:
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________26
26
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________27
27
CTree
I nformaes 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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________28
28
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________29
29
AdPl Guia de Programao
A LinguagemAdvPl
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 I nterface 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,
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________30
30
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 umPrograma
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________31
31
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:
* Programa para clculo do total
* Autor: Microsiga Software S.A.
* Data: 2 de outubro de 2001
Todas as linhas iniciadas com um sinal de asterisco so consideradas como 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:
// Programa para clculo do total
// Autor: Microsiga Software S.A.
// Data: 2 de outubro de 2001
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________32
32
Outra forma de documentar textos utilizar as barras transversais juntamente com o asterisco, podendo-
se comentar todo um bloco de texto sem precisar comentar linha a linha:
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
Todo o texto encontrado entre a abertura (indicada pelos caracteres /*) e o fechamento (indicada pelos
caracteres */) considerado como comentrio.
Linhas Mistas
O AdvPl tambm permite que existam linhas de comando com comentrio. Isto possvel inclundo-se as
duas barras transversais (//) ao final da linha de comando e adicionando-se o texto do comentrio:
Local nCnt
Local nSoma := 0 // Inicializa a varivel com zero para a soma
For nCnt := 1 To 10
nSoma += nCnt
Next nCnt
Tamanho da Linha
Assim como a linha fsica, delimitada pela quantidade de caracteres que pode ser digitado no editor de
textos utilizado, existe uma linha considerada linha lgica. A linha lgica, aquela considerada para a
compilao como uma nica linha de comando.
A princpio, cada linha digitada no arquivo texto diferenciada aps o pressionamento da tecla <Enter>.
Ou seja, a linha lgica, a linha fsica no arquivo. Porm algumas vezes, por limitao fsica do editor de
texto ou por esttica, pode-se "quebrar" a linha lgica em mais de uma linha fsica no arquivo texto. Isto
efetuado utilizando-se o sinal de ponto-e-vrgula (;).
If !Empty(cNome) .And. !Empty(cEnd) .And. ; <enter>
!Empty(cTel) .And. !Empty(cFax) .And. ; <enter>
!Empty(cEmail)
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como a linha
torna-se muito grande, pode-se 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 umPrograma
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________33
33
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
| Programa: Clculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+===========================================+
*/
Local nCnt
Local nResultado := 1 // Resultado do fatorial
Local nFator := 5 // Nmero para o clculo
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= nCnt
Next nCnt
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
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 I dentificao
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.
/*
+==========================================+
| Programa: Clculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+==========================================+
*/
Opcionalmente pode-se incluir definies de constantes utilizadas no programa ou incluso de arquivos de
cabealho nesta rea.
A rea de Aj ustes I niciais
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________34
34
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 nResultado := 0 // Resultado do fatorial
Local nFator := 10 // Nmero para o clculo
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.
// Clculo do fatorial
For nCnt := nFator To 1 Step -1
nResultado *= 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.
// Exibe o resultado na tela, atravs da funo alert
Alert("O fatorial de " + cValToChar(nFator) + ;
" " + cValToChar(nResultado))
// Termina o programa
Return
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________35
35
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!"
'Esta uma string'
"Esta 'outra' string"
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________36
36
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:
nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))
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
cNumero
VAR_QUALQUER
M_CARGO
A11
E alguns invlidos:
1CODIGO (Inicia por um nmero)
M CARGO (contm um espao em branco)
LOCAL (palavra reservada do AdvPl)
O AdvPl no uma linguagem de tipos rgidos para variveis, ou seja, no necessrio informar o tipo de
dados que determinada varivel ir conter no momento de sua declarao, e o seu valor pode mudar
durante a execuo do programa. Tambm no h necessidade de declarar variveis em uma seo
especfica do seu cdigo fonte, embora seja aconselhvel declarar todas as variveis necessrias no
comeo, tornando a manuteno mais fcil e evitando a declarao de variveis desnecessrias.
Para declarar uma varivel deve-se utilizar um identificador de escopo, seguido de uma lista de variveis
separadas por vrgula (,). Um identificador de escopo uma palavra chave que indica a que contexto do
programa a varivel declarada pertence. O contexto de variveis pode ser local (visualizadas apenas
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________37
37
dentro do programa atual), pblico (visualizadas por qualquer outro programa), entre outros. Os
diferentes tipos de contexto de variveis so explicados na documentao sobre escopo de variveis.
Considere as linhas de cdigo de exemplo:
nResultado := 250 * (1 + (nPercentual / 100))
Se esta linha for executada em um programa AdvPl, ocorrer um erro de execuo com a mensagem
"variable does not exist: nPercentual", pois esta varivel est sendo utilizada em uma expresso de
clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar a varivel previamente:
Local nPercentual, nResultado
nResultado := 250 * (1 + (nPercentual / 100))
Neste exemplo, as variveis so declaradas previamente utilizando o identificador de escopo local. Quando
a linha de clculo for executada, o erro de varivel no existente no mais ocorrer. Porm variveis no
inicializadas tm sempre o valor default nulo (Nil) e este valor no pode ser utilizado em um clculo pois
tambm gerar erros de execuo (nulo no pode ser dividido por 100). A resoluo deste problema
efetuada inicializando-se a varivel atravs de uma das formas:
Local nPercentual,nResultado
Store 10 To nPercentual
nResultado := 250 * (1 + (nPercentual / 100))
ou
Local nPercentual, nResultado
nPercentual := 10
nResultado := 250 * (1 + (nPercentual / 100))
ou
Local nPercentual := 10, nResultado
nResultado := 250 * (1 + (nPercentual / 100))
A diferena entre o ltimo 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 xVariavel // Declara a varivel inicialmente com valor nulo
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________38
38
02
03 xVariavel := "Agora a varivel caracter..."
04 Alert("Valor do Texto: " + xVariavel)
05
06 xVariavel := 22 // Agora a varivel numrica
07 Alert(cValToChar(xVariavel))
08
09 xVariavel := .T. // Agora a varivel lgica
10 If xVariavel
11 Alert("A varivel tem valor verdadeiro...")
12 Else
13 Alert("A varivel tem valor falso...")
14 Endif
15
16 xVariavel := Date() // Agora a varivel data
17 Alert("Hoje : " + DtoC(xVariavel))
18
19 xVariavel := nil // Nulo novamente
20 Alert("Valor nulo: " + xVariavel)
21
22 Return
No 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________39
39
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________40
40
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________41
41
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.
I nicializando 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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________42
42
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:
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________43
43
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________44
44
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).
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________45
45
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________46
46
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________47
47
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________48
48
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 umPrograma
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________49
49
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.)
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________50
50
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________51
51
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________52
52
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________53
53
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________54
54
/ 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________55
55
.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:
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________56
56
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________57
57
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________58
58
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.
Ordemde 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________59
59
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________60
60
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 := nValorI nicial TO nValorFinal [STEP nI ncremento]
Comandos...
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________61
61
[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.
nValorI nicial
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
nI ncremento
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________62
62
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________63
63
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________64
64
Sintaxe
IF l Expr essao
Comandos
[ELSE
Comandos. . . ]
ENDIF
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 dVencto := CTOD("31/12/01")
If Date() > dVencto
Alert("Vencimento ultrapassado!")
Endif
Return
O Comando DO CASE...ENDCASE
Executa o primeiro conjunto de comandos cuja expresso condicional resulta em verdadeiro (.T.).
Sintaxe
DO CASE
CASE l Expr essao1
Commandos
[CASE l Expr essao2
Commandos
...
CASE l Expr essaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
Parmetros
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________65
65
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).
OTHERWI SE
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 := Month(Date())
Local cPeriodo := ""
DO CASE
CASE nMes <= 3
cPeriodo := "Primeiro Trimestre"
CASE nMes >= 4 .And. nMes <= 6
cPeriodo := "Segundo Trimestre"
CASE nMes >= 7 .And. nMes <= 9
cPeriodo := "Terceiro Trimestre"
OTHERWISE
cPeriodo := "Quarto Trimestre"
ENDCASE
Return
I nformaes Adicionais
Lista de Palavras Reservadas
AADD DTOS INKEY REPLICATE VAL
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________66
66
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 emAdvPl
Para o desenvolvimento de sistemas e a programao de rotinas, sempre esperado que qualquer cdigo
escrito seja:
de correto funcionamento
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________67
67
eficiente
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)
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________68
68
Return GetOk(lDefault)
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________69
69
Este tipo de alterao torna o cdigo mais legvel e o processamento mais rpido, evitando a avaliao de
instrues desnecessariamente.
Existem outras situaes onde a simplificao pode ser utilizada. A expresso de avaliao a seguir:
If cVar == "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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________70
70
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:
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________71
71
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________72
72
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
cColor := "Preto"
EndCase
Replace hair With cColor
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________73
73
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
A utilizao da identao seguindo as estruturas de controle de fluxo (while, if, case, etc) torna a
compreenso do cdigo muito mais fcil:
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________74
74
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________75
75
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]
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________76
76
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________77
77
I solamento 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________78
78
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________79
79
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 I nteligncia
Precisamos entender, antes de mais nada, o que inteligncia.
Segundo o dicionrio Michaelis, inteligncia significa:
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________80
80
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;
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________81
81
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________82
82
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________83
83
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.
I nicializao
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 CRI AVAR()
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________84
84
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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________85
85
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)
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________86
86
// 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
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________87
87
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.
PDF Creator - PDF4Free v2.0 http://www.pdf4free.com
AdvPl________________________________________________________________88
88
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())