Professional Documents
Culture Documents
ndice
A Tecnologia Protheus..........................................................................................................16
Caractersticas da Tecnologia Protheus.................................................................................16
As Camadas do Advanced Protheus......................................................................................16
Servidor de Aplicao.......................................................................................................17
Terminal Thin-Client.........................................................................................................17
Dados................................................................................................................................17
Repositrio de Apos.........................................................................................................17
Estruturao..........................................................................................................................18
A estrutura de diretrios do Advanced Protheus...............................................................18
Verso AP5....................................................................................................................18
Verso AP6....................................................................................................................18
Aplicativos do Advanced Protheus...................................................................................19
Protheus Server.............................................................................................................19
Remote..........................................................................................................................19
IDE................................................................................................................................19
Monitor..........................................................................................................................19
Nomenclaturas Utilizadas.................................................................................................20
Topologia de Rede................................................................................................................20
Caractersticas e Possibilidades de Topologias de Rede...................................................20
IDE - Integrated Development Environment........................................................................22
Caractersticas do IDE......................................................................................................22
Monitor..................................................................................................................................23
Informaes Bsicas das Conexes..................................................................................23
Btrieve...................................................................................................................................23
Informaes Bsicas.........................................................................................................23
Configurao do Btrieve/PervasiveSQL2000:..................................................................24
CTree.....................................................................................................................................26
Informaes Bsicas.........................................................................................................26
ndices...............................................................................................................................26
Sistemas Operacionais e Plataformas (verso AP6 e posteriores)........................................27
Sistemas Operacionais e Plataformas...............................................................................27
Plataformas e SO's suportados......................................................................................27
Novos SO's a serem suportados....................................................................................27
AdPl Guia de Programao................................................................................................28
A Linguagem AdvPl..............................................................................................................28
Programao Com Interface Prpria com o Usurio........................................................28
Programao Sem Interface Prpria com o Usurio.........................................................28
Programao por Processos..........................................................................................29
Programao de RPC....................................................................................................29
Programao Web.........................................................................................................29
AdvPl________________________________________________________________2
Programao TelNet......................................................................................................29
Sintaxe da Linguagem...........................................................................................................29
Edio de Programas.............................................................................................................29
Criao de um Programa.......................................................................................................29
Linhas de Programa..........................................................................................................30
Linhas de Comando......................................................................................................30
Linhas de Comentrio...................................................................................................30
Linhas Mistas................................................................................................................31
Tamanho da Linha.............................................................................................................31
Estrutura de um Programa.....................................................................................................31
A rea de Identificao.....................................................................................................32
A rea de Ajustes Iniciais.................................................................................................32
O Corpo do Programa.......................................................................................................33
A rea de Encerramento...................................................................................................33
Variveis de Memria...........................................................................................................33
Tipos de Dados......................................................................................................................33
Numrico...........................................................................................................................33
Lgico...............................................................................................................................34
Caracter.............................................................................................................................34
Data...................................................................................................................................34
Matriz (Array)...................................................................................................................34
Bloco de Cdigo................................................................................................................34
Criao e Atribuio de Variveis.........................................................................................35
Matrizes.................................................................................................................................37
Matrizes como Estruturas..................................................................................................38
Cuidados com Matrizes.....................................................................................................40
Inicializando Matrizes...........................................................................................................40
Se o tamanho da matriz conhecido.................................................................................40
Se o tamanho da matriz no conhecido..........................................................................41
Blocos de Cdigo..................................................................................................................41
Um Primeiro Lembrete.....................................................................................................41
Outro Lembrete.................................................................................................................42
Lista de Expresses...........................................................................................................43
Duas Linhas de Cdigo.................................................................................................43
Duas Linha de Cdigo em Uma , Utilizando Ponto-e-Vrgula.....................................43
Convertendo para uma Lista de Expresses.................................................................43
Onde Pode-se Utilizar uma Lista de Expresses?.........................................................44
De Listas de Expresses para Blocos de Cdigo..............................................................44
Executando um Bloco de Cdigo..................................................................................45
Passando Parmetros.....................................................................................................46
Utilizando Blocos de Cdigo........................................................................................46
Escopo de Variveis..............................................................................................................47
O Contexto de Variveis dentro de um Programa.................................................................47
Variveis Locais....................................................................................................................48
Variveis Estticas.................................................................................................................49
Variveis Privadas.................................................................................................................49
Variveis Pblicas.................................................................................................................50
AdvPl________________________________________________________________3
Diferenciao entre variveis e nomes de campos................................................................51
Operadores da Linguagem....................................................................................................52
Operadores Comuns..............................................................................................................52
Operadores Matemticos...................................................................................................52
Operadores de String.........................................................................................................53
Operadores Relacionais.....................................................................................................53
Operadores Lgicos..........................................................................................................53
Operadores de Atribuio......................................................................................................54
Atribuio Simples............................................................................................................54
Atribuio em Linha.........................................................................................................54
Atribuio Composta........................................................................................................55
Operadores de Incremento/Decremento................................................................................55
Operadores Especiais............................................................................................................56
Ordem de Precedncia dos Operadores................................................................................57
Alterao da Precedncia..................................................................................................57
Macro Substituio...............................................................................................................58
Estruturas de Controle...........................................................................................................59
Controlando o Fluxo.............................................................................................................59
Estruturas de Repetio.........................................................................................................59
Repetio de Comandos........................................................................................................59
O Comando FOR...NEXT.....................................................................................................59
O Comando WHILE...ENDDO............................................................................................61
Estruturas de Deciso............................................................................................................62
Desviando a Execuo..........................................................................................................62
O Comando IF...ENDIF........................................................................................................62
O Comando DO CASE...ENDCASE....................................................................................63
Informaes Adicionais.........................................................................................................64
Lista de Palavras Reservadas................................................................................................64
Tcnicas de Programao Eficiente em AdvPl.....................................................................65
Criao de Funes Segundo a Necessidade....................................................................66
Codificao Auto-Documentvel......................................................................................67
Utilizao de Solues Simples........................................................................................67
Opo por Flexibilidade....................................................................................................68
Opo da Praticidade ao Drama........................................................................................68
Utilizao de Operadores de Incremento/Decremento.....................................................68
Evitar Passos Desnecessrios............................................................................................69
Utilizao de Alternativas.................................................................................................70
Utilizao de Arquivos de Cabealho Quando Necessrio...............................................71
Constantes em Maisculo.................................................................................................71
Utilizao de Identao.....................................................................................................71
Utilizao de Espaos em Branco.....................................................................................72
Quebra de Linhas Muito Longas.......................................................................................72
Capitulao de Palavras-Chave.........................................................................................73
Utilizao da Notao Hngara........................................................................................73
Utilizao de Nomes Significantes para Variveis............................................................73
Utilizao de Comentrios................................................................................................73
Criao de Mensagens Sistmicas Significantes e Consistentes......................................74
AdvPl________________________________________________________________4
Evitar Abreviao de Comandos em 4 letras....................................................................74
Evitar "Disfarces" no Cdigo............................................................................................74
Evitar Cdigo de Segurana Desnecessrio......................................................................75
Isolamento de Strings de Texto.........................................................................................76
Tabela de Pictures de Formatao.........................................................................................76
Comando SAY/PSAY.......................................................................................................76
Comando GET..................................................................................................................76
Programao do AdvPl para o ERP Siga Advanced Protheus..............................................77
Prefcio.................................................................................................................................77
O Que Fazer um Programa com Inteligncia.................................................................78
Programando Simples, mas Certo.....................................................................................79
Erros que Podem ser Evitados..........................................................................................79
A Importncia de Programas Documentados....................................................................80
Cabealho de Programa / Funo......................................................................................80
Criao de Variveis..............................................................................................................81
A Declarao.....................................................................................................................81
O Tipo de Varivel............................................................................................................81
Tipos Existentes............................................................................................................81
Inicializao......................................................................................................................82
Padronizao de Variveis.................................................................................................82
Criando uma Varivel Utilizando a Funo CRIAVAR()..................................................82
Variveis de Relatrios......................................................................................................83
Cuidados com o Posicionamento de Registros.....................................................................84
Funo Posicione..............................................................................................................85
Funo Existcpo................................................................................................................85
Restaurando ndice e limpando filtros..............................................................................85
Outros Cuidados....................................................................................................................86
Confrontando relatrios e consultas..................................................................................86
Problemas com Looping de Programas............................................................................86
Manipulao de Arquivos Externos ao Protheus..............................................................87
Desenvolvendo Telas........................................................................................................88
Salvando Arrays padres..................................................................................................89
Pontos de Entrada..................................................................................................................89
Objetivo dos Pontos de Entrada........................................................................................89
Quando criar um Ponto de Entrada...................................................................................89
Sintaxe para criar um Ponto de Entrada:.......................................................................90
Procedimentos para sua criao........................................................................................90
Contabilizando......................................................................................................................90
A Funo HeadProva........................................................................................................91
A funo DetProva().........................................................................................................91
A funo RodaProva().......................................................................................................91
Atualizando SX (ATUSX)....................................................................................................92
Exemplo de atualizao no SX:........................................................................................92
SX1 - Parmetros Genricos.............................................................................................92
SX2 - Mapeamento dos arquivos......................................................................................92
SX3 - Dicionrio de Dados...............................................................................................93
SX5 - Tabelas Genricas...................................................................................................93
AdvPl________________________________________________________________5
SX6 - Parmetros..............................................................................................................93
SX7 Gatilhos..................................................................................................................93
SXE/SXF - Seqncia. de documentos.............................................................................93
SINDEX- Arquivo de ndices...........................................................................................93
Controle de Transao (TTS)................................................................................................93
O que ..............................................................................................................................93
Quando usar......................................................................................................................93
Como usar.........................................................................................................................93
Onde no usar....................................................................................................................94
Comandos Definidos pelo Usurio (UDCs)........................................................................94
Uso de Strings...................................................................................................................95
Conceito de Filial e Compartilhamento de Arquivos............................................................96
Arquivos Compartilhados.................................................................................................96
Arquivos Exclusivos.........................................................................................................96
Tcnicas para Filtragem....................................................................................................97
Chaves Primrias...............................................................................................................97
Chaves Estrangeiras..........................................................................................................97
Integridade Referencial.....................................................................................................97
Utilizando Rotinas Automticas............................................................................................98
Controle de Semforo...........................................................................................................98
Atualizao do SourceSafe...................................................................................................99
Procedimentos de Localizaes............................................................................................99
Procedimentos a serem cumpridos em alterao / desenvolvimento de programas :.......99
Programando com Schedule de Relatrios.........................................................................100
Modelos de Programas Padronizados.................................................................................100
Modelo 1.............................................................................................................................101
Modelo 2.............................................................................................................................103
Modelo 3.............................................................................................................................111
Modelos de Relatrios........................................................................................................125
Modelos de Clculos...........................................................................................................129
Funes bsicas da Linguagem...........................................................................................138
AAdd...................................................................................................................................138
ACopy.................................................................................................................................139
AClone................................................................................................................................140
ADel....................................................................................................................................141
ADir....................................................................................................................................141
AEval..................................................................................................................................142
AFill....................................................................................................................................144
AIns.....................................................................................................................................145
Alias....................................................................................................................................145
Append From......................................................................................................................146
Array...................................................................................................................................148
AScan..................................................................................................................................149
ASize...................................................................................................................................151
ASort...................................................................................................................................152
ATail....................................................................................................................................153
BTVCanOpen......................................................................................................................153
AdvPl________________________________________________________________6
BTVCreateDDFs.................................................................................................................154
BTVDropIdxs......................................................................................................................155
BTVTables..........................................................................................................................156
CDow..................................................................................................................................157
CMonth...............................................................................................................................157
Commit................................................................................................................................158
Copy To...............................................................................................................................159
Copy File.............................................................................................................................160
Copy Structure....................................................................................................................161
CPYS2T..............................................................................................................................162
CPYT2S..............................................................................................................................163
CTreeDelIdxs......................................................................................................................164
CTreeDellnt.........................................................................................................................164
CurDir.................................................................................................................................165
Date.....................................................................................................................................166
Day......................................................................................................................................167
DBAppend..........................................................................................................................167
DBClearAllFilter.................................................................................................................168
DBClearFilter......................................................................................................................169
DBCloseAll.........................................................................................................................169
DBCloseArea......................................................................................................................170
DBClearIndex.....................................................................................................................170
DBCommit..........................................................................................................................171
DBCommitAll.....................................................................................................................172
DBCreate.............................................................................................................................172
DBCreateIndex....................................................................................................................173
DBDelete.............................................................................................................................174
DBEval................................................................................................................................175
DBF.....................................................................................................................................176
DBFieldInfo........................................................................................................................177
DBFilter..............................................................................................................................178
DBGoBottom......................................................................................................................178
DBGoTo..............................................................................................................................179
DBGoTop............................................................................................................................179
DBInfo................................................................................................................................180
DBOrderInfo.......................................................................................................................181
DBOrderNickName............................................................................................................182
DBRecall.............................................................................................................................183
DBRecordInfo.....................................................................................................................183
DBReindex..........................................................................................................................185
DBRLock............................................................................................................................185
DBRLockList......................................................................................................................186
DBRunLock........................................................................................................................187
DbSeek................................................................................................................................187
DBSetDriver........................................................................................................................189
DBSetFilter.........................................................................................................................190
DBSetIndex.........................................................................................................................190
AdvPl________________________________________________________________7
DBSetNickName.................................................................................................................191
DBSetOrder.........................................................................................................................192
DBSkip................................................................................................................................193
DBStruct..............................................................................................................................194
DBUnlock...........................................................................................................................194
DBUnlockAll......................................................................................................................195
Delete..................................................................................................................................196
Deleted................................................................................................................................197
DevOutPict..........................................................................................................................197
DevPos................................................................................................................................198
Directory.............................................................................................................................199
DirRemove..........................................................................................................................200
DiskSpace............................................................................................................................201
Dow.....................................................................................................................................202
Dtoc.....................................................................................................................................202
Dtos.....................................................................................................................................203
Eject....................................................................................................................................204
ElapTime.............................................................................................................................205
FClose.................................................................................................................................205
FCreate................................................................................................................................206
FErase..................................................................................................................................207
FError..................................................................................................................................208
FieldBlock...........................................................................................................................209
FieldWbl..............................................................................................................................210
File.......................................................................................................................................211
FOpen..................................................................................................................................212
FOpenPort...........................................................................................................................213
FRead..................................................................................................................................215
FReadStr..............................................................................................................................217
Frename...............................................................................................................................218
FSeek...................................................................................................................................218
FWrite.................................................................................................................................219
GetImpWindows.................................................................................................................221
GetPortActive......................................................................................................................221
GetClientDir........................................................................................................................222
Header.................................................................................................................................222
IndexKey.............................................................................................................................223
IndexOrd.............................................................................................................................224
InitPrint...............................................................................................................................224
IsPrinter...............................................................................................................................225
IsCisaSyncOn......................................................................................................................226
Locate..................................................................................................................................226
LUpdate...............................................................................................................................228
MakeDir..............................................................................................................................228
MemoLine...........................................................................................................................229
MemoRead..........................................................................................................................230
MemoWrite.........................................................................................................................231
AdvPl________________________________________________________________8
MLCount.............................................................................................................................231
Month..................................................................................................................................232
MsCompress........................................................................................................................233
MsCRC32............................................................................................................................234
MsCRC32Str.......................................................................................................................235
MsDecomp..........................................................................................................................235
OrdCondSet.........................................................................................................................236
OrdCreate............................................................................................................................237
OrdDescend.........................................................................................................................239
OrdKey................................................................................................................................240
OrdListAdd.........................................................................................................................241
PRow...................................................................................................................................242
Pack.....................................................................................................................................243
PCol.....................................................................................................................................243
PreparePrint.........................................................................................................................244
PrnFlush..............................................................................................................................245
RDDSetDefault...................................................................................................................246
RealRDD.............................................................................................................................246
Recall..................................................................................................................................247
RecSize................................................................................................................................248
ReIndex...............................................................................................................................249
Replace................................................................................................................................249
RLock..................................................................................................................................251
Seconds...............................................................................................................................252
Seek.....................................................................................................................................252
Select...................................................................................................................................253
Set Filter..............................................................................................................................254
Set Index.............................................................................................................................255
Set Order.............................................................................................................................256
SetPrc..................................................................................................................................257
Skip.....................................................................................................................................257
SplitPath..............................................................................................................................259
TCConType.........................................................................................................................260
TCDelFile............................................................................................................................261
TCGenQry...........................................................................................................................261
TCIsvLock..........................................................................................................................262
TCRefresh...........................................................................................................................262
TCSetBuff...........................................................................................................................263
TCSetConn..........................................................................................................................263
TCSetDummy.....................................................................................................................264
TCSetField..........................................................................................................................265
TCSpExec...........................................................................................................................266
TCSpExist...........................................................................................................................267
TCSqlError..........................................................................................................................268
TCSrvType..........................................................................................................................268
TCSysExe............................................................................................................................269
;TCUnLink..........................................................................................................................270
AdvPl________________________________________________________________9
TCVUnLock........................................................................................................................270
TCVLock............................................................................................................................271
Time....................................................................................................................................272
UnLock................................................................................................................................273
UpdateIntName...................................................................................................................273
Use......................................................................................................................................274
Used....................................................................................................................................276
Year.....................................................................................................................................276
ZAP.....................................................................................................................................277
Classes de Interface Visual..................................................................................................278
tSrvObject...........................................................................................................................278
Caractersticas.................................................................................................................278
Propriedades....................................................................................................................278
Mtodos...........................................................................................................................279
SetFocus......................................................................................................................279
Hide.............................................................................................................................279
Show............................................................................................................................279
Enable..........................................................................................................................279
Disable........................................................................................................................280
Refresh........................................................................................................................280
Classes de Janelas...............................................................................................................280
tWindow..............................................................................................................................280
Hierarquia........................................................................................................................280
Caractersticas.................................................................................................................280
Propriedades....................................................................................................................281
Mtodos...........................................................................................................................281
New.............................................................................................................................281
Activate.......................................................................................................................282
End..............................................................................................................................283
Center..........................................................................................................................283
Exemplo......................................................................................................................283
TDialog...............................................................................................................................283
Hierarquia........................................................................................................................284
Caractersticas.................................................................................................................284
Propriedades....................................................................................................................284
Mtodos...........................................................................................................................284
New.............................................................................................................................284
Activate.......................................................................................................................285
End..............................................................................................................................286
MSDialog............................................................................................................................286
Hierarquia........................................................................................................................286
Caractersticas.................................................................................................................286
Propriedades....................................................................................................................286
Mtodos...........................................................................................................................286
New.............................................................................................................................286
Classes Auxiliares...............................................................................................................288
tFont....................................................................................................................................288
AdvPl________________________________________________________________10
Hierarquia........................................................................................................................288
Descrio.........................................................................................................................288
Mtodos...........................................................................................................................288
New.............................................................................................................................288
Exemplo..........................................................................................................................289
Classes de Componentes.....................................................................................................289
tControl...............................................................................................................................289
Hierarquia........................................................................................................................289
Caractersticas.................................................................................................................289
Propriedades....................................................................................................................289
Mtodos...........................................................................................................................290
SetFocus......................................................................................................................290
Classes de Componentes Visuais........................................................................................290
tButton.................................................................................................................................290
Hierarquia........................................................................................................................290
Descrio.........................................................................................................................290
Propriedades....................................................................................................................290
Metodos...........................................................................................................................291
New.............................................................................................................................291
Exemplo..........................................................................................................................292
tCheckBox...........................................................................................................................292
Hierarquia........................................................................................................................292
Descrio.........................................................................................................................292
Mtodos...........................................................................................................................292
New.............................................................................................................................292
Exemplo..........................................................................................................................293
tComboBox.........................................................................................................................294
Hierarquia........................................................................................................................294
Descrio.........................................................................................................................294
Propriedades....................................................................................................................294
Mtodos...........................................................................................................................294
New.............................................................................................................................294
Select...........................................................................................................................295
Exemplo..........................................................................................................................296
tGet......................................................................................................................................296
Hierarquia........................................................................................................................296
Descrio.........................................................................................................................296
Propriedades....................................................................................................................296
Mtodos...........................................................................................................................297
New.............................................................................................................................297
Exemplo..........................................................................................................................298
tGroup.................................................................................................................................298
Hierarquia........................................................................................................................298
Descrio.........................................................................................................................299
Mtodos...........................................................................................................................299
New.............................................................................................................................299
Exemplo..........................................................................................................................299
AdvPl________________________________________________________________11
tListbox...............................................................................................................................300
Hierarquia........................................................................................................................300
Descrio.........................................................................................................................300
Parmetros.......................................................................................................................300
Mtodos...........................................................................................................................300
New.............................................................................................................................300
Select...........................................................................................................................301
Add..............................................................................................................................302
Modify.........................................................................................................................302
Del...............................................................................................................................302
Len..............................................................................................................................303
Reset............................................................................................................................303
Exemplo..........................................................................................................................303
tMeter..................................................................................................................................304
Hierarquia........................................................................................................................304
Descrio.........................................................................................................................304
Parmetros.......................................................................................................................304
Mtodos...........................................................................................................................304
New.............................................................................................................................304
Set................................................................................................................................305
Exemplo..........................................................................................................................305
tMultiget..............................................................................................................................306
Hierarquia........................................................................................................................306
Descrio.........................................................................................................................306
Propriedades....................................................................................................................306
Mtodos...........................................................................................................................307
New.............................................................................................................................307
EnableVScroll.............................................................................................................308
EnableHScroll.............................................................................................................308
Exemplo..........................................................................................................................309
tPanel...................................................................................................................................309
Hierarquia........................................................................................................................309
Descrio.........................................................................................................................309
Mtodos...........................................................................................................................309
New.............................................................................................................................309
Exemplo..........................................................................................................................310
tRadMenu............................................................................................................................310
Hierarquia........................................................................................................................310
Descrio.........................................................................................................................310
Propriedades....................................................................................................................311
Mtodos...........................................................................................................................311
New.............................................................................................................................311
EnableItem..................................................................................................................312
Exemplo..........................................................................................................................312
tSay......................................................................................................................................312
Hierarquia........................................................................................................................312
Descrio.........................................................................................................................313
AdvPl________________________________________________________________12
Parmetros.......................................................................................................................313
Mtodos...........................................................................................................................313
New.............................................................................................................................313
SetText........................................................................................................................314
Exemplo..........................................................................................................................314
tScrollbox............................................................................................................................315
Hierarquia........................................................................................................................315
Descrio.........................................................................................................................315
Mtodos...........................................................................................................................315
New.............................................................................................................................315
Exemplo..........................................................................................................................315
Infra-estrutura......................................................................................................................317
MsGetDados........................................................................................................................317
MsGetDb.............................................................................................................................321
MsmGet...............................................................................................................................325
MBrowse.............................................................................................................................328
Funes...............................................................................................................................329
AllGroups............................................................................................................................329
AllUsers..............................................................................................................................330
APMsgAlert........................................................................................................................332
APMsgInfo..........................................................................................................................332
APMsgNoYes......................................................................................................................333
APMsgStop.........................................................................................................................333
APMsgYesNo......................................................................................................................334
APMsgYesNo......................................................................................................................334
Cabec...................................................................................................................................335
Capital.................................................................................................................................337
CloseBrowse.......................................................................................................................338
Conpad1..............................................................................................................................338
Enchoicebar.........................................................................................................................339
FileNoExt............................................................................................................................339
Final....................................................................................................................................340
FTPConnect........................................................................................................................341
FTPDirChange....................................................................................................................341
FTPDirectory......................................................................................................................342
FTPDisconnect....................................................................................................................343
FTPDownload.....................................................................................................................343
FTPErase.............................................................................................................................344
FTPGetCurDir.....................................................................................................................344
FTPRenameFile..................................................................................................................345
FTPUpload..........................................................................................................................345
FunDesc..............................................................................................................................346
FunName.............................................................................................................................347
GetCountryList....................................................................................................................347
GetMark..............................................................................................................................347
GetMv.................................................................................................................................348
IncProc................................................................................................................................349
AdvPl________________________________________________________________13
IncRegua.............................................................................................................................350
IndRegua.............................................................................................................................351
MarkBRefresh.....................................................................................................................352
MarkBrow...........................................................................................................................352
Ms_Flush.............................................................................................................................354
MsAppend...........................................................................................................................355
MsCopyFile.........................................................................................................................356
MsCopyTo...........................................................................................................................356
MsCreate.............................................................................................................................357
MsErase...............................................................................................................................358
MsFile.................................................................................................................................358
MsRename..........................................................................................................................359
MsUnlock............................................................................................................................360
OurSpool.............................................................................................................................360
Pergunte..............................................................................................................................361
Processa...............................................................................................................................362
ProcRegua...........................................................................................................................363
PswAdmin...........................................................................................................................364
PswID..................................................................................................................................364
PswName............................................................................................................................365
PswOrder.............................................................................................................................365
PswRet................................................................................................................................366
PswSeek..............................................................................................................................367
ReadVar...............................................................................................................................367
RetAcsName.......................................................................................................................368
RetExtHlp............................................................................................................................368
RetExtHls............................................................................................................................369
RetExtHpr...........................................................................................................................369
RetExtMnu..........................................................................................................................370
RetFileName.......................................................................................................................370
Roda....................................................................................................................................371
RptStatus.............................................................................................................................372
SetDefault............................................................................................................................374
SetPrint................................................................................................................................375
SetRegua.............................................................................................................................378
SixDescricao.......................................................................................................................379
VerSenha.............................................................................................................................380
X1Def01..............................................................................................................................380
X1Def02..............................................................................................................................381
X1Def03..............................................................................................................................381
X1Def04..............................................................................................................................382
X1Def05..............................................................................................................................382
X1Pergunt...........................................................................................................................383
X2Nome..............................................................................................................................383
X3CBox..............................................................................................................................384
X3Descric............................................................................................................................384
X3Picture............................................................................................................................385
AdvPl________________________________________________________________14
X3Titulo..............................................................................................................................385
X3Uso.................................................................................................................................386
X5Descri.............................................................................................................................386
X6Conteud..........................................................................................................................387
X6Desc1..............................................................................................................................388
X6Desc2..............................................................................................................................388
X6Descric............................................................................................................................389
XADescric...........................................................................................................................389
XBDescri.............................................................................................................................390
AdvPl________________________________________________________________15
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.
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.
AdvPl________________________________________________________________16
Servidor de Aplicao
Terminal Thin-Client
Dados
Repositrio de APOs
Servidor de Aplicao
O Protheus Server a aplicao encarregada da compilao e da execuo do cdigo em AdvPl, no qual o
sistema Siga Advanced est escrito a partir da verso 5.07. Na linguagem AdvPl, as rotinas so mantidas
em APO's (Advanced Protheus Objects) individuais em repositrios. Isso permite que as rotinas sejam
carregadas/descarregadas dinamicamente da memria da mquina onde o Protheus Server est sendo
executado, ou seja, de acordo com a necessidade de execuo dos Terminais conectados, e facilita a
atualizao aps correes de no-conformidades ou criao de melhorias, pois apenas os APO's
modificados necessitam ser atualizados. Desse modo, a performance alta e no requer muitos recursos
da mquina para a execuo do servidor.
Terminal Thin-Client
O Remote a aplicao encarregada da interface com o usurio. No existe processamento local, por isso
o trfego de rede entre o Terminal e o Servidor de Aplicao baixo, tratando-se apenas de comandos
para o desenho das telas e do tratamento do teclado e mouse.
Dados
O acesso aos dados efetuado pelo Servidor de Aplicao utilizando as seguintes bases de dados: ADS,
BTrieve, CTree e TopConnect (para padro SQL). Para bases de dados SQL, existe total suporte a Stored
Procedures. No Protheus, todas as bases de dados tm suporte a controle de transao.
Repositrio de Apos
E no repositrio que se encontram os programas escritos em AdvPl que sero carregados para a execuo
de determinada tarefa. atravs do repositrio de Apos que pode-se incluir novas customizaes no
sistema.
AdvPl________________________________________________________________17
Estruturao
A estrutura de diretrios do Advanced Protheus
A estrutura de diretrios do Advanced Protheus depende da verso instalada.
Verso AP5
\ap5\
\ap5\apo\
\ap5\bin\
\ap5\sigaadv\
\ap5\dadosadv\
\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\
\ap5\include\
\ap5\util\
Verso AP6
\ap6\
\ap6\apo\
\ap6\bin\server\
\ap6\bin\remote\
Diretrio onde so localizados os arquivos das aplicaes clientes (Remote, IDE, Monitor,
etc): executveis, bibliotecas de carga dinmica (DLLs) e arquivos de configurao.
\ap6\sigaadv\
AdvPl________________________________________________________________18
tambm o diretrio inicial de execuo no Remote.
\ap6\dadosadv\
\ap6\relato\
\ap6\cprova\
\ap6\ixbpad\
\ap6\include\
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.
Protheus Server
Trata-se do servidor de aplicao do Advanced Protheus esta a parte do sistema que ser executada no
Servidor e ser responsvel pela comunicao entre o Cliente, a Base de Dados e o Repositrio de Apos.
O nome do executvel depende da verso e sistema operacional utilizados, por exemplo: AP5SRV.EXE ou
AP6SRVWIN.EXE.
Remote
o Remote que utilizamos para interagir com todo o sistema, ele poder ser instalado de duas maneiras,
no servidor ou na prpria estao de trabalho. O nome do executvel depende da verso utilizada, por
exemplo: AP5RMT.EXE ou AP6RMT.EXE.
IDE
Trata-se do ambiente de desenvolvimento integrado do Advanced Protheus. atravs deste aplicativo que
todos os acessos aos repositrios de Apos (compilao de customizaes, visualizao de funes
existentes etc.) so efetuados, e tambm a ferramenta para desenvolvimento e depurao de
aplicaes/customizaes. O nome do executvel depende da verso utilizada, por exemplo: AP5IDE.EXE
ou AP6IDE.EXE.
Monitor
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
AdvPl________________________________________________________________19
Alem destas aplicaes, o Siga Advanced Protheus conta ainda com outros utilitrios diversos, como o Diff
(utilizado para comparao de arquivos texto) e Dump (utilizado para edio de arquivos binrios).
Nomenclaturas Utilizadas
Estas so as principais nomeclaturas utilizadas no Advanced Protheus:
Build: Verso completa do sistema com seus executveis, Dlls e RPO completo. O build do sistema pode
ser identificado atravs da opo Miscelneas | Sobre dentro dos mdulos do sistema.
RPO: o arquivo binrio de repositrio de APOs, com o cdigo AdvPl.
Patch: Arquivo binrio semelhante ao repositrio contendo apenas atualizaes de APOs, correes
disponibilizadas pela Microsiga Software S.A., que ser aplicado no repositrio atravs do IDE.
Verso Master: Mesma definio de build porm neste caso a verso ser utilizada como referncia para
a gerao de atualizaes do sistema (patchs). Quando gerada, a verso encaminhada a todos os
envolvidos em processos de implantao/utilizao do sistema via correio ou disponibilizada no site de FTP
do Protheus.
A definio dos nomes dos arquivos dos repositrios de APO's e Patchs seguem o mesmo padro
(diferenciando-se apenas na extenso Patch=.PAT e repositrio=RPO) e efetuada da seguinte
maneira AP12345.RPO:
1 (D)bf, (T)op, (A)ds, (B)trieve, (C)Tree;
2 (P)ortuguese, (E)nglish, (S)panish;
3 Verso;
4 Verso;
5 Verso;
Por exemplo, APBP609.RPO ser um repositrio de APO's para base de dados BTrieve, idioma
Portugus e verso 609.
Topologia de Rede
Devido sua diviso em camadas, a tecnologia Protheus permite montar o ambiente de execuo com
diferentes topologias, priorizando a execuo, o trfego de rede ou os recursos individuais das mquinas
existentes, o que torna o processamento distribudo. Essa uma das grandes vantagens da tecnologia
Protheus.
AdvPl________________________________________________________________20
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.
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
AdvPl________________________________________________________________21
Remote para se atualizar automaticamente a partir do Protheus Server sendo executado como um
servidor FTP.
Caractersticas do IDE
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.
2.
3.
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
AdvPl________________________________________________________________22
simplesmente colocando-se um ponto de parada (break point) em uma linha qualquer do cdigo
do ponto de entrada;
Monitor
O Monitor utilizado para monitorar as conexes de terminais ao Protheus Server. Atravs dele pode-se:
Desabilitar novas conexes. Isto til quando se precisa efetuar alguma manuteno e se precisa
evitar que outros usurios se conectem.
Usurio. o nome do usurio na rede local. Para conexes remotas este nome est em branco.
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.
Btrieve
Informaes Bsicas
Para programar algo especfico para o Btrieve pode-se utilizar o teste "#ifdef BTV";
As manipulaes e visualizaes de dados devem ser feitas atravs do "APSdu", pois as antigas
ferramentas so incompatveis;
AdvPl________________________________________________________________23
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
"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:
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.
AdvPl________________________________________________________________24
MaxDatabases: 10
Number of Sessions: 20
System Cache: On
Communications Threads : 64
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
AdvPl________________________________________________________________25
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.
CTree
Informaes Bsicas
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;
AdvPl________________________________________________________________26
ind1r.ind. Este tipo de ndice no possui definio armazenada no arquivo da tabela, por ser
temporrio.
Windows IA64,
HP UX ( RISC ),
PocketPC
AdvPl________________________________________________________________27
A Linguagem AdvPl
A Linguagem AdvPl teve seu incio em 1994, sendo na verdade uma evoluo na utilizao de linguagens
no padro xBase pela Microsiga Software S.A. (Clipper, Visual Objects e depois FiveWin). Com a criao da
tecnologia Protheus, era necessrio criar uma linguagem que suportasse o padro xBase para a
manuteno de todo o cdigo existente do sistema de ERP Siga Advanced. Foi ento criada a linguagem
chamada Advanced Protheus Language.
O AdvPl uma extenso do padro xBase de comandos e funes, operadores, estruturas de controle de
fluxo e palavras reservadas, contando tambm com funes e comandos disponibilizados pela Microsiga
que a torna uma linguagem completa para a criao de aplicaes ERP prontas para a Internet. Tambm
uma linguagem orientada a objetos e eventos, permitindo ao programador desenvolver aplicaes visuais
e criar suas prprias classes de objetos.
Quando compilados, todos os arquivos de cdigo tornam-se unidades de inteligncia bsicas, chamados
APOs (de Advanced Protheus Objects). Tais APOs so mantidos em um repositrio e carregados
dinamicamente pelo AP6 Server para a execuo. Como no existe a linkedio, ou unio fsica do cdigo
compilado a um determinado mdulo ou aplicao, funes criadas em AdvPl podem ser executadas em
qualquer ponto do ambiente Advanced Protheus.
O compilador e o interpretador da linguagem AdvPl o prprio servidor AP6 (AP6 Server), e existe um
ambiente visual para desenvolvimento integrado (AP6 IDE) onde o cdigo pode ser criado, compilado e
depurado.
Os programas em AdvPl podem conter comandos ou funes de interface com o usurio. De acordo com
tal caracterstica, tais programas so subdivididos nas seguintes categorias:
AdvPl________________________________________________________________28
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 de RPC
Atravs de uma biblioteca de funes disponvel no Protheus (uma API de comunicao), pode-se executar
rotinas escritas em AdvPl diretamente no AP6 Server, atravs de aplicaes externas escritas em outras
linguagens. Isto o que se chama de RPC (de Remote Procedure Call, ou Chamada de Procedimentos
Remota).
O servidor Protheus tambm pode executar rotinas em AdvPl em outros servidores Protheus atravs de
conexo TCP/IP direta utilizando o conceito de RPC. Do mesmo modo, aplicaes externas podem
requisitar a execuo de rotinas escritas em AdvPl atravs de conexo TCP/IP direta.
Programao Web
O AP6 Server pode tambm ser executado como um servidor Web, respondendo a requisies HTTP. No
momento destas requisies, pode executar rotinas escritas em AdvPl como processos individuais,
enviando o resultado das funes como retorno das requisies para o cliente HTTP (como por exemplo
um Browser de Internet). Qualquer rotina escrita em AdvPl que no contenha comandos de interface pode
ser executada atravs de requisies HTTP. O Protheus permite a compilao de arquivos HTML contendo
cdigo AdvPl embutido. So os chamados arquivos AdvPl ASP, para a criao de pginas dinmicas.
Programao TelNet
TelNet parte da gama de protocolos TCP/IP que permite a conexo a um computador remoto atravs de
uma aplicao cliente deste protocolo. O AP6 Server pode emular um terminal TelNet, atravs da execuo
de rotinas escritas em AdvPl. Ou seja, pode-se escrever rotinas AdvPl cuja interface final ser um terminal
TelNet ou um coletor de dados mvel.
Sintaxe da Linguagem
Edio de Programas
Criao de um Programa
AdvPl________________________________________________________________29
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:
AdvPl________________________________________________________________30
Outra forma de documentar textos utilizar as barras transversais juntamente com o asterisco, podendose 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 (;).
Estrutura de um Programa
AdvPl________________________________________________________________31
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.
3.
Corpo do Programa
4.
rea de Encerramento
A rea de Identificao
Esta uma rea que no obrigatria e dedicada a documentao do programa. Quando existente,
contm apenas comentrios explicando a sua finalidade, data de criao, autor, etc, e aparece no comeo
do programa, antes de qualquer linha de comando.
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao desejada e escolher
a formatao apropriada.
/*
+==========================================+
| 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.
AdvPl________________________________________________________________32
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.
Variveis de Memria
Tipos de Dados
O AdvPl no uma linguagem de tipos rgidos (strongly typed), o que significa que variveis de memria
podem diferentes tipos de dados durante a execuo do programa. Variveis podem tambm conter
objetos, mas os tipos primrios da linguagem so:
Numrico
AdvPl________________________________________________________________33
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 Juliana.
Variveis do tipo de dados Data no podem ser declaradas diretamente, e sim atravs da utilizao de
funes especficas como por exemplo ctod que converte uma string para data.
Matriz (Array)
Matrizes so um tipo de dado especial. a disposio de outros elementos em colunas e linhas. O AdvPl
suporta matrizes uni ou multidimensionais. Os elementos de uma matriz so acessados atravs de ndices
numricos iniciados em 1, identificando a linha e coluna para quantas dimenes existirem.
Uma matriz pode conter no mximo 100000 elementos, independentemente do nmero de dimenses.
Matrizes devem ser utilizadas com cautela, pois se forem muito grandes podem exaurir a memria do
servidor.
Bloco de Cdigo
O bloco de cdigo um tipo de dado especial. utilizado para armazenar instrues escritas em AdvPl que
podero ser executadas posteriormente.
AdvPl________________________________________________________________34
TOT01
cNumero
VAR_QUALQUER
M_CARGO
A11
E alguns invlidos:
AdvPl________________________________________________________________35
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:
Local nPercentual,nResultado
Store 10 To nPercentual
nResultado := 250 * (1 + (nPercentual / 100))
ou
AdvPl________________________________________________________________36
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
No programa de exemplo anterior, a varivel xVariavel utilizada para armazenar diversos tipos de dados.
A letra "x" em minsculo no comeo do nome utilizada para indicar uma varivel que pode conter
diversos tipos de dados, segundo a Notao Hngara (consulte documentao especfica para detalhes).
Este programa troca os valores da varivel e exibe seu contedo para o usurio atravs da funo alert.
Essa funo recebe um parmetro que deve ser do tipo string de caracter, por isso dependendo do tipo de
dado da varivel xVariavel necessrio fazer uma converso antes.
Apesar dessa flexibilidade de utilizao de variveis, deve-se tomar cuidados na passagem de parmetros
para funes ou comandos, e na concatenao (ou soma) de valores. Note a linha 20 do programa de
exemplo. Quando esta linha executada, a varivel xVariavel contem o valor nulo. A tentativa de soma de
tipos de dados diferentes gera erro de execuo do programa. Nesta linha do exemplo, ocorrer um erro
com a mensagem "type mismatch on +". Excetuando-se o caso do valor nulo, para os demais deve-se
sempre utilizar funes de converso quando necessita-se concatenar tipos de dados diferentes (por
exemplo, nas linhas 07 e 17.
Note tambm que quando uma varivel do tipo de dado lgico, ela pode ser utilizada diretamente para
checagem (linha 10):
If xVariavel
o mesmo que
If xVariavel = .T.
A declarao de variveis para os demais tipos de dados, matrizes e blocos de cdigo, exatamente igual
ao descrito at agora. Apenas existem algumas diferenas quanto a inicializao, que podem ser
consultadas na documentao de inicializao de matrizes e blocos de cdigo.
Matrizes
AdvPl________________________________________________________________37
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
Alert(cValToChar(Len(aLetras)))
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:
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
#define FUNCT_IDADE 2
#define FUNCT_CASADO 3
AdvPl________________________________________________________________38
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 uma matriz com 3 linhas por 3 colunas. Uma vez que as variveis separadas foram combinadas
em uma matriz, os nomes podem ser exibidos assim:
Local nCount
For nCount := 1 To Len(aFuncts)
Alert(aFuncts[nCount,FUNCT_NOME])
// O acesso a elementos de uma matriz multidimensional
// pode ser realizado tambm desta forma:
// aFuncts[nCount][FUNCT_NOME]
Next nCount
AdvPl________________________________________________________________39
A varivel nCount seleciona que funcionrio (ou que linha) de interesse. Ento a constante
FUNCT_NOME seleciona a primeira coluna daquela linha.
Inicializando Matrizes
Algumas vezes o tamanho da matriz conhecido previamente. Outras vezes o tamanho da matriz s ser
conhecido em tempo de execuo.
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
08 Next nCnt
Este cdigo preenche a matriz com uma tabela de quadrados. Os valores sero 1, 4, 9, 16 ... 81, 100.
Note que a linha 07 se refere varivel aX, mas poderia tambm trabalhar com aY ou aZ. O objetivo
deste exemplo demonstrar trs modos de criar uma matriz de tamanho conhecido no momento da
criao do cdigo.
Na linha 02 a matriz criada usando aX[10]. Isto indica ao AdvPl para alocar espao para 10 elementos
na matriz. Os colchetes [ e ] so utilizados para indicar o tamanho necessrio.
Na linha 03 utilizada a funo array com o parmetro 10 para criar a matriz, e o retorno desta funo
atribudo varivel aY.
AdvPl________________________________________________________________40
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.
01 Local nCnt
02 Local aX[0]
03 Local aY := Array(0)
04 Local aZ := {}
05
06 For nCnt := 1 To nSize
07
aAdd(aX,nCnt*nCnt)
08 Next nCnt
A linha 02 utiliza os colchetes para criar uma matriz vazia. Apesar de no ter nenhum elemento, seu tipo
de dado matriz.
Na linha 03 a chamada da funo array cria uma matriz sem nenhum elemento.
Na linha 04 est declarada a representao de uma matriz vazia em AdvPl. Mais uma vez, esto sendo
utilizadas as chaves para indicar que o tipo de dados da varivel matriz. Note que {} uma matriz vazia
(tem o tamanho 0), enquanto {Nil} uma matriz com um nico elemento nulo (tem tamanho 1).
Porque cada uma destas matrizes no contem elementos, a linha 07 utiliza a funo aadd para adicionar
elementos sucessivamente at o tamanho necessrio (especificado por exemplo na varivel nSize).
Blocos de Cdigo
Blocos de cdigo so um conceito existente h muito tempo em linguagens xBase. No como algo que
apareceu da noite para o dia, e sim uma evoluo progressiva utilizando a combinao de muitos
conceitos da linguagem para a sua implementao.
Um Primeiro Lembrete
O AdvPl uma linguagem baseada em funes. Funes tm um valor de retorno. Assim como o operador
de atribuio :=.
Assim, ao invs de escrever:
AdvPl________________________________________________________________41
Posde-se escrever:
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
AdvPl________________________________________________________________42
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.
==>
10
@00,00 PSAY y := 20
==>
20
Cada uma das linhas ter a expresso avaliada, e o valor da varivel ser ento impresso.
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.
Alert( cValToChar ( ( X := 10 , Y := 20 ) ) )
==>
20
O valor de retorno resultante de uma lista de expresses o valor resultante da ltima expresso ou
elemento da lista. Funciona como se fosse um pequeno programa ou funo, que retorna o resultado de
sua ltima avaliao (efetuadas da esquerda para a direita).
AdvPl________________________________________________________________43
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.
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 )
AdvPl________________________________________________________________44
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:
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
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.
AdvPl________________________________________________________________45
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
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:
A ordem padro para a funo asort ascendente. Este comportamento pode ser modificado atravs da
informao de um bloco de cdigo que ordena a matriz de forma descendente:
B := { |X, Y| X > Y }
aSort(A, B)
O bloco de cdigo (de acordo com a documentao da funo asort) deve ser escrito para aceitar dois
parmetros que so os dois elementos da matriz para comparao. Note que o bloco de cdigo no
conhece que elementos est comparando - a funo asort seleciona os elementos (talvez utilizando o
algortmo QuickSort) e passa-os para o bloco de cdigo. O bloco de cdigo compara-os e retorna
verdadeiro (.T.) se se encontram na ordem correta, ou falso (.F.) se no. Se o valor de retorno for falso, a
funo asort ir ento trocar os valores de lugar e seguir comparando o prximo par de valores.
AdvPl________________________________________________________________46
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:
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:
Finalmente, para ordenar um sub-elemento (coluna) de uma matriz por exemplo, pode-se utilizar o
seguinte bloco de cdigo:
Escopo de Variveis
Local nNumero := 10
Esta linha de cdigo declara uma varivel chamada nNumero indicando que pertence seu escopo local.
LOCAL
STATIC
AdvPl________________________________________________________________47
PRIVATE
PUBLIC
nNumero2 := 15
Quando um valor atribudo uma varivel em um programa ou funo, o AdvPl criar a varivel caso ela
no tenha sido declarada anteriormente. A varivel ento criada como se tivesse sido declarada como
Private.
Devido a essa caracterstica, quando pretende-se fazer uma atribuio a uma varivel declarada
previamente mas escreve-se o nome da varivel de forma incorreta, o AdvPl no gerar nenhum
erro de compilao ou de execuo. Pois compreender o nome da varivel escrito de forma
incorreta como se fosse a criao de uma nova varivel. Isto alterar a lgica do programa, e um
erro muitas vezes difcil de identificar.
Variveis Locais
Variveis locais so pertencentes apenas ao escopo da funo onde foram declaradas. Devem ser
explicitamente declaradas com o identificador LOCAL, como no exemplo:
Function Pai()
Local nVar := 10, aMatriz := {0,1,2,3}
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
AdvPl________________________________________________________________48
Neste exemplo, a varivel nVar foi declarada como local e atribuda com o valor 10. Quando a funo Filha
executada, nVar ainda existe mas no pode ser acessada. Quando a execuo da funo Pai terminar, a
varivel nVar destruda. Qualquer varivel com o mesmo nome no programa que chamou a funo Pai
no afetada.
Variveis locais so criadas automaticamente cada vez que a funo onde forem declaradas for ativada.
Elas continuam a existir e mantm seu valor at o fim da ativao da funo (ou seja, at que a funo
retorne o controle para o cdigo que a executou). Se uma funo chamada recursivamente (por
exemplo, chama a si mesma), cada chamada em recurso cria um novo conjunto de variveis locais.
A visibilidade de variveis locais idntica ao escopo de sua declarao. Ou seja, a varivel visvel em
qualquer lugar do cdigo fonte em que foi declarada. Se uma funo chamada recursivamente, apenas
as variveis locais criadas na mais recente ativao so visveis.
Variveis Estticas
Variveis estticas funcionam basicamente como as variveis locais, mas mantm seu valor atravs da
execuo. Variveis estticas devem ser declaradas explicitamente no cdigo com o identificador STATIC.
O escopo das variveis estticas depende de onde so declaradas. Se forem declaradas dentro do corpo
de uma funo ou procedimento, seu escopo ser limitado quela rotina. Se forem declaradas fora do
corpo de qualquer rotina, seu escopo todo o arquivo de programa.
Neste exemplo, a varivel nVar declarada como esttica e inicializada com o valor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente de variveis
declaras como LOCAL ou PRIVATE, nVar continua a existir e mantem seu valor atual quando a execuo da
funo Pai termina. Entretanto, somente pode ser acessada por execues subseqntes da funo Pai.
Variveis Privadas
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com o
identificador PRIVATE.
AdvPl________________________________________________________________49
Adicionalmente, a atribuio de valor a uma varivel no criada anteriormente automaticamente cria a
varivel como privada. Uma vez criada, uma varivel privada continua a existir e mantem seu valor at
que o programa ou funo onde foi criada termine (ou seja, at que a funo onde foi criada retorne para
o cdigo que a executou). Neste momento, automaticamente destruda.
possvel criar uma nova varivel privada com o mesmo nome de uma varivel j existente. Entretanto, a
nova (duplicada) varivel pode apenas ser criada em um nvel de ativao inferior ao nvel onde a varivel
foi declarada pela primeira vez (ou seja, apenas em uma funo chamada pela funo onde a varivel j
havia sido criada). A nova varivel privada ir esconder qualquer outra varivel privada ou pblica (veja a
documentao sobre variveis pblicas) com o mesmo nome enquanto existir.
Uma vez criada, uma varivel privada visvel em todo o programa enquanto no for destruda
automaticamente quando a rotina que a criou terminar ou uma outra varivel privada com o mesmo nome
for criada em uma subfuno chamada (neste caso, a varivel existente torna-se inacessvel at que a
nova varivel privada seja destruda).
Em termos mais simples, uma varivel privada visvel dentro da funo de criao e todas as funes
chamadas por esta, a menos que uma funo chamada crie sua prpria varivel privada com o mesmo
nome.
Por exemplo:
Function Pai()
Private nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
Neste exemplo, a varivel nVar criada como privada e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e, diferente de uma varivel local, pode ser acessada pela funo Filha.
Quando a funo Pai terminar, nVar ser destruda e qualquer declarao de nVar anterior se tornar
acessvel novamente.
Variveis Pblicas
Pode-se criar variveis pblicas dinamicamente no cdigo com o identificador PUBLIC. As variveis
pblicas continuam a existir e mantm seu valor at o fim da execuo.
possvel criar uma varivel privada com o mesmo nome de uma varivel pblica existente. Entretanto,
no permitido criar uma varivel pblica com o mesmo nome de uma varivel privada existente.
Uma vez criada, uma varivel pblica visvel em todo o programa onde foi declarada at que seja
escondida por uma varivel privada criada com o mesmo nome. A nova varivel privada criada esconde a
AdvPl________________________________________________________________50
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).
cRes := MEMVAR->NOME
Esta linha de comando identifica que o valor atribudo varivel cRes deve ser o valor da varivel de
memria chamada NOME.
cRes := FIELD->NOME
AdvPl________________________________________________________________51
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:
Neste exemplo so utilizadas algumas expresses para calcular o salrio lquido aps um aumento. Os
operandos de uma expresso podem ser uma varivel, uma constante, um campo de arquivo ou uma
funo.
Operadores Matemticos
Os operadores utilizados em AdvPl para clculos matemticos so:
+
Adio
Subtrao
Multiplicao
AdvPl________________________________________________________________52
/
Diviso
** ou ^
Exponenciao
Operadores de String
Os operadores utilizados em AdvPl para tratamento de caracteres so:
+
Concatenao de strings com eliminao dos brancos finais das strings intermedirias
Operadores Relacionais
Os operadores utilizados em AdvPl para operaes e avaliaes relacionais so:
<
Comparao Menor
>
Comparao Maior
Comparao Igual
==
<=
>=
<>
Comparao Diferente
ou
#
ou
!=
Operadores Lgicos
Os operadores utilizados em AdvPl para operaes e avaliaes lgicas so:
.And.
E lgico
.Or.
OU lgico
.Not. ou !
NO lgico
AdvPl________________________________________________________________53
Operadores de Atribuio
Os operadores utilizados em AdvPl para atribuio de valores a variveis de memria so:
=
Atribuio Simples
:=
Atribuio em Linha
+=
-=
*=
/=
**= ou ^=
%=
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.
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:
por
AdvPl________________________________________________________________54
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 Incremento/Decremento
A linguagem AdvPl possui operadores para realizar incremento ou decremento de variveis. Entende-se
por incremento aumentar o valor de uma varivel numrica em 1 e entende-se por decremento diminuir o
valor da varivel em 1. Os operadores so:
++
Incremento Ps ou Pr-fixado
--
Decremento Ps ou Pr-fixado
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
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.
AdvPl________________________________________________________________55
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
{}
->
Identificador de Apelido
&
Macrosubstituio
AdvPl________________________________________________________________56
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.
2.
Operadores de String
3.
Operadores Matemticos
4.
Operadores Relacionais
5.
Operadores Lgicos
6.
Operadores de Atribuio
7.
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:
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.
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.
AdvPl________________________________________________________________57
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"
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.
Estruturas de Controle
AdvPl________________________________________________________________58
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
Deciso.
Estruturas de Repetio
Estruturas de
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
comando WHILE...ENDDO.
FOR...NEXT
e o
O Comando FOR...NEXT
A estrutura de controle FOR...NEXT, ou simplesmente o loop FOR, repete uma seo de cdigo em um
nmero determinado de vezes.
Sintaxe
FOR Variavel := nValorInicial TO nValorFinal [STEP nIncremento]
Comandos...
[EXIT]
[LOOP]
NEXT
AdvPl________________________________________________________________59
Parmetros
Variavel
Especifica uma varivel ou um elemento de uma matriz para atuar como um contador. A
varivel ou o elemento da matriz no precisa ter sido declarado antes da execuo do
comando FOR...NEXT. Se a varivel no existir, ser criada como uma varivel
privada.
nValorInicial TO
nValorFinal
nValorInicial o valor inicial para o contador; nValorFinal o valor final para o contador.
Pode-se utilizar valores numricos literais, variveis ou expresses, contanto que o
resultado seja do tipo de dado numrico.
STEP
nIncremento
Comandos
EXIT
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.
Exemplo
Local nCnt
Local nSomaPar := 0
AdvPl________________________________________________________________60
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 WHILE...ENDDO
A estrutura de controle WHILE...ENDDO, ou simplesmente o loop WHILE, repete uma seo de cdigo
enquanto uma determinada expresso resultar em verdadeiro (.T.).
Sintaxe
WHILE lExpressao
Comandos...
[EXIT]
[LOOP]
ENDDO
Parmetros
lExpressao
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
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.
AdvPl________________________________________________________________61
Exemplo
Local nNumber := nAux := 350
nAux := Int(nAux / 2)
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 IF...ENDIF
Executa um conjunto de comandos baseado no valor de uma expresso lgica.
Sintaxe
IF lExpressao
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)
AdvPl________________________________________________________________62
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
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 lExpressao1
Commandos
[CASE lExpressao2
Commandos
...
CASE lExpressaoN
Commandos]
[OTHERWISE
Commandos]
ENDCASE
Parmetros
CASE
lExpressao1
Comandos...
AdvPl________________________________________________________________63
verdadeiro).
OTHERWISE
Commandos
Se todas as expresses CASE forem avaliadas como falso (.F.), a clusula OTHERWISE
determina se um conjunto adicional de comandos deve ser executado. Se essa clusula
for incluida, os comandos seguintes sero executados e ento o programa continuar
com o primeiro comando seguinte ao ENDCASE. Se a clusula OTHERWISE for omitida, a
execuo continuar normalmente aps a clusula ENDCASE.
Comentrios
O Comando DO CASE...ENDCASE utilizado no lugar do comando IF...ENDIF quando um nmero maior
do que uma expresso deve ser avaliada, substituindo a necessidade de mais de um comando IF...ENDIF
aninhados.
Exemplo
Local nMes
:= Month(Date())
Local cPeriodo := ""
DO CASE
CASE nMes <= 3
cPeriodo
CASE nMes >= 4
cPeriodo
CASE nMes >= 7
cPeriodo
OTHERWISE
cPeriodo
ENDCASE
:= "Primeiro Trimestre"
.And. nMes <= 6
:= "Segundo Trimestre"
.And. nMes <= 9
:= "Terceiro Trimestre"
:= "Quarto Trimestre"
Return
Informaes Adicionais
DTOS
INKEY
REPLICATE
VAL
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
AdvPl________________________________________________________________64
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:
Funes reservadas so pertencentes ao compilador e portanto no podem ser redefinidas por uma
aplicao.
Todos os identifadores que comearem com um ou mais caracters de sublinhado (_) so utilizados
como identificadores internos e portanto so tambm reservados.
de correto funcionamento
eficiente
legvel
reutilizvel
extensvel
portvel
AdvPl________________________________________________________________65
Criao de Funes Segundo a Necessidade
Observe o cdigo de exemplo:
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:
Ou melhor:
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:
AdvPl________________________________________________________________66
cVar := "
" // 11 espaos
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:
Este tipo de programao deixa o cdigo fcil de digitar, fcil de ler e mais flexvel.
Se o valor da varivel nVar for igual a zero (0) no momento da execuo desta linha de cdigo, ambas as
comparaes separadas pelo operador lgico .Or. sero efetuadas: Aps ser avaliada, a primeria
comparao ir falhar. A segunda comparao ser ento avaliada e falhar tambm. Como resultado, o
cdigo existente dentro da estrutura de fluxo If no ser executado. Tal cdigo somente ser executado
quando o valor desta varivel for maior OU menor do que zero. Ou seja, sempre que for DIFERENTE de
zero, o que torna a linha a seguir mais eficiente:
If nVar != 0
Este tipo de alterao torna o cdigo mais legvel e o processamento mais rpido, evitando a avaliao de
instrues desnecessariamente.
Existem outras situaes onde a simplificao pode ser utilizada. A expresso de avaliao a seguir:
AdvPl________________________________________________________________67
If cVar $ "ABCD"
nVar := nVar + 1
nVar := nVar -1
++nVar
AdvPl________________________________________________________________68
--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.
Local nCnt := 0
For nCnt := 1 To 10
<cdigo>
Next nCnt
Local nCnt
While ( nCnt++ < 10 )
<cdigo>
EndDo
Em AdvPl, variveis no inicializadas sempre tem seu valor contendo nulo (nil) a princpio, o que far com
que uma exceo em tempo de execuo acontea quando a instruo de repetio while for executada.
Diferentemente do primeiro exemplo, onde a inicializao da varivel no fazia diferena alguma, neste
segundo exemplo a inicializao absolutamente necessria. Deve-se procurar inicializar variveis
numricas com zero (0) e variveis caracter com string nula ("") apenas quando realmente necessrio.
Utilizao de Alternativas
Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para explorar duas ou
trs diferentes abordagens. Quando se est trabalhando em algo mais complexo, deve-se planejar
prototipar algumas a mais. Considere o seguinte cdigo:
AdvPl________________________________________________________________69
If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif
Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. Este cdigo foi ento
convertido e armazenado como uma string. Pode-se notar que a cor "Preto" ser atribuda se nenhuma
outra opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto reduz o nmero
de comandos replace:
Do Case
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
AdvPl________________________________________________________________70
cColor := "Preto"
EndCase
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 Identao
Este um hbito que todo programador deve desenvolver. No consome muito esforo para manter o
cdigo alinhado durante o trabalho, porm quando necessrio pode-se utilizar AP6 IDE para a reidentao
de cdigo.
Considere o exemplo:
While !SB1->(Eof())
If mv_par01 = SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == "01" .Or. SB1->B1_LOCAL == "02"
TrataLocal(SB1->B1_COD,SB1->B1_LOCAL)
Case SB1->B1_LOCAL == "03"
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD,SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
AdvPl________________________________________________________________71
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
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
AdvPl________________________________________________________________72
enddo
Local nCnt
While ( nCnt++ < 10 )
nTotal += nCnt * 2
EndDo
Utilizao de Comentrios
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 tornase apenas perda de tempo:
AdvPl________________________________________________________________73
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":
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.
aReturn[5]
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
A impresso que se tem aps uma leitura deste cdigo de que valores esto sendo atribuidos s
variveis ou que constantes esto sendo utilizadas. Se o objetivo flexibilidade, o cdigo anterior deve ser
substitudo por:
#define NUMLINES 1
AdvPl________________________________________________________________74
#define NUMPAGES 2
#define ISDISK
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
O ganho irrisrio na checagem do tipo de dado do parmetro j que nenhum programa corretamente
escrito em execuo poderia enviar uma string ou uma data para a funo. De fato, este tipo de "captura"
o que torna a depurao difcil, j que o retorno ser sempre um valor vlido (mesmo que o parmetro
recebido seja de tipo de dado incorreto). Se esta captura no tiver sido efetuada quando um possvel erro
de tipo de dado invlido ocorrer, o cdigo pode ser corrigido para que este erro no mais acontea.
AdvPl________________________________________________________________75
Funes
C
Templates
X
Comando GET
Funes
A
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
AdvPl________________________________________________________________76
Templates
X
Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para numricos
Prefcio
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.
AdvPl________________________________________________________________77
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!
AdvPl________________________________________________________________78
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.
AdvPl________________________________________________________________79
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.
Criao de Variveis
Na criao de uma varivel deve-se ter em mente alguns pontos fundamentais:
A declarao
O tipo de varivel
AdvPl________________________________________________________________80
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
rapidamente que os outros tipos (PUBLIC e PRIVATE). Cuidado para no sucumbir teoria de que se pode
obter economia de memria, mudando qualquer referncia PRIVATE para uma referncia LOCAL. Se voc
fizer isso, as funes podem no funcionar corretamente, embora funcionassem na verso anterior s
alteraes.
STATIC: A varivel STATIC idntica classe de armazenamento LOCAL, com uma exceo. Uma varivel
STATIC retida dentro de sua sub-rotina, mesmo depois que o fluxo da funo a tenha deixado. Isto
particularmente til para funes independentes tipo caixa-preta, que contm seu prprio conjunto de
variveis exclusivas e devem manter esses valores de interao em interao.
Inicializao
Quando no atribumos nenhum valor a uma varivel no momento de sua declarao, corremos o risco de
utiliz-la com valor NIL e causar erros fatais. Por isso, a inicializao de uma varivel de extrema
importncia.
Padronizao de Variveis
AdvPl________________________________________________________________81
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
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
cbCont
Local
Contador
Cabec1
Local
Cabec2
Local
Cabec3
Local
AdvPl________________________________________________________________82
Tamanho
Local
cDesc1
Local
cDesc2
Local
cDesc3
Local
Limite
Local
Titulo
Local
Ttulo do Relatrio
aReturn
Private
Nomeprog
Private
cString
Private
Li
Private
Controle das linhas de impresso. Seu valor inicial a quantidade mxima de linhas
por pgina utilizada no relatrio
m_pag
Private
aOrd
Private
nLastKey
Private
cPerg
Private
aLinha
Private
AdvPl________________________________________________________________83
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)
// 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")
AdvPl________________________________________________________________84
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.
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.
AdvPl________________________________________________________________85
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.
AdvPl________________________________________________________________86
Outro exemplo:
aCampos := {}
Do while .T.
Aadd(aCampos, Teste)
Enddo
No exemplo acima o caso ainda mais crtico, pois alm utilizar todo o recurso de processamento do
servidor, em dado momento haver uma queda do aplicativo, devido a limitao da varivel tipo
Array, criada acima. E quando este limite for ultrapassado, o sistema ser interrompido abruptamente
e todos os demais usurios ficaro impossibilitados de utilizarem o sistema.
CPYT2S("C:\WINDOWS\TEMP\EXEMPLO.DOC,"\DOCS",.T.)
Onde os parmetros so:
AdvPl________________________________________________________________87
1o. o <Nome do Arquivo> a ser copiado para o Server
2o. o <Nome do Diretrio> do Server
3o. se deseja compactar o arquivo (recomendvel)
As funes possuem um retorno True(.T.) ou False(.F.) indicando se a cpia foi realizada com sucesso ou
no.
Desenvolvendo Telas
A aparncia e objetividade das telas num sistema base fundamental da interface Sistema x Usurio.
O AP5 j cria, automaticamente, a grande parte das telas de um mdulo, tais como a Browse, a GetDados
e Enchoice.
Algumas outras telas necessitam de construo manual, ou seja, com a utilizao de comandos, tais
como SAY , GET e LABEL, na Dialog.
Procure sempre colocar em tela as informaes que mais se objetivam com o assunto abordado.
Sempre que possvel, d preferncia aos campos obrigatrios primeiro. Isso facilita a digitao do usurio,
que no precisar passar de campo em campo (no caso de estar utilizando a tecla <TAB>) at chegar ao
campo desejado. A ordem dos campos tambm importante para a fcil localizao das informaes.
Quando o volume de informaes muito grande, divida os campos em folders, ou seja, pastas,
agrupando os campos em assuntos. Isso ir deixar a tela menos poluda e evitar que o usurio navegue
por uma tela s. Para fazer essa facilidade, preencha o campo X3_FOLDER, no SX3, com um nmero,
agrupando-os de acordo com a tipo de informao e no SXA, com o ALIAS do arquivo em pauta, a ordem,
que equivale ao numero informado no X3_FOLDER e a descrio nos trs idiomas. Essa descrio que ser
a informao contida na pasta do folder. Exemplo: Os campos SZ1_ENDER, SZ1_NUM e SZ1_BAIRRO
devem estar com o campo X3_FOLDER preenchido com o contedo 1. No SXA, o XA_ALIAS dever ser
SZ1, o XA_ORDEM = 1 (mesmo valor preenchido no X3_FOLDER), no XA_DESCRIC, Endereo
Residencial e, nos demais, o mesmo texto em outros idiomas.
O Folder, alm de agrupar e facilitar a procura pelos campos, evita a rolagem vertical da tela, facilitando a
visualizao das informaes.
Evite tela com muitos botes. Isso poder confundir o usurio e induzi-lo ao erro. Utilize telas sequenciais,
conhecidas como Wizard (semelhante aos de instalao de um software). Dessa forma, o usurio ficar
mais atento aos fatos, dificultando o erro. Mas cuidado: no faa disso uma incansvel sequncia de telas,
pois isso acabar desmotivando o usurio a utilizar o sistema.
Enfim, as telas devem ser limpas e objetivas, de tal forma que impea o usurio de sair de seu objetivo
final. Todo curioso ir apertar todos os botes da tela ou preencher todos os campos com qualquer tipo de
informao. Portanto, esteja atento a tamanho dos labels, para que os mesmos no excedam o tamanho
da caixa de dilogo definida. Isso, alm de no ser esttico, prejudica o entendimento da informao.
AdvPl________________________________________________________________88
N = Varivel publica que indica a posio do atual no acols
(a Linha que est sendo editada na Getdados)
Para salva-las podemos:
aColsAnt := aClone(Acols)
aHeaderAnt := aClone(aHeader)
nElemAnt := n
E para restaura-las:
aCols := aClone(aColsAnt)
aHeader := aClone(aHeaderAnt)
n := nElemAnt
Pontos de Entrada
Dentro dos processos operacionais dos programas possvel criar
execuo de processos distintos a partir de uma rotina do sistema.
:= .F.
AdvPl________________________________________________________________89
Endif
Return( lRetorno )
Contabilizando
A contabilizao de registros em um sistema ERP necessrio toda vez que houverem operaoes
envolvendo valores na empresa, como por exemplo, a emisso de uma nota fiscal, um recebimento de
dinheiro, um pagamento na folha, entre outros.
Para quem est programando fundamental que este conceito esteja bastante sidimentado.
Para se definir a contabilizao em qualquer rotina deve-se :
Definir os lanamentos padronizados que sero utilizados para a rotina (cada mdulo ou famlia de
mdulo possui uma sequencia lgica)
Existem trs funes que devero ser utilizadas, para que seja criado um arquivo texto, contendo as
informaes a serem contabilizadas.
Como temos 2 sistemas contbeis (SIGACON e SIGACTB) com procedimentos diferenciados programamos
de forma identica para ambos porm internamente as rotinas efetuam comandos diferentes. Os comandos
para a contabilizao so :
A Funo HeadProva
Este funo cria o cabealho da contabilizao. tratada de forma diferenciada para os mdulos SIGACON
e SIGACTB.
Sintaxe:
nHdlPrv := HeadProva(cLoteAtf, cNomProg, Substr(cUsuario,7,6), @arquivo, .T.)
Onde:
NHdlPrv -> Varivel que conter o num. (Handle) do arquivo (.LAN) criado.
cLoteAtf -> Cdigo do lote do mdulo (Ex.: Ativo Fixo: 8866)
AdvPl________________________________________________________________90
cNomProg -> Nome do Programa (Ex.: ATFA060)
cUsuario -> Usurio arquivo: nome do arquivo (Ex.: cArquivo := )
A funo DetProva()
Em primeiro lugar, deve-se estar posicionado no registro, que contm o valor ser contabilizado
Sintaxe:
ExpN1 := DetProva(ExpN2,ExpC1,ExpC2,ExpC3)
ExpN1 -> Valor Total da Contabilizao
ExpN2 -> Handle retornado da funo anterior
ExpC1 -> Cdigo do Lanamento Padro
ExpC2 -> Nome da rotina Geradora
ExpC3 -> Lanamento Padro
A funo RodaProva()
Esta funo ir cria a finalizao da contabilizao.
Sintaxe:
RodaProva(ExpN1, ExpN2)
ExpN1 -> Handle retornado da funo anterior
ExpN2 -> Valor Total da contabililizao
No Final, ou seja, aps todos registros serem processados utilizar a funo CA100INCL(), cujo objetivo
ler o arquivo gerado (.LAN), e gerar os lanamentos no arquivo SI2 (Lanamentos contbeis).
Exemplo:
CA100Incl( cArquivo, nHdlPrv, nOpcx, cLoteContabil, lDigita, lAglut, cOnLine, dData)
Onde:
cArquivo -> Nome do arquivo
nHdlPrv -> Numero do Header
nOpcx -> Numero da Opcao escolhida
cLoteContabil -> Numero do Lote
lDigita -> Se Mostra ou nao
lAglut -> Se Aglutina ou no
cOnLine -> Determina se sera On Line ou pelo cProva
Atualizando SX (ATUSX)
AdvPl________________________________________________________________91
O ATUSX uma ferramenta muito importante utilizada na manuteno dos arquivos customizadores
internos: os arquivos SXs . nos arquivos SX que esto armazenadas todas as informaes padres
necessrias para a criao de bases das empresas e efetuar possveis customizaes.
Em uma atualizao de verso, o sistema ir fazer uma compatibilizao de dados com os arquivos j
existentes e os atualizar com base nos SXs. Ao desenvolver uma rotina que exige um novo campo, por
exemplo, este dever ser criado no ATUSX, caso contrrio gerar uma no conformidade
comprometendo todo o trabalho da atualizao e o bom andamento do trabalho. Todo os campos,
perguntas, ndices, parmetros novos devero estar no ATUSX , pois estes so os padres do Protheus.
aqui tambm que cadastramos os HELPs de campo e de programas, criamos os menus do sistema e
onde disponibilizamos informaes para serem traduzidas para outros pases.
SX6 - Parmetros
Elemento chave para a execuo de um processamento, que determina diferentes resultados dependendo
do seu contedo.
SX7 Gatilhos
AdvPl________________________________________________________________92
Rotina ou operao que disparada a partir de um evento get.
Quando usar
Quando temos uma operao em Banco de Dados que necessite que vrias incluses, alteraes ou
excluses s sejam efetuadas quando todas as operaes tenham sido realizadas com sucesso, garantindo
com isso que no seja atualizada parcialmente uma tabela ou que atualize uma tabela e no atualize outra
tabela relacionada.
Como usar
Para definir uma transao, deve-se utilizar os comandos BEGIN TRANSACTION e END TRANSACTION para
definir inicio e fim de uma transao respectivamente. Todas informaes serem gravadas no Banco
devem estar dentro de uma nica transao sejam elas provenientes de uma ou vrias tabelas.
Deve-ser evitar utilizar laos (WHILE, FOR) dentro de uma transao, pois a rea de LOG do banco
limitada, e se o volume de informaes ultrapassarem este limite, ocasionar o travamento do banco de
dados. O tamanho da transao deve-ser ser conhecido pelo programdor. Em suma, para exemplificar,
devemos controlar a transao de uma nota e no de um conjunto ilimitado de notas.
Onde no usar
O controle de transao jamais dever ser utilizado durante processo que envolvam interface (telas com
entrada de dados). O controle deve-se resumir apenas ao processo de gravao. Entre um incio de
transao (Begin Transaction) e um final (End Transaction) Todos os registros a serem gravados ficam
locados at o final da transao. Caso tenhamos uma tela aps o BEGIN e antes do END dependeremos
do usurio para efetuar a liberao da transao, fato este que causaria enormes problemas para o
usurio.
Outro lugar que no deve-se ter o controle de transao refere-se a rotinas de reprocessamentos ou
reclculos, onde as informaes podem ser regerados durante este processo ou onde possamos ter um
grande nmero de locks.
BEGIN TRANSACTION
AdvPl________________________________________________________________93
ExpN1 :=FuncGrava()
END TRANSACTION
Caso exista uma transao dentro de uma outra a segunda ser automaticamente ignorada, fechando-se
a transao principal quando da chamada do comando END TRANSACTION.
_TESC
27
#DEFINE
_LESC
lastkey()
if _nLastkey == _TESC
RETURN
Endif
if _LESC == _TESC
RETURN
AdvPl________________________________________________________________94
Endif
Esta diretiva muito til quando temos um valor constante vrias vezes repetido dentro do cdigo fonte,
que poder ser alterado com freqncia no decorrer da vida til da funo.
#IFDEF ou #IFNDEF <CONSTANTE>
<instrues>
#ELSE
<outras instrues>
#ENDIF
Esta diretiva do pr-processador permite que voc prepare aplicaes para compilao condicional, ou em
outras palavras, se a <constante>, definida anteriormente via diretiva DEFINE ou pelo Protheus foi
definida (IFDEF), as <instrues> sero incorporadas ao cdigo objeto e as <outras instrues>, sero
desprezadas. Mas se a <constante> no foi definida <IFNDEF> as <instrues> sero incorporadas e as
<outras instrues> sero desprezadas.
#INCLUDE <ARQUIVO>
Uma instruo INCLUDE diz ao pr-processador para inserir o contedo de outro arquivo em um local
determinado dentro da funo. Este arquivo especificado, deve focalizar outras instrues do prprocessador que possam ser comuns a diversos mdulos da rotina.
Uso de Strings
Para que o sistema possa ser utilizado em outros pases com lnguas diferentes ao invs de inserirmos
diretamente os textos no fonte do relatrio utilizamos o recurso de strings, onde atravs de um include
acessaremos o texto em trs lnguas diferentes (Portugus, Espanhol e Ingls) dependendo da forma da
compilao.
convencionado que o nome do include seja o mesmo nome do fonte do relatrio para que a manuteno
deste relatrio seja o mais simples possvel.
Exemplo:
Relatrio -> FABR001.PRW
Include
-> FABR001.CH
Arquivos Compartilhados
Quando o arquivo esta configurado para trabalhar no modo compartilhado (X2_MODO = C), este campo
ser gravado com ( espaos ).
Deste modo o registro ficara disponvel para todas as Filiais.
AdvPl________________________________________________________________95
Arquivos Exclusivos
Quando o arquivo esta configurado para trabalhar no modo exclusivo ( X2_MODO= C ), esta campo ser
gravado com o cdigo da Filial Atual.
Deste modo o registro focara disponivel apenas para a Filial que o gravou.
Para que o registro realmente fique disponvel ou no para suas respectivas Filiais , TODAS as rotinas que
manilpulam registros diretamente na base de dados dever verificar a Filial atravs da Funo xFilial() ,
alem disto a maioria dos ndices possuem o campo FILIAL na
chave :
Sintaxe : XFILIAL(EXPC1) onde, ExpC1 = Alias do arquivo
A funo xFilial() verifica se o arquivo exclusivo ou compartilhado e ira retornar
Compartilhado e o cdigo da Filial se o arquivo for exclusivo .
se o arquivo for
Por exemplo :
Para executar um dbSeek no arquivo de clientes :
DbSelectArea(SA1)
DbSeek(xFilial(SA1)+cCodCli+cLoja)
ndice do SA1 :
A1_FILIAL+A1_COD+A1_LOJA
Ou um processamento no arquivo :
Do while !EOF() .AND. XX_FILIAL==xFilial(01)
Sendo o campo FILIAL parte da chave de Todos os ndices do sistema, este procedimento garante que a
utilizao dos registros ser exclusiva da Filial que criou os mesmos no caso do arquivo ser Exclusivo, ou
disponvel para todas as Filiais quando o mesmo estiver configurado como Compartilhado.
Jamais use um campo filial de uma tabela para executar um dbSeek() em outra tabela. Pois uma tabela
poder ser compartillhada (campo filial em branco), enquanto que a outra poder ser compartilhada
(campo filial preenchido).
A varivel cFilAnt contm a filial que o usurio est operando, e a varivel cEmpant contm a empresa e
a filial
Chaves Primrias
Sua funo garantir unicidade. Em toda relao, por definio, tem-se uma ou mais chaves candidatas.
Dessas chaves, uma ser primria e se houver mais de uma na relao, essas outras sero definidas como
chave alternada.
AdvPl________________________________________________________________96
Chaves Estrangeiras
um atributo cuja funo permitir relacionamento. Em uma tabela na qual o atributo chave externa
ou estrangeira, em outra, o atributo deve ser chave primria, e os valores dos campos so necessrios.
Integridade Referencial
Todos os valores da chave estrangeira tem, obrigatoriamente, que ter valor correspondente na chave
primria que se relaciona; mas nem todos os valores encontrados na chave primria, precisam ter seus
correspondentes na chave estrangeira que se relaciona. Por exemplo, na tabela de clientes, o campo
A1_COD (cdigo do cliente), vai estar relacionado com outra tabela que indica quais so os pedidos de
venda colocados. Desta forma, nem todos os clientes precisam ter pedidos de venda colocados; mas,
necessariamente, todos os pedidos de venda precisam de um cliente.
Como o PROTHEUS foi projetado para o ambiente SQL, onde a integridade referencial das tabelas
definida no prprio banco de dados atravs de regras internas, devemos tomar algumas precaues com
esse tpico:
Verificar a integridade da coluna em todas as tabelas relacionadas: no pode-se alterar o tamanho do
cdigo do cliente em apenas uma tabela, caso esse cdigo seja alterado deve-se verificar as tabelas de
cabecalho e itens das notas fiscais, de titulos a pagar e receber, etc. O sistema conta com o recurso de
grupos de tabelas relacionadas, que permite alterar o tamanho de diversas colunas de uma vez s ,
garantindo a integridade das colunas
Verificar a integridade dos cadastros com todas as tabelas relacionadas: no pode-se excluir o cdigo do
cliente se existe um pedido de vendas em aberto para esse cliente, deve-se verificar todas as tabelas
relacionadas antes de atualizar a base de dados.Alm disso na incluso de cadastros devemos utilizar as
funes existchav e existcpo para garantir que as informaes de chave no sejam repetidas e que o
acesso a tabelas externas seja validado de maneira consistente.
Verificar a atualizao da informao em todas as tabelas relacionadas: a integridade no se resume a
validaes de cadastros e tamanho de colunas, deve-se garantir no ato do desenvolvimento que TODOS
os pontos relacionados ao tpico envolvido sejam analisados e se necessrio atualizados. Por exemplo, se
ser atualizado o saldo em estoque de determinado produto NO DEVE-SE atualizar somente o arquivo de
saldos em estoque, deve-se avaliar se o produto utiliza rastreabilidade para nesse caso atualizar o arquivo
de saldos por lote, deve-se avaliar se o produto utiliza controle de localizao fisica para nesse caso
atualizar o arquivo de saldos por localizao, etc. Deve-se fazer um estudo antes de qualquer alterao
em atualizao de base de dados.
AdvPl________________________________________________________________97
Contedo -> o contedo que cCampo vai receber
Validao -> a validao que cCampo vai receber.
Observao: A Validao pode ser uma funo ou um valor NIL. Se for NIL, as validaes a serem
utilizadas para o respectivo campo sero as existentes no SX3. Se as validaes no forem as do SX3,
elas devem ser passadas numa funo.
Exemplo,
ARotAuto := { { "D3_TM" ,"001" ,NIL } , ;
{ "D3_COD" ,padr("10100",15) ,NIL } , ;
{ "D3_UM" ,"UN" ,NIL } , ;
{ "D3_QUANT" ,1 ,NIL } , ;
{ "D3_OP" ,"00000401001" ,NIL } , ;
{ "D3_LOCAL" ,"01" ,NIL } , ;
{ "D3_EMISSAO" ,dDataBase ,NIL }
Para o processo de incluso simples, sem getdados, a varivel padro a ser utilizada nos programas
chama-se aRotAuto, e para processo de incluso com cabealho e itens, as variveis a serem utilizadas
so: aAutoCab para o cabealho, e aAutoItens para os itens da getdados.
Para uma incluso simples, tomar como exemplo o MATA250.PRX. Para uma incluso com cabealho e
tem, tomar como exemplo o CONA050.PRX.
Controle de Semforo
O controle de Semaforo permite que o sistema controle a Numerao Automtica de Documentos On Line.
Temos basicamente 3 funes que gerenciam o controle do mesmo.
So elas :
GETSXENUM( EXPC1) -> Obtem o nmero sequencial do alias especificado no parmetro.
ROLLBACKSXE -> Descarta o nmero pendente do semforo. usado quando o usurio cancela a
operao (o numero no aproveitado).
CONFIRMSXE -> Confirma o nmero sugerido. Esta funo deve ser chamada quando da confirmao da
gravao do registro.
MAYIUSE -> Checa fisicamente se um determinado arquivo existe. O arquivo poder conter o nmero
sequencial.
Obs : A funo GETX8NUM executa a prpria GETSXENUM.
Atualizao do SourceSafe
A atualizao do Source Safe a ltima, e mais crtica, etapa do processo de alterao dos programas.
Para que ela seja feita com a mxima segurana algumas etapas devem ser observadas. A seguir:
AdvPl________________________________________________________________98
Aps as alteraes ser necessria uma anlise meticulosa de tudo o que foi alterado para avaliar qual o
impacto que estas podero causar no programa em que foram executadas e nos programas
correlacionados;
Devero ser efetuados o maior nmero de testes onde devero ser previstos o maior nmero de situaes
possveis e provveis. Os testes devero ser simulados em base equivalente instalada no cliente e para
as novas verses, em uma nova base que poder ser gerada atravs do ATUSX;
Feita a anlise, os testes e antes de atualizar definitivamente o Source Safe o programa alterado dever
ser comparado com o constante no Source Safe para verificar se as alteraes foram realmente feitas no
programa que foi reservado e, s ento o programa poder ser Baixado.
Aps a Baixa, e para garantir que o atualizao do Source Safe foi feita corretamente, o programa
atualizado dever ser novamente comparado. E claro que se todas as etapas anteriores, principalmente
a 1 e 2 , foram cumpridas essa no passar de uma medida de segurana.
Procedimentos de Localizaes
A Microsiga atua hoje em 13 pases e isto faz com que praticamente todas as alteraes executadas no
sistema reflitam em todos os pases (exceto quando no for necessrio tal procedimento).
Quando includo um novo STR em um CH, ou criado um novo CH, ou modificado um STR em um
CH j existente, este deve ser replicado em PORTUGUS para os demais idiomas e
automaticamente deve ser encaminha um e-mail para traducoes@microsiga.com.br
indicando a verso, o STR e o CH que foi alterado.
Quando criado ou alterado um novo HELP (de campo ou de programa) deve ser informado de
imediato para tradues para proceder a traduo para os outros idiomas.
Para atualizar um parmetro deve ser sempre usada a funo PUTMV, NUNCA DEVE SER
PREENCHIDO NEM POSICIONADO POR FORA. Esta funo atualiza nos trs idiomas.
Quando criado um campo novo similar a outros j existentes no sistema, deve se analisar se este
deve ser replicado com caractersticas diferentes para todos os paises localizados, ou se as
caractersticas devem ser igual independentemente da localizao. Na falta de critrio ou
informao, deve ser informado ao setor de localizaes.
Quando criado um campo novo de uso exclusivo de Brasil (E1_INSS por exemplo) deve ser
informada a equipe de localizaes para configurar este campo (uso, browse, etc.) de acordo com
os demais paises.
Quando for modificada a caracterstica de um campo do sistema e este estiver replicado para o
resto dos pases, as alteraes devem ser replicadas em todos os paises. Na dvida da
aplicabilidade da alterao nos outros paises, deve ser informada a equipe de localizaes.
AdvPl________________________________________________________________99
Os novos campos tipo COMBO, devem ser criados com numerao e no com siglas (1 para sim e 2
para no, ao invs de S para sim e N para no). Esta alterao o incluso deve ser informada de
imediato para a equipe de tradues.
Quando for criado um novo parmetro, ou modificado o contedo default de um j existente, esta
modificao deve ser aplicada nas 3 lnguas.
Quando houve a possibilidade de pegar um STR do dicionrio (funo RETTITLE() ), este deve ser
pego, o que evita ter que criar vrios STR e tratarmos com a varivel cPaisLoc dentro do
programa. Exemplo CGC, NOTA FISCAL, CEP, etc.
Quando criadas novas perguntas no SX1, ou modificadas as existentes, e o X1_GSC for igual a C,
deve ser informado de imediato para tradues, pois os campos das opes do combo, quando
vazias, geram erro fatal na execuo.
Modelo 1
Este modelo de programa exibe um Browse vertical de campos presentes no dicionrio de dados.
Genericamente as validaes so herdadas do prprio dicionrio de dados.
AdvPl________________________________________________________________100
/*/
+---------------------------------------------------------------------------+
+ Funcao
| FINA010 | Autor | Wagner Xavier
| Data | 28/04/92
|
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Programa de atualizacao de Naturezas
|
+-----------+---------------------------------------------------------------+
| Sintaxe
| FINA010()
|
+-----------+---------------------------------------------------------------+
| Uso
| Generico
|
+---------------------------------------------------------------------------+
|
ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL
|
+-----------+--------+------+-----------------------------------------------+
|Programador| Data
| BOPS | Motivo da Alteracao
|
+-----------+--------+------+-----------------------------------------------+
|
|
|
|
|
+-----------+--------+------+-----------------------------------------------+
/*/
#INCLUDE "FINA010.CH"
#INCLUDE "PROTHEUS.CH"
FUNCTION FINA010
/*/
+----------------------------------------------------------------+
|
Define Array contendo as Rotinas a executar do programa
+
|
----------- Elementos contidos por dimensao -----------+
|
1. Nome a aparecer no cabecalho
+
|
2. Nome da Rotina associada
+
|
3. Usado pela rotina
+
|
4. Tipo de Transacao a ser efetuada
+
|
1 - Pesquisa e Posiciona em um Banco de Dados
+
AdvPl________________________________________________________________101
|
2 - Simplesmente Mostra os Campos
+
|
3 - Inclui registros no Bancos de Dados
+
|
4 - Altera o registro corrente
+
|
5 - Remove o registro corrente do Banco de Dados
+
+----------------------------------------------------------------+
/*/
PRIVATE aRotina := { { OemToAnsi(STR0001) ,"AxPesqui", 0 , 1},;
//"Pesquisar"
{ OemToAnsi(STR0002) ,"AxVisual", 0 , 2},;
//"Visualizar"
{ OemToAnsi(STR0003) ,"AxInclui", 0 , 3},;
//"Incluir"
{ OemToAnsi(STR0004) ,"AxAltera", 0 , 4},;
//"Alterar"
{ OemToAnsi(STR0005) ,"FA010Del", 0 , 5, 3} } //"Excluir"
+----------------------------------------------------------------+
|
Define o cabecalho da tela de atualizacoes
|
+----------------------------------------------------------------+
PRIVATE cCadastro := OemToAnsi(STR0006) //"Atualizacao de Naturezas"
+----------------------------------------------------------------+
|
Endereca funcao Mbrowse
|
+----------------------------------------------------------------+
mBrowse( 6, 1,22,75,"SED")
Return
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|FA010DEL | Autor | Wagner Xavier
| Data | 8/04/92 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Programa de exclusao de Naturezas
|
+------------+-----------------------------------------------------------+
| Sintaxe
| A010Deleta(ExpC1,ExpN1,ExpN2)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Alias do arquivo
|
|
| ExpN1 = Numero do registro
|
|
| ExpN2 = Numero da opcao selecionada
|
+------------+-----------------------------------------------------------+
| Uso
| FINA010
|
+------------+-----------------------------------------------------------+
/*/
FUNCTION FA010DEL(cAlias,nReg,nOpc)
Local aAC := { OemToAnsi(STR0007),OemToAnsi(STR0008) } //"Abandona"###"Confirma"
Local bCampo
Local lDeleta := .T.
Local oDlg
Local nCont
Local nOpca
+----------------------------------------------------------------+
|
Monta a entrada de dados do arquivo
|
+----------------------------------------------------------------+
Private aTELA[0][0],aGETS[0]
+----------------------------------------------------------------+
|
Verifica se o arquivo esta realmente vazio ou se esta
|
|
posicionado em outra filial
|
+----------------------------------------------------------------+
If EOF() .or. SED->ED_FILIAL != xFilial("SED")
HELP(" " , 1 , "ARQVAZIO")
Return Nil
Endif
While .T.
+----------------------------------------------------------------+
|
Envia para processamento dos Gets
|
+----------------------------------------------------------------+
dbSelectArea( cAlias )
bCampo := {|nCPO| Field(nCPO) }
FOR nCont := 1 TO FCount()
M->&(EVAL(bCampo,nCont)) := FieldGet(nCont)
NEXT nCont
nOpca := 1
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 9,0 TO 28,80 OF oMainWnd
EnChoice( cAlias, nReg, nOpc, ,"AC",OemToAnsi(STR0009) ) //"Quanto a exclusao?"
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg, {|| nOpca := 2,oDlg:End()},;
{|| nOpca := 1,oDlg:End()})
DbSelectArea(cAlias)
dbSelectArea(cAlias)
AdvPl________________________________________________________________102
IF nOpcA == 2
+----------------------------------------------------------------+
|
Antes de deletar, verificar se existe movimentacao
|
+----------------------------------------------------------------+
dbSelectArea("SE1")
dbSetOrder(3)
IF (dbSeek(cFilial+SED->ED_CODIGO))
Help(" ",1,"A010NAODEL")
lDeleta := .F.
MsUnlock()
Else
dbSelectArea("SE2")
dbSetOrder(2)
IF (dbSeek(cFilial+SED->ED_CODIGO))
Help(" ",1,"A010NAODEL")
lDeleta := .F.
MsUnlock( )
Else
dbSelectArea("SE5")
dbSetOrder(4)
IF (dbSeek(cFilial+SED->ED_CODIGO))
Help(" ",1,"A010NAODEL")
lDeleta := .F.
MsUnlock( )
Endif
Endif
Endif
If lDeleta
+----------------------------------------------------------------+
|
Inicio da Protecao via TTS
|
+----------------------------------------------------------------+
BEGIN TRANSACTION
dbSelectArea(cAlias)
RecLock(cAlias,.F.,.T.)
dbDelete()
END TRANSACTION
+----------------------------------------------------------------+
|
Final da protecao via TTS
|
+----------------------------------------------------------------+
Endif
Else
MsUnlock( )
Endif
Exit
Enddo
dbSelectArea("SE1")
dbSetOrder(1)
dbSelectArea("SE2")
dbSetOrder(1)
dbSelectArea("SE5")
dbSetOrder(1)
dbSelectArea(cAlias)
RETURN
Modelo 2
Este modelo de programa exibe um cabealho com informaes pr-determinadas, um Browse horizontal
central (dependente do dicionrio de dados) e um rodap com variveis de memria que so atualizadas
de acordo com os valores preenchidos no Browse horizontal.
As validaes do cabealho so pr-determinadas no programa-fonte. J as validaes do browse
horizontal so genericamente herdadas do dicionrio de dados.
AdvPl________________________________________________________________103
/*/
+---------------------------------------------------------------------------+
+ Funcao
| CTBA120 | Autor | Pilar S. Albaladejo
| Data | 24/07/00
|
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Cadastro de Criterios de Rateio Externo
|
+-----------+---------------------------------------------------------------+
| Sintaxe
| CTBA120()
|
+-----------+---------------------------------------------------------------+
| Uso
| Generico
|
+---------------------------------------------------------------------------+
|
ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL
|
+-----------+--------+------+-----------------------------------------------+
|Programador| Data
| BOPS | Motivo da Alteracao
|
+-----------+--------+------+-----------------------------------------------+
|
|
|
|
|
+-----------+--------+------+-----------------------------------------------+
/*/
#INCLUDE "CTBA120.CH"
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FONT.CH"
FUNCTION CTBA120()
/*/
+----------------------------------------------------------------+
|
Define Array contendo as Rotinas a executar do programa
+
|
----------- Elementos contidos por dimensao -----------+
|
1. Nome a aparecer no cabecalho
+
|
2. Nome da Rotina associada
+
|
3. Usado pela rotina
+
|
4. Tipo de Transacao a ser efetuada
+
AdvPl________________________________________________________________104
|
1 - Pesquisa e Posiciona em um Banco de Dados
+
|
2 - Simplesmente Mostra os Campos
+
|
3 - Inclui registros no Bancos de Dados
+
|
4 - Altera o registro corrente
+
|
5 - Remove o registro corrente do Banco de Dados
+
+----------------------------------------------------------------+
/*/
PRIVATE aRotina := { { OemToAnsi(STR0001),"AxPesqui", 0 , 1},;
//"Pesquisar"
{ OemToAnsi(STR0002),"Ctb120Cad", 0 , 2},; //"Visualizar"
{ OemToAnsi(STR0003),"Ctb120Cad", 0 , 3},; //"Incluir"
{ OemToAnsi(STR0004),"Ctb120Cad", 0 , 4},; //"Alterar"
{ OemToAnsi(STR0005),"Ctb120Cad", 0 , 5} } //"Excluir"
+----------------------------------------------------------------+
|
Define o cabecalho da tela de atualizacoes
|
+----------------------------------------------------------------+
Private cCadastro := OemToAnsi(STR0006) //"Criterios de Rateio
+----------------------------------------------------------------+
|
Endereca funcao Mbrowse
|
+----------------------------------------------------------------+
mBrowse( 6, 1,22,75,"CTJ" )
Return
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120CAD| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Cadastro de Rateio Externo
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120Cad(ExpC1,ExpN1,ExpN2)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Alias do arquivo
|
|
| ExpN1 = Numero do registro
|
|
| ExpN2 = Numero da opcao selecionada
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
/*/
Function Ctb120Cad(cAlias,nReg,nOpc)
Local aSaveArea := GetArea()
Local aCampos := {}
Local aAltera := {}
Local aTpSald := CTBCBOX("CTJ_TPSALD")
Local cArq
Local cRateio
Local cDescRat
lOCAL cMoedaLc
Local cTpSald
Local nOpca := 0
Local oGetDb
Local oDlg
Local oFnt
Local oTpSald
Private aTela := {}
Private aGets := {}
Private aHeader := {}
Private nTotalD := 0
Private nTotalC := 0
+----------------------------------------------------------------+
|
Monta aHeader para uso com MSGETDB
|
+----------------------------------------------------------------+
aCampos := Ctb120Head(@aAltera)
+----------------------------------------------------------------+
|
Cria arquivo Temporario para uso com MSGETDB
|
+----------------------------------------------------------------+
Ctb120Cri(aCampos,@cArq)
+----------------------------------------------------------------+
|
Carrega dados para MSGETDB
|
+----------------------------------------------------------------+
Ctb120Carr(nOpc)
If nOpc == 3 // Inclusao
cRateio := CriaVar("CTJ_RATEIO") // Numero do Rateio
cDescRat := CriaVar("CTJ_DESC") // Descricao do Rateio
AdvPl________________________________________________________________105
cMoedaLC := CriaVar("CTJ_MOEDLC") // Moeda do Lancamento
cTpSald := CriaVar("CTJ_TPSALD") // Tipo do Saldo
Else // Visualizacao / Alteracao / Exclusao
cRateio := CTJ->CTJ_RATEIO
cDescRat := CTJ->CTJ_DESC
cMoedaLC := CTJ->CTJ_MOEDLC
cTpSald := CTJ->CTJ_TPSALD
EndIf
+----------------------------------------------------------------+
|
Monta Tela Modelo 2
|
+----------------------------------------------------------------+
DEFINE MSDIALOG oDlg TITLE OemToAnsi(STR0006) From 9,0 To 32,80 OF oMainWnd
Externos"
DEFINE FONT oFnt NAME "Arial" Size 10,15
@ 18, 007 SAY OemToAnsi(STR0007) PIXEL //"Rateio: "
//"Rateios
@ 18, 037 MSGET cRateio Picture "9999" SIZE 020,08 When (nOpc == 3);
Valid Ctb120Rat(cRateio) OF oDlg PIXEL
@ 18, 090 Say OemToAnsi(STR0008) PIXEL //"Descricao: "
@ 18, 120 MSGET cDescRat Picture "@!" SIZE 140,08 When (nOpc == 3 .Or. ;
nOpc == 4) Valid !Empty(cDescRat) OF oDlg PIXEL
@ 33, 007 Say OemToAnsi(STR0009) PIXEL // "Moeda:"
@ 32, 037 MSGET cMoedaLc Picture "@!" F3 "CTO" SIZE 020,08 When (nOpc == 3 .Or.;
nOpc == 4) Valid Ct120Moed(cMoedaLC) Of oDlg PIXEL
@ 33, 090 SAY OemToAnsi(STR0010) PIXEL // "Saldo:"
@ 32, 120 MSCOMBOBOX oTpSald VAR cTpSald ITEMS aTpSald When (nOpc == 3 .Or. ;
nOpc == 4) SIZE 45,08 OF oDlg PIXEL Valid (!Empty(cTpSald) .And.;
CtbTpSald(@cTpSald,aTpSald))
+----------------------------------------------------------------+
|
Chamada da MSGETDB
|
+----------------------------------------------------------------+
oGetDB := MSGetDB():New(044, 005, 120, 315, Iif(nOpc==3,4,nOpc),"CTB120LOK",;
"CTB120TOk", "+CTJ_SEQUEN",.t.,aAltera,,.t.,,"TMP")
+----------------------------------------------------------------+
|
Validacao da janela
|
+----------------------------------------------------------------+
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,;
{||nOpca:=1,if(Ctb120TOK(),oDlg:End(),nOpca := 0)},;
{||nOpca:=2,oDlg:End()}) VALID nOpca != 0
IF nOpcA == 1 // Aceita operacao e grava dados
Begin Transaction
Ctb120Gra(cRateio,cDescRat,nOpc,cMoedaLC,cTpSald)
End Transaction
ENDIF
dbSelectArea(cAlias)
+----------------------------------------------------------------+
|
Apaga arquivo temporario gerado para MSGETDB
|
+----------------------------------------------------------------+
DbSelectArea( "TMP" )
DbCloseArea()
If Select("cArq") = 0
FErase(cArq+GetDBExtension())
EndIf
dbSelectArea("CTJ")
dbSetOrder(1)
Return nOpca
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120RAT| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Verifica existencia do Rateio
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120Rat(ExpC1)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Numero do Rateio
|
+------------+-----------------------------------------------------------+
| Retorno
| .T./.F.
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
AdvPl________________________________________________________________106
+------------+-----------------------------------------------------------+
/*/
Function Ctb120Rat(cRateio)
Local aSaveArea:= GetArea()
Local lRet := .T.
Local nReg
If Empty(cRateio)
lRet := .F.
Else
dbSelectArea("CTJ")
dbSetOrder(1)
nReg := Recno()
If dbSeek(xFilial()+cRateio)
Help(" ",1,"CTJNRATEIO")
lRet := .F.
EndIf
dbGoto(nReg)
EndIf
RestArea(aSaveArea)
Return lRet
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120GRA| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Grava resgistro digitados
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120Gra(ExpC1,ExpC2,ExpN1,cExpC3,cExpC4)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Numero do Rateio
|
|
| ExpC2 = Descricao do Rateio
|
|
| ExpN1 = Opcao do Menu (Inclusao / Alteracao etc)
|
|
| ExpC3 = Moeda do Rateio
|
|
| ExpC4 = Tipo de Saldo
|
+------------+-----------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
Function Ctb120Gra(cRateio,cDescRat,nOpc,cMoedaLC,cTpSald)
Local aSaveArea := GetArea()
dbSelectArea("TMP")
dbgotop()
While !Eof()
If !TMP->CTJ_FLAG // Item nao deletado na MSGETDB
If nOpc == 3 .Or. nOpc == 4
dbSelectArea("CTJ")
dbSetOrder(1)
If !(dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN))
RecLock( "CTJ", .t. )
CTJ->CTJ_FILIAL := xFilial()
CTJ->CTJ_RATEIO := cRateio
CTJ->CTJ_DESC := cDescRat
CTJ->CTJ_MOEDLC := cMoedaLC
CTJ->CTJ_TPSALD := cTpSald
Else
RecLock( "CTJ", .f. )
CTJ->CTJ_DESC := cDescRat
CTJ->CTJ_MOEDLC := cMoedaLC
CTJ->CTJ_TPSALD := cTpSald
Endif
For nCont := 1 To Len(aHeader)
If (aHeader[nCont][10] != "V" )
FieldPut(FieldPos(aHeader[nCont][2]),;
TMP->(FieldGet(FieldPos(aHeader[nCont][2]))))
EndIf
Next nCont
MsUnLock()
Elseif nOpc == 5 // Se for exclusao
dbSelectArea("CTJ")
dbSetOrder(1)
AdvPl________________________________________________________________107
If dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN)
RecLock("CTJ",.F.,.T.)
dbDelete()
MsUnlOCK()
EndIf
EndIf
Else // Item deletado na MSGETDB
dbSelectArea("CTJ")
dbSetOrder(1)
If dbSeek(xFilial()+cRateio+TMP->CTJ_SEQUEN)
RecLock( "CTJ", .f., .t. )
DbDelete()
MsUnlock()
Endif
EndIf
dbSelectArea("TMP")
dbSkip()
Enddo
RestArea(aSaveArea)
Return
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120TOK| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Valida MSGETDB -> Tudo OK
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120TOK(ExpC1)
|
+------------+-----------------------------------------------------------+
| Parametros | Nenhum
|
+------------+-----------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
/*/
Function Ctb120TOk()
Local aSaveArea := GetArea()
Local lRet := .T.
Local nTotalD := 0
Local nTotalC := 0
dbSelectArea("TMP")
dbGotop()
While !Eof()
If !TMP->CTJ_FLAG
If !Ctb120LOK()
lRet := .F.
Exit
EndiF
If !Empty(TMP->CTJ_DEBITO)
nTotalD += TMP->CTJ_PERCEN
EndIf
If !Empty(TMP->CTJ_CREDITO)
nTotalC += TMP->CTJ_PERCEN
EndIf
EndIf
dbSkip()
EndDo
nTotalD := Round(nTotalD,2)
nTotalC := Round(nTotalC,2)
If lRet
IF (nTotalD > 0 .And. nTotalD != 100 ).Or. (nTotalC > 0 .And. nTotalC != 100)
Help(" ",1,"CTJ100%")
lRet := .F.
EndIF
EndIf
RestArea(aSaveArea)
Return lRet
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120LOK| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
AdvPl________________________________________________________________108
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Valida MSGETDB -> LinhaOK
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120LOK(ExpC1)
|
+------------+-----------------------------------------------------------+
| Parametros | Nenhum
|
+------------+-----------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
/*/
Function CTB120LOK()
Local lRet := .T.
Local nCont
If !TMP->CTJ_FLAG
If Empty(TMP->CTJ_PERCEN)
Help(" ",1,"CTJVLZERO")
lRet := .F.
EndIf
If lRet
ValidaConta(TMP->CTJ_DEBITO,"1",,,.t.)
EndIf
If lRet
ValidaConta(TMP->CTJ_CREDITO,"2",,,.T.)
EndIf
EndIf
Return lRet
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CTB120Cri| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Cria Arquivo Temporario para MSGETDB
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120Cri(ExpA1,ExpC1)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpA1 = Matriz com campos a serem criados
|
|
| ExpC1 = Nome do arquivo temporario
|
+------------+-----------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
/*/
Function Ctb120Cria(aCampos,cArq)
Local cChave
Local aSaveArea := GetArea()
cChave := "CTJ_SEQUEN"
cArq := CriaTrab(aCampos,.t.)
dbUseArea(.t.,,cArq,"TMP",.f.,.f.)
RestArea(aSaveArea)
Return
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|CTB120Head| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+----------+-------+-----------------------+------+----------+
| Descricao | Montar aHeader para arquivo temporario da MSGETDB
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ctb120Head(ExpA1)
|
+------------+------------------------------------------------------------+
| Parametros | ExpA1 = Matriz com campos que podem ser alterados
|
+------------+------------------------------------------------------------+
| Retorno
| ExpA1 = Matriz com campos a serem criados no arq temporario|
+------------+------------------------------------------------------------+
| Uso
| CTBA120
|
+------------+------------------------------------------------------------+
/*/
Function Ctb120Head(aAltera)
Local aSaveArea:= GetArea()
Local aFora := {"CTJ_RATEIO","CTJ_DESC","CTJ_MOEDLC","CTJ_TPSALD","CTJ_VALOR"}
Local aCampos := {}
AdvPl________________________________________________________________109
Local nCriter := 0
PRIVATE nUsado := 0
// Montagem da matriz aHeader
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("CTJ")
While !EOF() .And. (x3_arquivo == "CTJ")
If Alltrim(x3_campo) == "CTJ_SEQUEN" .Or. ;
x3Uso(x3_usado) .and. cNivel >= x3_nivel
If Ascan(aFora,Trim(X3_CAMPO)) <= 0
nUsado++
AADD(aHeader,{ TRIM(X3Titulo()), x3_campo, x3_picture,;
x3_tamanho, x3_decimal, x3_valid,;
x3_usado, x3_tipo, "TMP", x3_context } )
If Alltrim(x3_campo) <> "CTJ_SEQUEN"
Aadd(aAltera,Trim(X3_CAMPO))
EndIf
EndIF
EndIF
aAdd( aCampos, { SX3->X3_CAMPO, SX3->X3_TIPO, SX3->X3_TAMANHO,;
SX3->X3_DECIMAL } )
dbSkip()
EndDO
Aadd(aCampos,{"CTJ_FLAG","L",1,0})
RestArea(aSaveArea)
Return aCampos
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|CTB120Carr| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+----------+-------+-----------------------+------+----------+
| Descricao | Carrega dados para MSGETDB
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ctb120Carr(ExpN1)
|
+------------+------------------------------------------------------------+
| Parametros | ExpN1 = Opcao do Menu -> Inclusao / Alteracao etc
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| CTBA120
|
+------------+------------------------------------------------------------+
/*/
Function CTB120Carr(nOpc)
Local aSaveArea:= GetArea()
Local cAlias := "CTJ"
Local nPos
If nOpc != 3 // Visualizacao / Alteracao / Exclusao
cRateio := CTJ->CTJ_RATEIO
dbSelectArea("CTJ")
dbSetOrder(1)
If dbSeek(xFilial()+cRateio)
While !Eof() .And. CTJ->CTJ_FILIAL == xFilial() .And.;
CTJ->CTJ_RATEIO == cRateio
dbSelectArea("TMP")
dbAppend()
For nCont := 1 To Len(aHeader)
nPos := FieldPos(aHeader[nCont][2])
If (aHeader[nCont][08] <> "M" .And. aHeader[nCont][10] <> "V" )
FieldPut(nPos,(cAlias)->(FieldGet(FieldPos(aHeader[nCont]
[2]))))
EndIf
Next nCont
TMP->CTJ_FLAG := .F.
dbSelectArea("CTJ")
dbSkip()
EndDo
EndIf
Else
dbSelectArea("TMP")
dbAppend()
For nCont := 1 To Len(aHeader)
If (aHeader[nCont][08] <> "M" .And. aHeader[nCont][10] <> "V" )
AdvPl________________________________________________________________110
nPos := FieldPos(aHeader[nCont][2])
FieldPut(nPos,CriaVar(aHeader[nCont][2],.T.))
EndIf
Next nCont
TMP->CTJ_FLAG := .F.
TMP->CTJ_SEQUEN:= "001"
EndIf
dbSelectArea("TMP")
dbGoTop()
RestArea(aSaveArea)
Return
/*/
+------------+---------+-------+-----------------------+------+----------+
| Funcao
|CT120Moed| Autor | Pilar S. Albaladejo
| Data | 24/07/00 |
+------------+---------+-------+-----------------------+------+----------+
| Descricao | Valida Moeda do Lancamento
|
+------------+-----------------------------------------------------------+
| Sintaxe
| Ctb120Moed(ExpC1)
|
+------------+-----------------------------------------------------------+
| Parametros | ExpC1 = Moeda a ser validada
|
+------------+-----------------------------------------------------------+
| Retorno
| .T./.F.
|
+------------+-----------------------------------------------------------+
| Uso
| CTBA120
|
+------------+-----------------------------------------------------------+
/*/
Function Ct120MoedLC(cMoeda)
Local aCtbMoeda:= {}
Local lRet := .T.
aCtbMoeda := CtbMoeda(cMoeda)
If Empty(aCtbMoeda[1])
Help(" ",1,"NOMOEDA")
lRet := .F.
Endif
Return lRet
Modelo 3
Este modelo de programa a juno dos Modelos 1 e 2. Nele exibido um Browse vertical e um Browse
horizontal (ambos dependentes do dicionrio de dados). As validaes so genericamente herdadas do
dicionrio de dados.
AdvPl________________________________________________________________111
/*/
+---------------------------------------------------------------------------+
+ Funcao
| FATA010 | Autor | Eduardo Riera
| Data | 11/01/00
|
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Cadastro de Processo de Vendas
|
+-----------+---------------------------------------------------------------+
| Sintaxe
| FATA010()
|
+-----------+---------------------------------------------------------------+
| Uso
| Generico
|
+---------------------------------------------------------------------------+
|
ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL
|
+-----------+--------+------+-----------------------------------------------+
|Programador| Data
| BOPS | Motivo da Alteracao
|
+-----------+--------+------+-----------------------------------------------+
|
|
|
|
|
+-----------+--------+------+-----------------------------------------------+
/*/
#INCLUDE "FATA010.CH"
#INCLUDE "FIVEWIN.CH"
#DEFINE APOS { 15, 1, 70, 315 }
Function Fata010()
/*/
+----------------------------------------------------------------+
|
Define Array contendo as Rotinas a executar do programa
+
|
----------- Elementos contidos por dimensao -----------+
|
1. Nome a aparecer no cabecalho
+
|
2. Nome da Rotina associada
+
|
3. Usado pela rotina
+
AdvPl________________________________________________________________112
|
4. Tipo de Transacao a ser efetuada
+
|
1 - Pesquisa e Posiciona em um Banco de Dados
+
|
2 - Simplesmente Mostra os Campos
+
|
3 - Inclui registros no Bancos de Dados
+
|
4 - Altera o registro corrente
+
|
5 - Remove o registro corrente do Banco de Dados
+
+----------------------------------------------------------------+
/*/
PRIVATE cCadastro := OemToAnsi(STR0001) //"Processo de Venda"
PRIVATE aRotina := { { OemToAnsi(STR0002),"AxPesqui" ,0,1},; //"Pesquisar"
{ OemToAnsi(STR0003),"Ft010Visua",0,2},; //"Visual"
{ OemToAnsi(STR0004),"Ft010Inclu",0,3},; //"Incluir"
{ OemToAnsi(STR0005),"Ft010Alter",0,4},; //"Alterar"
{ OemToAnsi(STR0006),"Ft010Exclu",0,5} }
//"Exclusao"
If !Empty( Select( "AC9" ) )
AAdd( aRotina, { STR0013,"MsDocument",0,4} )
EndIf
mBrowse( 6, 1,22,75,"AC1")
Return(.T.)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010Visua| Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Tratamento da Visualizacao
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010Visua(ExpC1,ExpN2,ExpN3)
|
+------------+------------------------------------------------------------+
| Parametros | ExpC1: Alias do arquivo
|
|
| ExpN2: Registro do Arquivo
|
|
| ExpN3: Opcao da MBrowse
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Function Ft010Visua(cAlias,nReg,nOpcx)
Local aArea
:= GetArea()
Local oGetDad
Local oDlg
Local nUsado
:= 0
Local nCntFor
:= 0
Local nOpcA
:= 0
Local lContinua := .T.
Local lQuery
:= .F.
Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda"
Local cQuery
:= ""
Local cTrab
:= "AC2"
Local bWhile
:= {|| .T. }
Local aObjects := {}
Local aPosObj
:= {}
Local aSizeAut := MsAdvSize()
PRIVATE aHEADER := {}
PRIVATE aCOLS
:= {}
PRIVATE aGETS
:= {}
PRIVATE aTELA
:= {}
+----------------------------------------------------------------+
|
Montagem de Variaveis de Memoria
|
+----------------------------------------------------------------+
dbSelectArea("AC1")
dbSetOrder(1)
For nCntFor := 1 To FCount()
M->&(FieldName(nCntFor)) := FieldGet(nCntFor)
Next nCntFor
+----------------------------------------------------------------+
|
Montagem do aHeader
|
+----------------------------------------------------------------+
dbSelectArea("SX3")
dbSetOrder(1)
AdvPl________________________________________________________________113
dbSeek("AC2")
While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" )
If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL )
nUsado++
Aadd(aHeader,{ TRIM(X3Titulo()),;
TRIM(SX3->X3_CAMPO),;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
SX3->X3_USADO,;
SX3->X3_TIPO,;
SX3->X3_ARQUIVO,;
SX3->X3_CONTEXT } )
EndIf
dbSelectArea("SX3")
dbSkip()
EndDo
+----------------------------------------------------------------+
|
Montagem do aCols
|
+----------------------------------------------------------------+
dbSelectArea("AC2")
dbSetOrder(1)
#IFDEF TOP
If ( TcSrvType()!="AS/400" )
lQuery := .T.
cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery +=
"AC2.AC2_PROVEN='"+AC1->AC1_PROVEN+"' AND "
cQuery +=
"AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))
cQuery := ChangeQuery(cQuery)
cTrab := "FT010VIS"
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.)
For nCntFor := 1 To Len(aHeader)
TcSetField(cTrab,AllTrim(aHeader[nCntFor]
[2]),aHeader[nCntFor,8],aHeader[nCntFor,4],aHeader[nCntFor,5])
Next nCntFor
Else
#ENDIF
AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN))
bWhile := {|| xFilial("AC2") == AC2->AC2_FILIAL .And.;
AC1->AC1_PROVEN == AC2->AC2_PROVEN }
#IFDEF TOP
EndIf
#ENDIF
While ( !Eof() .And. Eval(bWhile) )
aadd(aCOLS,Array(nUsado+1))
For nCntFor := 1 To nUsado
If ( aHeader[nCntFor][10] != "V" )
aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntFor][2]))
Else
If ( lQuery )
AC2->(dbGoto((cTrab)->AC2RECNO))
EndIf
aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][2])
EndIf
Next nCntFor
aCOLS[Len(aCols)][Len(aHeader)+1] := .F.
dbSelectArea(cTrab)
dbSkip()
EndDo
If ( lQuery )
dbSelectArea(cTrab)
dbCloseArea()
dbSelectArea(cAlias)
EndIf
aObjects := {}
AdvPl________________________________________________________________114
AAdd( aObjects, { 315, 50, .T., .T. } )
AAdd( aObjects, { 100, 100, .T., .T. } )
aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 }
aPosObj := MsObjSize( aInfo, aObjects, .T. )
DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aSizeAut[5] OF
oMainWnd PIXEL
EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 )
oGetDad := MSGetDados():New (aPosObj[2,1], aPosObj[2,2], aPosObj[2,3], aPosObj[2,4],
nOpcx, "Ft010LinOk" ,"AllwaysTrue","",.F.)
ACTIVATE MSDIALOG oDlg ON INIT EnchoiceBar(oDlg,{||oDlg:End()},{||oDlg:End()})
RestArea(aArea)
Return(.T.)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010Inclu|Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Tratamento da Inclusao
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010Inclu(ExpC1,ExpN2,ExpN3)
|
+------------+------------------------------------------------------------+
| Parametros | ExpC1: Alias do arquivo
|
|
| ExpN2: Registro do Arquivo
|
|
| ExpN3: Opcao da MBrowse
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Function Ft010Inclu(cAlias,nReg,nOpcx)
Local aArea
:= GetArea()
Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda"
Local oGetDad
Local oDlg
Local nUsado
:= 0
Local nCntFor
:= 0
Local nOpcA
:= 0
Local aObjects := {}
Local aPosObj
:= {}
Local aSizeAut := MsAdvSize()
PRIVATE aHEADER := {}
PRIVATE aCOLS
:= {}
PRIVATE aGETS
:= {}
PRIVATE aTELA
:= {}
+----------------------------------------------------------------+
|
Montagem das Variaveis de Memoria
|
+----------------------------------------------------------------+
dbSelectArea("AC1")
dbSetOrder(1)
For nCntFor := 1 To FCount()
M->&(FieldName(nCntFor)) := CriaVar(FieldName(nCntFor))
Next nCntFor
+----------------------------------------------------------------+
|
Montagem da aHeader
|
+----------------------------------------------------------------+
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("AC2")
While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" )
If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL )
nUsado++
Aadd(aHeader,{ TRIM(X3Titulo()),;
TRIM(SX3->X3_CAMPO),;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
SX3->X3_USADO,;
SX3->X3_TIPO,;
SX3->X3_ARQUIVO,;
SX3->X3_CONTEXT } )
AdvPl________________________________________________________________115
EndIf
dbSelectArea("SX3")
dbSkip()
EndDo
+----------------------------------------------------------------+
|
Montagem da Acols
|
+----------------------------------------------------------------+
aadd(aCOLS,Array(nUsado+1))
For nCntFor := 1 To nUsado
aCols[1][nCntFor] := CriaVar(aHeader[nCntFor][2])
Next nCntFor
aCOLS[1][Len(aHeader)+1] := .F.
aObjects := {}
AAdd( aObjects, { 315, 50, .T., .T. } )
AAdd( aObjects, { 100, 100, .T., .T. } )
aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 }
aPosObj := MsObjSize( aInfo, aObjects, .T. )
DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aSizeAut[5] OF
oMainWnd PIXEL
EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 )
oGetDad := MSGetDados():New(aPosObj[2,1], aPosObj[2,2], aPosObj[2,3], aPosObj[2,4],
nOpcx, "Ft010LinOk", "Ft010TudOk","",.T.)
ACTIVATE MSDIALOG oDlg ;
ON INIT EnchoiceBar(oDlg, {||nOpcA:=If(oGetDad:TudoOk() .And. Obrigatorio(aGets,aTela),
1,0),If(nOpcA==1,oDlg:End(),Nil)},{||oDlg:End()})
If ( nOpcA == 1 )
Begin Transaction
Ft010Grv(1)
If ( __lSX8 )
ConfirmSX8()
EndIf
EvalTrigger()
End Transaction
Else
If ( __lSX8 )
RollBackSX8()
EndIf
EndIf
RestArea(aArea)
Return(.T.)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010Alter| Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Tratamento da Alteracao
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010Alter(ExpC1,ExpN2,ExpN3)
|
+------------+------------------------------------------------------------+
| Parametros | ExpC1: Alias do arquivo
|
|
| ExpN2: Registro do Arquivo
|
|
| ExpN3: Opcao da MBrowse
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Function Ft010Alter(cAlias,nReg,nOpcx)
Local aArea
:= GetArea()
Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda"
Local oGetDad
Local oDlg
Local nUsado
:= 0
Local nCntFor
:= 0
Local nOpcA
:= 0
Local lContinua := .T.
Local cQuery
:= ""
Local cTrab
:= "AC2"
Local bWhile
:= {|| .T. }
Local aObjects := {}
Local aPosObj
:= {}
AdvPl________________________________________________________________116
Local aSizeAut := MsAdvSize()
PRIVATE aHEADER := {}
PRIVATE aCOLS
:= {}
PRIVATE aGETS
:= {}
PRIVATE aTELA
:= {}
+----------------------------------------------------------------+
|
Montagem das Variaveis de Memoria
|
+----------------------------------------------------------------+
dbSelectArea("AC1")
dbSetOrder(1)
lContinua := SoftLock("AC1")
If ( lContinua )
For nCntFor := 1 To FCount()
M->&(FieldName(nCntFor)) := FieldGet(nCntFor)
Next nCntFor
+----------------------------------------------------------------+
|
Montagem da aHeader
|
+----------------------------------------------------------------+
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("AC2")
While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" )
If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL )
nUsado++
Aadd(aHeader,{ TRIM(X3Titulo()),;
TRIM(SX3->X3_CAMPO),;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
SX3->X3_USADO,;
SX3->X3_TIPO,;
SX3->X3_ARQUIVO,;
SX3->X3_CONTEXT } )
EndIf
dbSelectArea("SX3")
dbSkip()
EndDo
+----------------------------------------------------------------+
|
Montagem da aCols
|
+----------------------------------------------------------------+
dbSelectArea("AC2")
dbSetOrder(1)
#IFDEF TOP
If ( TcSrvType()!="AS/400" )
lQuery := .T.
cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery +=
"AC2.AC2_PROVEN='"+AC1->AC1_PROVEN+"' AND "
cQuery +=
"AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))
cQuery := ChangeQuery(cQuery)
cTrab := "FT010VIS"
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.)
For nCntFor := 1 To Len(aHeader)
TcSetField(cTrab,AllTrim(aHeader[nCntFor][2]),aHeader[nCntFor,8],;
Header[nCntFor,4],aHeader[nCntFor,5])
Next nCntFor
Else
#ENDIF
AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN))
bWhile := {|| xFilial("AC2") == AC2->AC2_FILIAL .And.;
AC1->AC1_PROVEN == AC2->AC2_PROVEN }
#IFDEF TOP
EndIf
#ENDIF
While ( !Eof() .And. Eval(bWhile) )
aadd(aCOLS,Array(nUsado+1))
For nCntFor := 1 To nUsado
AdvPl________________________________________________________________117
If ( aHeader[nCntFor][10] != "V" )
aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntFor]
[2]))
Else
If ( lQuery )
AC2->(dbGoto((cTrab)->AC2RECNO))
EndIf
aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][2])
EndIf
Next nCntFor
aCOLS[Len(aCols)][Len(aHeader)+1] := .F.
dbSelectArea(cTrab)
dbSkip()
EndDo
If ( lQuery )
dbSelectArea(cTrab)
dbCloseArea()
dbSelectArea(cAlias)
EndIf
EndIf
If ( lContinua )
aObjects := {}
AAdd( aObjects, { 315, 50, .T., .T. } )
AAdd( aObjects, { 100, 100, .T., .T. } )
aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 }
aPosObj := MsObjSize( aInfo, aObjects, .T. )
DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To aSizeAut[6],aSizeAut[5]
;
OF MainWnd PIXEL
EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 )
oGetDad :=
MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx,;
"Ft010LinOk","Ft010TudOk","",.T.)
ACTIVATE MSDIALOG oDlg ;
ON INIT EnchoiceBar(oDlg,{||
nOpca:=If(oGetDad:TudoOk().And.Obrigatorio(aGets,aTela),1,0),;
If(nOpcA==1,oDlg:End(),Nil)},{||oDlg:End()})
If ( nOpcA == 1 )
Begin Transaction
Ft010Grv(2)
If ( __lSX8 )
ConfirmSX8()
EndIf
EvalTrigger()
End Transaction
Else
If ( __lSX8 )
RollBackSX8()
EndIf
EndIf
EndIf
Endif
RestArea(aArea)
Return(.T.)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010Exclu| Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Tratamento da Exclusao
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010Exclu(ExpC1,ExpN2,ExpN3)
|
+------------+------------------------------------------------------------+
| Parametros | ExpC1: Alias do arquivo
|
|
| ExpN2: Registro do Arquivo
|
|
| ExpN3: Opcao da MBrowse
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
AdvPl________________________________________________________________118
Function Ft010Exclu(cAlias,nReg,nOpcx)
Local aArea
:= GetArea()
Local cCadastro := OemToAnsi(STR0001) //"Processo de Venda"
Local oGetDad
Local oDlg
Local nUsado
:= 0
Local nCntFor
:= 0
Local nOpcA
:= 0
Local lContinua := .T.
Local cQuery
:= ""
Local cTrab
:= "AC2"
Local bWhile
:= {|| .T. }
Local aObjects := {}
Local aPosObj
:= {}
Local aSizeAut := MsAdvSize()
PRIVATE aHEADER := {}
PRIVATE aCOLS
:= {}
PRIVATE aGETS
:= {}
PRIVATE aTELA
:= {}
+----------------------------------------------------------------+
|
Montagem das Variaveis de Memoria
|
+----------------------------------------------------------------+
dbSelectArea("AC1")
dbSetOrder(1)
lContinua := SoftLock("AC1")
If ( lContinua )
For nCntFor := 1 To FCount()
M->&(FieldName(nCntFor)) := FieldGet(nCntFor)
Next nCntFor
+----------------------------------------------------------------+
|
Montagem da aHeader
|
+----------------------------------------------------------------+
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("AC2")
While ( !Eof() .And. SX3->X3_ARQUIVO == "AC2" )
If ( X3USO(SX3->X3_USADO) .And. cNivel >= SX3->X3_NIVEL )
nUsado++
Aadd(aHeader,{ TRIM(X3Titulo()),;
TRIM(SX3->X3_CAMPO),;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
SX3->X3_USADO,;
SX3->X3_TIPO,;
SX3->X3_ARQUIVO,;
SX3->X3_CONTEXT } )
EndIf
dbSelectArea("SX3")
dbSkip()
EndDo
+----------------------------------------------------------------+
|
Montagek da aCols
|
+----------------------------------------------------------------+
dbSelectArea("AC2")
dbSetOrder(1)
#IFDEF TOP
If ( TcSrvType()!="AS/400" )
lQuery := .T.
cQuery := "SELECT *,R_E_C_N_O_ AC2RECNO "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery +=
"AC2.AC2_PROVEN='"+AC1->AC1_PROVEN+"' AND "
cQuery +=
"AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))
cQuery := ChangeQuery(cQuery)
cTrab := "FT010VIS"
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),cTrab,.T.,.T.)
For nCntFor := 1 To Len(aHeader)
AdvPl________________________________________________________________119
TcSetField(cTrab,AllTrim(aHeader[nCntFor][2]),aHeader[nCntFor,8],;
aHeader[nCntFor,4],aHeader[nCntFor,5])
Next nCntFor
Else
#ENDIF
AC2->(dbSeek(xFilial("AC2")+AC1->AC1_PROVEN))
bWhile := {|| xFilial("AC2") == AC2->AC2_FILIAL .And.;
AC1->AC1_PROVEN == AC2->AC2_PROVEN }
#IFDEF TOP
EndIf
#ENDIF
While ( !Eof() .And. Eval(bWhile) )
aadd(aCOLS,Array(nUsado+1))
For nCntFor := 1 To nUsado
If ( aHeader[nCntFor][10] != "V" )
aCols[Len(aCols)][nCntFor] := FieldGet(FieldPos(aHeader[nCntFor]
[2]))
Else
If ( lQuery )
AC2->(dbGoto((cTrab)->AC2RECNO))
EndIf
aCols[Len(aCols)][nCntFor] := CriaVar(aHeader[nCntFor][2])
EndIf
Next nCntFor
aCOLS[Len(aCols)][Len(aHeader)+1] := .F.
dbSelectArea(cTrab)
dbSkip()
EndDo
If ( lQuery )
dbSelectArea(cTrab)
dbCloseArea()
dbSelectArea(cAlias)
EndIf
EndIf
If ( lContinua )
aObjects := {}
AAdd( aObjects, { 315, 50, .T., .T. } )
AAdd( aObjects, { 100, 100, .T., .T. } )
aInfo := { aSizeAut[ 1 ], aSizeAut[ 2 ], aSizeAut[ 3 ], aSizeAut[ 4 ], 3, 3 }
aPosObj := MsObjSize( aInfo, aObjects, .T. )
DEFINE MSDIALOG oDlg TITLE cCadastro From aSizeAut[7],00 To ;
aSizeAut[6],aSizeAut[5] OF oMainWnd PIXEL
EnChoice( cAlias ,nReg, nOpcx, , , , , aPosObj[1], , 3 )
oGetDad :=
MSGetDados():New(aPosObj[2,1],aPosObj[2,2],aPosObj[2,3],aPosObj[2,4],nOpcx,;
"Ft010LinOk","Ft010TudOk","",.F.)
ACTIVATE MSDIALOG oDlg ;
ON INIT EnchoiceBar(oDlg,{||
nOpca:=If(oGetDad:TudoOk(),1,0),If(nOpcA==1,oDlg:End(),Nil)},;
{||oDlg:End()})
If ( nOpcA == 1 )
Begin Transaction
If Ft010DelOk()
Ft010Grv(3)
EvalTrigger()
EndIf
End Transaction
EndIf
EndIf
RestArea(aArea)
Return(.T.)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010LinOK| Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Validacao da linha OK
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010LinOk()
|
AdvPl________________________________________________________________120
+------------+------------------------------------------------------------+
| Parametros | Nennhum
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Function Ft010LinOk()
Local lRetorno:= .T.
Local nPStage := aScan(aHeader,{|x| AllTrim(x[2])=="AC2_STAGE"})
Local nPDescri:= aScan(aHeader,{|x| AllTrim(x[2])=="AC2_DESCRI"})
Local nCntFor := 0
Local nUsado := Len(aHeader)
If ( !aCols[n][nUsado+1] )
+----------------------------------------------------------------+
| Verifica os campos obrigatorios
|
+----------------------------------------------------------------+
If ( nPStage == 0 .Or. nPDescri == 0 )
Help(" ",1,"OBRIGAT")
lRetorno := .F.
EndIf
If ( lRetorno .And. (Empty(aCols[n][nPStage]) .Or. Empty(aCols[n][nPDescri])))
Help(" ",1,"OBRIGAT")
lRetorno := .F.
EndIf
+----------------------------------------------------------------+
|
Verifica se no h estagios repetidos
|
+----------------------------------------------------------------+
If ( nPStage != 0 .And. lRetorno )
For nCntFor := 1 To Len(aCols)
If ( nCntFor != n .And. !aCols[nCntFor][nUsado+1])
If ( aCols[n][nPStage] == aCols[nCntFor][nPStage] )
Help(" ",1,"FT010LOK01")
lRetorno := .F.
EndIf
EndIf
Next nCntFor
EndIf
EndIf
Return(lRetorno)
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010Grv | Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de Gravacao do Processe de Venda
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010Grv(ExpN1)
|
+------------+------------------------------------------------------------+
| Parametros | ExpN1: Opcao do Menu (Inclusao / Alteracao / Exclusao)
|
+------------+------------------------------------------------------------+
| Retorno
| .T.
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Static Function Ft010Grv(nOpc)
Local aArea
:= GetArea()
Local aUsrMemo := If( ExistBlock( "FT010MEM" ), ExecBlock( "FT010MEM", .F.,.F. ), {} )
Local aMemoAC1 := {}
Local aMemoAC2 := {}
Local aRegistro := {}
Local cQuery
:= ""
Local lGravou
:= .F.
Local nCntFor
:= 0
Local nCntFor2 := 0
Local nUsado
:= Len(aHeader)
Local nPStage
:= aScan(aHeader,{|x| AllTrim(x[2])=="AC2_STAGE"})
Local nPMEMO
:= aScan(aHeader,{|x| AllTrim(x[2])=="AC2_MEMO"})
If ValType( aUsrMemo ) == "A" .And. Len( aUsrMemo ) > 0
AdvPl________________________________________________________________121
For nLoop := 1 to Len( aUsrMemo )
If aUsrMemo[ nLoop, 1 ] == "AC1"
AAdd( aMemoAC1, { aUsrMemo[ nLoop, 2 ], aUsrMemo[ nLoop, 3 ] } )
ElseIf aUsrMemo[ nLoop, 1 ] == "AC2"
AAdd( aMemoAC2, { aUsrMemo[ nLoop, 2 ], aUsrMemo[ nLoop, 3 ] } )
EndIf
Next nLoop
EndIf
+----------------------------------------------------------------+
| Guarda os registros em um array para atualizacao
|
+----------------------------------------------------------------+
dbSelectArea("AC2")
dbSetOrder(1)
#IFDEF TOP
If ( TcSrvType()!="AS/400" )
cQuery := "SELECT AC2.R_E_C_N_O_ AC2RECNO "
cQuery += "FROM "+RetSqlName("AC2")+" AC2 "
cQuery += "WHERE AC2.AC2_FILIAL='"+xFilial("AC2")+"' AND "
cQuery +=
"AC2.AC2_PROVEN='"+M->AC1_PROVEN+"' AND "
cQuery +=
"AC2.D_E_L_E_T_<>'*' "
cQuery += "ORDER BY "+SqlOrder(AC2->(IndexKey()))
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),"FT010GRV",.T.,.T.)
dbSelectArea("FT010GRV")
While ( !Eof() )
aadd(aRegistro,AC2RECNO)
dbSelectArea("FT010GRV")
dbSkip()
EndDo
dbSelectArea("FT010GRV")
dbCloseArea()
dbSelectArea("AC2")
Else
#ENDIF
dbSeek(xFilial("AC2")+M->AC1_PROVEN)
While ( !Eof() .And. xFilial("AC2") == AC2->AC2_FILIAL .And.;
M->AC1_PROVEN == AC2->AC2_PROVEN )
aadd(aRegistro,AC2->(RecNo()))
dbSelectArea("AC2")
dbSkip()
EndDo
#IFDEF TOP
EndIf
#ENDIF
Do Case
+----------------------------------------------------------------+
| Inclusao / Alteracao
|
+----------------------------------------------------------------+
Case nOpc != 3
For nCntFor := 1 To Len(aCols)
If ( nCntFor > Len(aRegistro) )
If ( !aCols[nCntFor][nUsado+1] )
RecLock("AC2",.T.)
EndIf
Else
AC2->(dbGoto(aRegistro[nCntFor]))
RecLock("AC2")
EndIf
If ( !aCols[nCntFor][nUsado+1] )
lGravou := .T.
For nCntFor2 := 1 To nUsado
If ( aHeader[nCntFor2][10] != "V" )
FieldPut(FieldPos(aHeader[nCntFor2][2]),aCols[nCntFor]
[nCntFor2])
EndIf
Next nCntFor2
+----------------------------------------------------------------+
| Grava os campos obrigatorios
|
AdvPl________________________________________________________________122
+----------------------------------------------------------------+
AC2->AC2_FILIAL := xFilial("AC2")
AC2->AC2_PROVEN := M->AC1_PROVEN
If ( nPMemo != 0 .And. !Empty(aCols[nCntFor][nPMemo]))
MSMM(AC2->AC2_CODMEM,,,aCols[nCntFor]
[nPMemo],1,,,"AC2","AC2_CODMEM")
EndIf
+----------------------------------------------------------------+
| Grava os campos memo de usuario
|
+----------------------------------------------------------------+
For nLoop := 1 To Len( aMemoAC2 )
MSMM(AC2->(FieldGet(aMemoAC2[nLoop,1])),,, ;
DFieldGet( aMemoAC2[nLoop,2],
nCntFor ),1,,,"AC2",aMemoAC2[nLoop,1])
Next nLoop
Else
If ( nCntFor <= Len(aRegistro) )
dbDelete()
MSMM(AC2->AC2_CODMEM,,,,2)
+---------------------------------------------------------------+
| Exclui os campos memo de usuario
|
+---------------------------------------------------------------+
For nLoop := 1 To Len( aMemoAC2 )
MSMM(aMemoAC2[nLoop,1],,,,2)
Next nLoop
EndIf
EndIf
MsUnLock()
Next nCntFor
+----------------------------------------------------------------+
| Exclusao
|
+----------------------------------------------------------------+
OtherWise
For nCntFor := 1 To Len(aRegistro)
AC2->(dbGoto(aRegistro[nCntFor]))
RecLock("AC2")
dbDelete()
MsUnLock()
MSMM(AC2->AC2_CODMEM,,,,2)
Next nCntFor
If !Empty( Select( "AC9" ) )
+----------------------------------------------------------------+
| Exclui a amarracao de conhecimento
|
+----------------------------------------------------------------+
MsDocument( "AC1", AC1->( Recno() ), 2, , 3 )
EndIf
EndCase
+----------------------------------------------------------------+
| Atualizacao do cabecalho
|
+----------------------------------------------------------------+
dbSelectArea("AC1")
dbSetOrder(1)
If ( MsSeek(xFilial("AC1")+M->AC1_PROVEN) )
RecLock("AC1")
Else
If ( lGravou )
RecLock("AC1",.T.)
EndIf
EndIf
If ( !lGravou )
dbDelete()
MSMM(AC1->AC1_CODMEM,,,,2)
+----------------------------------------------------------------+
AdvPl________________________________________________________________123
| Exclui os campos memo de usuario
|
+----------------------------------------------------------------+
For nLoop := 1 To Len( aMemoAC1 )
MSMM( AC1->( FieldGet( aMemoAC1[ nLoop, 1 ] ) ),,,,2)
Next nLoop
Else
For nCntFor := 1 To AC1->(FCount())
If ( FieldName(nCntFor)!="AC1_FILIAL" )
FieldPut(nCntFor,M->&(FieldName(nCntFor)))
Else
AC1->AC1_FILIAL := xFilial("AC1")
EndIf
Next nCntFor
MSMM(AC1->AC1_CODMEM,,,M->AC1_MEMO,1,,,"AC1","AC1_CODMEM")
+----------------------------------------------------------------+
| Grava os campos memo de usuario
|
+----------------------------------------------------------------+
For nLoop := 1 To Len( aMemoAC1 )
MSMM( AC1->( FieldGet( aMemoAC1[nLoop,1] ) ),,,;
M->&( aMemoAC1[nLoop,2] ),1,,,"AC1",aMemoAC1[nLoop,1])
Next nLoop
EndIf
MsUnLock()
+----------------------------------------------------------------+
|
Restaura integridade da rotina
|
+----------------------------------------------------------------+
RestArea(aArea)
Return( .T. )
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010TudOK| Autor |Eduardo Riera
| Data |13.01.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao TudoOK
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010TudOK()
|
+------------+------------------------------------------------------------+
| Parametros | Nenhum
|
+------------+------------------------------------------------------------+
| Retorno
| .T./.F.
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Function Ft010TudOk()
Local lRet
:= .T.
Local nPosRelev := GDFieldPos( "AC2_RELEVA" )
Local nPosStage := GDFieldPos( "AC2_STAGE" )
Local nLoop
:= 0
Local nTotal
:= 0
Local nPosDel
:= Len( aHeader ) + 1
If !Empty( AScan( aCols, { |x| x[nPosRelev] > 0 } ) )
For nLoop := 1 To Len( aCols )
If !aCols[ nLoop, nPosDel ]
nTotal += aCols[ nLoop, nPosRelev ]
Else
+----------------------------------------------------------------+
| Permite excluir apenas se no estiver em uso por oportunidade |
+----------------------------------------------------------------+
AD1->( dbSetOrder( 5 ) )
If AD1->( dbSeek( xFilial( "AD1" ) + M->AC1_PROVEN +
aCols[nLoop,nPosStage] ) )
Aviso( STR0007, STR0011 + AllTrim( aCols[nLoop,nPosStage] ) + ;
STR0012, { STR0009 }, 2 ) ;
// Atencao // "A etapa " // " nao pode ser excluida pois esta em
uso por uma ou mais // oportunidades !"
lRet := .F.
Exit
EndIf
AdvPl________________________________________________________________124
EndIf
Next nLoop
If lRet
If nTotal <> 100
Aviso( STR0007, STR0008, ;
{ STR0009 }, 2 ) //"Atencao !"###"A soma dos valores de relevancia
deve ser igual a 100% //!"###"Fechar"
lRet := .F.
EndIf
EndIf
EndIf
Return( lRet )
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Ft010DelOk| Autor |Sergio Silveira
| Data |18.01.2001|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Validacao da Exclusao
|
+------------+------------------------------------------------------------+
| Sintaxe
| Ft010DelOk()
|
+------------+------------------------------------------------------------+
| Parametros | Nenhum
|
+------------+------------------------------------------------------------+
| Retorno
| .T./.F.
|
+------------+------------------------------------------------------------+
| Uso
| FATA010
|
+------------+------------------------------------------------------------+
/*/
Static Function Ft010DelOk()
LOCAL lRet := .T.
AD1->( dbSetOrder( 5 ) )
If AD1->( dbSeek( xFilial( "AD1" ) + M->AC1_PROVEN ) )
lRet := .F.
Aviso( STR0007, STR0010, { STR0009 }, 2 ) // "Atencao"
// "Este processo de venda nao pode ser excluido pois esta sendo utilizado em uma
ou mais
// oportunidades !", "Fechar"
EndIf
Return( lRet )
Modelos de Relatrios
Existem vrias formas de se gerar um relatrio no sistema, no entanto a forma de se elaborar o programa
no varia muito. Abaixo mostramos um modelo-padro, que utiliza as funes bsicas na gerao de um
relatrio.
/*/
+---------------------------------------------------------------------------+
+ Funcao
| MATR425 | Autor | Rodrigo de Sartorio
| Data | 11/05/95
|
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Relatorio de Estoque por Lote
|
+-----------+---------------------------------------------------------------+
| Sintaxe
| MATR425()
|
+-----------+---------------------------------------------------------------+
| Uso
| Generico
|
+---------------------------------------------------------------------------+
|
ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL
|
+-----------+--------+------+-----------------------------------------------+
|Programador| Data
| BOPS | Motivo da Alteracao
|
+-----------+--------+------+-----------------------------------------------+
|
|
|
|
|
+-----------+--------+------+-----------------------------------------------+
/*/
AdvPl________________________________________________________________125
#include 'MATR425.CH'
#include 'FIVEWIN.CH'
Function MATR425()
+----------------------------------------------------------------+
| Define Variaveis
|
+----------------------------------------------------------------+
Local cDesc1
:= STR0001 //"Este programa emitira' uma relacao com a posio de "
Local cDesc2
:= STR0002 //"estoque por Lote/Sub-Lote."
Local cDesc3
:= ''
Local cString
:= 'SB8'
Local Titulo
:= STR0003 //"Posicao de Estoque por Lote/Sub-Lote"
Local Tamanho
:= 'M'
Local wnRel
:= 'MATR425'
+----------------------------------------------------------------+
| Variaveis Tipo Private padrao de todos os relatorios
|
+----------------------------------------------------------------+
Private aOrd
:= {STR0004,STR0005} //" Por Produto"###" Por Lote/Sub-Lote"
Private aReturn
:= {STR0006,1,STR0007, 1, 2, 1, '',1 } //"Zebrado"###"Administracao"
Private cPerg
:= 'MR425A'
Private nLastKey
:= 0
Private nTipo
:= 0
+----------------------------------------------------------------+
| Verifica as perguntas selecionadas
|
+----------------------------------------------------------------+
Pergunte('MR425A', .F.)
+----------------------------------------------------------------+
| Variaveis utilizadas para parametros
|
| mv_par01
// Do Produto
|
| mv_par02
// Ate Produto
|
| mv_par03
// De Lote
|
| mv_par04
// Ate Lote
|
| mv_par05
// De Sub-Lote
|
| mv_par06
// Ate Sub-Lote
|
| mv_par07
// De Local
|
| mv_par08
// Ate Local
|
| mv_par09
// Lista Saldo Zerado ? Lista/Nao Lista
|
| mv_par10
// Do Tipo
|
| mv_par11
// Ate o Tipo
|
| mv_par12
// Do Grupo
|
| mv_par13
// Ate o Grupo
|
+----------------------------------------------------------------+
+----------------------------------------------------------------+
| Envia controle para SETPRINT
|
+----------------------------------------------------------------+
wnRel := SetPrint(cString,wnRel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,,Tamanho)
nTipo := If(aReturn[4]==1,GetMv('MV_COMP'),GetMv('MV_NORM'))
If nLastKey == 27
dbClearFilter()
Return Nil
Endif
SetDefault(aReturn,cString)
If nLastKey == 27
dbClearFilter()
Return Nil
Endif
RptStatus({|lEnd| C425Imp(@lEnd,wnRel,Tamanho,Titulo)},Titulo)
Return Nil
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|C425Imp
| Autor |Rodrigo Sartorio
| Data | 14/11/95 |
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Chamada do Relatorio
|
+------------+------------------------------------------------------------+
| Uso
| MATR425
|
+------------+------------------------------------------------------------+
/*/
Static Function C425Imp(lEnd, wnRel, Tamanho, Titulo)
+----------------------------------------------------------------+
| Variaveis especificas dos relatorios
|
+----------------------------------------------------------------+
Local cIndex
:= ''
AdvPl________________________________________________________________126
Local cCond
:= ''
Local cLoteAnt
:= ''
Local cProdAnt
:= ''
Local cDescAnt
:= ''
Local cSLotAnt
:= ''
Local cAlmoAnt
:= ''
Local cSeekSB8
:= ''
Local cCondSB8
:= ''
Local cNomArq
:= ''
Local cPicSld
:= PesqPict('SB8', 'B8_SALDO', 12)
Local cPicEmp
:= PesqPict('SB8', 'B8_EMPENHO', 12)
Local dDataAnt
:= CtoD(' / / ')
Local dValiAnt
:= CtoD(' / / ')
Local nSaldo
:= 0
Local nEmpenho
:= 0
Local nSaldoT
:= 0
Local nEmpenhoT := 0
Local nCntImpr
:= 0
Local nIndSB8
:= 0
Local lSubLote
:= .F.
+----------------------------------------------------------------+
| Variaveis utilizadas para Impressao do Cabecalho e Rodape
|
+----------------------------------------------------------------+
Private aLinha
:= {}
Private Cabec1
:= ''
Private Cabec2
:= ''
Private cBTxt
:= Space(10)
Private cBCont
:= 0
Private Li
:= 80
Private M_PAG
:= 01
//-- Condicao de Filtragem da IndRegua
cCond := 'B8_FILIAL=="'+xFilial('SB8')+'".And.'
cCond += 'B8_PRODUTO>="'+mv_par01+'".And.B8_PRODUTO<="'+mv_par02+'".And.'
cCond += 'B8_LOTECTL>="'+mv_par03+'".And.B8_LOTECTL<="'+mv_par04+'".And.'
cCond += 'B8_NUMLOTE>="'+mv_par05+'".And.B8_NUMLOTE<="'+mv_par06+'".And.'
cCond += 'B8_LOCAL>="'+mv_par07+'".And.B8_LOCAL<="'+mv_par08+'"'
If aReturn[8]==1
cIndex := 'B8_FILIAL+B8_PRODUTO+B8_LOCAL+B8_LOTECTL+B8_NUMLOTE'
Titulo := STR0008 //"POSICAO DE ESTOQUE POR LOTE/SUBLOTE (POR PRODUTO)"
Cabec1 := STR0009 //"PRODUTO DESCRICAO SUB-LOTE LOTE AL SALDO
EMPENHO
DATA
"
Cabec2 := STR0014 //"
VALIDADE "
ElseIf aReturn[8] == 2
cIndex := 'B8_FILIAL+B8_LOTECTL+B8_NUMLOTE+B8_PRODUTO+B8_LOCAL'
Titulo := STR0010 //"POSICAO DE ESTOQUE POR LOTE/SUB-LOTE (POR LOTE)"
Cabec1 := STR0011 //"SUB-LOTE LOTE PRODUTO DESCRICAO AL SALDO EMPENHO
DATA
"
Cabec2 := STR0014 //"
VALIDADE "
EndIf
+----------------------------------------------------------------+
| Pega o nome do arquivo de indice de trabalho
|
+----------------------------------------------------------------+
cNomArq := CriaTrab('', .F.)
//-- Seta a Ordem Correta no Arquivo SB1
dbSelectArea('SB1')
dbSetOrder(1)
+----------------------------------------------------------------+
| Cria Indice de Trabalho
|
+----------------------------------------------------------------+
dbSelectArea('SB8')
IndRegua('SB8', cNomArq, cIndex,, cCond, STR0017) //"Selecionando Registros..."
#IFNDEF TOP
dbSetIndex(cNomArq+OrdBagExt())
#ENDIF
dbGoTop()
SetRegua(LastRec())
+----------------------------------------------------------------+
| Processa o Laco de impressao
|
DATA
DATA
AdvPl________________________________________________________________127
+----------------------------------------------------------------+
Do While !Eof()
+----------------------------------------------------------------+
| Cancela a impressao
|
+----------------------------------------------------------------+
If lEnd
@ PRow()+1, 001 PSay STR0012 //"CANCELADO PELO OPERADOR"
Exit
EndIf
lSubLote := Rastro(B8_PRODUTO,'S')
//-- Define a Quebra por Produto ou Lote
If aReturn[8] == 1
cSeekSB8 := B8_FILIAL+B8_PRODUTO+B8_LOCAL
cCondSB8 := 'B8_FILIAL+B8_PRODUTO+B8_LOCAL'
Else
cSeekSB8 := B8_FILIAL+B8_LOTECTL+If(lSubLote,B8_NUMLOTE,'')
+B8_PRODUTO+B8_LOCAL
cCondSB8 := 'B8_FILIAL+B8_LOTECTL+'+If(lSubLote,'B8_NUMLOTE+','')
+'B8_PRODUTO+B8_LOCAL'
EndIf
nSaldo
:= 0
nEmpenho := 0
nSaldoT
:= 0
nEmpenhoT := 0
//-- Processa o Laco da Quebra
Do While !Eof() .And. cSeekSB8 == &(cCondSB8)
//-- Atualiza a Regua de Impressao
IncRegua()
+----------------------------------------------------------------+
| Cancela a Impressao
|
+----------------------------------------------------------------+
If lEnd
@ PRow()+1, 001 PSay STR0012 //"CANCELADO PELO OPERADOR"
Exit
EndIf
//-- Saldo do Lote ou Lote/Sublote
nSaldo
+= B8_SALDO
nEmpenho += B8_EMPENHO
//-- Saldo Total da Quebra
nSaldoT
+= B8_SALDO
nEmpenhoT += B8_EMPENHO
//-- Posiciona-se na Descricao Correta do SB1
If !(cProdAnt==B8_PRODUTO)
SB1->(dbSeek(xFilial('SB1')+SB8->B8_PRODUTO, .F.))
EndIf
If SB1->B1_TIPO < mv_par10 .Or. SB1->B1_TIPO > mv_par11
dbSkip()
Loop
EndIf
If SB1->B1_GRUPO < mv_par12 .Or. SB1->B1_GRUPO > mv_par13
dbSkip()
Loop
EndIf
//-- Salva Dados do Registro Atual / Passa para o Proximo Registro
cProdAnt := B8_PRODUTO
cDescAnt := SubS(SB1->B1_DESC,1,30)
cSLotAnt := If(lSubLote,B8_NUMLOTE,Space(Len(B8_NUMLOTE)))
cLoteAnt := B8_LOTECTL
cAlmoAnt := B8_LOCAL
dDataAnt := B8_DATA
dValiAnt := B8_DTVALID
dbSkip()
AdvPl________________________________________________________________128
AdvPl________________________________________________________________129
Modelos de Clculos
Existem diversas formas de se gerar uma rotina de clculo no sistema, no entanto o modelo bsico
sempre se mantm. Abaixo mostramos um modelo-padro que utiliza as funes bsicas para tal.
/*/
+---------------------------------------------------------------------------+
+ Funcao
| FINA210 | Autor | Wagner Xavier
| Data | 01/12/92
|
+-----------+----------+-------+-----------------------+------+-------------+
| Descricao | Recalcula saldos bancarios dentro de um determinado periodo
|
+-----------+---------------------------------------------------------------+
| Sintaxe
| FINA210()
|
+-----------+---------------------------------------------------------------+
| Uso
| Generico
|
+---------------------------------------------------------------------------+
|
ATUALIZACOES SOFRIDAS DESDE A CONSTRUCAO NICIAL
|
+-----------+--------+------+-----------------------------------------------+
|Programador| Data
| BOPS | Motivo da Alteracao
|
+-----------+--------+------+-----------------------------------------------+
|
|
|
|
|
+-----------+--------+------+-----------------------------------------------+
#INCLUDE "FINA210.CH"
#INCLUDE "PROTHEUS.CH"
Function FinA210()
LOCAL nOpca :=0
+----------------------------------------------------------------+
| Define Variaveis
|
+----------------------------------------------------------------+
LOCAL oDlg, aSays:={}, aButtons:={}
Private cCadastro := OemToAnsi(STR0004) //"Reconciliacao de Saldos Bancarios"
Pergunte("FIN210",.F.)
AADD (aSays,;
OemToAnsi(STR0005))//"Este programa tem como objetivo recalcular e analisar os saldos"
AADD (aSays,;
OemToAnsi(STR0006)) //"Bancarios dia a dia de um determinado periodo ate a data base do
"
AADD (aSays,;
OemToAnsi(STR0007)) //"sistema. Utilizando no caso de haver necessidade de retroagir a
"
AADD (aSays,;
OemToAnsi(STR0008)) //"movimentacao bancaria. Use como referencia a data em que o saldo
"
AADD (aSays,;
OemToAnsi(STR0009)) //"ficou defasado. "
AADD(aButtons, { 1,.T.,{|o| nOpca:= 1,o:oWnd:End()}} )
AADD(aButtons, { 2,.T.,{|o| o:oWnd:End() }} )
AADD(aButtons, { 5,.T.,{|| Pergunte("FIN210",.T. ) } } )
FormBatch( cCadastro, aSays, aButtons )
If nOpcA == 1
#IFDEF TOP
If TcSrvType() == 'AS/400'
Processa({|lEnd| FA210Proc()}) // Chamada da funcao de reconciliacao
Else
Processa({|lEnd| FA211Proc()}) // Chamada da funcao de reconciliacao
Endif
#ELSE
Processa({|lEnd| FA210Proc()})
// Chamada da funcao de reconciliacao
#ENDIF
Endif
Return
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Fa210Proc | Autor |Wagner Xavier
| Data |01.12.1992|
|------------+----------+-------+-----------------------+------+----------+
AdvPl________________________________________________________________130
| Descricao |Funcao de recalculo dos saldos bancarios CODEBASE
|
+------------+------------------------------------------------------------+
| Sintaxe
| Fa210Proc ()
|
+------------+------------------------------------------------------------+
| Parametros | Nenhum
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FINA210
|
+------------+------------------------------------------------------------+
/*/
Function FA210Processa()
LOCAL nSaldoIni
LOCAL nEntradas
LOCAL nSaidas, nData, cCond
LOCAL dDataMovto
LOCAL cFil
:=""
LOCAL lAllFil :=.F.
LOCAL cChave
LOCAL cIndex := ""
LOCAL lSaida :=.F.
+----------------------------------------------------------+
| Variaveis utilizadas para parametros
|
| mv_par01 // Do Banco
|
| mv_par02 // Ate o Banco
|
| mv_par03 // Da Agencia
|
| mv_par04 // Ate a Agencia
|
| mv_par05 // Da Conta
|
| mv_par06 // Ate a Conta
|
| mv_par07 // A partir da Data
|
+----------------------------------------------------------+
dbSelectArea( "SA6" )
dbSeek( cFilial+mv_par01 , .T.)
ProcRegua(RecCount())
If Empty(xFilial( "SA6")) .AND. !Empty(xFilial("SE5"))
+----------------------------------------------------------------+
| Filtra o arquivo pro tipo e vencimento
|
+----------------------------------------------------------------+
dbSelectArea("SE5")
cIndex := CriaTrab(nil,.f.)
cChave := "E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO)"
cCond := 'dtos(E5_DTDISPO)>="'+dtos(mv_par07)+'"'
IndRegua("SE5",cIndex,cChave,,cCond,OemToAnsi(STR0015)) //"Selecionando
Registros..."
nIndexSE5 := RetIndex("SE5")
#IFNDEF TOP
dbSetIndex(cIndex+OrdBagExt())
#ENDIF
dbSetOrder(nIndexSE5+1)
lSaida := .T.
dbGoTop()
lAllFil:= .T.
Else
dbSelectArea("SE5")
cIndex := CriaTrab(nil,.f.)
cChave := "E5_FILIAL+E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO)"
cCond := 'dtos(E5_DTDISPO)>="'+dtos(mv_par07)+'" .and. E5_FILIAL ==
"'+xFilial("SE5")+'"'
IndRegua("SE5",cIndex,cChave,,cCond,OemToAnsi(STR0015)) //"Selecionando
Registros..."
nIndexSE5 := RetIndex("SE5")
#IFNDEF TOP
dbSetIndex(cIndex+OrdBagExt())
#ENDIF
dbSetOrder(nIndexSE5+1)
dbGoTop()
Endif
+----------------------------------------------------------------+
| Inicia recalculo dos saldos atraves da movimentacao bancaria
|
+----------------------------------------------------------------+
dbSelectArea( "SA6" )
AdvPl________________________________________________________________131
dbSeek( cFilial+mv_par01 , .T.)
While !Eof() .and. A6_FILIAL == cFilial .and. A6_COD <= mv_par02
IncProc()
// Alteracao para nao recalcular o saldo dos caixas do Loja, pois
// estes devem ser recalculados atraves da opcao "Recalculo de Caixa" - Adriano
dbSelectArea("SX5")
If (dbSeek(xFilial("SX5")+"23"+SA6->A6_COD)) .or. (SA6->A6_Cod == "CL1")
dbSelectArea("SA6")
dbSkip()
Loop
Endif
dbSelectArea("SA6")
cBanco
:= A6_COD
cAgencia := A6_AGENCIA
cConta
:= A6_NUMCON
nSaldoIni:= 0
nEntradas:= 0
nSaidas := 0
If cAgencia < mv_par03 .or. cAgencia > mv_par04 .or. cConta < mv_par05 .or. cConta
> mv_par06
dbSkip( )
Loop
Endif
+---------------------------------------------------------+
| Localiza Saldo de Partida.
|
| Observe que o programa retorna um registro no banco de |
| dados, portanto a data de referencia a data em que
|
| o saldo ficou errado, nao a data correta do saldo.
|
+---------------------------------------------------------+
dbSelectArea( "SE8" )
dbSeek( cFilial+cBanco+cAgencia+cConta+Dtos(mv_par07),.T. )
dbSkip( -1 )
If E8_BANCO != cBanco .or. E8_AGENCIA != cAgencia .or. E8_CONTA != cConta .or.
BOF() .or. EOF()
nSaldoIni := 0
Else
nSaldoIni := E8_SALATUA
End
+----------------------------------------------------------------+
| Localiza movimentacao bancaria
|
+----------------------------------------------------------------+
dbSelectArea( "SE5" )
dbSetOrder(nIndexSE5+1)
cFil := Iif(lAllFil,"",xFilial("SE5"))
dbSeek(cFil+cBanco+cAgencia+cConta+Dtos(mv_par07),.T.)
While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta
IF !lAllFil .and. E5_FILIAL != xFilial("SE5")
Exit
Endif
dDataMovto := E5_DTDISPO
While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA+dtos(E5_DTDISPO)== ;
cBanco+cAgencia+cConta+dtos(dDataMovto)
IF !lAllFil .and. E5_FILIAL != xFilial("SE5")
Exit
Endif
IF E5_TIPODOC $ "DC/JR/MT/CM/D2/J2/M2/C2/V2/CP/TL" //Valores de Baixas
dbSkip()
Loop
Endif
If E5_VENCTO > E5_DATA
// Ignora pre' datados - gerou titulo
dbSkip()
Loop
Endif
If E5_SITUACA = "C"
//Cancelado
dbSkip()
Loop
Endif
If SE5->E5_MOEDA $ "C1/C2/C3/C4/C5" .and. Empty(SE5->E5_NUMCHEQ)
dbSkip()
Loop
Endif
AdvPl________________________________________________________________132
+---------------------------------------------------------------+
| Na transferencia somente considera nestes numerarios
|
| No Fina100 tratado desta forma.
|
| As transferencias TR de titulos p/ Desconto/Cauo (FINA060) |
| no sofrem mesmo tratamento dos TR bancarias do FINA100
|
| Aclaracao : Foi incluido o tipo $ para os movimentos en di-- |
| nheiro em QUALQUER moeda, pois o R$ nao e representativo
|
| fora do BRASIL.
|
+---------------------------------------------------------------+
If SE5->E5_TIPODOC $ "TR/TE" .and. Empty(SE5->E5_NUMERO)
If !(E5_MOEDA $ " $ /R$/DO/TB/TC/CH"+IIf(cPaisLoc=="BRA","","/$
"))
dbSkip()
Loop
Endif
Endif
If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ;
.or. Substr(E5_DOCUMEN,1,1) == "*" )
dbSkip()
Loop
Endif
If SE5->E5_MOEDA == "CH" .and. IsCaixaLoja(SE5->E5_BANCO) //Sangria
dbSkip()
Loop
Endif
If SubStr(E5_NUMCHEQ,1,1)=="*"
//cheque para juntar (PA)
dbSkip()
Loop
Endif
If !Empty(SE5->E5_MOTBX)
If !MovBcoBx(SE5->E5_MOTBX)
dbSkip()
Loop
Endif
Endif
+----------------------------------------------------------------+
| Baixa automatica
|
+----------------------------------------------------------------+
IF E5_TIPODOC = "BA"
dbSkip()
Loop
Endif
dbSelectArea("SE5")
IF E5_RECPAG = "R"
nEntradas += E5_VALOR
Else
nSaidas += E5_VALOR
Endif
dbSkip()
End // Quebra da data
dbSelectArea("SE8")
dbSeek(cFilial + cBanco+cAgencia+cConta+Dtos(dDataMovto))
IF Eof()
RecLock("SE8",.t.)
Else
RecLock("SE8",.f.)
Endif
Replace E8_FILIAL
With cFilial,;
E8_BANCO
With cBanco,;
E8_AGENCIA With cAgencia,;
E8_CONTA
With cConta,;
E8_DTSALATU With dDataMovto
Replace E8_SALATUA With nSaldoIni+nEntradas-nSaidas
MsUnlock()
dbSelectArea("SE5")
IF !(SE5->(Eof())) .and. E5_BANCO+E5_AGENCIA+E5_CONTA ==
cBanco+cAgencia+cConta
IF !lAllFil .and. E5_FILIAL != xFIlial("SE5")
Exit
Endif
For nData := dDataMovto+1 to ((SE5->E5_DTDISPO) - 1)
AdvPl________________________________________________________________133
dbSelectArea("SE8")
If dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(nData))
RecLock("SE8",.F.,.T.)
dbDelete()
MsUnlock()
SX2->(MsUnlock())
EndIf
dbSelectArea("SE5")
Next
Endif
IF SE5->(Eof()) .or. E5_BANCO+E5_AGENCIA+E5_CONTA != cBanco+cAgencia+cConta
dbSelectArea("SE8")
dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(dDataMovto+1),.t.)
While !Eof() .and. cFilial + cBanco+cAgencia+cConta == ;
E8_FILIAL+E8_BANCO+E8_AGENCIA+E8_CONTA
RecLock("SE8",.F.,.T.)
dbDelete()
MsUnlock()
SX2->(MsUnlock())
dbselectArea("SE8")
dbSkip()
End
Endif
dbSelectArea("SE5")
End // Fecha Primeiro Loop do SE5
dbSelectArea("SA6")
RecLock("SA6")
Replace A6_SALATU With nSaldoIni+nEntradas-nSaidas
MsUnLock()
dbSkip()
End
dbSelectArea("SE5")
RetIndex( "SE5")
Set Filter To
If !Empty(cIndex)
ferase( cIndex+OrdBagExt())
EndIf
Return NIL
/*/
+------------+----------+-------+-----------------------+------+----------+
| Funcao
|Fa211Proc | Autor |Wagner Xavier
| Data |09.03.2000|
|------------+----------+-------+-----------------------+------+----------+
| Descricao |Funcao de recalculo dos saldos bancarios TOP CONNECT
|
+------------+------------------------------------------------------------+
| Sintaxe
| Fa211Proc ()
|
+------------+------------------------------------------------------------+
| Parametros | Nenhum
|
+------------+------------------------------------------------------------+
| Retorno
| Nenhum
|
+------------+------------------------------------------------------------+
| Uso
| FINA210
|
+------------+------------------------------------------------------------+
/*/
#IFDEF TOP
Function FA211Proc()
LOCAL nSaldoIni, nEntradas
LOCAL nSaidas, nData
LOCAL cQuery
LOCAL dDataMovto
+----------------------------------------------------------+
| Variaveis utilizadas para parametros
|
| mv_par01 // Do Banco
|
| mv_par02 // Ate o Banco
|
| mv_par03 // Da Agencia
|
| mv_par04 // Ate a Agencia
|
| mv_par05 // Da Conta
|
| mv_par06 // Ate a Conta
|
| mv_par07 // A partir da Data
|
+----------------------------------------------------------+
+----------------------------------------------------------------+
| Inicia recalculo de saldos atraves da movimentacao bancaria
|
AdvPl________________________________________________________________134
+----------------------------------------------------------------+
cQuery := "SELECT SA6.R_E_C_N_O_ A6_RECNO,"
cQuery += " E5_BANCO, E5_AGENCIA, E5_CONTA, E5_DTDISPO, E5_TIPODOC, E5_MOEDA,"
cQuery += " E5_NUMCHEQ, E5_MOTBX, E5_NUMERO, E5_RECPAG, E5_VALOR, E5_DOCUMEN"
cQuery += " FROM " + RetSqlName("SA6") + " SA6, " + RetSqlName("SE5") + " SE5"
cQuery += " WHERE A6_FILIAL = '" + xFilial("SA6") + "'"
cQuery += " AND
A6_COD
between '" + mv_par01 + "' AND '" + mv_par02 + "'"
cQuery += " AND
A6_AGENCIA between '" + mv_par03 + "' AND '" + mv_par04 + "'"
cQuery += " AND
A6_NUMCON between '" + mv_par05 + "' AND '" + mv_par06 + "'"
cQuery += " AND
SA6.D_E_L_E_T_ <> '*'"
cQuery += " AND
E5_VENCTO <= E5_DATA"
cQuery += " AND
A6_COD
= E5_BANCO"
cQuery += " AND
A6_AGENCIA = E5_AGENCIA"
cQuery += " AND
A6_NUMCON = E5_CONTA"
cQuery += " AND
E5_SITUACA <> 'C'"
cQuery += " AND
E5_TIPODOC <> 'BA'"
cQuery += " AND
SE5.D_E_L_E_T_ <> '*'"
If Empty(xFilial( "SA6")) .AND. !Empty(xFilial("SE5"))
cQuery += " AND E5_DTDISPO >= '" + dtos(mv_par07) + "'"
//O filtro de filial entre ' ' e 'ZZ' foi adicionado para o SQL utilizar indice
cQuery += " AND E5_FILIAL between ' ' AND 'ZZ'"
Else
cQuery += " AND E5_DTDISPO >= '" + dtos(mv_par07) + "' AND E5_FILIAL = '" +
xFilial("SE5") + "'"
Endif
cQuery += " ORDER BY E5_BANCO, E5_AGENCIA, E5_CONTA, E5_DTDISPO"
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,"TOPCONN",TcGenQry(,,cQuery),'TRB210',.T.,.T.)
TcSetField("TRB210", "E5_DTDISPO", "D")
While !Eof()
dbSelectArea("TRB210")
cBanco
:= E5_BANCO
cAgencia := E5_AGENCIA
cConta
:= E5_CONTA
nSaldoIni:= 0
nEntradas:= 0
nSaidas := 0
+---------------------------------------------------------+
| Localiza Saldo de Partida.
|
| Observe que o programa retorna um registro no banco de |
| dados, portanto a data de referencia a data em que
|
| o saldo ficou errado, nao a data correta do saldo.
|
+---------------------------------------------------------+
dbSelectArea( "SE8" )
dbSeek( cFilial+cBanco+cAgencia+cConta+Dtos(mv_par07),.T. )
dbSkip( -1 )
If E8_BANCO != cBanco .or. E8_AGENCIA != cAgencia .or. E8_CONTA != cConta .or.
BOF() .or. EOF()
nSaldoIni := 0
Else
nSaldoIni := E8_SALATUA
Endif
+----------------------------------------------------------------+
| Localiza movimentacao bancaria
|
+----------------------------------------------------------------+
dbSelectArea("TRB210")
While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA == cBanco+cAgencia+cConta
dDataMovto := E5_DTDISPO
While !Eof() .and. E5_BANCO+E5_AGENCIA+E5_CONTA+DTOS(E5_DTDISPO) == ;
cBanco+cAgencia+cConta+dtos(dDataMovto)
IF E5_TIPODOC $ "DC/JR/MT/CM/D2/J2/M2/C2/V2/CP/TL" //Valores de Baixas
dbSkip()
Loop
Endif
If E5_MOEDA $ "C1/C2/C3/C4/C5" .and. Empty(E5_NUMCHEQ)
dbSkip()
Loop
Endif
+---------------------------------------------------------------+
| Na transferencia somente considera nestes numerarios
|
AdvPl________________________________________________________________135
| No Fina100 tratado desta forma.
|
| As transferencias TR de titulos p/ Desconto/Cauo (FINA060) |
| no sofrem mesmo tratamento dos TR bancarias do FINA100
|
+---------------------------------------------------------------+
If E5_TIPODOC $ "TR/TE" .and. Empty(E5_NUMERO)
If !(E5_MOEDA $ "R$/DO/TB/TC/CH")
dbSkip()
Loop
Endif
Endif
If E5_TIPODOC $ "TR/TE" .and. (Substr(E5_NUMCHEQ,1,1)=="*" ;
.or. Substr(E5_DOCUMEN,1,1) == "*" )
dbSkip()
Loop
Endif
If E5_MOEDA == "CH" .and. IsCaixaLoja(E5_BANCO) //Sangria
dbSkip()
Loop
Endif
If SubStr(E5_NUMCHEQ,1,1)=="*"
//cheque para juntar (PA)
dbSkip()
Loop
Endif
If !Empty(E5_MOTBX)
If !MovBcoBx(E5_MOTBX)
dbSkip()
Loop
Endif
Endif
If E5_RECPAG = "R"
nEntradas += E5_VALOR
Else
nSaidas += E5_VALOR
Endif
dbSkip()
End // Quebra da data
dbSelectArea("SE8")
dbSeek(cFilial+cBanco+cAgencia+cConta+Dtos(dDataMovto))
IF Eof()
RecLock("SE8",.t.)
Else
RecLock("SE8",.f.)
Endif
Replace E8_FILIAL
With cFilial,;
E8_BANCO
With cBanco,;
E8_AGENCIA With cAgencia,;
E8_CONTA
With cConta,;
E8_DTSALATU With dDataMovto
Replace E8_SALATUA With nSaldoIni+nEntradas-nSaidas
MsUnlock()
dbSelectArea("TRB210")
IF !(TRB210->(Eof())) .and. E5_BANCO+E5_AGENCIA+E5_CONTA ==
cBanco+cAgencia+cConta
For nData := dDataMovto+1 to ((E5_DTDISPO) - 1)
dbSelectArea("SE8")
If dbSeek(cFilial + cBanco+cAgencia+cConta+dtos(nData))
RecLock("SE8",.F.,.T.)
dbDelete()
MsUnlock()
SX2->(MsUnlock())
EndIf
dbSelectArea("TRB210")
Next
Endif
If TRB210->(Eof()) .or. E5_BANCO+E5_AGENCIA+E5_CONTA !=
cBanco+cAgencia+cConta
dbSelectArea("SE8")
dbSeek(cFilial+cBanco+cAgencia+cConta+dtos(dDataMovto+1),.t.)
While !Eof() .and. cFilial+cBanco+cAgencia+cConta == ;
E8_FILIAL+E8_BANCO+E8_AGENCIA+E8_CONTA
RecLock("SE8",.F.,.T.)
AdvPl________________________________________________________________136
dbDelete()
MsUnlock()
SX2->(MsUnlock())
dbselectArea("SE8")
dbSkip()
Enddo
Endif
dbSelectArea("TRB210")
Enddo // Fecha Primeiro Loop do SE5
dbSelectArea("SA6")
If dbSeek( xFilial("SA6")+cBanco+cAgencia+cConta)
RecLock("SA6")
Replace A6_SALATU With nSaldoIni+nEntradas-nSaidas
MsUnLock()
EndIf
dbSelectArea("TRB210")
dbSkip()
Enddo
dbSelectArea("TRB210")
dbCloseArea()
Return NIL
#ENDIF
AdvPl________________________________________________________________137
AAdd
Adiciona um novo elemento ao final do array.
Sintaxe
AADD( aAlvo, expValor ) --> Valor
Argumento
Obrigat.
Tipo
Descrio
aAlvo
Sim
expValor
Sim
Todos
Retorno
Descrio
AADD()
avalia expValue e retorna seu Valor. Se expValue no for especificado, AADD() retorna NIL.
Descrio
AADD() uma funo de array que incrementa o tamanho real do array aAlvo em um. O elemento de
array recentemente criado atribudo o Valor especificado por expValue.
AADD() usado para aumentar dinmicamente uma array. til para listas ou filas criadas
dinamicamente.
Um exemplo bom deste o GetList, array usada pelo sistema para armazenar objetos do tipo Get. Depois
que um READ ou CLEAR GETS executado, a GetList ficar vazia. Cada vez que voc executa um
comando @...GET, o sistema usa AADD() para adicionar um novo elemento array GetList, e atribui ento
um novo objeto GET ao novo elemento.
AADD() similar a ASIZE(), mas apenas adiciona um elemento por vez; ASIZE() pode incrementar ou
decrementar uma array a um determinado tamanho. AADD(), entretanto, tm a vantagem de poder
atribuir um valor ao elemento recentemente adicionado, enquanto que ASIZE() no pode. AADD() pode
tambm parecer similar a AINS(), mas diferente: AINS() move elementos dentro de uma disposio,
mas os ele no muda o tamanho.
Se expValue for uma outra array, o novo elemento em aAlvo conter uma referncia array
especificada por expValue.
AdvPl________________________________________________________________138
Exemplos
aArray := {} // Resultado: aArray is an empty array
AADD(aArray, 5) // Resultado: aArray is { 5 }
AADD(aArray, 10) // Resultado: aArray is { 5, 10 }
AADD(aArray, { 12, 10 }) // Resultado: aArray is
// { 5, 10, { 12, 10 } }
ACopy
Obrigat.
Tipo
Descrio
aOrigem
Sim
aDestino
Sim
nInicio
No
nQtde
No
nPosDestino
N
Retorno
ACOPY()
Descrio
retorna uma referncia ao array aDestino.
Descrio
ACOPY() uma funo de array que copia elementos do array aOrigem para array aDestino. O array
destino aDestino j deve ter sido declarado e grande o bastante para conter os elementos que sero
copiados.
AdvPl________________________________________________________________139
Se o array aOrigem contiver mais elementos, alguns dos elementos no sero copiados. ACOPY() copia os
valores de todos os dados, incluindo valores nulos (NIL) e cdigos de bloco.
Exemplos
Este exemplo cria dois arrays, com um contedo cada. Os dois primeiros elementos do array
fonte so ento copiados no array destino:
LOCAL nCount := 2, nStart := 1, aOne, aTwo
aOne := { 1, 1, 1 }
aTwo := { 2, 2, 2 }
ACOPY(aOne, aTwo, nStart, nCount)
// Result: aTwo is now { 1, 1, 2 }
AClone
Duplica arrays aninhadas ou multi-dimensionais.
Sintaxe
ACLONE( aOrigem ) --> aDuplicado
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
Retorno
Descrio
aDuplicado
Descrio
ACLONE() uma funo de array, que cria duplicatas completas do array aSource. Se aSource contiver
arrays aninhadas, ACLONE() criar o mesmo padro de aninhamento preenchendo com cpias dos valores
contidos em aSource.
Exemplos
LOCAL aOne, aTwo, aThree
aOne := { 1, 2, 3 } // Resultado: aOne is {1, 2, 3}
aTwo := ACLONE(aOne) // Resultado: aTwo is {1, 2, 3}
AdvPl________________________________________________________________140
aThree := aOne
// Resultado: aThree is {1, 2, 3}
aOne[1] := 99 // Result: aOne is {99, 2, 3}
// aTwo continua {1, 2, 3} mais o aThree fica { 99, 2, 3 }
ADel
Exclui um elemento de um array.
Sintaxe
ADEL( aOrigem, nPos) --> aOrigem
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
nPos
Sim
Retorno
Descrio
ADEL()
Descrio
ADEL() uma funo de manipulao que elimina uma posio do array, deslocando as posies
posteriores. A ltima posio do array passa a ter o contedo NIL.
Exemplos
LOCAL aArray
aArray := { 1, 2, 3 } // Resultado: { 1, 2, 3 }
ADEL(aArray, 2) // Resultado: { 1, 3, NIL }
ADir
Preenche vrios arrays com informaes de arquivos e diretrios.
Sintaxe
ADIR([ cArqEspec ], [ aNomeArq ], [ aTamanho ], [ aData ], [ aHora ], [ aAtributo ]) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
AdvPl________________________________________________________________141
cArqEspec
No
aNomeArq
No
aTamanho
No
aData
No
aHora
No
aAtributos
No
Retorno
Descrio
>=0
Descrio
ADir() preenche os arrays passados com os dados dos arquivos encontrados, atravs da mscara
informada. Tanto arquivos locais (Remote) como do servidor podem ser informados. ADir uma funo
obsoleta, utilize sempre Directory().
Exemplos
LOCAL aFiles[ADIR("*.TXT")]
ADIR("*.TXT", aFiles)
AEVAL(aFiles, { |element| QOUT(element) })
AEval
Executa um code block para cada elemento de um array.
Sintaxe
AEVAL( aArray, bBloco, [ nInicio ], [ nQtde]) --> aArray
Argumento
Obrigat.
Tipo
Descrio
aArray
Sim
AdvPl________________________________________________________________142
bBlock
Sim
Bloco de cdigo
nInicio
No
nQtde
No
Retorno
Descrio
AEVAL()
Descrio
AEVAL() executa um code block para cada elemento de um array, passando cada um como o parmetro
do bloco. muito semelhante ao DBEVAL().
AEVAL() passa cada elemento de um array para o code block sem se preocupar com o tipo.
Exemplos
// Exemplo 1
#include "Directry.ch"
//
LOCAL aFiles := DIRECTORY("*.dbf"), nTotal := 0
AEVAL(aFiles,{ | aDbfFile | QOUT(PADR(aDbfFile[F_NAME], 10), aDbfFile[F_SIZE]),;
nTotal += aDbfFile[F_SIZE]);
} )
//
?
? "Total Bytes:", nTotal
// Exemplo 2
#include "Directry.ch"
//
LOCAL aFiles := DIRECTORY("*.dbf"), aNames := {}
AEVAL(aFiles, { | file | AADD(aNames, file[F_NAME]) } )
//Exemplo 3
LOCAL aArray[6]
AFILL(aArray,"old")
AEVAL(aArray,;
{|cValue,nIndex| IF(cValue == "old",;
aArray[nIndex] := "new",)})
EVAL()
DBEVAL()
AFill
AdvPl________________________________________________________________143
Preenche um array com um determinado valor.
Sintaxe
AFILL( aDestino , expValor, [ nInicio ], [ nQuantidade ]) --> aDestino
Argumento
Obrigat.
Tipo
Descrio
aDestino
Sim
expValor
Sim
Todos
[nInicio]
No
[nCount]
No
Retorno
Descrio
AFILL()
Descrio
AFILL() funo de manipulao de arrays, que preenche os elementos do array com qualquer tipo de
dado. Incluindo code block.
Afill() no deve ser usado para preencher um array com outro array.
Exemplos
LOCAL aLogic[3]
// Resultado: aLogic { NIL, NIL, NIL }
AFILL(aLogic, .F.)
// Resultado: aLogic { .F., .F., .F. }
AFILL(aLogic, .T., 2, 2)
// Resultado: aLogic { .F., .T., .T. }
AIns
Insere um elemento com contedo NIL em um array.
Sintaxe
AdvPl________________________________________________________________144
AINS( aOrigem, nPos ) --> aIns
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
nPos
Sim
Retorno
Descrio
AINS()
Descrio
AINS() um funo de manipulao de array que insere um elemento na posio determinada por nPos.
O novo elemento possui contedo igual a NIL. Aps a insero, o ltimo elemento ser excludo.
Alias
Verifica qual o Alias.
Sintaxe
ALIAS([ nAreaTrab ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
nAreaTrab
No
Retorno
Descrio
""
cAlias
AdvPl________________________________________________________________145
Descrio
Verifica qual o Alias de determinada rea de trabalho; se ela no foi especificada, ser verificado qual o
Alias da rea de trabalho corrente. O Alias definido quando a tabela aberta atravs do parmetro
correspondente (DBUSEAREA()).
Esta funo o inverso da funo
Alias correspondente.
SELECT(),
Exemplo
// Este exemplo mostra como o Alias corrente pode ser apresentado para o usurio.
dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
MessageBox("O Alias corrente : " + Alias(), "Alias", 0)
// Resultado: "O Alias
corrente : SSS"
Append From
Importa registros de outra tabela ou arquivo texto.
Sintaxe
APPEND FROM Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD
nRecno] [REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ]
Argumento
Obrigat.
Arquivo
Sim
Campos
No
CondFor
No
CondWhile
No
nRecs
No
nRecno
No
RDD
No
cDelimitador
No
Tipo
Descrio
Descrio
Este comando utilizado para copiar alguns registros do arquivo especificado por "FROM cArquivo"
utilizando-se o driver especificado por "VIA RDD" se especificado.
AdvPl________________________________________________________________146
Se forem especificados os campos de interesse atravs de "FIELDS Campos", apenas eles sero copiados,
caso contrrio todos campos o sero. Se no forem especificadas as condies para que o registro seja
copiado, copia toda a tabela como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR CondFor" e
"WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem copiados atravs da opo
"NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a partir do registro atual com "REST",
mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a cpia. Se desejado copiar
apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".
Alm de copiar registros de uma tabela normal, pode-se copiar registros de um arquivo texto que
contenha os dados desejados. Existem duas formas de gerar estes arquivos textos com COPY TO,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos)
ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do
arquivo texto atravs das opes "SDF" ou "DELIMITED".
Pode-se ainda especificar qual o delimitador utilizado nas strings da seguinte forma:
").
Exemplo
// Este exemplo demonstra como utilizar o comando APPEND FROM para acrescentar alguns
campos de registros (apenas 10 registros) de outra tabela pertencentes a um escopo
definido a partir do registro atual para a tabela corrente:
USE Cliente VIA "CTREECDX" NEW
APPEND FROM Amigos FIELDS Nome,Nascimento,End,Tel FOR Idade>20 WHILE Nome<"VVV" NEXT 10
REST
// Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gravar os dados
de uma tabela em um arquivo do tipo texto (DELIMITED) e inclu-los a outra tabela com o
comando APPEND FROM:
USE Amigos NEW
COPY TO temp DELIMITED // Registro: "Jose",19751108,69411233,12.00
COPY TO temp1 DELIMITED WITH BLANK // Registro: Jose 19751108 69411233 12.00
COPY TO temp2 DELIMITED WITH "@" // Registro: @Jose@,19751108,69411233,12.00
USE Cliente NEW
APPEND FROM temp DELIMITED
USE Cliente1 NEW
APPEND FROM temp1 DELIMITED WITH BLANK
USE Cliente2 NEW
APPEND FROM temp2 DELIMITED WITH "@"
// Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gravar os dados
de uma tabela em um arquivo do tipo texto (SDF) e inclu-los a outra tabela com o comando
APPEND FROM:
USE Amigos NEW
COPY TO temp3 SDF // Registro: Jose
1975110869411233 12.00
USE Cliente3 NEW
APPEND FROM temp3 SDF
AdvPl________________________________________________________________147
Array
Cria um array com dados no inicializados.
Sintaxe
ARRAY( nQtdElementos1 , [ nQtdElementosn ]...) --> aArray
Argumento
Obrigat.
Tipo
Descrio
nQtdElementos1
Sim
[nQtdElementosN]
No
Retorno
Descrio
ARRAY()
Descrio
Array() uma funo que retorna um array no inicializado com mltiplas dimenses.
A vantagem de utilizar ARRAY(), ao invs de outras opes, a possibilidade de us-la em code blocks e
expresses.
Exemplo
// Exemplo 1 - Dois mtodos idnticos.
aArray := ARRAY(5)
aArray := { NIL, NIL, NIL, NIL, NIL }
// Mtodos equivalentes.
aArray := ARRAY(3, 2)
aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} }
aArray := { ARRAY(2), ARRAY(2), ARRAY(2) }
AScan
Busca em um array at que o bloco retorne verdadeiro .T.
Sintaxe
AdvPl________________________________________________________________148
ASCAN( aOrigem, expSearch, [ nStart ], [ nCount ]) --> nStoppedAt
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
<expSearch>
Sim
Todos
Argumento Descrio
<aOrigem> Obrigatrio, Array. o array onde ser executada a expresso.
<expSearch> Obrigatrio, Qualquer Tipo. Casis either a simple value to scan for, or a code block.
If <expSearch> is a simple value it can be character, date, logical, or
numeric type.
<nStart> is the starting element of the scan. If this argument is
not specified, the default starting position is one.
<nCount> is the number of elements to scan from the starting
position. If this argument is not specified, all elements from the
starting element to the end of the array are scanned.
Returns
ASCAN() returns a numeric value representing the array position of thelast element scanned. If
<expSearch> is a simple value, ASCAN() returnsthe position of the first matching element, or zero if a
match is notfound. If <expSearch> is a code block, ASCAN() returns the position ofthe element where the
block returned true (.T.).
Description
ASCAN() is an array function that scans an array for a specified valueand operates like SEEK when
searching for a simple value. The<expSearch> value is compared to the target array element beginning
withthe leftmost character in the target element and proceeding until thereare no more characters left in
<expSearch>. If there is no match,ASCAN() proceeds to the next element in the array.Since ASCAN()
uses the equal operator (=) for comparisons, it issensitive to the status of EXACT. If EXACT is ON, the
target arrayelement must be exactly equal to the result of <expSearch> to match.If the <expSearch>
argument is a code block, ASCAN() scans the <aTarget>array executing the block for each element
accessed. As each element isencountered, ASCAN() passes the element's value as an argument to thecode
block, and then performs an EVAL() on the block. The scanningoperation stops when the code block
returns true (.T.), or ASCAN()reaches the last element in the array.
Examples
This example demonstrates scanning a three-element array using
simple values and a code block as search criteria. The code block
criteria shows how to perform a case-insensitive search:
aArray := { "Tom", "Mary", "Sue" }
? ASCAN(aArray, "Mary") // Result: 2
AdvPl________________________________________________________________149
? ASCAN(aArray, "mary") // Result: 0
//
? ASCAN(aArray, { |x| UPPER(x) ;
== "MARY" }) // Result: 2
This example demonstrates scanning for multiple instances of a
search argument after a match is found:
LOCAL aArray := { "Tom", "Mary", "Sue",;
"Mary" }, nStart := 1
//
// Get last array element position
nAtEnd := LEN(aArray)
DO WHILE (nPos := ASCAN(aArray, "Mary", ;
nStart)) > 0
? nPos, aArray[nPos]
//
// Get new starting position and test
// boundary condition
IF (nStart := ++nPos) > nAtEnd
EXIT
ENDIF
ENDDO
This example scans a two-dimensional array using a code block.
Note that the parameter aVal in the code block is an array:
LOCAL aArr:={}
CLS
AADD(aArr,{"one","two"})
AADD(aArr,{"three","four"})
AADD(aArr,{"five","six"})
? ASCAN(aArr, {|aVal| aVal[2] == "four"}) // Returns 2
See Also
AEVAL()
EVAL()
AdvPl________________________________________________________________150
ASize
Acrescenta ou reduz elementos de um array.
Sintaxe
ASIZE( aOrigem , nNovoTamanho ) --> aOrigem
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
nNovoTamanho
Sim
Retorno
Descrio
ASIZE()
Descrio
ASIZE() uma funo de manipulao de array que aumenta ou diminui o tamanho de um array.
No caso de diminuio, os ltimos elementos sero apagados, em caso de aumento de tamanho, os novos
elementos tero contedo NIL.
Exemplos
aArray := { 1 } // Resultado: aArray is { 1 }
ASIZE(aArray, 3) // Resultado: aArray is { 1, NIL, NIL }
ASIZE(aArray, 1) // Resultado: aArray is { 1 }
ASort
Ordena um array.
Sintaxe
ASORT( aOrigem, [ nInicio ], [ nQtde ], [ bOrdem ]) --> aOrigem
Argumento
Obrigat.
Tipo
Descrio
aOrigem
Sim
AdvPl________________________________________________________________151
nInicio
nQtde
bOrder
No
No
No
Quantidade
de
elementos
que
sero
ordenados a partir do nInicio. Caso seja
omitido, sero considerados todos elementos
at o final do Array.
Bloco de cdigo
Retorno
Descrio
ASORT()
Descrio
ASORT() uma funo de manipulao de array que classifica todo ou parcialmente um array de tipo
simples. Os tipos que podem ser classificados automaticamente so: caracter, data, lgico e numrico.
Caso bOrder seja especificado, o code block ser usado para ordernar o array, neste caso, pode-se usar
dados de qualquer tipo. Cada vez que o bloco for avaliado, sero passados dois elementos do array, caso
eles estejam em ordem, deve-se retornar .T.
Exemplos
// Exemplo 1
aArray := { 3, 5, 1, 2, 4 }
ASORT(aArray)
// Resultado: { 1, 2, 3, 4, 5 }
ASORT(aArray,,, { |x, y| x > y })
// Resultado: { 5, 4, 3, 2, 1 }
//Exemplo 2
aArray := { "Fred", Kate", "ALVIN", "friend" }
ASORT(aArray,,, { |x, y| UPPER(x) < UPPER(y) })
//Exemplo 3
aKids := { {"Mary", 14}, {"Joe", 23}, {"Art", 16} }
aSortKids := ASORT(aKids,,, { |x, y| x[2] < y[2] })
Resultado:
{ {"Mary", 14}, {"Art", 16}, {"Joe", 23} }
ATail
Retorna o ltimo elemento de um array
Sintaxe
ATAIL( aArray ) --> Element
AdvPl________________________________________________________________152
Argumento
Obrigat.
Tipo
Descrio
aArray
Sim
Retorno
Descrio
ATAIL()
Descrio.
ATAIL() uma funo de manipulao de array que retorna o ltimo elemento de um array. Ela deve ser
usada em substituio da seguinte construo: aArray [LEN( aArray )]
Exemplos
aArray := {"a", "b", "c", "d"}
? ATAIL(aArray) // Resultado: d
BTVCanOpen
Verifica se a tabela BTrieve pode ser aberta.
Sintaxe
BTVCanOpen( cNome , [ cIndice ])->Lgico
Argumento
Obrigat.
Tipo
Descrio
cNome
Sim
cIndice
No
Retorno
Descrio
.F.
.T.
Descrio
Esta funo verifica se a tabela definida pelo parmetro cNome pode ser aberta e, se existir, o parmetro
cIndice verifica, tambm, se o ndice pode ser aberto. Para tanto, testado se os arquivos envolvidos
existem fisicamente, caso afirmativo, verificado se as definies envolvidas so encontradas nos
arquivos do DDF's.
AdvPl________________________________________________________________153
Exemplo
// Este exemplo demonstra o uso tpico de BTVCanOpen(). Se no falhar, a tabela e o
ndice testados sero abertos. Se falhar, uma mensagem apresentada.
IF !BTVCanOpen("\dadosadv\aa1990.dat", "\dadosadv\ind1.ind")
Messagebox("No possvel abrir a tabela testada","Erro", 0)
BREAK
ELSE
Use "\dadosadv\aa1990.dat" SHARED NEW
OrdListAdd("\dadosadv\ind1.ind")
ENDIF
BTVCreateDDFs
Gera os arquivos de definies (DDFs) compatveis com outras ferramentas que manipulam arquivos
Btrieve (Crystal Reports).
Sintaxe
BTVCreateDDFs ( aTabelas , [ cDiretorio ])->Lgico
Argumento
Obrigat.
Tipo
Descrio
aTabelas
Sim
cDiretorio
No
Retorno
Descrio
.F.
.T.
Descrio
Esta funo transforma as informaes armazenadas nos arquivos DDF's para o padro utilizado por
outras ferramentas, principalmente para gerao de relatrios. Sendo que podem ser selecionadas apenas
as tabelas de interesse atravs do parmetro aTabelas.
AdvPl________________________________________________________________154
Os novos arquivos de definio, FILE.DDF, FIELD.DDF e INDEX.DDF, so gerados no diretrio especificado
pelo parmetro cDiretrio, se ele for omitido, sero gerados no mesmo diretrio dos SXs.
Exemplo
// Este exemplo demonstra o uso tpico de BTVCreateDDFs(). Se no falhar, sero gerados
os novos arquivos de definio. Se falhar, uma mensagem apresentada.
b:= {{"AA3990"}, {"SA1990", "c:\protheus507\dadosadv"}}
IF !BTVCreateDDFs(b, "\temp")
// Ser concatenado com o RootPath
Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0)
BREAK
ENDIF
BTVDropIdxs
Apaga os ndices da tabela corrente.
Sintaxe
BTVDropIdxs ()->Lgico
Retorno
Descrio
.F.
.T.
Descrio
A funo BTVDropIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for Btrieve e estiver aberto exclusivo. Para tanto ela executa os seguintes passos:
1.
2.
3.
Apaga os ndices do arquivo da tabela corrente. Todos os ndices criados de forma permanente
ficam guardados na estrutura da tabela. Quando a tabela for aberta, todos os ndices criados de
forma permanente e o ndice interno sero abertos tambm. Por isso, recomendada a criao de
ndices de forma temporria.
Exemplo
// Este exemplo demonstra o uso tpico de BTVDropIdxs(). Se no falhar, os ndices so
apagados e o processo continua. Se falhar, uma mensagem apresentada.
USE Clientes SHARED NEW
IF !BTVDropIdxs()
Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0)
BREAK
ENDIF
AdvPl________________________________________________________________155
BTVTables
Retorna array composto por nomes das tabelas definidas no DDF do Protheus (FILE.BTV).
Sintaxe
BTVTables ()-->Array
Retorno
Descrio
NIL
Array
Descrio
Verifica todos os nomes das tabelas armazenados no arquivo FILE.BTV do DDF e retorna um array com
todos eles. Toda tabela criada possui o nome acrescentado neste arquivo de definies.
Exemplo
// Este exemplo demonstra o uso tpico de BTVTables(). Se no falhar, montado um array
com os nomes das tabelas e esses nomes so mostrados no servidor. Se falhar, uma mensagem
apresentada.
a:= BTVTables()
IF a=Nil
Messagebox("No foi possvel montar o array com os nomes das tabelas","Erro", 0)
BREAK
ELSE
FOR i:= 1 to LEN(a)
ConOut(a[i])
NEXT
ENDIF
CDow
Converte uma data para uma cadeia de caracteres contendo o dia da semana.
Sintaxe
CDOW( dExp ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
dExp
Sim
a data a converter.
AdvPl________________________________________________________________156
Retorno
Descrio
Caracter
""
Descrio
CDOW() uma funo que converte uma data para uma cadeia de caracteres.
Exemplos
dData := DATE()
cDiaDaSemana :=
cDiaDaSemana :=
cDiaDaSemana :=
// Resultado: 09/01/90
CDOW(DATE()) // Resultado: Friday
CDOW(DATE() + 7) // Resultado: Friday
CDOW(CTOD("06/12/90")) // Resultado: Tuesday
CMonth
Converte uma data para uma cadeia de caracteres contento o nome do ms.
Sintaxe
CMONTH( dData ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
dData
a data a converter.
Retorno
Descrio
Caracter
""
Descrio
CMONTH() uma funo de converso de datas que retorna uma cadeia de caracteres com o nome do
ms em ingls.
Exemplos
Estes exemplos ilustram CMONTH():
cMes
cMes
cMes
cMes
:=
:=
:=
:=
AdvPl________________________________________________________________157
Commit
Salva em disco as modificaes de todas as tabelas.
Sintaxe
COMMIT
Descrio
Este comando salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
Exemplo
// Este exemplo demonstra como se pode utilizar o COMMIT para salvar todas as alteraes
realizadas nas reas de trabalho abertas no momento.
USE Clientes NEW
DBGOTO(100)
Nome := "Jose"
USE Fornecedores NEW
DBGOTO(168)
Nome := "Joao"
COMMIT// Salva em disco as alteraes realizadas nas tabelas Clientes e Fornecedores
Copy To
Copia registros da tabela corrente para uma nova tabela.
Sintaxe
COPY TO Arquivo [FIELDS Campos] [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno]
[REST] [ALL] [VIA RDD] [SDF | DELIMITED [WITH BLANK | cDelimitador] ]
Argumento
Obrigat.
Tipo
Descrio
Arquivo
Sim
Campos
No
CondFor
No
CondWhile
No
nRecs
No
nRecno
No
AdvPl________________________________________________________________158
RDD
No
cDelimitador
No
Descrio
Este comando utilizado para copiar alguns registros da tabela corrente para o arquivo especificado por
"TO cArquivo" utilizando-se o driver especificado por "VIA RDD" se especificado. Se forem especificados os
campos de interesse atravs de "FIELDS Campos" apenas eles sero copiados, caso contrrio todos
campos o sero. Se no forem especificadas as condies para que o registro seja copiado, copia toda a
tabela como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam copiados atravs das opes "FOR CondFor" e
"WHILE CondWhile". Pode-se tambm limitar o nmero de registros a serem copiados atravs da opo
"NEXT nRecs" e determinar que a cpia dos registros deve-se iniciar a partir do registro atual com "REST",
mas caso contrrio o comando executa um DBGOTOP() antes de iniciar a cpia. Se desejado copiar
apenas determinado registro pode-se defini-lo atravs da especificao do recno com "RECORD nRecno".
Alm de copiar registros para uma tabela normal, pode-se copiar registros para um arquivo texto que
contenha os dados desejados. Existem duas formas de gerar estes arquivos textos com COPY TO,
utilizando-se o SDF que trabalha com tamanhos de registros e campos fixos (preenchendo com espaos)
ou atravs de um delimitador que separa os campos",". Deve-se especificar na cpia qual o tipo do
arquivo texto atravs das opes "SDF" ou "DELIMITED". Pode-se ainda especificar qual o delimitador
utilizado nas strings da seguinte forma:
").
Exemplo
// Este exemplo demonstra como utilizar o comando COPY TO criar nova tabela com alguns
campos escolhidos e alguns registros (apenas 10) da tabela atual pertencentes a um escopo
definido a partir do registro atual para determinada tabela:
USE Cliente VIA "CTREECDX" NEW
COPY TO Amigos FIELDS Nome,Nascimento,End,Tel FOR Idade>20 WHILE Nome<"VVV" NEXT 10 REST
// Este exemplo demonstra como se pode utilizar o comando COPY TO para gravar os dados de
uma tabela em um arquivo do tipo texto (DELIMITED) e inclu-los a outra tabela com o
comando APPEND FROM:
USE Amigos NEW
COPY TO temp DELIMITED // Registro: "Jose",19751108,69411233,12.00
COPY TO temp1 DELIMITED WITH BLANK // Registro: Jose 19751108 69411233 12.00
COPY TO temp2 DELIMITED WITH "@" // Registro: @Jose@,19751108,69411233,12.00
USE Cliente NEW
APPEND FROM temp DELIMITED
USE Cliente1 NEW
APPEND FROM temp1 DELIMITED WITH BLANK
USE Cliente2 NEW
APPEND FROM temp2 DELIMITED WITH "@"
// Este exemplo demonstra como se pode utilizar o comando <@>COPY TO para gravar os dados
de uma tabela em um arquivo do tipo texto (SDF) e inclu-los a outra tabela com o comando
APPEND FROM:
AdvPl________________________________________________________________159
USE Amigos NEW
COPY TO temp3 SDF // Registro: Jose
USE Cliente3 NEW
APPEND FROM temp3 SDF
1975110869411233
12.00
Copy File
Copia Arquivos.
Sintaxe
CopyFile( cOrigem, cDestino) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cOrigem
Sim
cDestino
Sim
Retorno
Descrio
NIL
Sem retorno.
Descrio
Copia um arquivo, da origem para o destino, os caracteres * e ?, so aceitos normalmente.
Caso a origem esteja no cliente e o destino no servidor os arquivos so copiados para o servidor, o
contrrio tambm valido.
Exemplo
__CopyFile( "C:\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos do cliente para o Servidor
__CopyFile( "\TEMP\*.DBF", "\BKP\*.DBF" ) // Copia arquivos no servidor
Copy Structure
Copia a estrutura da tabela corrente para uma nova tabela.
Sintaxe
AdvPl________________________________________________________________160
COPY STRUCTURE [FIELDS Campos] TO Arquivo
Argumento
Obrigat.
Campos
No
Arquivo
Sim
Tipo
Descrio
Lista dos campos a serem includos na nova tabela, se
omitido sero includos todos os campos.
Descrio
Este comando utilizado para criar nova tabela copiando a estrutura da tabela atual, sendo que pode-se
selecionar apenas os campos de interesse atravs da opo "FIELD Campos" que se omitida, deixa que o
comando copie toda a estrutura.
DBCREATE
Exemplo
// Este exemplo demonstra como utilizar o comando COPY STRUCTURE no seu modo mais usual:
USE Cliente NEW
COPY STRUCTURE FIELDS Nome,Idade TO NovoCliente
// Este exemplo demonstra como o comando COPY STRUCTURE pode substituir o DBCREATE:
USE Cliente NEW
COPY STRUCTURE TO NovoCliente
// *** semelhante a ***
USE Cliente NEW
DBCREATE("NovoCliente",DBSTRUCT())
CPYS2T
Copia arquivos do servidor para o cliente ( Remote ).
Sintaxe
CpyS2T( cOrigem, cDestino, [lCompacta]) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cOrigem
Sim
cDestino
Sim
lCompacta
No
no remote
AdvPl________________________________________________________________161
Retorno
Descrio
.T.
.F.
Descrio
Copia um arquivo, do servidor para o cliente ( Remote ), os caracteres * e ?, so aceitos normalmente.
Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de maneira compactada e
descompactados antes do uso.
Exemplo
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. ) // Copia arquivos do servidor para o remote
local, compactando antes de transmitir
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. ) // Copia arquivos do servidor para o remote
local, sem compactar antes de transmitir
CPYT2S
Copia Arquivos entre o Cliente ( Terminal ) para o servidor.
Sintaxe
CpyT2S( cOrigem, cDestino, [ lCompacta ]) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cOrigem
Sim
cDestino
Sim
lCompacta
No
Retorno
Descrio
.T.
.F.
Descrio
no remote
AdvPl________________________________________________________________162
Copia um arquivo, do cliente ( Remote ) para o servidor, os caracteres * e ?, so aceitos normalmente.
Caso a compactao seja habilitada ( lCompacta ), os dados sero transmitidos de maneira compacta e
descompactados antes do uso.
Exemplo
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP", .T. ) // Copia arquivos do cliente( remote ) para o
Servidor compactando antes de transmitir
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP" ) // Copia arquivos do cliente( remote ) para o
Servidor sem compactar.
CTreeDelIdxs
Deleta os ndices da tabela corrente.
Sintaxe
CTreeDelIdxs()->Lgico
Retorno
Descrio
.F.
.T.
Descrio
A funo CtreeDelIdxs apaga os ndices da tabela corrente, com exceo do ndice interno, apenas se
o mesmo for CTree e estiver exclusiva. Para tanto, ela executa os seguintes passos:
1.
2.
Fecha a tabela;
3.
4.
5.
Todos os ndices criados de forma permanente ficam guardados na estrutura da tabela. Portanto, no
adianta deletar os arquivos de ndices, pois quando a tabela for aberta, todos os ndices criados de forma
permanente e o ndice interno sero recriados fisicamente (se no existirem); caso contrrio, a tabela no
ser aberta. Por isso, recomendada a criao de ndices de forma temporria.
Exemplo
// Este exemplo demonstra o uso tpico de CtreeDelIdxs(). Se no falhar, os ndices so apagados e o
processo continua. Se falhar, uma mensagem apresentada.
AdvPl________________________________________________________________163
USE Clientes SHARED NEW
IF !CtreeDelIdxs()
Messagebox("No foi possvel deletar os ndices da tabela corrente","Erro", 0)
BREAK
ENDIF
CTreeDellnt
Deleta ndice interno da tabela CTree.
Sintaxe
CTreeDelInt( cNome )->Lgico
Argumento
Obrigat.
Tipo
Descrio
cNome
Sim
Retorno
Descrio
.F.
.T.
Descrio
A funo CtreeDelInt apaga o ndice interno de tabela Ctree, estando a mesma fechada. Para tanto,
so executados os seguintes procedimentos:
1.
2.
3.
Fecha a tabela;
4.
Deleta fisicamente o arquivo do ndice interno.
A tabela deve ser apagada aps a chamada desta funo, pois a tabela CTree no pode ser aberta sem
ndice interno.
Exemplo
// Este exemplo demonstra o uso tpico de CtreeDelInt(). Sendo que a tabela
"\DADOSADV\SA1990.DTC" deve estar fechada. Se no falhar, o ndice interno apagado e o
processo continua. Se falhar, uma mensagem apresentada.
IF !CtreeDelInt("\dadosadv\sa1990.dtc")
Messagebox("No foi possvel deletar o ndice da tabela","Erro", 0)
BREAK
ENDIF
fErase("\dadosadv\sa1990.dtc")
AdvPl________________________________________________________________164
CurDir
Retorna o diretrio corrente.
Sintaxe
CURDIR([ cNovoDir ]) --> cDirAtual
Argumento
Obrigat.
Tipo
Descrio
cNovoDir
No
Retorno
Descrio
cDirAtual
Descrio
Retorna o diretrio corrente do servidor, caso seja passado um caminho como parmetro, esse diretrio
passar a ser o default.
Exemplo
? CURDIR("C:\TEMP")
Date
Retorna a data do sistema.
Sintaxe
DATE() --> Data
Retorno
Descrio
Data
Data do sistema.
Descrio
DATE() a funo que retorna a data do atual sistema. O formato de sada controlado pelo comando
SET DATE. O formato padro mm/dd/yy.
Exemplos
Estes exemplos mostram como usar a funo DATE():
AdvPl________________________________________________________________165
dData := DATE() // Resultado: 09/01/01
dData := DATE() + 30 // Resultado: 10/01/01
dData := DATE() - 30 // Resultado: 08/02/90
dData := DATE()
cMes := CMONTH(dData) // Resultado: September
Day
Retorna o dia do ms como valor numrico.
Sintaxe
DAY( dData ) -->Numrico
Argumento
Obrigat.
Tipo
Descrio
dData
Sim
a data a converter.
Retorno
Descrio
>=0 e <=31
Descrio
DAY() uma funo de converso de datas usada para converter o valor data em um nmero inteiro que
representa o dia do ms.
YEAR()
Exemplos
Estes exemplos mostram a funo DAY() de diversas maneiras:
dData := DATE() // Resultado: 09/01/01
nDia := DAY(DATE()) // Resultado: 1
nDia := DAY(DATE()) + 1 // Resultado: 2
nDia := DAY(CTOD("12/01/94")) // Resultado: 1
Este exemplo mostra a funo DAY() usada em conjunto com CMONTH() e
YEAR() para formatar o valor da data:
dData := Date()
cData := CMONTH(dData) + STR(DAY(dData)) + "," + STR(YEAR(dData)) // Resultado: June 15,
2001
DBAppend
AdvPl________________________________________________________________166
Acrescenta um novo registro na tabela corrente.
Sintaxe
DBAppend ([ lLiberaBloqueios ]) ->Nil
Argumento
Obrigat.
Tipo
Descrio
lLiberaBloqueios
No
Descrio
Esta funo acrescenta mais um registro em branco no final da tabela corrente, sempre acrescentado e
bloqueado. Se o parmetro estiver com valor .T., todos os bloqueios de registros anteriores so liberados
para que o novo registro seja acrescentado, caso contrrio, se for .F., todos os bloqueios anteriores so
mantidos.
Exemplo
// Este exemplo demonstra como se pode utilizar o dbappend liberando e mantendo bloqueios
anteriores.
USE Clientes NEW
FOR i:=1 to 5
DBAPPEND(.F.)
NOME := "XXX"
END : "YYY"
NEXT
// Os 5 registros includos permanecem bloqueados
DBAPPEND()
// Todos os bloqueios anteriores so liberados
DBClearAllFilter
Limpa a condio de filtro de todas as ordem as ordens da lista.
Sintaxe
DBClearAllFilter() ->Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo salva as atualizaes realizadas e pendentes de todas as tabelas e depois limpa as condies
de filtro de todas as ordens inclusas na lista. Seu funcionamento oposto ao comando SET FILTER.
AdvPl________________________________________________________________167
Exemplo
// Este exemplo demonstra como se pode utilizar DBCLEARALLFILTER para limpar a expresso
de filtro.
USE Clientes NEW
DBSETFILTER( {|| Idade < 40}, "Idade < 40" ) // Seta a expresso de filtro
...
DBCLEARALLFILTER() // Limpa a expresso de filtro de todas as ordens
DBClearFilter
Limpa a condio de filtro.
Sintaxe
DBClearFilter () ->Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo salva as atualizaes realizadas e pendentes na tabela corrente e depois limpa todas as
condies de filtro da ordem ativa no momento. Seu funcionamento oposto ao comando SET FILTER.
Exemplo
// Este exemplo demonstra como se pode utilizar DBCLEARFILTER para limpar a expresso de
filtro.
USE Clientes NEW
DBSETFILTER( {|| Idade < 40}, "Idade < 40" ) // Seta a expresso de filtro
...
DBCLEARFILTER() // Limpa a expresso de filtro
DBCloseAll
Fecha todas as tabelas abertas.
Sintaxe
DBCloseAll () ->Nil
Retorno
NIL
Descrio
Nenhum
AdvPl________________________________________________________________168
Descrio
Esta funo salva as atualizaes pendentes, libera todos os registros bloqueados e fecha todas as tabelas
abertas (reas de trabalho) como se chamasse DBCLOSEAREA para cada rea de trabalho.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBCLOSEALL para fechar a rea de
trabalho atual.
USE Clientes NEW
DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome"
USE Fornecedores NEW
DBSETINDEX("Idade") // Abre o arquivo de ndice "Idade"
...
DBCLOSEALL() // Fecha todas as reas de trabalho, todos os indices e ordens
DBCloseArea
Fecha a rea de trabalho.
Sintaxe
DBCloseArea () ->Nil
Retorno
NIL
Descrio
Nenhum
Descrio
Esta funo salva as atualizaes pendentes na tabela corrente, libera todos os registros bloqueados e
fecha a tabela corrente (rea de trabalho). Seu funcionamento semelhante ao comando CLOSE e
oposto funo DBUSEAREA e ao comando USE.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBCLOSEAREA para fechar a rea de
trabalho atual.
USE Clientes NEW
DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome"
...
DBCLOSEAREA() // Fecha a rea de trabalho atual, todos os indices e ordens
DBClearIndex
Fecha todos os arquivos de ndice da rea de trabalho.
Sintaxe
DBClearIndex () ->Nil
AdvPl________________________________________________________________169
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo salva as atualizaes pendentes na tabela corrente e fecha todos os arquivos de ndice da
rea de trabalho, por conseqncia limpa todas as ordens da lista. Seu funcionamento oposto ao
comando <@>SET INDEX.
Exemplo
// Este exemplo demonstra como se pode utilizar a funo DBCLEARINDEX para fechar os
ndices.
USE Clientes NEW
DBSETINDEX("Nome") // Abre o arquivo de ndice "Nome"
...
DBCLEARINDEX() // Fecha todos os arquivos de ndices
DBCommit
Salva em disco todas as modificaes da tabela corrente.
Sintaxe
DBCommit() ->Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo salva em disco todas as atualizaes pendentes na rea de trabalho corrente.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBCOMMIT para salvar todas as
alteraes realizadas na rea de trabalho atual.
USE Clientes NEW
DBGOTO(100)
Nome := "Jose"
USE Fornecedores NEW
DBGOTO(168)
Nome := "Joao"
DBCOMMIT() // Salva em disco apenas as alteraes realizadas na tabela Fornecedores
AdvPl________________________________________________________________170
DBCommitAll
Salva em disco todas as modificaes.
Sintaxe
DBCommitAll () ->Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo salva em disco todas as atualizaes pendentes em todas as reas de trabalho.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBCOMMITALL para salvar todas as
alteraes realizadas nas reas de trabalho abertas no momento.
USE Clientes NEW
DBGOTO(100)
Nome := "Jose"
USE Fornecedores NEW
DBGOTO(168)
Nome := "Joao"
DBCOMMITALL() // Salva em disco as alteraes realizadas nas tabelas Clientes e
Fornecedores
DBCreate
Cria nova tabela.
Sintaxe
DBCREATE( cNome , aEstrutura , [ cDriver ]) --> Nil
Argumento
Obrigat.
Tipo
cNome
aEstrutura
Array
cDriver
Nome do RDD a ser utilizado para a criao da tabela. Se for omitido ser
criada com o corrente.
Retorno
Descrio
NIL
Nenhum
Descrio
AdvPl________________________________________________________________171
Descrio
Esta funo utilizada para criar um novo arquivo de tabela cujo nome est especificado atravs do
primeiro parmetro (cNome) e estrutura atravs do segundo (aEstrutura).
A estrutura especificada atravs de um array com todos os campos, onde cada campo expresso
atravs de um array contendo {Nome, Tipo, Tamanho, Decimais}, como visto no exemplo a seguir.
Exemplo
// Este exemplo mostra como se pode criar novo arquivo de tabela atravs da funo
DBCREATE:
LOCAL aEstrutura := {{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto, N,7,2}}
DBCREATE("\teste\amigos.xxx",aEstrutura) // Cria a tabela com o RDD corrente
USE "\teste\amigos.xxx" VIA "DBFCDX" NEW
DBCreateIndex
Cria um arquivo de ndice.
Sintaxe
DBCREATEINDEX( cNome , cExpChave , [ bExpChave ], [ lUnico ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
cNome
cExpChave
bExpChave
Bloco de Cdigo
lUnico
Retorno
Nil
Descrio
No h tabela corrente ou a posio do campo especificado est invlida.
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for tamanho
ou casas decimais, tipo caracter se for nome ou tipo).
Descrio
Esta funo utilizada para criar um novo arquivo de ndice com o nome especificado atravs do primeiro
parmetro, sendo que se o mesmo existir deletado e criado o novo. Para tanto so executados os passos
a seguir:
1.
2.
AdvPl________________________________________________________________172
3.
4.
5.
Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao
de ndice, pois na criao de ndices no Ctree alterada a estrutura da tabela, precisando para isto a
tabela estar aberta em modo exclusivo.
Exemplo
// Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem sobre os
campos Nome e End e no aceitar duplicao:
USE Cliente VIA "DBFCDX" NEW
DBCREATEINDEX ("\teste\ind2.cdx","Nome+End",{ || Nome+End },.T.)
DBDelete
Marca o arquivo corrente como deletado.
Sintaxe
DBDelete () ->Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo marca o arquivo corrente como deletado de modo semelhante ao comando DELETE. Para
filtrar os arquivos marcados pode-se utilizar o comando SET DELETED e para delet-los fisicamente podese utilizar o comando PACK.
Exemplo
// Este exemplo demonstra como se pode utilizar a funo DBDELETE() para marcar alguns
registros como deletados e o PACK para delet-los fisicamente.
USE Clientes NEW
DBGOTO(100)
DBDELETE()
DBGOTO(105)
DBDELETE()
DBGOTO(110)
DBDELETE()
PACK
DBEval
AdvPl________________________________________________________________173
Executa uma expresso para os registros dentro das condies especificadas.
Sintaxe
DBEVAL( bBloco, [ bForCond ], [ bWhileCond ], [ nProxRegs ], [ nRecno ], [ lRestante ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
bBloco
Bloco
Cdigo
bForCond
Bloco
Cdigo
bWhileCond
Bloco
Cdigo
nProxRegs
nRecno
lRestante
Descrio
Esta funo utilizada para executar uma expresso definida pelo bloco de cdigo do primeiro parmetro
para cada registro que est dentro do escopo definido atravs dos blocos de condio de "for" e "while".
O nmero de registros a ser executado ser definido com o parmetro nProxRegs ou se setado o
parmetro lRestante sero executados todos os registros a partir do registro corrente at o final da tabela
corrente. Se for especificado o parmetro nRecno apenas o registro com o recno especificado ser
processado.
Se forem omitidos os blocos de "for" e "while", os mesmos sero considerados .T. como padro, esto
assim todos os registros dentro do escopo.
Se o parmetro lRestante for omitido a tabela inicia o processamento dos registros a partir do topo da
tabela, caso contrrio sero processados os registros a partir do posicionamento corrente da tabela.
Exemplo
// Este exemplo mostra como se pode usar o DBEVAL para contar quantos registros esto
dentro do escopo especificado em toda a tabela, pois como o parmetro lRestante foi
omitido a tabela ir para o topo antes de iniciar a processar os registros. Supondo que a
tabela est sobre um ndice no campo idade, sero processados registros com o Nome cuja
ordem alfabtica maior que "FFFFF" e at encontrar algum registro de idade igual a 40:
USE Cliente VIA "DBFCDX" NEW
LOCAL nCount := 0;
DBGOTO(100)
DBEVAL( {|| nCount++}, {|| Nome > "FFFFF"}, {|| Idade < 40})
// Este exemplo mostra como se pode usar o DBEVAL para contar quantos registros esto
dentro do escopo especificado (como o exemplo anterior) a partir do registro atual (100):
USE Cliente VIA "DBFCDX" NEW
LOCAL nCount := 0;
AdvPl________________________________________________________________174
DBGOTO(100)
DBEVAL( {|| nCount++}, {|| Nome > "FFFFF"}, {|| Idade < 40},,,.T.)
// Este exemplo mostra como se pode usar o DBEVAL para colocar numa varivel um nome
inicial que est definido em um registro de recno definido (100):
USE Cliente VIA "DBFCDX" NEW
LOCAL cNomeIni := "";
DBEVAL( {|| cNomeIni := Nome},,,,100)
// Este exemplo mostra como se pode usar o DBEVAL para verificar qual o recno do dcimo
registro a partir do corrente dentro do escopo definido:
USE Cliente VIA "DBFCDX" NEW
LOCAL nRecno := 0;
DBGOTO(100)
DBEVAL( {|| nRecno := RECNO()}, {|| Nome > "FFFFF"}, {|| Idade < 40},10,,.T.)
DBF
Verifica qual o Alias corrente.
Sintaxe
DBF() --> Caracter
Retorno
Descrio
""
cAlias
Descrio
Verifica qual o Alias da rea de trabalho corrente. O Alias definido quando a tabela aberta atravs do
parmetro correspondente (DBUSEAREA()).
SELECT(),
Exemplo
// Este exemplo mostra como o DBF corrente pode ser mostrado para o usurio.
dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
MessageBox("O Alias corrente : " + DBF(), "Alias", 0)
// Resultado: "O Alias
corrente : SSS"
DBFieldInfo
Verifica informaes sobre um campo.
AdvPl________________________________________________________________175
Sintaxe
DBFieldInfo ( nInfoTipo , nCampo ) -> Informao do Campo
Argumento
Obrigat.
Tipo
Descrio
nInfoTipo
nCampo
Retorno
Descrio
No h tabela corrente ou a posio do campo especificado est invlida.
Nil
Informao do campo Informao requisitada pelo usurio (pode ser de tipo numrico se for tamanho
ou casas decimais, tipo caracter se for nome ou tipo).
Descrio
Esta funo utilizada para obter informaes sobre determinado campo da tabela corrente. O tipo
de informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
DBS_DEC
DBS_LEN
DBS_TYPE
Exemplo
// Este exemplo demonstra como se pode utilizar o DBFIELDINFO para obter as informaes
do primeiro campo da tabela Clientes.
USE Clientes NEW
DBFIELDINFO(DBS_NAME, 1) // Retorno: Nome
DBFIELDINFO(DBS_TYPE, 1) // Retorno: C
DBFIELDINFO(DBS_LEN, 1) // Retorno: 10
DBFIELDINFO(DBS_DEC, 1) // Retorno: 0
DBFilter
Verifica a expresso de filtro corrente.
Sintaxe
DBFilter () --> Caracter
Retorno
Descrio
AdvPl________________________________________________________________176
""
cExpFiltro
Descrio
Esta funo utilizada para verificar a expresso de filtro ativo na rea de trabalho corrente.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBFILTER para verificar a expresso do
filtro corrente.
USE Cliente INDEX Ind1 NEW
SET FILTER TO Nome > "Jose"
DBFILTER() // retorna: Nome > "Jose"
SET FILTER TO Num < 1000
DBFILTER() // retorna: Num < 1000
DBGoBottom
Posiciona no ltimo registro lgico.
Sintaxe
DBGoBottom() -> Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo utilizada para posicionar a tabela corrente no ltimo registro lgico. A seqncia lgica
depende da ordem e do filtro ativo sobre a tabela corrente, portanto o ltimo registro lgico pode no ser
o ltimo registro fsico.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo
registro fsico.
USE Cliente
DBGOBOTTOM() // Posiciona no ltimo registro fsico, pois no h ordem ativa
// Este exemplo demonstra como se pode utilizar o DBGOBOTTOM para posicionar no ltimo
registro lgico.
USE Cliente INDEX Ind1 NEW
DBGOBOTTOM() // Posiciona no ltimo registro lgico (ltimo registro na seqncia gerada
pelo ndice)
DBGoTo
AdvPl________________________________________________________________177
Posiciona em determinado registro.
Sintaxe
DBGoTo( nRegistro ) -> Nil
Argumento
Obrigat.
Tipo
Descrio
nRegistro
Descrio
Esta funo utilizada para posicionar a tabela corrente em determinado registro, segundo a ordem fsica
(seqncia sobre o recno).
Exemplo
// Este exemplo demonstra como se pode utilizar o DBGOTO para posicionar a tabela
corrente em determinado registro.
USE Cliente INDEX Ind1 NEW
DBGOTO(100) // Posiciona no registro de recno 100
DBGoTop
Posiciona no primeiro registro lgico.
Sintaxe
DBGoTop() -> Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo utilizada para posicionar a tabela corrente no primeiro registro lgico. A seqncia lgica
depende da ordem e do filtro ativo sobre a tabela corrente, portanto o primeiro registro lgico pode no
ser o primeiro registro fsico.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBGOBOTOP para posicionar no primeiro
registro fsico.
USE Cliente
DBGOTOP() // Posiciona no primeiro registro fsico, pois no h ordem ativa
// Este exemplo demonstra como se pode utilizar o DBGOTOP para posicionar no primeiro
registro lgico.
USE Cliente INDEX Ind1 NEW
DBGOTOP() // Posiciona no primeiro registro lgico (primeiro registro na segncia gerada
pelo ndice)
AdvPl________________________________________________________________178
DBInfo
Verifica informaes sobre a tabela corrente.
Sintaxe
DBInfo ( nInfoTipo ) -> Informao da Tabela
Argumento
Obrigat.
nInfoTipo
Retorno
Tipo
N
Descrio
Tipo de informao a ser
verificada.
Descrio
No h tabela corrente.
Nil
Descrio
Esta funo utilizada para obter informaes sobre a tabela corrente. O tipo de informao (primeiro
argumento) escolhido de acordo com as constantes abaixo:
DBI_GETRECSIZE
DBI_TABLEEXT
DBI_FULLPATH
DBI_BOF
DBI_EOF
DBI_FOUND
DBI_FCOUNT
DBI_ALIAS
DBI_LASTUPDATE
RECSIZE
(tipo
Exemplo
// Este exemplo demonstra como se pode utilizar o DBINFO para obter as informaes da
tabela corrente (Clientes).
USE Clientes NEW
DBINFO(DBI_FULLPATH) // Retorno: C:\Teste\Clientes.dbf
AdvPl________________________________________________________________179
DBINFO(DBI_FCOUNT) // Retorno: 12
DBGOTOP()
DBINFO(DBI_BOF) // Retorno: .F.
DBSKIP(-1)
DBINFO(DBI_BOF) // Retorno: .T.
DBOrderInfo
Verifica informaes sobre uma ordem.
Sintaxe
DBOrderInfo ( nInfoTipo , [ cIndice ], [ cOrdem | nPosicao ]) -> Informao da Ordem
Argumento
Obrigat.
Tipo
Descrio
nInfoTipo
cOrdem
Nome da ordem.
nPosio
Retorno
Nil
Descrio
No h ordem corrente ou a posio da ordem especificada est invlida.
Informao da Ordem Informao requisitada pelo usurio (pode ser de tipo numrico se for
nmero de ordens no ndice, tipo caracter se for nome do arquivo de ndice).
Descrio
Esta funo utilizada para obter informaes sobre determinada ordem. A especificao da ordem pode
ser realizada atravs de seu nome ou sua posio dentro da lista de ordens, mas se ela no for
especificada sero obtidas informaes da ordem corrente.
DBOI_BAGNAME
DBOI_FULLPATH
DBOI_ORDERCOUNT
Exemplo
// Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes
sobre o nome do arquivo de ndice da ordem corrente.
DBORDERINFO(DBOI_BAGNAME) // retorna: Ind
DBORDERINFO(DBOI_FULLPATH) // retorna: C:\AP6\Teste\Ind.cdx
// Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter informaes
sobre o nome do arquivo de ndice de uma ordem especificada.
AdvPl________________________________________________________________180
DBORDERINFO(DBOI_BAGNAME,,3) // retorna: Ind2
DBORDERINFO(DBOI_FULLPATH,,"Nome") // retorna: C:\AP6\Teste\Ind2.cdx
// Este exemplo demonstra como se pode utilizar o DBORDERINFO para obter o nmero de
ordens de determinado arquivo de ndice.
DBORDERINFO(DBOI_ ORDERCOUNT,"\Teste\Ind2.cdx") // retorna: 3
DBOrderNickName
Torna ativa a ordem com o determinado apelido.
Sintaxe
DBOrderNickName( cApelido ) -> Lgico
Argumento
Obrigat.
Tipo
Descrio
cApelido
Retorno
Descrio
No conseguiu tornar a ordem ativa.
.F.
Principais erros: No existe tabela ativa ou no foi encontrada a ordem com o apelido.
.T.
Descrio
Esta funo utilizada para selecionar a ordem ativa atravs de seu apelido. Esta ordem a responsvel
seqncia lgica dos registros da tabela corrente.
Exemplo
//Este exemplo demonstra como se pode utilizar o DBORDERNICKNAME para setar nova ordem.
USE Cliente NEW
SET INDEX TO Nome, Idade
IF !DBORDERNICKNAME("IndNome")
Messagebox("Registro no encontrado","Erro", 0)
BREAK
ENDIF
DBRecall
Altera o estado deletado do registro atual.
Sintaxe
DBRecall() -> Nil
AdvPl________________________________________________________________181
Retorno
Descrio
NIL
Nenhum
Descrio
Esta funo utilizada para retirar a marca de registro deletado do registro atual. Para ser executada o
registro atual deve estar bloqueado ou a tabela deve estar aberta em modo exclusivo. Se o registro atual
no estiver deletado, esta funo no faz nada. Ela o oposto da funo DBDELETE que marca o
registro atual como deletado.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBRECALL para retornar o estado do
registro atual para normal.
USE Cliente
DBGOTO(100)
DBDELETE()
DELETED() // Retorna: .T.
DBRECALL()
DELETED() // Retorna: .F.
// Este exemplo demonstra como se pode utilizar o DBRECALL para desfazer todas as
delees da tabela corrente.
USE Cliente
DBGOTOP()
WHILE !EOF()
DBRECALL()
DBSKIP()
ENDDO
DBRecordInfo
Verifica informaes sobre um registro.
Sintaxe
DBRecordInfo ( nInfoTipo ,[ nRegistro ]) -> Informao do Registro
Argumento
Obrigat.
Tipo
Descrio
nInfoTipo
nRegistro
Opcional
Retorno
Descrio
No h tabela corrente ou registro invlido.
Nil
Descrio
AdvPl________________________________________________________________182
Esta funo utilizada para obter informaes sobre o registro especificado pelo segundo argumento
(recno) da tabela corrente, se esta informao for omitida ser verificado o registro corrente. O tipo de
informao (primeiro argumento) escolhido de acordo com as constantes abaixo:
DBRI_DELETED
DBRI_RECSIZE
DBRI_UPDATED
Exemplo
// Este exemplo demonstra como se pode utilizar o DBRECORDINFO para se obter as
informaes sobre registros da tabela corrente.
USE Clientes NEW
DBGOTO(100)
DBRECORDINFO(DBRI_DELETED) // Retorno: .F.
DBDELETE()
DBRECORDINFO(DBRI_DELETED) // Retorno: .F.
DBRECALL()
DBRECORDINFO(DBRI_RECSIZE) // Retorno: 230
NOME := "JOAO"
DBGOTO(200)
DBRECORDINFO(DBRI_UPDATED) // Retorno: .F.
DBRECORDINFO(DBRI_UPDATED,100) // Retorno: .T.
DBReindex
Reconstri todos os ndices da rea de trabalho.
Sintaxe
DBReindex() -> Nil
Retorno
Descrio
NIL
Nenhum
Descrio
Reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro registro lgico.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os ndices
depois que um novo ndice foi gerado.
USE Clientes NEW
DBSETINDEX("IndNome")
DBREINDEX()
AdvPl________________________________________________________________183
DBRLock
Bloqueia determinado registro.
Sintaxe
DBRLOCK([ nRegistro ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
nRegistro
Opcional
Retorno
Descrio
No conseguiu bloquear o registro.
.F.
Principal motivo: o registro j foi bloqueado por outro usurio.
.T.
Descrio
Esta funo utilizada quando se tem uma tabela aberta e compartilhada e se deseja bloquear um
registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a
funo no altera seu estado.
O usurio pode escolher o registro a ser bloqueado atravs do parmetro (recno), mas se este for omitido
ser bloqueado o registro corrente como na funo RLOCK().
Exemplo
// Este exemplo mostra duas variaes do uso de DBRLOCK.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
DBRLOCK() // Bloqueia o registro atual (100)
DBRLOCK(110) // Bloqueia o registro de nmero 110
DBRLockList
Retorna uma lista com todos os registros locados na tabela corrente.
Sintaxe
AdvPl________________________________________________________________184
DBRLOCKLIST() --> Array
Retorno
Descrio
Nil
ListaLock
Descrio
Esta funo utilizada para verificar quais registros esto locados na tabela corrente. Para tanto,
retornada uma tabela unidimensional com os nmeros dos registros.
Exemplo
// Este exemplo mostra como utilizada a funo DBRLOCKLIST para verificar quais
registros esto bloqueados na tabela corrente
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTOP()
DBRLOCK() // Bloqueia o primeiro registro
DBRLOCK(110) // Bloqueia o registro de nmero 110
DBRLOCK(100) // Bloqueia o registro de nmero 100
DBRLOCKLIST() // Retorna: {1,100,110}
DBRunLock
Desbloqueia determinado registro.
Sintaxe
DBRUNLOCK([ nRegistro ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
nRegistro
No
Retorno
Descrio
NIL
Sem retorno.
Descrio
Esta funo utilizada para liberar determinado registro bloqueado.
O usurio pode escolher o registro a ser desbloqueado atravs do parmetro (recno), mas se este for
omitido ser desbloqueado o registro corrente como na funo DBUNLOCK().
AdvPl________________________________________________________________185
Esta funo o oposto
Exemplo
// Este exemplo mostra duas variaes do uso de DBRUNLOCK.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
DBRUNLOCK() // Desbloqueia o registro atual (100)
DBRUNLOCK(110) // Desbloqueia o registro de nmero 110
DbSeek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe
DBSeek ( cExp | nExp, [ lSoftSeek ], [ lUltimo ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cExp
Sim
nExp
Sim
lSoftSeek
No
lUltimo
No
Retorno
Descrio
.F.
.T.
Descrio
Esta funo utilizada para encontrar um registro com determinado valor da expresso de chave de
ndice.
Antes da chamada do DBSEEK deve-se certificar de que existe uma ordem ativa no momento com os
campos que se deseja pesquisar o valor.
AdvPl________________________________________________________________186
Se a expresso possuir apenas uma campo numrico, o primeiro parmetro deve ser do tipo numrico,
mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetro (mesmo se forem
apenas dois campos numricos ou do tipo data).
Quando o segundo parmetro for especificado como .T. (softseek), mesmo que a expresso pesquisada
no encontrar nenhum registro com este valor, a tabela ser posicionada no prximo valor maior que o
especificado no primeiro parmetro, mas mesmo posicionando no prximo valor esta funo retornar .F.
(pois no encontrou).
Quando no for especificado este valor ou estiver .F. e falhar o valor de pesquisa, a tabela ser
posicionada em LASTREC + 1 e ser setada a flag de EOF.
Se o terceiro parmetro for especificado com valor .T. a funo posiciona a tabela no ltimo registro com o
valor procurado, caso no seja especificado ou for .F., ser posicionada na primeira ocorrncia.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSEEK para busca de valores numricos.
USE Clientes NEW
ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico)
DBSEEK(100) // Retorna: .F.
EOF() // Retorna: .T.
DBSEEK(100,.T.) // Retorna: .F.
EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro)
// Este exemplo demonstra como se pode utilizar o DBSEEK para percorrer todos os
registros de Clientes com o nome joao e vencimentos a partir de janeiro de 2001.
USE Clientes NEW
ORDLISTADD ("/teste/ind2.cdx") // Expresso Nome+Venc (campo caracter + data)
DBSEEK("joao200101",.T.) // Procura a primeira ocorrncia de Nome "joao" e vencimento
maior que Janeiro de 2001
WHILE !EOF() .AND. Nome == "
joao"
DBSKIP()
ENDDO
DBSetDriver
Modifica ou verifica o RDD padro.
Sintaxe
DBSetDriver ([ cNovoRddPadro ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cNovoRddPadro
No
Retorno
Descrio
AdvPl________________________________________________________________187
cAntigoRddPadro
Descrio
Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for
omitido seu parmetro.
Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do
parmetro.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSETDRIVER para alterar o valor do RDD
padro.
DBSETDRIVER("CTREECDX") // Retorna: DBFCDX
DBSETDRIVER() // Retorna: CTREECDX
DBSetFilter
Seta uma condio de filtro.
Sintaxe
DBSetFilter( bCondio, cCondio ) --> Nil
Argumento
Obrigat.
Tipo
Descrio
bCondio
Sim
Bloco de Cdigo
Expresso do
executvel.
cCondio
Sim
Retorno
3Descrio
NIL
Sem retorno.
filtro
na
forma
Descrio
Esta funo utilizada para setar um filtro nos registros da tabela corrente especificado atravs do bloco
de cdigo no primeiro parmetro.
AdvPl________________________________________________________________188
Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKIP,
etc).
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSETFILTER para filtrar todos os
clientes com menos de 40 anos.
USE Cliente NEW
DBSETFILTER( {|| Idade < 40}, "Idade < 40" )
DBGOTOP()
DBSetIndex
Acrescenta todas as ordens de determinado ndice lista.
Sintaxe
DBSetIndex( cArqIndice ) --> Nil
Argumento
Obrigat.
Tipo
Descrio
cArqIndice
Sim
Retorno
Descrio
NIL
Sem retorno.
Descrio
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.
Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e torna-se ativa.
Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a primeira torna-se ativa.
Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas caso contrrio deve ser especificado.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSETINDEX para acrescentar novos
ndices lista de ordens.
USE Cliente NEW
DBSETINDEX("Ind1")
DBSETINDEX("\teste\Ind2.cdx")
AdvPl________________________________________________________________189
DBSetNickName
Seta um apelido para determinada ordem ou verifica qual o apelido corrente.
Sintaxe
DBSetNickName( cOrdem,[ cApelido ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cIndice
Sim
cApelido
No
Retorno
Descrio
""
cApelido
Apelido corrente
Descrio
Esta funo utilizada para colocar um apelido em determinada ordem especificada pelo primeiro
parmetro.
Caso seja omitido o nome do apelido a ser dado, a funo apenas verifica o apelido corrente.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSETNICKNAME para setar um novo
apelido e verificar qual o apelido atual.
USE Cliente NEW
DBSETNICKNAME("IndNome") // retorna: ""
DBSETNICKNAME("IndNome","NOME") // retorna: ""
DBSETNICKNAME("IndNome") // retorna: "NOME"
DBSetOrder
Seleciona a ordem ativa da rea de trabalho.
Sintaxe
AdvPl________________________________________________________________190
DBSetOrder( nPosio ) --> Nil
Argumento
Obrigat.
Tipo
Descrio
nPosio
Sim
Retorno
Descrio
NIL
Sem retorno
Descrio
Esta funo utilizada para selecionar a ordem ativa da rea de trabalho.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSETORDER para selecionar a ordem
corrente.
USE Cliente NEW
SET INDEX TO Nome, Idade
DBSETORDER(2)
DBSkip
Desloca para outro registro na tabela corrente.
Sintaxe
DBSkip([ nRegistros ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
nRegistros
No
Retorno
Descrio
NIL
Sem retorno.
Descrio
Esta funo utilizada para deslocar para outro registro a partir do registro atual.
AdvPl________________________________________________________________191
O parmetro especifica quantos registros lgicos devem ser deslocados a partir do corrente, se for positivo
desloca em direo ao final da tabela, se for negativo ao incio da tabela e caso seja omitido ir para o
prximo registro (o padro 1).
Caso passe do incio da tabela, posiciona no primeiro registro e seta BOF, caso passe do final da tabela,
posiciona no registro LASTREC + 1 e seta EOF.
Exemplo
// Este exemplo mostra como o DBSKIP pode passar do final da tabela e do incio da tabela
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOBOTTOM()
EOF() // retorna .F.
DBSKIP()
EOF() // retorna .T.
DBGOTOP()
BOF() // retorna .F.
DBSKIP(-1)
BOF() // retorna .T.
// Este exemplo mostra como o DBSKIP pode deslocar 10 registro em relao ao registro
corrente
DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
DBSKIP(10)
RECNO() // retorna 110
DBSKIP(-10)
RECNO() // retorna 100
DBStruct
Retorna a estrutura da tabela corrente.
Sintaxe
DBStruct() --> Array
Retorno
Descrio
{}
aEstrutura
Array com todos os campos, onde cada elemento um subarray contendo Nome,
Tipo, Tamanho e Decimais.
Descrio
Esta funo utilizada para verificar a estrutura da tabela corrente da mesma forma que utilizada para
criar a tabela com a funo DBCREATE.
AdvPl________________________________________________________________192
Exemplo
// Este exemplo demonstra como se pode utilizar o DBSTRUCT para recuperar a estrutura da
tabela corrente.
USE Cliente NEW
DBSTRUCT()
//Retorna:{{Cod,N,3,0},{Nome,C,10,0},{Idade,N,3,0},{Nasc,D,8,0},{Pagto,N,7,2}}
DBUnlock
Desbloqueia todos os registros da tabela corrente.
Sintaxe
DBUNLOCK() --> Nil
Retorno
NIL
Descrio
Sem retorno.
Descrio
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar
DBRUNLOCK para todos os registros da lista DBRLOCKLIST.
Exemplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBUNLOCK()
DBUnlockAll
Desbloqueia todos os registros de todas as tabelas abertas.
Sintaxe
DBUNLOCKALL() --> Nil
Retorno
Descrio
NIL
Sem retorno.
Descrio
AdvPl________________________________________________________________193
Esta funo utilizada para liberar todos os registros bloqueados e equivalente a executar
para todos os registros da lista DBRLOCKLIST de todas as reas de trabalho.
DBUNLOCK
Exemplo
// Este exemplo mostra como liberar todos os registros bloqueados da tabela corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBUNLOCKALL()
Delete
Marca registros como deletados.
Sintaxe
DELETE [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento
Obrigat.
Tipo
CondFor
No
CondWhile
No
nRecs
No
nRecno
No
Retorno
Descrio
NIL
Sem retorno.
Descrio
Descrio
Este comando utilizado para marcar alguns registros da tabela corrente como deletados.
Se no forem especificadas as condies para que o registro seja marcado como deletado, marca toda a
tabela como se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam marcados atravs das opes "FOR CondFor" e
"WHILE CondWhile".
AdvPl________________________________________________________________194
Pode-se tambm limitar o nmero de registros a serem marcados atravs da opo "NEXT nRecs" e
determinar que a "deleo" dos registros deve-se iniciar a partir do registro atual com "REST", mas caso
contrrio o comando executa um DBGOTOP() antes de iniciar a "deleo".
Se desejado marcar apenas determinado registro pode-se defini-lo atravs da especificao do recno
com "RECORD nRecno".
Exemplo
// Este exemplo demonstra como utilizar o comando DELETE para marcar alguns registros
dentro de determinado escopo como deletado. Este escopo definido por Idade > 20, at
que o nome seja maior ou igual a "VVV", comea a deleo a partir do registro atual e
marca apenas 10 registros:
USE Cliente VIA "CTREECDX" NEW
DELETE FOR Idade>20 WHILE Nome<"VVV" NEXT 10 REST
Deleted
Verifica se o registro foi deletado.
Sintaxe
DELETED() --> Lgico
Retorno
Descrio
.F.
.T.
Descrio
Quando o registro deletado, permanece fisicamente na tabela, mas fica marcado como "deletado". Esta
funo verifica este estado. Quando executada a funo DBPACK todos os registros marcados como
deletados so apagados fisicamente enquanto a funo DBRECALL marca todos os registros deletados
como no-deletados.
Exemplo
// Este exemplo verifica se determinado registro est deletado, caso positivo, mostra uma mensagem:
AdvPl________________________________________________________________195
DevOutPict
Imprime o contedo na posio corrente formatando a sada.
Sintaxe
DEVOUTPICT ( xVal, cPicture ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
xVal
Sim
C, N ou D
cPicture
Sim
Retorno
Descrio
NIL
Nenhum
Descrio
DEVOUTPICT( ) imprime contedo na posio corrente de
cPicture.
PROW( )
PCOL( ),
aplicando a mscara
Exemplo
nVal:= 100.89
DevPos( 10,10 ) // configura linha 0, coluna 0 para impresso
//@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() )
DevOutPict( nVal, "@E 999,999.99" ) // imprime 100,89
DevPos
Posiciona linha e coluna de impresso.
Sintaxe
DEVPOS( nLin, nCol ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
nLin
Sim
nCol
Sim
AdvPl________________________________________________________________196
Retorno
Descrio
NIL
Nenhum
Descrio
DEVPOS( ) modifica a linha e coluna corrente de impresso. Modifica os retornos de
PROW() e PCOL( ).
Exemplo
DevPos( 10,10 ) // configura linha 0, coluna 0 para impressao
@ Prow(),Pcol() PSAY "Minha linha e "+str( Prow() )
Directory
Cria um array com dados dos diretrios e dos arquivos.
Sintaxe
DIRECTORY( cDirSpec , [ cAtributos ]) -->Array
Argumento
Obrigat.
Tipo
Descrio
cDirSpec
Sim
cAtributos
No
Atributo
Descrio
D
V
Retorno
Array
Incluir diretrios
Procurar o nome do disco (label)
Descrio
Retorna um array de subarrays onde cada subarray
contm informaes sobre um arquivo ou diretrio
que correspondem a cDirSpec.
Os subarrays possuem a seguinte estrutura, definida
em directry.ch:
AdvPl________________________________________________________________197
F_NAME
F_SIZE
F_DATE
F_TIME
F_ATTR
Descrio
DIRECTORY() funo que retorna informaes de arquivos/diretrios que correspondam a uma mscara
especifica.
Tanto arquivos no servidor como no cliente (Remote) so aceitos. Os atributos so sempre aditivos.
Exemplos
#include "Directry.ch"
//
aDirectory := DIRECTORY("*.*", "D")
AEVAL( aDirectory, {|aFile| QOUT(aFile[F_NAME])} )
DirRemove
Elimina um diretrio.
Sintaxe
DIRREMOVE( cDirNome ) --> lSuccesso
Argumento
Obrigat.
Tipo
Descrio
cDirNome
Sim
Retorno
Descrio
.T.
.F.
Descrio
AdvPl________________________________________________________________198
DIRREMOVE() elimina um diretrio especifico.
Note que necessrio ter direitos suficientes para remover um diretrio, e o diretrio para ser eliminado
precisa estar vazio, sem subdiretrios e arquivos.
Exemplo
DIRREMOVE("c:\teste\um\dois") // Eliminando um diretrio, sem testar o retorno
bResult := DIRREMOVE("c:\teste\um") // Elimina e testa o retorno
IF bResult
? "Impossivel excluir o diretrio"
ENDIF
DiskSpace
Retorna o espao disponvel em um disco especfico.
Sintaxe
DISKSPACE([ nDrive ]) --> nBytes
Argumento
Obrigat.
Tipo
Descrio
nDrive
No
Retorno
Descrio
nBytes
Descrio
DISKSPACE() uma funo de ambiente que determina quantos bytes esto disponveis em um
determinado disco.
Ao ser utilizado zero e o diretrio corrente for local, ser retornado o espao disponvel no cliente ( remote
), caso o diretrio corrente esteja no servidor, ser retornado o espao disponvel no servidor.
Exemplos
CURDIR( "\SIGAADV" ) // Posiciona no diretorio SIGAADV do servidor
? DISKSPACE( 0 ) // Retorna o espao disponivel no servidor.
? DISKSPACE( 1 ) // Retorna o espao disponivel no drive a: local ( remote ).
CURDIR( "C:\WINDOWS" ) // Posiciona no diretorio SIGAADV do servidor
? DISKSPACE( 0 ) // Retorna o espao disponivel na estao.
AdvPl________________________________________________________________199
Dow
Converte uma data para o valor numrico do dia da semana.
Sintaxe
DOW( dData ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
dData
Sim
Retorno
>=0
<=7
Descrio
e
Descrio
DOW() uma funo que converte uma data para o valor numrico que representa o dia da semana. til
quando se deseja fazer clculos semanais. DOW() similar a CDOW(), que retorna o dia da semana como
uma cadeia de caracteres.
Exemplos
Estes exemplos mostram como usar CDOW() e o seu relacionamento com DOW():
dData := DATE()
nDiaDaSemana :=
cDiaDaSemana :=
nDiaDaSemana :=
cDiaDaSemana :=
// Resultado: 09/01/01
DOW(DATE()) // Resultado: 3
CDOW(DATE()) // Resultado: Tuesday
DOW(DATE() - 2) // Resultado: 1
CDOW(DATE() - 2) // Resultado: Sunday
Esta funo de usurio utiliza DOW() para calcular a data da ltima segunda-feira da data informada.
FUNCTION LastMonday(dData)
RETURN (dData - DOW(dData) + 2)
Dtoc
Converte uma data para cadeia de caracteres.
Sintaxe
AdvPl________________________________________________________________200
DTOC( dData ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
DData
Sim
o valor a converter.
Retorno
Descrio
Caracter
Descrio
DTOC() converte uma data para uma cadeia de caracteres formatada segundo o padro corrente, definido
pelo comando SET DATE. Se for necessria a utilizao de formatao especial, use a funo
TRANSFORM() <a>.
Em expresses de ndices de arquivo, use DTOS() no lugar de DTOC() para converter datas para cadeia de
caracteres.
Exemplos
cData := DATE() // Resultado: 09/01/90
cData := DTOC(DATE()) // Resultado: 09/01/90
cData := "Today is " + DTOC(DATE()) // Resultado: Today is 09/01/90
Dtos
Converte uma data para uma cadeia de caracteres no formato yyyymmdd.
Sintaxe
DTOS( dData ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
dData
Sim
Retorno
Descrio
Caracter
Retorna uma cadeia de caracteres com oito byte de tamanho no formato yyyymmdd. Quando
dData nulo ou invalido, DTOS() retorna uma cadeia de caracteres com oito espaos. O valor
retornado no afetado pela formato da data corrente.
AdvPl________________________________________________________________201
Descrio
DTOS() uma funo de converso de data que pode ser usada para criar expresses de ndice. O
resultado estruturado visando manter a ordem correta do ndice (ano, ms, dia).
Exemplos
cData := DATE() // Resultado: 09/01/90
cData := DTOS(DATE()) // Resultado: 19900901
nLen := LEN(DTOS(CTOD(""))) // Resultado: 8
Este exemplo mostra como criado um ndice composto usando DTOS():
USE Vendas NEW
INDEX ON DTOS(Data) + Vendedor TO DataNome
Eject
Fora a impresso de nova pgina no relatrio.
Sintaxe
EJECT( )--> NIL
Retorno
Descrio
NIL
Sem retorno
Descrio
EJECT( ) efetua o salto de pgina na impresso de relatrio configurando o
PROW( ) para 0.
Exemplo
SETPRC(0,0) // inicia impressao na linha 0 coluna 0
PCOL( 10 ) //muda para coluna 10
@ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PRNFLUSH( ) // Forca impressao antes do termino da pagina.
PROW( PROW( )+2 ) // Pula 2 linhas
PCOL( 10 )
@ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
//PROW( 0 ) // Salta a pagina
EJECT( ) // Salta de pagina
FECHAREL( ) // Fecha impressao
ElapTime
Retorna o tempo decorrido entre duas horas.
AdvPl________________________________________________________________202
Sintaxe
ElapTime( cHoraInicial , cHoraFinal ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cHoraInicial
Sim
cHoraFinal
Sim
Retorno
Descrio
Caracter
Descrio
ElapTime() retorna uma cadeia de caracteres contendo a diferena de tempo no formato hh:mm:ss, onde
hh a hora ( 1 a 24 ), mm os minutos e ss os segundos.
Exemplos
Este exemplo compara ELAPTIME():
cHoraInicio := TIME() // Resultado: 10:00:00
.
. <instrucoes>
.
cElapsed := ELAPTIME(TIME(), cHoraInicio)
FClose
Fecha um arquivo binrio e grava os buffers no disco.
Sintaxe
FCLOSE( nHandle ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
nHandle
Sim
Retorno
Descrio
AdvPl________________________________________________________________203
.F.
.T.
Descrio
Fecha um manipulador ( handle ) de um arquivo binrio. Este manipulador deve ter sido aberto atravs
das funes FOPEN(), FOPENPORT(), FCREATE().
Exemplo
O exemplo abaixo utiliza o CLOSE para fechar um arquivo.
#include "Fileio.ch"
//
nHandle := FCREATE("Testfile", FC_NORMAL)
IF !FCLOSE(nHandle)
conout ("Erro fechando arquivo:" + Str(FError( 0 )
ENDIF
FCreate
Cria um arquivo, ou elimina o contedo de um arquivo.
Sintaxe
FCREATE( cArq, [ nAtributo ]) --> nHandle
Argumento
Obrigat.
Tipo
Descrio
cArq
nAtributo
Opcional
Retorno
Descrio
>0
Numrico. O Handle do arquivo para ser usado nas demais funes de arquivo.
-1
Erro na criao do arquivo, verifique FERROR() para obter maiores detalhes do erro.
Descrio
FCREATE() uma funo de baixo-nvel que permite a manipulao direta dos arquivos textos como
binrios.
AdvPl________________________________________________________________204
Ao ser executada FCREATE() cria um arquivo ou elimina o seu contedo, e retorna o handle (Manipulador)
do arquivo, para ser usado nas demais funes.
Os Atributos para criao do arquivo esto abaixo, e esto definidos no header fileio.ch.
FC_NORMAL
FC_READONLY
FC_HIDDEN
FC_SYSTEM
Note que se o arquivo existir, o contedo ser truncado para zero bytes.
Exemplo
#include "Fileio.ch"
IF (nHandle := FCREATE("Testfile", FC_NORMAL)) == -1
? "Arquivo no pode ser criado", FERROR()
BREAK
ELSE
FWRITE(nHandle, "ola!!!")
FCLOSE(nHandle)
ENDIF
FErase
Apaga um arquivo do disco.
Sintaxe
FERASE( cArq ) --> nSucesso
Argumento
Obrigat.
Tipo
Descrio
cArg
Retorno
Descrio
Arquivo foi apagado com sucesso.
-1
AdvPl________________________________________________________________205
Descrio
Elimina um arquivo. O Arquivo pode estar no servidor ou no local (Remote).
O Arquivo para ser apagado deve estar fechado. No permitido a utilizao de caracteres coringa
(wildcards).
Exemplos
// Este exemplo apaga todos os arquivos .BAK do diretrio corrente.
#include "Directry.ch"
AEVAL(DIRECTORY("*.BAK"), { |aFile| FERASE(aFile[F_NAME]) })
/// Este exemplo apaga um arquivo no cliente ( Remote ) e imprime uma mensagem caso //
ele apresente erro.
IF FERASE("AFile.txt") == -1
? "File erase error:", FERROR()
BREAK
ENDIF
FError
Verifica se houve erros aps uma operao com arquivos binrios.
Sintaxe
FERROR() --> Numrico
Retorno
Descrio
Arquivo no encontrado
Caminho no encontrado
Acessso negado
Memria Insuficiente
15
19
21
23
29
AdvPl________________________________________________________________206
30
32
Erro de leitura
Violao de compartilhamento
33
Erro de Lock
Descrio
FERROR() a funo que retorna o cdigo de erro mais especfico, aps a execuo de funes com
arquivos binrios, tais como: FOPEN(), FCLOSE(), FWRITE(), FREAD().
Exemplo
#include "Fileio.ch"
//
nHandle := FCREATE("Temp.txt", FC_NORMAL)
IF FERROR() != 0
conout ("Erro ao criar o arquivo, Erro:" Str(FError())
ENDIF
FieldBlock
Retorna um bloco de cdigo para um campo determinado da tabela corrente.
Sintaxe
FIELDBLOCK( cCampo ) --> Bloco de Cdigo
Argumento
Obrigat.
Tipo
Descrio
cCampo
Retorno
Descrio
bBloco
Descrio
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado. Sendo que
quando o bloco resultante executado sem valor recupera o valor armazenado no campo, mas quando
executado com um valor, seta este valor no determinado campo.
AdvPl________________________________________________________________207
Exemplo
// Este exemplo mostra como se pode usar o FIELDBLOCK para criar o bloco de cdigo para o
campo Nome da tabela corrente na varivel bBloco:
USE Cliente VIA "DBFCDX" NEW
bBloco := FIELDBLOCK("Nome")
FieldWbl
Retorna um bloco de cdigo para um campo determinado especificando a rea de trabalho.
Sintaxe
FIELDWBLOCK(<cCampo>,<nArea>) --> Bloco de Cdigo
Argumento
Obrigat.
Tipo
Descrio
cCampo
cArea
Retorno
Descrio
bWBloco
Bloco de cdigo. Bloco de cdigo para o campo especificado na rea de trabalho determinada.
Descrio
Esta funo utilizada para retornar um bloco de cdigo executvel com o campo especificado em
determinada rea de trabalho. Sendo que quando o bloco resultante executado sem valor recupera o
valor armazenado no campo, mas quando executado com um valor seta esta valor no determinado campo.
Portanto o bloco retornado similar a:
&("{|Valor| IF(Valor==NIL, nArea->Campo, nArea->Campo:=Valor)}")
Sendo: Campo = parmetro da funo FIELDBLOCK()
nArea = nmero da rea de trabalho especificada no funo FIELDWBLOCK()
Valor = valor executado no bloco de cdigo
Exemplo
// Este exemplo mostra como se pode usar o FIELDWBLOCK para criar o bloco de cdigo para
o campo Nome da rea de trabalho 3 na varivel bBloco:
AdvPl________________________________________________________________208
USE Cliente VIA "DBFCDX" NEW
bBloco := FIELDBLOCK("Nome",3)
File
Verifica se um arquivo ou mscara de arquivos existem.
Sintaxe
FILE( cArquivo ) --> lExiste
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Retorno
Descrio
.F.
.T.
Descrio
Verifica se existe um arquivo ou um padro de arquivos, no diretrio. Os caracteres * e ?. so aceitos.
Caminhos de servidor e locais so aceitos.
Exemplos
FILE("teste.dbf") // Verifica no diretrio corrente se existe o arquivo teste.dbf
FILE("\SIGAADV\TESTE.dbf") // // Verifica no diretrio Sigaadv do servidor se corrente e
se existe o arquivo teste.dbf
FILE("C:\TEMP\TESTE.dbf") // // Verifica no diretrio Temp do cliente (Remote) se existe
o arquivo teste.dbf
FOpen
Abre um arquivo binrio.
Sintaxe
FOPEN( cArq , nModo ]) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
cArq
Sim
AdvPl________________________________________________________________209
nModo
No
Retorno
Descrio
-1
>0
Descrio
FOPEN() abre um arquivo de modo binrio, permitindo a leitura ou gravao atrves das funes
FREAD(), FWRITE().
FCLOSE().
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.
Modos de Acesso
FO_READ
Apenas Leitura
FO_WRITE
Apenas Gravao
FO_READWRITE
Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT
FO_EXCLUSIVE
Exclusivo
FO_DENYWRITE
FO_DENYREAD
FO_DENYNONE
FO_SHARED
Igual ao FO_DENYNONE
AdvPl________________________________________________________________210
Sero aceitos tantos caminhos baseados no servidor, como caminhos locais ( remote ).
Exemplo
Este exemplo usa o FOPEN() para abrir um arquivo para leitura/gravao de maneira compartilhada e
mostra uma mensagem de erro caso a abertura falhe:
#include "Fileio.ch"
//
nHandle := FOPEN("Temp.txt", FO_READWRITE + FO_SHARED)
IF FERROR() != 0
? "Impossivel abrir o arquivo, Erro : ", FERROR()
BREAK
ENDIF
FOpenPort
Abre uma porta paralela ou serial.
Sintaxe
FOPENPORT( cPorta , [ cParm ], [ nModo ] ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
cArq
Sim
cParm
Sim
nModo
No
Retorno
Descrio
-1
>0
Descrio
FOPENPORT() abre um dispositivo, permitindo a leitura ou gravao atrves das funes
FWRITE().
Todo arquivo aberto atravs da FOPENPORT(), deve ser fechado atravs da funo
FCLOSE().
FREAD(),
AdvPl________________________________________________________________211
O modo de abertura composto de modo de acesso e modo de compartilhamento, esses modos esto
descritos em fileio.ch.
Modos de Acesso
FO_READ
Apenas Leitura
FO_WRITE
Apenas Gravao
FO_READWRITE
Leitura e Gravao
Modos de Compartilhamento
FO_COMPAT
FO_EXCLUSIVE
Exclusivo
FO_DENYWRITE
FO_DENYREAD
FO_DENYNONE
FO_SHARED
Igual ao FO_DENYNONE
O dispositivo ser aberto no diretrio corrente, ou seja, caso o diretrio esteja posicionado no cliente, o
dispositivo ser aberto no cliente ( Remote ), caso contrrio ser aberto no servidor.
Os parmetros das portas seriais servem para configurar a comunicao serial e podem ser os seguintes:
Velocidade
(BaudRate)
Paridade
DataBits
StopBits
1 ( default ) ou 2 Bits.
Timeout de leitura
Exemplo
Este exemplo usa o FOPENPORT() para abrir uma porta de impresso para gravao e mostra uma
mensagem de erro caso a abertura falhe:
#include "Fileio.ch"
//
AdvPl________________________________________________________________212
nHandle := FOPENPORT("LPT1:", "", FO_WRITE)
IF FERROR() != 0
? "Impossivel abrir a impressora LPT1, Erro : ", FERROR()
BREAK
ENDIF
Este exemplo abre uma porta serial e espera para obter uma leitura da porta.
#include "Fileio.ch"
//
CURDIR( "C:\TEMP" ) // Posicionando no diretrio cliente ( Remote )
nHandle := FOPENPORT("COM1:", "9600,N,8,1,10000", FO_WRITE)
IF FERROR() != 0
? "Impossivel abrir a impressora LPT1, Erro : ", FERROR()
BREAK
ENDIF
FREAD(
FRead
L caracteres binrios de um arquivo.
Sintaxe
FREAD( nHandle , @cBuffer , nQtdBytes ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
nHandle
Sim
o manipulador
FOPENPORT()
cBufferVar
Sim
nQtdBytes
Sim
Retorno
Descrio
Numrico
retornado
pelas
funes
FOPEN(),
FCREATE(),
Descrio
FREAD() l a partir um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados e
armazena no buffer informado. FREAD() l normalmente caracteres de controle (ASC 128, ASC 0, etc.).
FREAD() ler at o nmero de bytes informado em nQtdBytes; caso acontea algum erro ou o arquivo
chegue ao final, FREAD() retornar um nmero menor que o nQtdBytes.
O buffer passado para leitura deve ser sempre pr-alocado e passado como referncia. Caso contrrio, os
dados no podero ser retornados.
AdvPl________________________________________________________________213
FREAD() l a partir da posio atual do ponteiro, que pode ser ajustado pelo
FREADSTR().
Exemplos
Este exemplo l 128 bytes em um buffer.
#define F_BLOCK 128
//
cBuffer := SPACE(F_BLOCK)
nHandle := FOPEN("Temp.txt")
//
IF FERROR() != 0
? "Abertura de arquivos com erro: ", FERROR()
ELSE
IF FREAD(nHandle, @cBuffer, F_BLOCK) <> F_BLOCK
? "Erro lendo arquivo"
ENDIF
FCLOSE(nHandle)
ENDIF
FReadStr
L caracteres de um arquivo binrio.
Sintaxe
FREADSTR( nHandle , nQtdBytes ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
nHandle
Sim
o manipulador
FOPENPORT().
nQtdBytes
Sim
retornado
Retorno
Descrio
Retorno varivel
pelas
funes
FOPEN(),
FCREATE(),
Descrio
FREADSTR() l de um arquivo aberto, atravs de
FREAD() ler at o nmero de bytes informado em nQtdBytes ou at encontrar um CHR(0). Caso acontea
algum erro ou o arquivo chegue ao final, FREAD() retornar uma string menor do que nQdBytes e
colocar o erro em FERROR().
AdvPl________________________________________________________________214
FREADSTR() l a partir da posio atual do ponteiro, que pode ser ajustado pelo FSEEK() ou por
FWRITE( ), FREAD().
Exemplos
Este exemplo l os 16 caracteres de um arquivo e imprime o seu contedo.
#include "Fileio.ch"
//
nHandle := FOPEN("New.txt", FC_NORMAL)
IF FERROR() != 0
? "Erro abrindo o arquivo", FERROR()
ELSE
cString := FREADSTR(nHandle, 16)
? cString
FCLOSE(nHandle)
ENDIF
Frename
Muda o nome de um arquivo.
Sintaxe
FRENAME(cNomeAntigo, cNovoNome) --> nSucesso
Argumento
Obrigat.
Tipo
Descrio
cOldFile
cNewFile
Retorno
Descrio
A mudana foi executada com sucesso.
Ocorreu algum erro na mudana de nome, verifique se os dois caminhos esto no
mesmo ambiente. (Local/Local, Servidor/Servidor). Verifique FERROR() para detalhes
do erro.
-1
Descrio
FRENAME() renomeia um arquivo para outro nome, tanto no servidor como na estao. Ao renomear um
arquivo no esquea que esta arquivo dever estar fechado.
Exemplos
// Renomeando arquivos no cliente.
IF FRENAME("C:\TEMP\ArqAntigo.txt", "C:\TEMP\ArqNovo.txt") == -1
? "Erro ao renomear ", FERROR()
ENDIF
// Renomeando arquivos no Servidor.
AdvPl________________________________________________________________215
IF FRENAME("\SIGAADV\ArqAntigo.txt", "\SIGAADV\ArqNovo.txt") == -1
? "Erro ao renomear ", FERROR()
ENDIF
FSeek
Posiciona o arquivo binrio.
Sintaxe
FSEEK( nHandle , nOffset , [ nOrigem ]) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
nHandle
Sim
nOffset
Sim
nOrigem
No
Retorno
Descrio
Numrico
Descrio
FSEEK() posiciona o ponteiro do arquivo para as prximas operaes de leitura ou gravao. As
movimentaes de ponteiros so relativas nOrigem que pode ter os seguintes valores definidos em
fileio.ch:
FS_SET
FS_RELATIVE
FS_END
Exemplo
// Exemplo calcula o tamanho do arquivo.
#include "Fileio.ch"
//
// Abre o arquivo apenas para leitura
IF (nHandle := FOPEN("Temp.txt")) >= 0
//
// Pega o tamanho do arquivo
nLength := FSEEK(nHandle, 0, FS_END)
//
FCLOSE(nHandle)
AdvPl________________________________________________________________216
ELSE
? "Erro na abertura do arquivo", FERROR()
ENDIF
FWrite
Grava em um arquivo binrio.
Sintaxe
FWRITE( nHandle , cBuffer , [ nQtdBytes ]) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
nHandle
Sim
o manipulador
FOPENPORT().
cBuffer
Sim
nQtdBytes
No
Retorno
Numrico
retornado
pelas
funes
FOPEN(),
FCREATE(),
Descrio
Quantidade de bytes efetivamente gravados. Se o retorno for menor que o nQtdBytes,
houve um erro na gravao. Verifique FERROR() para mais detalhes.
Descrio
FWRITE() grava em um arquivo aberto, atravs de FCLOSE(), FCREATE(), FOPENPORT(), os dados
do buffer informado. FWRITE() grava normalmente caracteres de controle ( ASC 128, ASC 0, etc. ).
FWRITE() gravar at o nmero de bytes informado em nQtdBytes; caso acontea algum erro, retornar
um nmero menor que o nQtdBytes.
FWRITE() grava a partir da posio atual do ponteiro, que pode ser ajustado pelo
FREAD(), FREADSTR().
Exemplos
Este exemplo copia um arquivo para outro.
#include "Fileio.ch"
#define F_BLOCK 512
//
cBuffer := SPACE(F_BLOCK)
nInfile := FOPEN("Temp.txt", FO_READ)
nOutfile := FCREATE("Newfile.txt", FC_NORMAL)
FSEEK()
ou por
AdvPl________________________________________________________________217
lDone := .F.
//
DO WHILE !lDone
nBytesRead := FREAD(nInfile, @cBuffer, F_BLOCK)
IF FWRITE(nOutfile, cBuffer, nBytesRead) < ;
nBytesRead
? "Erro gravando: ", FERROR()
lDone := .T.
ELSE
lDone := (nBytesRead == 0)
ENDIF
ENDDO
//
FCLOSE(nInfile)
FCLOSE(nOutfile)
GetImpWindows
Retorna lista de impressoras disponveis para impresso.
Sintaxe
GETIMPWINDOWS( lServer ) --> Array
Argumento
Obrigat.
Tipo
Descrio
lServer
Sim
Retorno
Descrio
Array
Descrio
GETIMPWINDOWS( ) retorna uma lista de impressoras disponveis no spool do Server ou Remote. Se o
Server est em ambiente Unix, a GETIMPWINDOWS( ) retornar a lista com os nomes de impressoras
cadastradas na chave PRINTERSNAME do AP6SRV.INI (ver PREPAREPRINT( )).
Exemplo
aImpressoras:= GetImpWindows(.F.) // retorna lista de impressoras do Windows do remote.
GetPortActive
Retorna lista de portas de impresso disponveis.
Sintaxe
AdvPl________________________________________________________________218
GETPORTACTIVE ( lServer ) --> Array
Argumento
Obrigat.
Tipo
Descrio
lServer
Sim
Retorno
Descrio
Array
Descrio
GETPORTACTIVE( ) retorna uma lista de portas de impresso disponveis do Server ou Remote. Se o
Server est em ambiente Unix, a GETPORTACTIVE( ) retornar uma lista com os nomes de devices
possveis para impresso.
Exemplo
aPortas:= GetPortActive(.F.) // retorna lista de portas de impressao do remote.
GetClientDir
Retorna o diretrio onde est instalado o Remote.
Sintaxe
GetClientDir( ) --> cDir
Retorno
Descrio
cDir
Descrio
Retorna o diretrio onde o Remote est instalado.
Exemplo
? GetClientDir() // Imprime o diretrio onde est instalado o remote
// Exemplo de sada
// c:\ap6\bin\remote
Header
AdvPl________________________________________________________________219
Verifica o tamanho do cabealho da tabela corrente.
Sintaxe
HEADER() --> Numrico
Retorno
Descrio
No h tabela corrente
nBytes
Descrio
Esta funo pode ser utilizada em conjunto com as funes RecSize e RecCount para calcular o tamanho
ocupado no disco pela tabela corrente. Pois, o tamanho ser Header+RecSize*RecCount.
Exemplo
// Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de
bytes):
USE "\DADOSADV\AA1990.DBF" SHARED NEW
nCabecalho := HEADER()
nDados := RecSize() * RecCount()
nTamanhoTotal := nCabecalho + nDados
IndexKey
Verifica qual a expresso de chave de um ndice.
Sintaxe
INDEXKEY( nOrdem ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
nOrdem
Retorno
Descrio
""
cExpOrdem
Descrio
Esta funo utilizada para verificar qual a expresso de chave de determinado ndice, especificado pela
posio do ndice na lista pelo primeiro parmetro.
AdvPl________________________________________________________________220
Se for passado parmetro igual a 0, ser retornada a expresso de chave do ndice atual.
Exemplo
// Este exemplo mostra como o INDEXKEY() pode recuperar a expresso do ndice atual:
USE Cliente NEW
INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ"
INDEX ON Nome TO Ind2 FOR Nome > "CCCCCCC"
INDEXKEY(1) // Retorna: Nome+Cod
INDEXKEY(2) // Retorna: Nome
INDEXKEY(0) // Retorna: Nome
expresso corrente
IndexOrd
Verifica a posio do ndice corrente.
Sintaxe
INDEXORD() --> Numrico
Retorno
Descrio
nOrd
Descrio
Esta funo retorna a posio ocupada pelo ndice corrente dentro da lista de ndices.
Exemplo
// Este exemplo verifica qual a posio do ndice corrente dentro da lista
USE Cliente NEW
SET INDEX TO Nome, End, Cep
INDEXORD() // Returns: 1 - o primeiro ndice da lista
InitPrint
Inicializa parmetros de impresso de relatrio.
Sintaxe
INITPRINT([ nOutPut ], [ cNameRel ], [ cType ] ,[ lPort ],[ cPathAtu ]) --> NIL
Argumento
Obrigat.
Tipo
Descrio
nOutPut
No
AdvPl________________________________________________________________221
Server
cNameRel
No
cType
No
lPort
No
No utilizado
cPathAtu
No
No utilizado
Retorno
Descrio
NIL
Sem retorno
Descrio
INITPRINT() inicializa parmetros de impresso de relatrio. Define onde ser a sada de impresso e qual
vai ser a formatao de sada.
Exemplo
/* Inicializa relatrio para imprimir via Client "Meu relatrio" em formulrio de 132
colunas
em Landscape */
InitPrint( 1,"Meu relatrio", "132L" )
IsPrinter
Verifica se impressora est disponvel.
Sintaxe
ISPRINTER( [ xPorta ], [ lSeta ], [ nWhere ], [ @nErrorCode ] ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
xPorta
No
C ou N
lSeta
No
No utilizado
nWhere
No
nErrorCode
No
Retorno
Descrio
.T.
Impressora ativa
AdvPl________________________________________________________________222
.F.
Impressora inativa
Descrio
ISPRINTER( ) testa a disponibilidade de impressoras conectadas fisicamente mquina onde est sendo
executado o Server ou Remote Protheus. Dependendo do sistema operacional, o teste pode ser um
Assembler em Windows 95 ou 98, ou a criao de um arquivo em Windows NT,2000 e Unix.
Nos casos onde o teste efetuado por criao de arquivo, o nErrorCode no ser informado.
Exemplo
If !isPrinter(1,,1,@nErr) // testa se impressora esta conectada na lpt1 no Remote.
MsgBox("Impressora no conectada! Erro: "+Str(nErr))
endif
IsCisaSyncOn
Verifica se o uso do CisaSync est habilitado.
Sintaxe
IsCisaSyncON() -> Lgico
Retorno
Descrio
.F.
No est habilitado.
.T.
Est habilitado.
Descrio
Esta funo utilizada para verificar se o uso do CisaSync est habilitado ou no.
Exemplo
// Este exemplo demonstra como se pode utilizar IsCisaSyncOn verificar se o CisaSync est
habilitado.
USE Cliente NEW
IF (ISCISASYNCON())
QOUT("CisaSync habilitado")
ELSE
QOUT("CisaSync desabilitado")
ENDIF
Locate
AdvPl________________________________________________________________223
Pesquisa um registro segundo um determinado escopo.
Sintaxe
LOCATE FOR CondFor [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento
Obrigat.
Tipo
Descrio
CondFor
Expresso AdvPl Expresso em ADVPL a ser resolvida para o registro a ser aceito.
CondWhile
Expresso AdvPl
nRecs
nRecno
Descrio
Este comando utilizado para encontrar um registro com determinado valor dentro de um escopo
especificado na tabela corrente.
Se a pesquisa obteve xito, a flag FOUND retorna .T. e a tabela posicionada no registro encontrado; caso
FOUND retorne .F., a tabela posicionada em EOF.
Se as opes do escopo forem omitidas (CondWhile, nRecs e nRecno), todos os registros so pesquisados,
desde o primeiro como a opo "ALL".
Caso contrrio, a opo "WHILE CondWhile" determina quando a busca deve parar (a expresso
retornar .F.); "NEXT nRecs" determina quantos registros devem ser pesquisados na busca; "RECORD
nRecno" determina o recno do registro a ser verificado na busca; "REST" significa que a busca deve
comear a partir do prximo registro.
Exemplo
// Este exemplo demonstra como utilizar o comando LOCATE no seu modo mais usual:
USE Cliente NEW
LOCATE FOR Nome="Jose"
FOUND() // Retorna: .T.
EOF() // Retorna: .F.
RECNO() // Retorna: 5
LOCATE FOR Nome="DDDDD"
FOUND() // Retorna: .F.
EOF() // Retorna: .T.
RECNO() // Retorna: 85
// Este exemplo demonstra como se pode utilizar o comando LOCATE para lista todos os
Cliente de nome "Jose" com idade 20 anos:
USE Cliente NEW
DBGOTOP()
LOCATE FOR Idade=20 WHILE Nome="Jose"
DO WHILE FOUND()
DBSKIP()
LOCATE REST FOR Idade=20 WHILE Nome="Jose"
ENDDO
AdvPl________________________________________________________________224
LUpdate
Verifica a data da ltima modificao da tabela corrente.
Sintaxe
LUpdate() --> Data
Retorno
Descrio
Data em branco
No h tabela corrente
Data
Descrio
Esta funo verifica qual a data da ltima modificao e fechamento da tabela corrente, caso no exista
tabela corrente retornada uma data em branco.
Exemplo
// Mostra a data da ltima modificao da tabela corrente, caso no exista tabela
corrente mostra uma mensagem de erro:
dModificacao := LUpdate()
IF (EMPTY(dModificacao))
Messagebox("No h tabela corrente","Erro", 0)
BREAK
ELSE
CONOUT ("A data da ultima modificacao e: " + DTOS(dModificacao))
ENDIF
MakeDir
Cria um diretrio.
Sintaxe
MAKEDIR( cNovoDir ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
CNovoDir
Sim
Retorno
Descrio
AdvPl________________________________________________________________225
-1
Descrio
Cria um diretrio na estao ou no servidor Advanced Protheus.
Exemplo
MAKEDIR("c:\teste\um") // Cria um diretrio na estacao
nResult := MAKEDIR("\teste\um") // Cria o diretorio no servidor Advanced protheus
IF nResult != 0
conout("Impossivel criar o diretrio no servidor Protheus" + Str(nResult))
ENDIF
MAKEDIR( "teste" ) // Exemplo tambm vlido ( Criando o diretrio no servidor)
MemoLine
Extrai uma linha de uma string ou de um campo memo.
Sintaxe
MEMOLINE( cString, [ nLineLength ], [ nLineNumber ], [ nTabSize ], [ lWrap ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cString
Sim
nLineLength
No
nLineNumber
No
nTabSize
No
lWrap
No
Retorno
Descrio
Caracter
Caracter. Retorna a linha solicitada, caso no exista o nmero de linhas, retorna uma string em
branco.
Descrio
MemoLine() uma funo que retorna uma linha especfica. Caso no exista a linha especificada, retorna
um string em branco.
Caso a quebra de linhas esteja habilitada (lWrap igual .T.) e a palavra esteja no meio da quebra de linha,
esta ser colocada na prxima linha.
AdvPl________________________________________________________________226
MemoLine() usada em conjunto com MLCOUNT() para extrair todas as linhas de um texto.
Exemplos
LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T.
LOCAL nLines, nCurrentLine
//
LOCAL cTexto := MEMOREAD( "Texto.TXT" )
nLines := MLCOUNT(cTexto, nLineLength, nTabSize, lWrap)
//
FOR nCurrentLine := 1 TO nLines
conout (MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap))
NEXT
MemoRead
L um arquivo texto e retorna uma string.
Sintaxe
MEMOREAD( cFile ) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cFile
Sim
Nome do arquivo texto que dever ser lido. Caminhos podem ser
includos.
Retorno
Descrio
varivel
Caracter. MEMOREAD() retorna uma string com no mximo 65.535 bytes do arquivo informado.
Descrio
MemoRead() l um arquivo texto e armazena o contedo em uma varivel string. O arquivo pode conter
no mximo 65.535 bytes.
AdvPl________________________________________________________________227
MemoWrite
Grava uma string para um arquivo em disco.
Sintaxe
MEMOWRITE( cArquivo , cString ) -->Lgico
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
cString
Sim
Retorno
Descrio
.T.
.F.
Houve falha na criao e gravao do arquivo, verifique FERROR() para obter detalhes o erro.
Descrio
MEMOWRITE() uma funo que grava o contedo de uma string em um arquivo em disco.
Podem ser usados caminhos tanto no local ( Remote ) como no servidor.
Exemplos
LOCAL cString := "Teste de gravao"
IF MEMOWRITE("teste.txt", cString)
conout("Erro gravando teste.txt")
ENDIF
MLCount
Conta o nmero de linhas de uma String.
Sintaxe
MLCOUNT( cString , [ nLineLength ], [ nTabSize ], [ lWrap ]) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
cString
Sim
nLineLength
No
AdvPl________________________________________________________________228
nTabSize
No
lWrap
No
Retorno
Descrio
>=0
Descrio
MLCOUNT() retorna o nmero de linhas de uma string baseado nos parmetros informados.
Exemplos
LOCAL nLineLength := 40, nTabSize := 3, lWrap := .T.
LOCAL nLines, nCurrentLine
//
LOCAL cTexto := MEMOREAD( "Texto.TXT" )
nLines := MLCOUNT(cTexto, nLineLength, nTabSize, lWrap)
//
FOR nCurrentLine := 1 TO nLines
conout(MEMOLINE(CustNotes, nLineLength, nCurrentLine, nTabSize, lWrap))
NEXT
Month
Converte o valor da data para o nmero do ms.
Sintaxe
MONTH( dData ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
dData
Sim
Retorno
Descrio
>=0 e <=12
Descrio
MONTH() uma funo de converso que extrai da data o valor numrico do ms.
AdvPl________________________________________________________________229
CMONTH() uma funo semelhante que retorna o nome do ms a partir do valor de dData.
Exemplos
Estes exemplos retornam o ms da data do sistema:
dData := DATE() // Resultado: 09/01/01
nMes := MONTH(DATE()) // Resultado: 9
nMes := MONTH(DATE()) + 1 // Resultado: 10
MsCompress
Compacta um ou vrios arquivos em um nico arquivo com extenso .MZP.
Sintaxe
MSCOMPRESS( cArq, [ cDestino ], [ cSenha ] ) --> lSucesso
Ou
MSCOMPRESS( aArquivos, [ cDestino ], [ cSenha ] ) --> lSucesso
Argumento
Obrigat.
Tipo
Descrio
cArq
Sim
aArquivos
Sim
cDestino
No
cSenha
No
Retorno
Descrio
.T.
.F.
Descrio
MSCOMPRESS() compacta os arquivos informados em um nico arquivo com extenso default .MZP. O
formato proprietrio e multiplataforma.
Caso a senha seja informada apenas com a senha poderemos descompactar os arquivos.
A funo para descompactao a MSDECOMP().
Tanto arquivos no local ( Remote ) como no Servidor so aceitos.
AdvPl________________________________________________________________230
Exemplos
// Exemplo 1 Compacta apenas um arquivo
lRes := MSCOMPRESS( "AP6SRV.EXE", "AP6SRV.MZP" )
// Exemplo 2 Compacta um diretrio com senha
aNome := {}
ADIR( "*.DBF", aNome )
lRes := MSCOMPRESS( aNome, "ArqComp.MZP", "SENHA" )
MsCRC32
Calcula um CRC de uma string.
Sintaxe
MSCRC32( cString ) --> nCRC
Argumento
Obrigat.
Tipo
Descrio
cString
Sim
Retorno
Descrio
nCRC
Descrio
MSCRC32() calcula um CRC de uma string informada e retorna um nmero com esse clculo.
Note que strings iguais retornam CRC iguais, porm, nem sempre strings diferentes retornam CRC
diferentes.
Exemplo
cString := MEMOREAD( "ARQ.TXT" )
? MSCRC32( cString )
MsCRC32Str
Calcula um CRC de uma string, retornando em formato String.
AdvPl________________________________________________________________231
Sintaxe
MSCRC32STR( cString ) --> cCRC.
Argumento
Obrigat.
Tipo
Descrio
cString
Sim
Retorno
Descrio
nCRC
Descrio
MSCRC32STR() calcula um CRC de uma string informada e retornando uma string com esse clculo.
Note que strings iguais retornam CRC iguais, porm nem sempre strings diferentes retornam CRC
diferentes.
Exemplo
cString := MEMOREAD( "ARQ.TXT" )
? MSCRC32STR( cString )
MsDecomp
Descompacta arquivos no formato .MZP (Microsiga Zip).
Sintaxe
MSDECOMP( cArqZip, cPathDestino, [ cSenha ] ) --> lSucesso.
Argumento
Obrigat.
Tipo
Descrio
cArq
Sim
cPathDestino
No
AdvPl________________________________________________________________232
cSenha
No
Retorno
Descrio
.T.
.F.
Descrio
MSDECOMP() descompacta o arquivo informado em um diretrio. O Formato proprietrio, e multiplataforma, suporta apenas arquivos compactados pela funo MSCOMPRESS().
Caso o arquivo seja protegido por senha, apenas com a senha poderemos descompact-lo.
Exemplo
// Exemplo 1 Descompacta no servidor
lRes := MSDECOMP( "AP6SRV.MZP", "TEMP" )
// Exemplo 2 Descompacta no local ( Remote )
lRes := MSCOMPRESS( "c:\ArqComp.MZP", "SENHA" )
OrdCondSet
Seta a condio e o escopo para a ordem corrente.
Sintaxe
ORDCONDSET([ cForCond ],,,,[ bEval ],,,,,, [ lDescendente ],,,,) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cForCond
No
AdvPl________________________________________________________________233
bEval
No
Bloco de Cdigo
lDescendente
No
Especifica se a ordem
crescente ou decrescente
Retorno
Descrio
.F.
.T.
deve
ser
Descrio
Esta funo utilizada para setar uma ordem de registro que esteja dentro de um escopo e de uma
condio especificada. Se todos os parmetros forem omitidos sero aceitos todos os registros da ordem.
Atravs do primeiro parmetro (cForCond) possvel especificar o escopo ao qual o registro deve
pertencer para estar dentro do filtro. Atravs do parmetro bEval, pode-se definir um bloco de cdigo que
deve retornar .T. para que o registro pertena ao filtro a ser setado.
Se o parmetro lDescendente for omitido, a ordem estar crescente, mas se tiver valor .T. ser
decrescente.
Exemplo
// Este exemplo mostra como se pode usar o ORDCONDSET para executar um filtro com idade
entre 20 e 30 anos e nome Joao:
USE Cliente VIA "DBFCDX" NEW
ORDCONDSET("Idade>20 .AND. Idade<30",,,,{||Nome = "Joao"})
OrdCreate
Cria uma ordem em determinado arquivo de ndice.
Sintaxe
ORDCREATE([ cIndice ],[ cOrdem ], cExpChave, [ bExpChave ], [ lUnico ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
cIndice
No *
cOrdem
No *
AdvPl________________________________________________________________234
cExpChave
Sim
bExpChave
No
Bloco de Cdigo
lUnico
No
*Obs: Os dois primeiros parmetros so opcionais, mas pelo menos um deles tem que estar especificado.
Retorno
Descrio
NIL
Sem retorno
Descrio
Esta funo utilizada para criar uma nova ordem em determinado arquivo de ndice com o nome
especificado atravs do primeiro parmetro, sendo que, se o mesmo existir, apenas acrescentada a
ordem, mas, caso contrrio, criado o arquivo.
Com exceo do RDD Ctree, a tabela corrente no precisa estar aberta em modo exclusivo para a criao
da ordem, pois na criao de ndices no Ctree alterada a estrutura da tabela, sendo necessrio que a
tabela esteja aberta em modo exclusivo.
Exemplo
// Este exemplo mostra como se pode criar novo arquivo de ndice criando a ordem sobre os
campos Nome e End e no aceitar duplicao:
USE Cliente VIA "DBFCDX" NEW
ORDCREATE ("\teste\ind2.cdx",,"Nome+End",{ || Nome+End },.T.)
// Este exemplo mostra como se pode criar nova ordem (Tag2) sobre o campo End que
aceitar duplicao e no arquivo de ndice j existente:
USE Cliente VIA "DBFCDX" NEW
ORDCREATE ("\teste\ind2.cdx","Tag2","End",{ || End })
AdvPl________________________________________________________________235
OrdDescend
Verifica ou altera a condio (crescente/decrescente) de uma ordem.
Sintaxe
ORDDESCEND([ cOrdem | nPosicao ],[ cArqIndice ], [ lDecrescente ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cOrdem
No
nPosicao
No
cArqIndice
No
lDecrescente
No
Retorno
Descrio
.F.
.T.
Descrio
Esta funo pode ser utilizada para apenas verificar o estado da ordem atual, se no for especificado o
parmetro lDecrescente.
Quando especificado o parmetro lDescend, o estado da ordem modificado, sendo que a funo
retorna ao estado anterior da ordem em questo.
Para evitar conflito, no caso de haver mais de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.
A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
Exemplo
AdvPl________________________________________________________________236
// Este exemplo mostra como o ORDBAGNAME pode encontrar o nome de diferentes ndices
atravs da posio da ordem na lista:
USE Cliente VIA "DBFCDX" NEW
ORDLISTADD ("\teste\ind1.cdx","NOME") // A ordem criada na forma crescente
ORDDESCEND() // Retorna: .F.
ORDDESCEND(,,.T.) // Retorna: .F., mas seta a ordem atual (NOME) como decrescente
ORDDESCEND() // Retorna: .T.
ORDLISTADD ("\teste\ind2.cdx","NOME")
ORDDESCEND("NOME","ind1",.F.) // Retorna: .T.
ORDDESCEND("NOME","ind1",) // Retorna: .F.
OrdKey
Verifica qual a expresso de chave da ordem.
Sintaxe
ORDKEY([ cOrdem | nPosicao ],[ cArqIndice ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cOrdem
No
nPosicao
No
cArqIndice
No
Nome do ndice
Retorno
Descrio
""
cExpOrdem
Descrio
Esta funo utilizada para verificar qual a expresso de chave de determinada ordem.
Para evitar conflito, no caso de haver mais de uma ordem com o mesmo nome, pode-se passar o
parmetro com o nome do ndice ao qual a ordem pertence.
A ordem passada no primeiro parmetro pode ser especificada atravs da sua posio na lista de ordens
ativas (atravs do ORDLISTADD) ou atravs do nome dado ordem, a funo verifica automaticamente
se o parmetro numrico ou caracter.
AdvPl________________________________________________________________237
Exemplo
// Este exemplo mostra como o ORDKEY() pode recuperar a expresso da ordem atual:
USE Cliente NEW
INDEX ON Nome+Cod TO Ind1 FOR Nome+Cod > "AZZZZZZZ"
ORDKEY("Ind1") // Retorna: Nome+Cod
OrdListAdd
Acrescenta uma ou mais ordens lista.
Sintaxe
ORDLISTADD( cArqIndice, [ cOrdem ]) --> Nil
Argumento
Obrigat.
Tipo
Descrio
cArqIndice
Sim
cOrdem
No
Retorno
Descrio
NIL
Sem retorno
Descrio
Esta funo utilizada para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho.
Para se utilizar arquivos de extenso padro do RDD, este dado pode ser omitido no primeiro parmetro,
mas, caso contrrio, deve ser especificado.
Exemplo
// Este exemplo mostra como se pode acrescentar uma ordem especfica ou todas as ordens
de determinado arquivo de ndice lista:
USE Cliente VIA "DBFCDX" NEW
OrdListAdd ("\teste\ind1.cdx","NOME") // Acrescenta apenas a ordem NOME
OrdListAdd ("\teste\ind2.cdx") // Acrescenta todas as ordens do arquivo ind2.cdx
AdvPl________________________________________________________________238
PRow
Informa ou muda a linha corrente de impresso.
Sintaxe
PROW( [ nNewLine ] ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
nNewLine
No
Retorno
Descrio
Descrio
PROW( ) pode ser utilizado para informar a linha corrente de impresso ou para modific-la. Se a nova
linha informada for menor que a corrente, isto provocar um salto de pgina na impresso.
Exemplo
@ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( PROW( )+2 ) // Pula 2 linhas
@ PROW( ), 10 PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( 0 ) // Salta a pagina
Pack
Remove todos os registros deletados da tabela.
Sintaxe
PACK
Descrio
Este comando apaga (fisicamente) todos os registros deletados da tabela corrente.
Exemplo
// Este exemplo demonstra como se pode utilizar a funo DBDELETE() para marcar alguns
registros como deletados e o comando PACK para delet-los fisicamente.
AdvPl________________________________________________________________239
USE Clientes NEW
DBGOTO(100)
DBDELETE()
DBGOTO(105)
DBDELETE()
DBGOTO(110)
DBDELETE()
PACK
PCol
Informa ou muda a coluna corrente de impresso.
Sintaxe
PCOL( [ nNewCol ] ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
nNewCol
No
Retorno
Descrio
Descrio
PCOL( ) pode ser utilizado para informar a coluna corrente de impresso ou para modific-la. Se for
informada uma coluna menor que a corrente, sero impressos caracteres de BACKSPACE chr(8) para
forar o retorno do carro de impresso em impressoras matriciais.
Exemplo
PCOL( 10 )
@ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( PROW( )+2 ) // Pula 2 linhas
PCOL( 10 )
@ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( 0 ) // Salta a pagina
PreparePrint
Prepara o relatrio para o inicio da impresso.
Sintaxe
PREPAREPRINT( lWindows, cPrinterName, lDisco, cFile, l_Lpd, nLeftMargin ) --> NIL
AdvPl________________________________________________________________240
Argumento
Obrigat.
Tipo
Descrio
lWindows
Sim
cPrinterName
Sim
lDisco
Sim
cFile
Sim
l_lpd
No
nLeftMargin
No
Retorno
Descrio
NIL
Sem retorno.
Descrio
PREPAREPRINT( ) ajusta a impresso do relatrio propriamente dita, define se utilizar o spool do
Windows ou se o relatrio ser direcionado para arquivo. Pode-se ajustar a margem esquerda do relatrio
para encadernaes.
Quando estamos utilizando um servidor em ambiente Unix, pode-se configurar a sada do relatrio para
utilizar o LPD (Line Printer Daemon) do Unix. Ative o parmetro l_lpd para .T., e no arquivo de
configurao do Server (AP6SRV.INI), crie a entrada abaixo:
[SERVERPRINTERS]
PRINTERSNAME=lp1,lp2[...,lp3]
Onde PRINTERSNAME uma lista com os nomes das impressoras cadastradas no \etc\printcap. Para mais
informaes veja manual do Unix para configurao de impressoras. Lembrando que o Unix casesensitive quando trata nomes e arquivos.
Exemplo
// Envia a impressao para a impressora "LaserJet4.." e configura a margem esquerda para 1
cm para direita
PreparePrint( .T., "LaserJet4 in //advpr1",.F.,"",.F.,1 )
AdvPl________________________________________________________________241
PrnFlush
Fora envio do buffer de impresso para a impressora.
Sintaxe
PRNFLUSH( ) --> NIL
Retorno
Descrio
NIL
Sem retorno
Descrio
Nas impresses, o Protheus bufferiza a impresso em pginas para enviar todo o contedo para a
impressora de forma otimizada. PRNFLUSH( ) fora o envio do buffer de dados para a impressora antes do
previsto pela otimizao de impresso.
Exemplo
SETPRC(0,0) // inicia impresso na linha 0 coluna 0
PCOL( 10 ) //muda para coluna 10
@ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PRNFLUSH( ) // Forca impresso antes do termino da pagina.
PROW( PROW( )+2 ) // Pula 2 linhas
PCOL( 10 )
@ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( 0 ) // Salta a pagina
FECHAREL( ) // Fecha impresso
RDDSetDefault
Modifica ou verifica o RDD padro.
Sintaxe
RDDSetDefault ([ cNovoRddPadro ]) --> Caracter
Argumento
Obrigat.
Tipo
Descrio
cNovoRddPadro
No
Retorno
Descrio
cAntigoRddPadro
AdvPl________________________________________________________________242
Descrio
Esta funo pode ser utilizada apenas para verificar qual o RDD que est definido como padro quando for
omitido seu parmetro.
Ela tambm pode ser utilizada para especificar outro RDD como padro, especificando-o atravs do
parmetro.
Exemplo
// Este exemplo demonstra como se pode utilizar o RDDSETDEFAULT para alterar o valor do
RDD padro.
RDDSETDEFAULT("CTREECDX") // Retorna: DBFCDX
RDDSETDEFAULT() // Retorna: CTREECDX
RealRDD
Retorna qual o driver que realmente est sendo utilizado para abertura dos arquivos locais.
Sintaxe
REALRDD() --> Caracter
Retorno
Descrio
"ADS"
"ADSSERVER"
"CTREE"
Ctree - Faircom
"CODEBASE"
Codebase
Descrio
O driver "DBFCDX" pode ser utilizado para a abertura de arquivos Codebase, Advantage Database Server,
Advantage Local Server ou Ctree. Depende do que est especificado na chave LOCALFILES do ambiente
utilizado, no arquivo de inicializao do servidor.
REALRDD() retorna o nome do driver que realmente est sendo utilizado para abertura dos arquivos
locais.
Exemplo
if RealRdd()="CODEBASE"
conout("Mudar abertura dos arquivos para ADS.")
endif
AdvPl________________________________________________________________243
Recall
Altera o estado deletado de alguns registros.
Sintaxe
RECALL [FOR CondFor] [WHILE CondWhile] [NEXT nRecs] [RECORD nRecno] [REST] [ALL]
Argumento
Obrigat.
Tipo
CondFor
Sim
CondWhile
No
nRecs
No
nRecno
No
Retorno
Descrio
NIL
Sem retorno
Descrio
Descrio
Este comando utilizado para retirar a marca de registro deletado de alguns registros.
Para ser executado, os registros em questo devem estar bloqueados ou a tabela deve estar aberta em
modo exclusivo. Se o registro no estiver deletado, este comando no faz nada.
se todas as opes forem omitidas ele executado apenas para o registro atual;
se for especificada uma condio de "FOR", o escopo abrange todos os arquivos ("ALL");
o parmetro "RECORD nRecno" especifica qual recno do registro deve ser alterado;
AdvPl________________________________________________________________244
a opo "REST" determina que sero processados os registros a partir do registro atual. Caso seja
omitida, o comando comea a processar a partir do primeiro registro.
Exemplo
// Este exemplo demonstra como se pode utilizar o
registro atual para normal.
USE Cliente
DBGOTO(100)
DBDELETE()
DELETED() // Retorna: .T.
RECALL
DELETED() // Retorna: .F.
// Este exemplo demonstra como se pode utilizar o
os registros que apresentam idade>30.
USE Cliente
RECALL FOR Idade>30
// Este exemplo demonstra como se pode utilizar o
os registros com idade maior que 30 e Nome = Joao
USE Cliente
RECALL FOR Idade>30 WHILE Nome="Joao" REST
RecSize
Verifica o tamanho do registro da tabela corrente.
Sintaxe
RECSIZE() --> Numrico
Retorno
Descrio
nBytes
No h tabela corrente.
Descrio
Esta funo calcula o tamanho do registro da tabela corrente somando os tamanhos de cada campo mais
um byte da flag de registro deletado mais quatro bytes do campo recno.
Ela pode ser utilizada em conjunto com as funes Header e RecCount para calcular o tamanho ocupado
no disco pela tabela corrente, pois o tamanho ser Header+RecSize*RecCount.
Exemplo
// Este exemplo calcula o tamanho ocupado pela tabela "AA1990.DBF" no disco (nmero de
bytes):
USE "\DADOSADV\AA1990.DBF" SHARED NEW
nCabecalho := HEADER()
nDados := RECSIZE() * RECCOUNT()
nTamanhoTotal := nCabecalho + nDados
AdvPl________________________________________________________________245
ReIndex
Reconstri todos os ndices abertos da rea de trabalho corrente.
Sintaxe
REINDEX
Descrio
Este comando reconstri todos os ndices da rea de trabalho corrente e posiciona as tabelas no primeiro
registro lgico.
Exemplo
// Este exemplo demonstra como se pode utilizar o DBREINDEX para reconstruir os ndices
depois que um novo ndice foi gerado.
USE Clientes NEW
DBSETINDEX("IndNome")
REINDEX
Replace
Modifica o valor de alguns campos e registros da tabela corrente.
Sintaxe
REPLACE Campo WITH Exp [, Campo2 WITH Exp2 ] [FOR CondFor] [WHILE CondWhile] [NEXT
nRecs] [RECORD nRecno] [REST] [ALL]
Argumento
Obrigat.
Tipo
Campo
Sim
Exp
Sim
CondFor
No
CondWhile
No
nRecs
No
nRecno
No
N
N
Descrio
AdvPl________________________________________________________________246
Descrio
Este comando utilizado para alterar o valor de determinado campo em alguns registros da tabela
corrente, onde o campo escolhido recebe o valor da expresso para os registros dentro do escopo
definido.
Se no forem especificadas as condies para que o registro seja alterado, modifica toda a tabela, como
se estivesse especificada a opo "ALL".
Pode-se especificar um escopo para que os registros sejam alterados atravs das opes "FOR CondFor" e
"WHILE CondWhile".
Pode-se tambm limitar o nmero de registros a serem alterados atravs da opo "NEXT nRecs" e
determinar que a alterao dos registros deve-se iniciar a partir do registro atual com "REST", mas, caso
contrrio, o comando executa um DBGOTOP() antes de iniciar a alterao.
Se desejado alterar apenas determinado registro pode-se defini-lo atravs da especificao do recno
com "RECORD nRecno".
Exemplo
// Este exemplo demonstra como utilizar o comando REPLACE alterar todos os registros
dentro do escopo, onde o campo "Valor" receber "Valor1+Valor2-Valor3*0.1" e o campo
"DiaTran" receber a data atual. Este escopo definido por Idade > 20, at que o nome
seja maior ou igual a "VVV", comea a deleo a partir do registro atual e marca apenas
10 registros:
USE Cliente VIA "CTREECDX" NEW
REPLACE Valor WITH Valor1+Valor2-Valor3*0.1, DiaTran WITH Date() FOR Idade>20 WHILE
Nome<"VVV" NEXT 10 REST
RLock
Bloqueia o registro corrente da tabela ativa.
Sintaxe
RLOCK() --> Lgico
Retorno
Descrio
.F.
No conseguiu bloquear o registro. Principal motivo: o registro j est bloqueado por outro
usurio.
.T.
Descrio
AdvPl________________________________________________________________247
Esta funo utilizada quando se tem uma tabela aberta e compartilhada, e se deseja bloquear um
registro para que outros usurios no possam alter-lo. Se a tabela j est aberta em modo exclusivo, a
funo no altera seu estado.
Exemplo
//Este exemplo utiliza a funo RLOCK() para deletar o registro com o nome "Joao" da tabela de Clientes
indexada por Nome:
USE Clientes INDEX Nome SHARED NEW
SEEK "Joao"
IF FOUND()
IF RLOCK()
DELETE
Messagebox("Joao deletado","OK", 0)
ELSE
Messagebox("Registro utilizado por outro usurio","Erro", 0)
ENDIF
ELSE
Messagebox("Registro no encontrado","Erro", 0)
ENDIF
CLOSE
//Este exemplo mostra como se pode bloquear um registro sem que ele esteja na tabela
corrente
USE VENDAS NEW
USE CLIENTES NEW
//
IF !VENDAS->(RLOCK())
Messagebox("Registro utilizado por outro usurio","Erro", 0)
BREAK
ENDIF
Seconds
Retorna o nmero de segundos decorridos desde a meia-noite.
Sintaxe
SECONDS() --> Numrico
Retorno
Descrio
>=0 e <=86399
Descrio
Esta funo retorna o nmero de segundos decorridos desde a meia-noite, segundo a hora do sistema.
Est relacionada funo TIME() que retorna a hora do sistema como uma cadeia de caracteres no
formato hh:mm:ss.
Exemplos
Este exemplo compara TIME() e SECONDS():
AdvPl________________________________________________________________248
cHora := TIME() // Resultado: 10:00:00
cSegundos := SECONDS() // Resultado: 36000.00
Este exemplo usa a funo SECONDS() para cronometrar o tempo decorrido:
LOCAL nStart, nElapsed
nStart:= SECONDS()
.
. <statements>
.
nElapsed:= SECONDS() - nStart
cElapsed := LTRIM(STR(nElapsed)) + " seconds"
Seek
Encontra um registro com determinado valor da chave do ndice.
Sintaxe
SEEK Exp [SOFTSEEK]
Argumento
Obrigat.
Exp
Sim
Tipo
Descrio
Expresso em ADVPL a ser resolvida para o registro ser encontrado
Retorno
Descrio
NIL
Sem retorno
Descrio
Este comando utilizado para encontrar um registro com determinado valor da expresso de chave de
ndice.
Antes da chamada do SEEK deve-se certificar de que existe uma ordem ativa no momento com os campos
que se deseja pesquisar o valor.
Caso a expresso possua apenas um campo numrico, o primeiro parmetro deve ser do tipo numrico,
mas nos demais casos deve-se utilizar um valor do tipo caracter para este parmetro (mesmo se forem
apenas dois campos numricos ou do tipo data).
Quando for especificada a opo "SOFTSEEK", mesmo que a expresso pesquisada no encontrar nenhum
registro com este valor, a tabela ser posicionada no prximo valor maior que o especificado no primeiro
parmetro, mas mesmo posicionando no prximo valor, esta funo retornar .F. (pois no encontrou).
Quando no for especificado este valor ou estiver .F. e falhar o valor de pesquisa, a tabela ser
posicionada em LASTREC + 1 e ser setada a flag de EOF.
AdvPl________________________________________________________________249
Exemplo
// Este exemplo demonstra como se pode utilizar o SEEK para busca de valores numricos.
USE Clientes NEW
ORDLISTADD ("/teste/ind1.cdx") // Expresso Num (campo numrico)
SEEK 100 // Retorna: .F.
EOF() // Retorna: .T.
SEEK 100 SOFTSEEK // Retorna: .F.
EOF() // Retorna: .F. (pois o softseek posicionou no prximo registro)
// Este exemplo demonstra como se pode utilizar o SEEK para percorrer todos os registros
de Clientes com o nome joao e vencimentos a partir de janeiro de 2001.
USE Clientes NEW
ORDLISTADD ("/teste/ind2.cdx") // Expresso Nome+Venc (campo caracter + data)
SEEK "
joao200101" SOFTSEEK // Procura a primeira ocorrncia de Nome "joao" e
vencimento maior que Janeiro de 2001
WHILE !EOF() .AND. Nome == "
joao"
DBSKIP()
ENDDO
Select
Seleciona nova rea de trabalho.
Sintaxe
SELECT nArea | Alias
Argumento
Obrigat.
Tipo
Descrio
nArea
Sim
Alias
Sim
Descrio
Este comando utilizado para selecionar uma nova rea de trabalho para deix-la ativa.
Exemplo
// Este exemplo demonstra como se pode utilizar o SELECT alterar a rea corrente.
USE Clientes ALIAS a1
USE Clientes2 ALIAS a2
SELECT a1 // ou SELECT 1
Set Filter
Seta ou cancela uma condio de filtro.
Sintaxe
AdvPl________________________________________________________________250
SET FILTER TO [ Condio ]
Argumento
Obrigat.
Condio
No
Tipo
Descrio
Expresso em ADVPL a ser setada como filtro na ordem corrente
Retorno
Descrio
NIL
Sem retorno
Descrio
Este comando utilizado para setar um filtro nos registros da tabela corrente especificado atravs da
condio especificada.
Quando um registro no est dentro do filtro setado ele continua existindo fisicamente, mas no
logicamente (nas funes de manipulao de banco de dados como DBGOTOP, DBSEEK, DBSKIP,
etc).
Exemplo
// Este exemplo demonstra como utilizar o comando SET FILTER para setar novas expresses
de filtro e retir-las:
USE Cliente VIA "CTREECDX" NEW
SET ORDER TO 2 // Seta a ordem de nome Nome do ndice Ind1
SET FILTER TO Idade>30 // Filtra os registros com Idade menor que 30
SET FILTER TO
Set Index
Acrescenta todas as ordens de um ou mais arquivos de ndice lista.
Sintaxe
SET INDEX TO [ ArqIndices ] [ ADDITIVE ]
Argumento
Obrigat.
ArqIndices
No
Retorno
Tipo
Descrio
Nome dos arquivos de ndice a serem acrescentados lista de ordens.
Descrio
AdvPl________________________________________________________________251
NIL
Sem retorno
Descrio
Este comando utilizado para acrescentar uma ou mais ordens de determinado ndice na lista de ordens
ativas da rea de trabalho quando se especifica "ADDITIVE".
Quando o mesmo omitido, a lista de ordens esvaziada para depois ser acrescentada s ordens dos
ndices.
Quando o arquivo de ndice possui apenas uma ordem, a mesma acrescentada lista e torna-se ativa.
Quando o ndice possui mais de uma ordem, todas so acrescentadas lista e a primeira torna-se ativa.
Quando mais de um arquivo de ndice selecionado, a ordem que torna-se ativa a primeira ordem do
primeiro arquivo.
Quando o comando utilizado sem nenhum parmetro, todas as ordens da lista so apagadas.
Exemplo
// Este exemplo demonstra como utilizar o comando SET INDEX para
a lista e retir-las depois:
USE Cliente VIA "CTREECDX" NEW
SET INDEX TO ind1 // Inicializa a lista com as ordens do arquivo
SET INDEX TO ind2 ADDITIVE // Acrescenta as ordens do arquivo de
SET INDEX TO ind3 // Limpa a lista e inicializa com as ordens do
SET INDEX TO // Limpa a lista de ordens
Set Order
Seleciona uma ordem ativa da rea de trabalho.
Sintaxe
SET ORDER TO [ nPosio | [ TAG cOrdem ] [ IN cIndice ]]
Argumento
Obrigat.
Tipo
Descrio
nPosio
No
cOrdem
No
AdvPl________________________________________________________________252
cIndice
No
Retorno
Descrio
NIL
Sem retorno
Descrio
Este comando pode ser utilizado apenas para retornar a tabela corrente ordem original (recno), se no
for especificado nenhum parmetro.
Tambm pode ser utilizado para selecionar uma nova ordem para a tabela corrente atravs da posio da
ordem na lista de ordens ativas com o primeiro parmetro ou atravs do nome da ordem especificado
"TAG cOrdem".
Para evitar nomes de ordens duplicados, pode-se especificar a qual arquivo de ndice pertence com "IN
cIndice".
Exemplo
// Este exemplo demonstra como utilizar o comando SET ORDER para setar novas ordens e
retir-las:
USE Cliente VIA "CTREECDX" NEW
SET ORDER TO TAG Nome IN Ind1 // Seta a ordem de nome Nome do ndice Ind1
SET ORDER TO 3 // Seta a terceira ordem da lista
SET ORDER TO // Retira as ordens, setando a ordem natural da tabela
SetPrc
Configura a linha e coluna correntes de impresso.
Sintaxe
SETPRC( nLin, nCol ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
nLin
Sim
nCol
Sim
Retorno
Descrio
NIL
Sem retorno.
AdvPl________________________________________________________________253
Descrio
SETPRC( ) modifica a linha e coluna atuais de impresso assim como PCOL( ) e PROW( ) chamados
separadamente.
Exemplo
SETPRC(0,0) // inicia impresso na linha 0 coluna 0
PCOL( 10 ) //muda para coluna 10
@ ROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( PROW( )+2 ) // Pula 2 linhas
PCOL( 10 )
@ PROW( ), PCOL( ) PSAY "Minha Linha nesta pagina e " + str( PROW( ) )
PROW( 0 ) // Salta a pagina
Skip
Desloca a tabela para outro registro.
Sintaxe
SKIP [nRegistros] [nArea | ALIAS Alias]
Argumento
Obrigat.
Tipo
Descrio
nRegistros
No
nArea
No
Alias
No
Retorno
Descrio
NIL
Sem retorno
Descrio
Este comando utilizado para deslocar para outro registro a partir do registro atual.
O parmetro especifica quantos registros lgicos devem ser deslocados a partir do corrente. Se for
positivo desloca em direo ao final da tabela, se for negativo ao incio da tabela e, caso seja omitido, ir
para o prximo registro (o padro 1). Caso passe do incio da tabela, posiciona no primeiro registro e
seta BOF, caso passe do final da tabela, posiciona no registro LASTREC + 1 e seta EOF.
AdvPl________________________________________________________________254
O padro ser utilizado para a tabela corrente, mas pode ser especificada outra rea de trabalho para
execut-lo atravs do nmero "nArea" ou nome "ALIAS Alias".
Exemplo
// Este exemplo mostra como o SKIP pode passar do final da tabela e do incio da tabela
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOBOTTOM()
EOF() // retorna .F.
SKIP
EOF() // retorna .T.
DBGOTOP()
BOF() // retorna .F.
SKIP -1
BOF() // retorna .T.
// Este exemplo mostra como o SKIP pode deslocar 10 registro em relao ao registro
corrente
DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
SKIP 10
RECNO() // retorna 110
SKIP -10
RECNO() // retorna 100
// Este exemplo mostra como o SKIP pode ser executado em outra area de trabalho.
DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
DBGOTO(100)
DBUSEAREA(.T.,"dbfcdxads", "\dadosadv609\sa1110.dbf","XXX", .T., .F. )
SKIP 10 ALIAS "SSS"
SSS->RECNO() // retorna 110
SKIP -10 ALIAS "SSS"
SSS->RECNO() // retorna 100
SplitPath
Quebra em diversas partes um arquivo.
Sintaxe
SPLITPATH( cArq, @[cDrive], @[cCaminho], @[cNome], @[cExt] ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cArq
Sim
cDrive
No
cCaminho
No
cNome
No
AdvPl________________________________________________________________255
cExt
No
Retorno
Descrio
NIL
Sem retorno
Descrio
SplitPath() divide um caminho completo em todas as suas subpartes; cArq no necessita conter todas as
partes.
Tanto arquivos locais ( Remote ) quanto arquivos no servidor, podem ser informados.
TCConType
Define o tipo de conexo que ser utilizada entre o Protheus e o TopConnect.
Sintaxe
TCCONTYPE ( cTipo ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cTipo
Sim
AdvPl________________________________________________________________256
Retorno
Descrio
NIL
Sem retorno
Descrio
Determina o tipo de conexo que ser utilizada entre o Protheus e o TopConnect. O valor guardado e
utilizado nas chamadas seguintes de TCLink.
Exemplo
TCConType("NPIPE")
_nCon := TCLink("MSSQL7/TOPSQL", "TOPSERVER1")
If (_nCon < 0)
CONOUT("Falha Conexao TOPCONN - Erro: "+ str(nCon, 10, 0))
EndIf
TCDelFile
Apaga um arquivo de um banco de dados.
Sintaxe
TCDELFILE ( cTabela ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cTabela
Sim
Retorno
Descrio
.T.
.F.
Erro. Geralmente porque a tabela est sendo utilizada por outro processo.
Descrio
Apaga um arquivo de um banco de dados relacional via TopConnect.
Exemplo
If TcCanOpen("TRB"+SM0->M0_CODIGO+"0")
TcDelFile("TRB"+SM0->M0_CODIGO+"0")
Endif
TCGenQry
AdvPl________________________________________________________________257
Define a execuo de uma Query.
Sintaxe
TCGENQRY ([ xPar1, xPar2, ], cQuery) --> caracter
Argumento
Obrigat.
Tipo
Descrio
xPar1, xPar2
No
Qualquer
cQuery
Sim
Retorno
Descrio
""
Descrio
Esta funo determina que a prxima chamada DBUseArea ser a abertura de uma Query e no de
tabela.
Exemplo
cQuery := 'SELECT X2_CHAVE CHAVE, R_E_C_N_O_ RECNO from SX2990'
dbUseArea(.T., 'TOPCONN', TCGenQry(,,cQuery), 'TRB', .F., .T.)
while !Eof()
// Processa
conout(TRB->CHAVE)
dbSkip()
enddo
dbCloseArea()
TCIsvLock
Verifica se o servidor possui sistema de locks virtuais.
Sintaxe
TCISVLOCK () --> Lgico
Retorno
Descrio
.T.
.F.
Descrio
Atravs de locks virtuais, possvel bloquear uma string. A funo TCISVLOCK verifica se o servidor
TopConnect possui tratamento para locks virtuais.
AdvPl________________________________________________________________258
Exemplo
#ifdef TOP
If TCIsVLock()
TCVUnLock()
EndIf
#endif
TCRefresh
Faz refresh em uma tabela.
Sintaxe
TCREFRESH ( cTabela ) --> NIL
Argumento
Obrigat.
Tipo
Descrio
cTabela
Sim
Lgico
Retorno
Descrio
NIL
No existe retorno.
Descrio
Faz o refresh de uma tabela, atravs de uma leitura forada da tabela no banco de dados. til aps
alteraes diretas no banco (delete, insert).
Exemplo
cTabela:= "SA1990"
cComando := "Delete "+ cTabela +" Where R_E_C_N_O_ > 50000 "
TCSqlExec(cComando)
TCRefresh(cTabela)
TCSetBuf
Esta funo foi mantida apenas para compatilizao, no sendo utilizada no AP6.
TCSetConn
Altera a conexo corrente.
AdvPl________________________________________________________________259
Sintaxe
TCSETCONN( nConexaoCorrente ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
nConexaoCorrente
Sim
Numrico
Retorno
Descrio
.T.
.F.
Conexo no encontrada
Descrio
Altera a conexo corrente. Novas tabelas abertas ou criadas utilizaro esta conexo para realizar a
operao. til quando se tem mais de uma conexo com o TopConnect.
Exemplo
_nCon1 := TCLink("MSSQL7/TOPSQL1", "TOPSERVER1")
If (_nCon1 < 0)
CONOUT("Falha Conexao TOPCONN 1 - Erro: "+ str(_nCon1, 10,
return .F.
EndIf
_nCon2 := TCLink("MSSQL7/TOPSQL2", "TOPSERVER2")
If (_nCon2 < 0)
CONOUT("Falha Conexao TOPCONN 2 - Erro: "+ str(_nCon2, 10,
return .F.
EndIf
USE CLIENTES VIA "TOPCONN" NEW // Tabela de clientes ser aberto
TCSETCONN(_nCon1)
USE PEDIDOS VIA "TOPCONN" NEW // Tabela de pedidos ser aberto
.
.
.
TCQUIT()
RETURN .T.
0))
0))
em _nCon2
em _nCon2
TCSetDummy
Altera o status do modo "dummy"
Sintaxe
TCSETDUMMY ([ lStatus ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
lStatus
Sim
Lgico
AdvPl________________________________________________________________260
Retorno
Descrio
.T.
.F.
Erro na operao.
Descrio
No modo "dummy", o TopConnect faz apenas a abertura dos arquivos, sem executar nenhuma funo de
posicionamento. utilizado para fazer uma abertura mais rpida dos arquivos. Passando .T., entra em
modo "Dummy", .F. volta ao normal.
Exemplo
TCSetDummy(.t.)
For ni:= 1 to NroTabelas
cTabela:= "TABELA"+TRIM(STR(NI, 10, 0))
dbUseArea( .T.,"TOPCONN", cTabela, cTabela, .T., .F. )
next
TCSetDummy(.F.)
dbselectarea("TABELA1")
DBGOTOP()
.......
TCSetField
Altera o tipo de um campo.
Sintaxe
TCSETFIELD (cAlias, cCampo, cTipo [, nTamanho, nDecimais]) --> nil
Argumento
Obrigat.
Tipo
Descrio
cAlias
Sim
Alias da Tabela
cCampo
Sim
Nome do Campo
cTipo
Sim
Novo tipo do campo. Pode ser : 'N' (numrico), 'D' (data) ou 'L' (lgico).
nTamanho
No
nDecimais
No
Retorno
Descrio
NIL
Sem retorno
AdvPl________________________________________________________________261
Descrio
Quando se faz a abertura de uma tabela via TCquery, todos os campos aparecem como tipo Caracter.
necessrio em seguida acertar o tipo do campo, se ele no for caracter.
Exemplo
aStru := CT2->(dbStruct())
cCond := ".T."
cQuery := "SELECT * FROM " + RetSqlName("CT2") + " WHERE"
cQuery := 'CT2_FILIAL = "' + xFilial("CT2") EndIf
cQuery := ChangeQuery(cQuery)
dbUseArea(.T., "TOPCONN", TCGenQry(,,cQuery), 'NovoCT2', .F., .T.)
For ni := 1 to Len(aStru)
If aStru[ni,2] != 'C'
TCSetField('NovoCT2', aStru[ni,1], aStru[ni,2],aStru[ni,3],aStru[ni,4])
Endif
Next
TCSpExec
Executa uma Stored Procedure.
Sintaxe
TCSPEXEC ( cSProc [, xParam1,...,xParamN])--> [array]
Argumento
Obrigat.
Tipo
Descrio
cSProc
Sim
xParamX
No
Qualquer
Retorno
Descrio
NIL
array
Descrio
Executa uma Stored Procedure, no banco de dados, com nmero varivel de parmetros.
Exemplo
A Stored Procedure abaixo retorna "Teste" e o parmetro numrico +3:
AdvPl________________________________________________________________262
@OUT_STR char(255), @OUT_VALUE int)
WITH RECOMPILE
As
Begin
Select @OUT_STR = "Teste", @OUT_VALUE = @IN_VALUE + 3
End
GO
Para executar:
aResult := TCSPEXEC(xProcedures ('teste1'), 100 )
IF Len(aResult) = 0
conout("Erro na execuo da Stored Procedure.")
Endif
Else
conout(aResult[1] + str(aResult[2]))
Endif
TCSpExist
Verifica se uma Stored Procedure existe.
Sintaxe
TCSPEXIST ( cStoredProc ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cStoredProc
Sim
Retorno
Descrio
.T.
.F.
Descrio
Verifica a existncia de uma Stored Procedure no Banco de dados atual.
Exemplo
if TCSPExist("SP000001")
cStr := "DROP PROCEDURE "+ "SP000001 "
TCSqlExec(cStr)
endif
AdvPl________________________________________________________________263
TCSqlError
Retorna o ltimo erro produzido em comandos SQL.
Sintaxe
TCSQLERROR ( )-> Caracter
Retorno
Descrio
Caracter
Descrio
Esta funo obtm as mensagens de erros em ordem inversa. Portanto, s vezes necessrio fazer vrias
chamadas a esta funo para obter todos os erros, caso eles sejam mltiplos.
Exemplo
nRet = TCSQLEXEC("INSERT INTO SALES/CUSTOMER(NAME) VALUES('JOHN DOE')")
If nRet == 0
conout("Insero executada")
Else
conout( "Insero com erro (s) : ")
cRet = TCSQLERROR()
Do While !Empty(cRet)
conout(cRet)
cRet = TCSQLERROR()
EndDo
EndIf
TCSrvType
Retorna o tipo de servidor.
Sintaxe
TCSRVTYPE () --> Caracter
Retorno
Descrio
AdvPl________________________________________________________________264
""
<> ""
String contendo o tipo do servidor. Pode ser: "AS/400", "WinNT", "AIX", "HPUX","Linux"
Descrio
Retorna o tipo de servidor onde est o banco de dados.
Exemplo
// utilizado para testar se o ambiente AS/400, pois alguns comandos so diferentes
nesta plataforma.
Ex: Chamada da funcao de reconciliao
If TcSrvType() == 'AS/400'
Processa({|lEnd| FA210Processa()})
Else
Processa({|lEnd| FA211Processa()})
Endif
TCSysExe
Executa um comando do sistema operacional no servidor TopConnect.
Sintaxe
TCSYSEXE ( cComando ) --> Numrico
Argumento
Obrigat.
Tipo
Descrio
cComando
Sim
Retorno
Descrio
<>0
Exemplo
// Copia arquivo no AS400
cAntigo:= "ANTIGO"
cNovo:= "NOVO"
cExpres := "CPYF FROMFILE("+AllTrim(cAntigo)+") TOFILE("
cExpres += AllTrim(cNovo)+") MBROPT(*ADD) FMTOPT(*MAP *DROP)"
if TCSysExe(cExpres) <> 0
conout("Erro na execuo do comando")
endif
AdvPl________________________________________________________________265
;TCUnLink
Finaliza uma conexo com o TopConnect.
Sintaxe
TCUNLINK([ nNroConexao ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
nNroConexao
No
Retorno
Descrio
.T.
.F.
Descrio
Finaliza a conexo especificada com o TopConnect. Se no passar parmetro, finaliza a conexo corrente.
O nmero da conexo a retornada pela funo <@>TCLink.
Exemplo
_nCon1 := TCLink("MSSQL7/TOPSQL1", "TOPSERVER1")
_nCon2 := TCLink("MSSQL7/TOPSQL2", "TOPSERVER2")
.
.
.
TCUNLINK(_nCon1)
TCVUnLock
Libera o bloqueio virtual de uma string.
AdvPl________________________________________________________________266
Sintaxe
TCVUNLOCK ([ cPalavra ]) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cPalavra
No
String que deve ser liberada. Se no for passada, TODOS os locks virtuais
desta conexo so liberados.
Retorno
Descrio
.T.
.F.
Descrio
Retira o bloqueio virtual de uma string ou de todas da conexo.
Exemplo
#ifdef TOP
If TCIsVLock()
if !TCVLock("Processo1")
messagebox("Nao foi possivel bloquear o processo1", "", 0)
return
endif
......
// Processa
TCVUnlock("Processo1")
EndIf
#endif
TCVLock
Bloqueia uma string atravs de lock virtual.
Sintaxe
TCVLOCK ( cPalavra ) --> Lgico
Argumento
Obrigat.
Tipo
Descrio
cPalavra
Sim
AdvPl________________________________________________________________267
Retorno
Descrio
.T.
.F.
Descrio
A funo TCVLOCK bloqueia uma string atravs de lock virtual no servidor .
Exemplo
#ifdef TOP
If TCIsVLock()
if !TCVLock("Processo1")
messagebox("Nao foi possivel bloquear o processo1", "", 0)
endif
EndIf
#endif
Time
Retorna a hora do sistema
Sintaxe
TIME() --> cHora
Retorno
Descrio
cHora
Descrio
TIME() uma funo que retorna a hora do sistema como uma cadeia de caracteres. TIME() est
relacionada com SECONDS() que retorna o valor inteiro representando o nmero de segundos desde a
meia-noite.
Exemplos
Estes exemplos mostram a funo TIME() utilizada em conjunto com SUBSTR() para extrair a hora, os
minutos e os segundos:
cTime := TIME() // Resultado: 10:37:17
cHora := SUBSTR(cTime, 1, 2) // Resultado: 10
cMinutos := SUBSTR(cTime, 4, 2) // Resultado: 37
cSegundos := SUBSTR(cTime, 7, 2) // Resultado: 17
AdvPl________________________________________________________________268
UnLock
Desbloqueia os registros da tabela corrente.
Sintaxe
UnLock [ALL]
Descrio
Este comando utilizado para liberar registros da tabela corrente. Se for passada a opo "ALL" todos os
registros da tabela corrente so liberados. Caso contrrio, s liberado o registro corrente.
Exemplo
// Este exemplo mostra como liberar todos os registros bloqueados
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T.,
UNLOCK ALL
// Este exemplo mostra uma variao do uso de UNLOCK para liberar
corrente.
DBUSEAREA( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T.,
DBGOTO(100)
UNLOCK // Desbloqueia o registro atual (100)
da tabela corrente.
.F. )
apenas o registro
.F. )
UpdateIntName
Atualiza o nome do ndice interno da tabela CTree.
Sintaxe
UpdateIntName ( cNome )->Lgico
Argumento
Obrigat.
Tipo
Descrio
cNome
No
Retorno
Descrio
.F.
.T.
Descrio
AdvPl________________________________________________________________269
A funo UpdateIntName muda o nome do arquivo de ndice interno de uma tabela Ctree, estando a
mesma fechada. Para tanto ela executa os seguintes passos:
1- Abre a tabela;
3- Fecha a tabela;
O nome do ndice interno, que armazenado no diretrio "\CTREEINT\" acima da tabela equivalente,
calculado da seguinte forma:
xxxxxxxxeeeYYYYMMDDhhmmss.int, sendo:
Exemplo
// Este exemplo demonstra o uso tpico de UpdateIntName(). Se no falhar, o nome do
ndice interno ser atualizado e o processo continua quando ao abrir a tabela o novo
arquivo de ndice interno criado. Se falhar, uma mensagem apresentada.
IF !UpdateIntName("\dadosadv\sa1990.dtc")
Messagebox("No foi possvel atualizar o nome do ndice interno da tabela","Erro", 0)
BREAK
ENDIF
USE "\dadosadv\sa1990.dtc" SHARED NEW
Use
Abre uma tabela na rea de trabalho atual e os arquivos relacionados a ela.
Sintaxe
AdvPl________________________________________________________________270
USE Tabela [INDEX Indices] [ALIAS Alias] [EXCLUSIVE | SHARED] [NEW] [READONLY] [VIA Driver]]
Argumento
Obrigat.
Tipo
Descrio
Tabela
Indices
Alias
Driver
Retorno
Descrio
NIL
Sem retorno
Descrio
Este comando associa uma tabela especificada pelo primeiro parmetro (Tabela) rea de trabalho atual
atravs de um driver especificado atravs do parmetro Driver.
No caso do Ctree os arquivos de ndices permanentes j so abertos automaticamente, mas nos demais
RDDs deve especificar os arquivos de ndices que se deseja abrir atravs do parmetro Indices.
O Alias pode ser especificado atravs do parmetro Alias. Pode-se especificar se a tabela ser aberta em
modo exclusivo ou compartilhado (atravs das opes "EXCLUSIV" e "SHARED").
O usurio pode optar por abrir a tabela em modo somente leitura atravs da opo "READONLY", onde
nenhuma alterao ser efetivada na tabela. A opo "NEW" determina que a tabela especificada ser
aberta na prxima rea de trabalho disponvel e ser setada como a rea de trabalho corrente.
Exemplo
// Este exemplo demonstra como utilizar o comando USE para associar uma tabela (do tipo
Ctree) a prxima rea de trabalho disponvel e torn-la ativa em modo compartilhado e
somente leitura:
USE Cliente VIA "CTREECDX" NEW SHARED READONLY
Used
AdvPl________________________________________________________________271
Verifica se existe uma tabela corrente
Sintaxe
Used() --> Lgico
Retorno
Descrio
.F.
.T.
Descrio
Esta funo utilizada para verificar se existe alguma tabela aberta no momento.
Exemplo
//Este exemplo utiliza a funo USED()para verificar quando a tabela est ativa:
USE Clientes NEW
Result := USED() // Result: .T.
CLOSE
Result := USED() // Result: .F.
Year
Converte o valor da data no valor numrico do ano.
Sintaxe
YEAR( dData ) --> nAno
Argumento
Obrigat.
Tipo
Descrio
dData
Sim
Retorno
Descrio
nAno
Descrio
AdvPl________________________________________________________________272
YEAR() uma funo de converso de data que extrai o valor numrico do ano. YEAR() membro de um
grupo de funes que retornam valores numricos de uma data. O grupo inclui DAY() e MONTH() que
retornam o dia e o ms como valores numricos.
Exemplos
Estes exemplos mostram YEAR() usando a data do sistema:
dData := DATE() // Resultado: 09/20/01
dAno := YEAR(dData) // Resultado: 2001
dAno := YEAR(dData) + 11 // Resultado: 2012
Este exemplo cria uma funo de usurio que usa a funo YEAR() para formatar o valor da data:
cData := Mdy(DATE()) // Result: September 20, 1990
FUNCTION Mdy( dDate )
RETURN CMONTH(dDate) + " " + LTRIM(STR(DAY(dDate))) + "," + STR(YEAR(dDate))
ZAP
Remove todos os registros da tabela.
Sintaxe
ZAP
Descrio
Este comando apaga (fisicamente) todos os registro da tabela corrente.
Exemplo
// Este exemplo mostra como o ZAP pode se utilizado.
dbUseArea( .T.,"dbfcdxads", "\dadosadv609\sa1990.dbf","SSS", .T., .F. )
ZAP
AdvPl________________________________________________________________273
tSrvObject
Classe me de todas as classes de interface.
Caractersticas
Classe abstrata inicial de todas as classes de interface do Advpl. No deve ser instanciada diretamente.
Propriedades
Nleft
Ntop
nWidth
nHeight
cCaption
cTooltip
lShowHint
Lgico. Flag que ativa .T. ou desativa .F. a exibio do tooltip do objeto.
cMsg
Caractere. Mensagem exibida na barra de status da janela principal quando o objeto ganha foco.
nClrText
nClrPane
bWhen
bValid
blClicked
brClicked
blDblClick
oWnd
lVisible
Cargo
bLostFocus
bGotFocus
AdvPl________________________________________________________________274
Mtodos
SetFocus
Sintaxe
SetFocus( )
Descrio
Fora o foco de entrada de dados mudar para o objeto.
Retorno
NIL
Hide
Sintaxe
Hide( )
Descrio
Torna objeto invisvel.
Retorno
NIL
Show
Sintaxe
Show( )
Descrio
Torna objeto visvel.
Retorno
NIL
Enable
Sintaxe
Enable( )
Descrio
Habilita o objeto.
AdvPl________________________________________________________________275
Retorno
NIL
Disable
Sintaxe
Disable( )
Descrio
Desabilita o objeto.
Retorno
NIL
Refresh
Sintaxe
Refresh( )
Descrio
Fora atualizao (sincronia) de propriedades entre o programa e o Protheus Remote.
Classes de Janelas
tWindow
Classe de janela principal de programa.
Hierarquia
tSrvObject -> tWindow
Caractersticas
Classe de janela principal de programa, dever existir apenas uma instncia deste objeto na execuo do
programa.
Propriedades
AdvPl________________________________________________________________276
Binit
lEscClose
oCtlFocus
Objeto. Objeto contido na janela que est com foco de entrada de dados.
Mtodos
New
Descrio
Mtodo construtor da janela.
Sintaxe
New( [anTop], [anLeft],[anBottom], [anRight], [acTitle], [nPar6], [oPar7] ,[oPar8],[oPar9], [aoParent],
[lPar11], [lPar12], [anClrFore], [anClrBack], [oPar15], [cPar16], [lPar17], [lPar18], [lPar19], [lPar20],
[alPixel] );
Parmetros
AnTop
AnLeft
AnBottom
AnRight
acTitle
nPar6
Reservado.
oPar7
Reservado.
oPar8
Reservado.
Reservado.
oPar9
AoParent
lPar11
lPar12
anClrFore
anClrText
oPar15
cPar16
lPar17
lPar18
lPar19
lPar20
Reservado.
Reservado.
Lgico, opcional. Se .T. (padro) considera coordenadas passadas em pixels, se .F.
considera caracteres.
AlPixel
Reservado.
AdvPl________________________________________________________________277
Retorno
Objeto. A janela construda.
Activate
Descrio
Ativa (exibe) a janela. Chamar esse mtodo apenas uma vez.
Sintaxe
Activate([acShow], [bPar2], [bPar3], [bPar4], [bPar5], [bPar6], [ abInit ], [bPar8], [bPar9], [bPar10],
[bPar11], [bPar12] ,[bPar13], [bPar14], [bPar15], [abValid], [bPar17], [bPar18] ).
Parmetros
AcShow
bPar2
Reservado.
bPar3
Reservado.
bPar4
Reservado.
bPar5
Reservado.
bPar6
AbInit
bPar8
bPar9
bPar10
bPar11
bPar12
bPar13
bPar14
bPar15
AbValid
bPar17
bPar18
Reservado.
Bloco de cdigo. Executado quando janela est sendo exibida.
Reservado.
Reservado.
Reservado.
Reservado.
Reservado.
Reservado.
Reservado.
Reservado.
Bloco de cdigo. Executado quando a janela for solicitada de fechar. Dever retornar .T. se o
contedo da janela for vlido, ou .F. se no. Se o bloco retornar .F. a janela no fechar.
Reservado.
Reservado.
Retorno
NIL
End
Descrio
Solicita encerramento da janela.
Sintaxe
AdvPl________________________________________________________________278
End( )
Retorno
Lgico. .T. se encerrou a janela e .F. se no.
Center
Descrio
Centraliza a janela.
Sintaxe
Center( )
Retorno
NIL
Exemplo
#include protheus.ch
USER FUNCTION MyProg()
Local oWindow
Local abInit:= {||msgstop(ativando!)}
Local abValid:= {|| msgstop(encerrando!),.T.}
oWindow:= tWindow():New( 10, 10, 200, 200, Meu programa;
,,,,,,,,CLR_WHITE,CLR_BLACK,,,,,,,.T. )
oWindow:Activate(MAXIMIZED,,,,,,abInit,,,,,,,,,abValid,,)
Return nil
TDialog
Classe de janela de dilogo.
Hierarquia
tSrvObject -> tWindow -> tDialog
Caractersticas
Classe de janela de dilogo de entrada de dados, uso reservado, recomenda-se utilizar a classe MSDialog
que herdada desta classe.
Propriedades
Vide classes ancestrais.
AdvPl________________________________________________________________279
Mtodos
New
Descrio
Mtodo construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8], [nPar9],
[anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16], [nPar17], [anWidth],
[anHeight])
Parmetros
AnTop
anLeft
anBotom
anRight
acCaption
cPar6
Reservado.
nPar7
Reservado.
lPar8
Reservado.
nPar9
Reservado.
anClrText
anClrBack
oPar12
Reservado.
AoWnd
AlPixel
oPar15
Reservado.
oPar16
Reservado.
nPar17
Reservado.
anWidth
anHeight
AdvPl________________________________________________________________280
Retorno
O Dilogo criado.
Activate
Descrio
Ativa (exibe) o dilogo. Chamar somente uma vez este mtodo.
Sintaxe
Activate([bPar1], [bPar2], [bPar3], [alCentered], [abValid], [lPar6], [abInit], [bPar8], [bPar9] )
Parmetros
bPar1
bPar2
Reservado.
bPar3
alCentered
Reservado.
Lgico, opcional. Se .T. exibe a janela centralizada, .F. padro.
Bloco de cdigo, opcional. Deve retornar .T. se contedo do dilogo vlido, se retornar .F.
o dilogo no fechar quando solicitada de encerrar.
Reservado.
Bloco de cdigo, opcional. Executado quando o dilogo inicia exibio.
Reservado.
Reservado.
AbValid
lPar6
AbInit
bPar8
bPar9
Reservado.
Retorno
NIL.
End
Descrio
Encerra (fecha) o dilogo.
Sintaxe
End( )
Retorno
Lgico .T. se o dilogo foi encerrado.
MSDialog
AdvPl________________________________________________________________281
Classe de dilogo de entrada de dados.
Hierarquia
tSrvObject -> tWindow -> tDialog -> MSDialog
Caractersticas
MSDialog deve ser utilizada como padro de janela para entrada de dados. MSDialog um tipo de janela
dilogo modal, isto , no permite que outra janela ativa receba dados enquanto esta estiver ativa.
Propriedades
Vide classes ancestrais.
Mtodos
New
Descrio
Mtodo construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [cPar6], [nPar7], [lPar8], [nPar9],
[anClrText], [anClrBack], [oPar12], [aoWnd], [alPixel], [oPar15], [oPar16], [lPar17])
Parmetros
AnTop
anLeft
anBottom
anRight
acCaption
cPar6
Reservado.
nPar7
Reservado.
lPar8
Reservado.
nPar9
Reservado.
anClrText
Cor do texto.
anClrBack
oPar12
AoWnd
Cor do fundo.
Reservado.
Objeto, opcional. Janela pai do dilogo, geralmente a janela principal do programa.
AdvPl________________________________________________________________282
AlPixel
oPar15
oPar16
lPar17
Retorno
O dilogo construdo.
Exemplo
#include protheus.ch
User Function Teste()
// cria dilogo
Local oDlg:=MSDialog():New(10,10,300,300,Meu dialogo;
,,,,,CLR_BLACK,CLR_WHITE,,,.T.)
// ativa dilogo centralizado
oDlg:Activate(,,,.T.,{||msgstop(validou!),.T.},;
,{||msgstop(iniciando) )
Return
Classes Auxiliares
tFont
Classe que encapsula fonte de edio.
Hierarquia
tFontAbs -> tFont
Descrio
Utilize objeto tFont para modificar a fonte padro de controles visuais.
Mtodos
New
Descrio
AdvPl________________________________________________________________283
Construtor do objeto.
Sintaxe
New([acName], [nPar2], [anHeight], [lPar4], [alBold], [nPar6], [lPar7], [nPar8], [alItalic], [alUnderline])
Parmetros
acName
nPar2
Reservado.
anHeight
lPar4
Reservado.
AlBold
nPar6
Reservado.
lPar7
Reservado.
nPar8
Reservado.
alItalic
alUnderline
Retorno
O objeto criado.
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oSay, oFont:= TFont():New(Courier New,,-14,.T.)
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL
// apresenta o tSay com a fonte Courier New //
oSay:= tSay():New(10,10,{||para exibir},oDlg,,oFont,,;
,,.T.,CLR_WHITE,CLR_RED,100,20)
oSay:lTransparent:= .T.
ACTIVATE MSDIALOG oDlg CENTERED
Return
Classes de Componentes
AdvPl________________________________________________________________284
tControl
Classe abstrata me de todos os controles editveis.
Hierarquia
tSrvObject -> tControl
Caractersticas
tControl a classe comum entre todos os componentes visuais editveis.
Propriedades
Align
lModified
Lgico. Se .T. indica que o contedo da varivel associada ao controle foi modificado.
lReadOnly
Lgico. Se .T. o contedo da varivel associada ao controle permanecer apenas para leitura.
hParent
bChange
Mtodos
SetFocus
Descrio
Fora mudana do foco de entrada de dados para o controle.
Sintaxe
SetFocus( )
Retorno
NIL
AdvPl________________________________________________________________285
tButton
Classe de boto.
Hierarquia
tSrvObject -> tControl -> tButton
Descrio
Utilize a classe tButton para criar um controle visual do tipo boto.
Propriedades
lProcessing
bAction
Metodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth], [anHeight], [nPar8], [aoFont],
[lPar10], [alPixel],[lPar12],[cPar13], [lPar14], [abWhen], [bPar16], [lPar17])
Parmetros
anRow
anCol
acCaption
aoWnd
abAction
Bloco de cdigo, opcional. Bloco que dever ser acionado quando o boto for pressionado.
anWidth
AdvPl________________________________________________________________286
anHeight
nPar8
Reservado.
aoFont
lPar10
alPixel
lPar12
cPar13
lPar14
abWhen
bPar16
lPar17
Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para o ttulo do
boto.
Reservado.
Lgico, opcional. Se .T. considera as coordenadas passadas em pixels, se .F. (padro)
considera em caracteres.
Reservado.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados est
sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o controle
deve permanecer habilitado ou .F. se no.
Reservado.
Reservado.
Exemplo
#include protheus.ch
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop(Mudou item)},;
,,,.T.,,,,,,,,,cCombo)
// Boto para fechar a janela
oButton:=tButton():New(30,10,fechar,oDlg,{||oDlg:End()},;
100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )
Return nil
tCheckBox
Classe de caixa checkbox.
Hierarquia
tSrvObject -> tControl -> tCheckBox
Descrio
Utilize a classe tCheckbox quando desejar criar um controle que possua dois estados .T. ou .F..
Mtodos
AdvPl________________________________________________________________287
New
Descrio
Construtor da classe
Sintaxe
New([anRow], [anCol], [acCaption], [abSetGet], [aoWnd], [anWidth], [anHeight], [nPar8], [abClick],
[aoFont], [abValid], [anClrFore], [anClrBack], [lPar14], [alPixel], [cPar16], [lPar17], [abWhen])
Parmetros
AnRow
anCol
acCaption
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo lgico,
se <var> = .T. ento o controle aparecer checado.
aoWnd
anWidth
anHeight
nPar8
Reservado.
abClick
Bloco de cdigo, opcional. Executado quando o controle click do boto esquerdo do mouse
acionado sobre o controle.
aoFont
Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada para o texto do
controle.
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrFore
anClrBack
lPar14
Reservado.
alPixel
cPar16
Reservado.
lPar17
Reservado.
abWhen
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados est
sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o controle
deve permanecer habilitado ou .F. se no.
Retorno
AdvPl________________________________________________________________288
O objeto construdo.
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oButton, oCheck, lCheck:=.F.
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu programa
oCheck:= tCheckBox():New(10,10,funcionou?,;
{|u|if( pcount()>0,lCheck:=u,lCheck)};
,oDlg,100,20,,,,,,,,.T.)
oButton:=tButton():New(30,10,fechar,oDlg,{||oDlg:End()},;
100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
If lCheck
MsgStop( Funcionou! )
endif
Return nil
tComboBox
Classe de combobox.
Hierarquia
tSrvObject -> tControl -> tComboBox
Descrio
Utilize a classe tComboBox para cria uma entrada de dados com mltipla escolha com item definido em
uma lista vertical, acionada por F4 ou pelo boto esquerdo localizado na parte direita do controle. A
varivel associada ao controle ter o valor de um dos itens selecionados ou no caso de uma lista
indexada, o valor de seu ndice.
Propriedades
aItems
Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes formatos: a)
Seqencial,
exemplo:
{item1,item2,...,itemN}
ou
b)
Indexada,
exemplo:
{a=item1,b=item2, ..., n=itemN}.
nAt
Mtodos
New
Descrio
AdvPl________________________________________________________________289
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anItems], [anWidth], [anHeight], [aoWnd], [nPar8], [abChange],
[abValid], [anClrText], [anClrBack], [alPixel], [aoFont], [cPar15], [lPar16], [abWhen], [lPar18], [aPar19],
[bPar20], [cPar21], [acReadVar])
Parmetros
AnRow
anCol
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter. Se a lista for seqencial, o controle atualizar <var> com o contedo do item
selecionado, se a lista for indexada, <var> ser atualizada com o valor do ndice do item
selecionado.
anItems
Array, opcional. Lista de items, caracteres, a serem exibidos. Pode ter os seguintes
formatos: a) Seqencial, exemplo: {item1,item2,...,itemN} ou b) Indexada, exemplo:
{a=item1,b=item2, ..., n=itemN}.
anWidth
anHeight
aoWnd
nPar8
Reservado.
abChange
abValid
anClrBack
anClrText
alPixel
aoFont
cPar15
lPar16
abWhen
lPar18
aPar19
bPar20
cPar21
acReadVar
Retorno
O objeto criado.
AdvPl________________________________________________________________290
Select
Descrio
Muda o item selecionado no combobox.
Sintaxe
Select( [anItem] )
Parmetros
anItem
Retorno
NIL
Exemplo
#include protheus.ch
User Function TesteGet()
Local oDlg, oButton, oCombo, cCombo, aItems:= {item1,item2,item3}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Combo
oCombo:= tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},;
aItems,100,20,oDlg,,{||MsgStop(Mudou item)},;
,,,.T.,,,,,,,,,cCombo)
// Boto para fechar a janela
@ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +cCombo )
Return nil
tGet
Classe de controle para entrada de dados editveis.
Hierarquia
tSrvObject -> tControl -> tGet
Descrio
Use tGet para criar um controle que armazene ou altere o contedo de uma varivel atravs de digitao.
O contedo da varivel s modicado quando o controle perde o foco de edio para outro controle.
AdvPl________________________________________________________________291
Propriedades
lPassword
Lgico. Se .T. o controle se comporta como entrada de dados de senha, exibindo asteriscos
* para esconder o contedo digitado.
Picture
Mtodos
New
Descrio
Mtodo construtor do controle.
Sintaxe
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [acPict], [abValid], [anClrFore],
[anClrBack], [aoFont], [lPar12], [oPar13], [alPixel], [cPar15], [lPar16], [abWhen], [lPar18], [lPar19],
[abChange], [alReadOnly], [alPassword], [cPar23], [acReadVar], [cPar25], [lPar26], [nPar27], [lPar28])
Parmetros
anRow
anCol
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter, numrico ou data.
aoWnd
anWidth
anHeight
acPict
abValid
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
anClrFore
anClrBack
aoFont
lPar12
oPar13
alPixel
cPar15
lPar16
abWhen
AdvPl________________________________________________________________292
lPar18
lPar19
abChange
alReadOnly
alPassword
cPar23
acReadVar
cPar25
lPar26
nPar27
lPar18
Retorno
O controle construdo.
Exemplo
#include protheus.ch
User Function TesteGet()
Local oDlg, oGet1, oButton, nGet1:=0
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Get
oGet1:= TGet():New(10,10,{|u| if(PCount()>0,nGet1:=u,nGet1}}, oDlg,;
100,20,@E 999,999.99,;
{|o|nGet1>1000.00},,,,,,.T.,,,,,,,,,,nGet1)
/* Tem o mesmo efeito
@ 10,10 MSGET oGet1 VAR nGet1 SIZE 100,20 OF oDlg PIXEL PICTURE @E 999,999.99 VALID
nGet1>1000.00
*/
// Boto para fechar a janela
@ 40,10 BUTTON oButton PROMPT Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( O valor +Transform(nGet1,@E 999,999.00) )
Return nil
tGroup
Classe de painel de grupo de controles.
Hierarquia
tSrvObject -> tControl -> tGroup
Descrio
AdvPl________________________________________________________________293
Utilize a classe tGroup para criar um painel onde controles visuais podem ser agrupados ou classificados.
criada uma borda com ttulo em volta dos controles agrupados.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anTop], [anLeft], [anBottom], [anRight], [acCaption], [aoWnd], [anClrText], [anClrPane], [alPixel],
[lPar10])
Parmetros
anTop
anLeft
anBottom
anRight
acCaption
aoWnd
anClrText
anClrPane
alPixel
lPar10
Reservado.
Retorno
O objeto criado.
Exemplo
#include protheus.ch
User function teste()
Local oDlg, oGroup, oGet1, oGet2, cGet1:=Space(10),;
cGet2:= Space(10)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE My test PIXEL
oGroup:= tGroup():New(10,10,200,200,grupo de gets,oDlg,,,.T.)
@ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL
@ 30,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oGroup PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Return nil
AdvPl________________________________________________________________294
tListbox
Classe de lista de items.
Hierarquia
tSrvObject -> tControl -> tListbox
Descrio
Utilize a classe tListbox para criar uma janela com itens selecionveis e barra de rolagem. Ao selecionar
um item, uma varivel atualizada com o contedo do item selecionado.
Parmetros
NAt
aItems
Mtodos
New
Descrio
Contrutor da classe
Sintaxe
New([anRow], [anCol], [abSetGet], [aaItems], [anWidth], [anHeigth], [abChange], [aoWnd], [abValid],
[anClrFore], [anClrBack], [alPixel], [lPar13], [abLDBLClick], [aoFont], [cPar16], [lPar17], [abWhen],
[aPar19], [bPar20], [lPar21], [lPar22], [abRightClick] )
Parmetros
anRow
anCol
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> )} que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter ou numrica.
aaItems
anWidth
AdvPl________________________________________________________________295
anHeight
abChange
aoWnd
abValid
anClrFore
anClrBack
alPixel
lPar13
abLDBLClick
aoFont
cPar16
lPar17
abWhen
aPar19
bPar20
lPar21
lPar22
abRightClick
Bloco de cdigo, opcional. Executado quando o contedo do controle deve ser validado,
deve retornar .T. se o contedo for vlido e .F. quando o contedo for invlido.
Numrico, opcional. Cor de fundo do controle.
Numrico, opcional. Cor do texto do controle.
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em
caracteres.
Reservado.
Bloco de cdigo, opcional. Executado quando acionado duplo click do boto esquerdo do
mouse sobre o controle.
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados est
sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. se o
controle deve permanecer habilitado ou .F. se no.
Reservado.
Reservado.
Reservado.
Reservado.
Bloco de cdigo, opcional. Executado quando acionado click do boto direito do mouse
sobre o controle.
Select
Descrio
Fora a seleo de um item.
Sintaxe
Select( [nItem] )
Parmetros
nItem
Retorno
NIL
Add
Descrio
Insere ou adiciona novo item.
AdvPl________________________________________________________________296
Sintaxe
Add( cText, nPos )
Parmetros
cText
nPos
Retorno
NIL
Modify
Descrio
Modifica o texto de um item.
Sintaxe
Modify( cText, nPos )
Parmetros
cText
nPos
Retorno
NIL
Del
Descrio
Apaga um item.
Sintaxe
Del( nPos )
Parmetros
nPos
Numrico, obrigatrio. Posio a ser excluida, deve ser maior que 0 e menor ou igual que o
nmero de itens.
Retorno
NIL
AdvPl________________________________________________________________297
Len
Descrio
Retorna o nmero de itens.
Sintaxe
Len( )
Retorno
Numrico. Nmero de itens.
Reset
Descrio
Apaga todos os itens.
Sintaxe
Reset( )
Retorno
NIL
Exemplo
#include protheus.ch
User Funcion Teste()
Local oDlg, oList, nList:= 1, aItems:={}
Aadd(aItems,Item 1)
Aadd(aItems,Item 2)
Aadd(aItems,Item 3)
Aadd(aItems,Item 4)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE Teste
oList:= tListBox():New(10,10,{|u|if(Pcount()>0,nList:=u,nList)};
,aItems,100,100,,oDlg,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return nil
tMeter
Classe de rgua de processamento.
Hierarquia
AdvPl________________________________________________________________298
tSrvObject -> tControl -> tMeter
Descrio
Utilize a classe tMeter para criar um controle que exibe uma rgua (gauge) de processamento,
descrevendo o andamento de um processo atraves da exibio de uma barra horizontal.
Parmetros
nTotal
lPercentage
nClrBar
Mtodos
New
Descrio
Contrutor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [anTotal], [aoWnd], [anWidth], [anHeight], [lPar8], [alPixel],
[oPar10], [cPar11], [alNoPerc], [anClrPane], [nPar14], [anClrBar], [nPar16], [lPar17])
Parmetros
anRow
anCol
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
numrico.
anTotal
aoWnd
anWidth
anHeight
lPar8
Reservado.
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres.
alPixel
oPar10
cPar11
alNoPerc
anClrPane
nPar14
Reservado.
Reservado.
Lgico, opcional. Se .T. (padro) no considera os passos de atualizao em porcentagem.
Numrico, opcional. Cor de fundo do controle.
Reservado.
AdvPl________________________________________________________________299
anClrBar
nPar16
lPar17
Retorno
O objeto construdo.
Set
Descrio
Atualiza a posio da rgua de processamento.
Sintaxe
Set( [nVal] )
Parmetros
nVal
Retorno
NIL
Exemplo
#include protheus.ch
Static lRunning:=.F., lStop:=.F.
User Function Teste()
Local oDlg, oMeter, nMeter:=0, oBtn1, oBtn2
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE Teste
// cria a rgua
oMeter:= tMeter():New(10,10,{|u|if(Pcount()>0,nMeter:=u,nMeter)};
,100,oDlg,100,20,,.T.)
// boto para ativar andamento da rgua
@ 30,10 BUTTON oBtn1 PROMPT Run OF oDlg PIXEL ACTION RunMeter(oMeter)
@ 50,10 BUTTON oBtn2 PROMPT Stop OF oDlg PIXEL ACTION lStop:=.T.
ACTIVATE MSDIALOG oDlg CENTERED
Return nil
Static Function RunMeter(oMeter)
If lRunning
Return
Endif
lRunning:= .T.
// inicia a rgua
oMeter:Set(0)
While .T. .and. !lStop
// pra 1 segundo
Sleep(1000)
// atualiza a pintura da janela, processa mensagens do windows
ProcessMessages()
// pega valor corrente da rgua
AdvPl________________________________________________________________300
nCurrent:= Eval(oMeter:bSetGet)
nCurrent+=10
// atualiza rgua
oMeter:Set(nCurrent)
if nCurrent==oMeter:nTotal
Return
endif
Enddo
lRunning:= .F.
lStop:= .F.
Return
tMultiget
Classe de campo Memo de edio.
Hierarquia
tSrvObject -> tControl -> tMultiGet
Descrio
Utilize a classe tMultiget para criar controle de edio de texto de mltiplas linhas.
Propriedades
lWordWrap
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [aoFont], [alHScroll], [anClrFore],
[anClrBack], [oPar11], [alPixel], [cPar13], [lPar14], [abWhen], [lPar16], [lPar17], [alReadOnly], [abValid],
[bPar20], [lPar21], [alNoBorder], [alNoVScroll])
Parmetros
anRow
AnCol
AdvPl________________________________________________________________301
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
caracter.
aoWnd
anWidth
anHeight
aoFont
Objeto, opcional. Objeto tipo tFont utilizado para definir as caractersticas da fonte
utilizada para exibir o contedo do controle.
alHScroll
anClrFore
anClrBack
oPar11
alPixel
cPar13
lPar14
abWhen
lPar16
lPar17
alReadOnly
abValid
bPar20
lPar21
alNoBorder
alNoVScroll
Retorno
O objeto construdo.
EnableVScroll
Descrio
Habilita a barra de rolagem vertical.
Sintaxe
EnableVScroll( lEnable )
Parmetros
lEnable
AdvPl________________________________________________________________302
Retorno
NIL
EnableHScroll
Descrio
Habilita a barra de rolagem horizontal.
Sintaxe
EnableHScroll( lEnable )
Parmetros
lEnable
Retorno
NIL
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oMemo, cMemo:= space(50)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test
oMemo:= tMultiget():New(10,10,{|u|if(Pcount()>0,cMemo:=u,cMemo)};
,oDlg,100,100,,,,,,.T.)
@ 200,10 BUTTON oBtn PROMPT Fecha OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop(cMemo)
Return Nil
tPanel
Classe de painel esttico.
Hierarquia
tSrvObject -> tControl -> tPanel
Descrio
AdvPl________________________________________________________________303
Utilize a classe tPanel quando desejar criar um painel esttico, onde podem ser criados outros controles
com o objetivo de organizar ou agrupar componentes visuais.
Mtodos
New
Descrio
Construtor da classe.
Sintaxe
New([anRow], [anCol], [acText], [aoWnd], [aoFont], [alCentered], [lPar6], [anClrText], [anClrBack],
[anWidth], [anHeight], [alLowered], [alRaised])
Parmetros
anRow
anCol
acText
aoWnd
alCentered
lPar6
Reservado.
anClrText
anClrBack
anWidth
anHeight
alLowered
alRaised
Retorno
O objeto construdo.
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oPanel, oBtn1, oBtn2
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE My test
// cria o painel
AdvPl________________________________________________________________304
oPanel:= tPanel():New(10,10,,oDlg,,,,,CLR_BLUE,100,100)
// cria boto sobre o painel
@ 10,10 BUTTON oBtn1 PROMPT hide OF oPanel ACTION oPanel:Hide()
// cria boto fora o painel
@ 200,10 BUTTON oBtn2 PROMPT show OF oDlg ACTION oPanel:Show()
ACTIVATE MSDIALOG oDlg CENTERED
Return
tRadMenu
Classe de radio group.
Hierarquia
tSrvObject -> tControl -> tRadMenu
Descrio
Utilize a classe tRadMenu para criar um controle que possibilita escolha de item atravs de uma lista.
Propriedades
nOption
aItems
Mtodos
New
Descrio
Construtor do objeto.
Sintaxe
New([anRow], [anCol], [aacItems], [abSetGet], [aoWnd], [aPar6], [abChange], [anClrText], [anClrPan],
[cPar10], [lPar11], [abWhen], [anWidth], [anHeight], [abValid], [lPar16], [lPar17], [alPixel])
Parmetros
anRow
anCol
aacItems
abSetGet
Bloco de cdigo, opcional. Bloco de cdigo no formato {|u| if( Pcount( )>0, <var>:= u,
<var> ) } que o controle utiliza para atualizar a varivel <var>. <var> deve ser tipo
AdvPl________________________________________________________________305
numrico.
aoWnd
aPar6
Reservado.
abChange
anClrText
anClrPan
cPar10
lPar11
abWhen
anWidth
anHeight
abValid
lPar16
Lpar17
alPixel
Reservado.
Bloco de cdigo, opcional. Executado quando mudana de foco de entrada de dados est
sendo efetuada na janela onde o controle foi criado. O bloco deve retornar .T. para que o
controle permanea habilitado, ou .F. se no.
Numrico, opcional. Largura do controle em pixels.
Numrico, opcional. Altura do controle em pixels.
Bloco de cdigo, opcional. Executado quando o contedo do controle deva ser validado,
retornando .T. se o contedo for vlido, e .F. quando invlido.
Reservado.
Reservado.
Lgico, opcional. Se .T. as coordenadas informadas so em pixels, se .F. so em caracteres.
Retorno
O objeto construdo.
EnableItem
Descrio
Habilita ou desabilita item.
Sintaxe
EnableItem( [nItem], [lEnable])
Parmetros
nItem
lEnable
Retorno
NIL
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oButton, oRadio, nRadio:=1,;
AdvPl________________________________________________________________306
aOptions:={escolha1,escolha2}
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE Meu Get
oRadio:= tRadMenu():New(10,10,aOptions,;
{|u|if(PCount()>0,nRadio:=u,nRadio)},;
oDlg,,,,,,,,100,20,,,,.T.)
@ 40,10 BUTTON oButton PROMPT 7Fechar OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop(Escolheu +aOptions[nRadio] )
Return nil
tSay
Classe de label.
Hierarquia
tSrvObject -> tControl -> tSay
Descrio
O objeto tipo tSay exibe o contedo de texto esttico sobre uma janela ou controle.
Parmetros
lWordWrap
lTransparent
Mtodos
New
Descrio
Mtodo construtor do controle.
Sintaxe
New([anRow], [anCol], [abText], [aoWnd], [acPicture], [aoFont], [lPar7], [lPar8], [lPar9], [alPixels],
[anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16], [lPar17], [lPar18], [lPar19])
Parmetros
anRow
anCol
abText
Codeblock, opcional. Quando executado deve retornar uma cadeia de caracteres a ser
AdvPl________________________________________________________________307
exibida.
aoWnd
acPicture
aoFont
Objeto, opcional. Objeto tipo tFont para configurao do tipo de fonte que ser utilizado
para exibir o contedo.
lPar7
Reservado.
lPar8
Reservado.
lPar9
Reservado.
Lgico, opcional. Se .T. considera coordenadas passadas em pixels se .F., padro, considera
as coordenadas passadas em caracteres.
alPixels
anClrText
anClrBack
anWidth
anHeight
lPar15
lPar16
lPar17
lPar18
lPar19
Numrico, opcional.
Numrico, opcional.
Numrico, opcional.
Numrico, opcional.
Reservado.
Reservado.
Reservado.
Reservado.
Reservado.
Retorno
O controle criado.
SetText
Descrio
Modifica o contedo a ser exibido pelo controle.
Sintaxe
SetText( [xVal] )
Parmetros
xVal
Retorno
NIL
Exemplo
#include protheus.ch
AdvPl________________________________________________________________308
User Function Teste()
Local oDlg, oSay
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE My dialog PIXEL
oSay:= tSay():New(10,10,{||para exibir},oDlg,,,,;
,,.T.,CLR_WHITE,CLR_RED,100,20)
ACTIVATE MSDIALOG oDlg CENTERED
Return
tScrollbox
Classe de rea de scroll.
Hierarquia
tSrvObject -> tControl -> tScrollbox
Descrio
Utilize a classe tScrollbox para criar um painel com scroll deslizantes nas laterais do controle.
Mtodos
New
Descro
Construtor da classe
Sintaxe
New([aoWnd], [anTop], [anLeft], [anHeight], [anWidth], [alVertical], [alHorizontal], [alBorder])
Parmetros
aoWnd
anTop
anLeft
anHeight
anWidth
alVertical
alHorizontal
AdvPl________________________________________________________________309
alBorder
Retorno
O objeto criado.
Exemplo
#include protheus.ch
User Function Teste()
Local oDlg, oScr, oGet1, oGet2, oGet3
Local cGet1, cGet2, cGet3
cGet1:= Space(10)
cGet2:= Space(10)
cGet3:= Space(10)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL My test
oScr:= TScrollBox():New(oDlg,10,10,200,200,.T.,.T.,.T.)
// cria controles dentro do scrollbox
@ 10,10 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oScr PIXEL
@ 50,10 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oScr PIXEL
@ 150,100 MSGET oGet3 VAR cGet3 SIZE 100,10 OF oScr PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Return nil
AdvPl________________________________________________________________310
Infra-estrutura
Bem-vindo documentao das funes genricas e objetos disponveis no RPO padro do Advanced
Protheus.
Funes de Infra-Estrutura
MsGetDados
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em um vetor.
Caractersticas
A MsGetDados precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.
Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao que esta sendo
executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no formato:
Elemento
Contedo
Ttulo
AdvPl________________________________________________________________311
Rotina
Reservado
aHeader
Vetor com informaes das colunas no formato:
Elemento
Contedo
Ttulo
Campo
Mscara
Tamanho
Decimal
Validao
Reservado
Tipo
Reservado
10
Reservado
aCols
Vetor com as linhas a serem editadas. As colunas devem ser construdas com base no aHeader mais uma
ultima com valor lgico que determina se a linha foi excluda.
AdvPl________________________________________________________________312
lRefresh
Varivel tipo lgica para uso reservado.
A MsGetDados cria a varivel publica n que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDados (cLinhaOk, cTudoOk, ...) no podero ser
declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver cadastrado no
Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
Cria o objeto MsGetDados.
Sintaxe
MSGETDADOS():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [ cTudoOk ], [
cIniCpos ], [ lApagar ], [ aAlter ], [ uPar1 ], [ lVazio ], [ nMax ], [ cCampoOk ], [ cSuperApagar ], [ uPar2
], [ cApagaOk ], [ oWnd ] ) -> objeto
Argumentos
Descrio
nSuperior
nEsquerda
nInferior
nDireita
nOpc
cLinhaOk
cTudoOk
cIniCpos
AdvPl________________________________________________________________313
lApagar
aAlter
uPar1
Parmetro reservado.
lVazio
nMax
cCampoOk
cSuperApagar
uPar2
Parmetro reservado.
cApagaOk
oWnd
Retorno
Objeto.
ForceRefresh
Descrio
Atualiza a MsGetDados com o aCols e posiciona na primeira linha.
Sintaxe
oObjeto:ForceRefresh()
Hide
Descrio
Esconde a MsGetDados.
Sintaxe
AdvPl________________________________________________________________314
oObjeto:Hide()
Show
Descrio
Mostra a MsGetDados.
Sintaxe
oObjeto:Show()
Exemplo
User Function Exemplo()
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluir", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
Aadd(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
EndIf
DbSkip()
End
Aadd(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL
oGetDados := MSGETDADOS():NEW(05, 05, 145, 195, 4, "U_LINHAOK", "U_TUDOOK",
"+A1_COD", .T., {"A1_NOME"}, , .F., 200, "U_FIELDOK", "U_SUPERDEL", , "U_DELOK", oDlg)
ACTIVATE MSDIALOG oDlg CENTERED
Return
User Function LINHAOK()
ApMsgStop("LINHAOK")
Return .T.
User Function TUDOOK()
ApMsgStop("LINHAOK")
Return .T.
AdvPl________________________________________________________________315
MsGetDb
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em uma tabela
temporria.
Caractersticas
A MsGetDB precisa que sejam declaradas as variveis abaixo sendo tipo Private:
aRotina.
Vetor com as rotinas que sero executadas na MBrowse e que definira o tipo de operao que esta sendo
executada (incluso, alterao, excluso, visualizao, pesquisa, ...) no formato:
Elemento
Contedo
Ttulo
Rotina
Reservado
Contedo
Ttulo
AdvPl________________________________________________________________316
Campo
Mscara
Tamanho
Decimal
Validao
Reservado
Tipo
Reservado
10
Reservado
lRefresh
Varivel tipo lgica para uso reservado.
A tabela temporria utilizada pela MsGetDB dever ser criada com base no aHeader mais um ltimo
campo tipo lgico que determina se a linha foi excluda.
A MsGetDB cria a varivel publica nBrLin que indica qual a linha posicionada do aCols.
As funes passadas como parmetro para a MsGetDB (cLinhaOk, cTudoOk, ...) no podero ser
declaradas como Static Function.
A consulta padro, validao do usurio e gatilhos estaro habilitados se o campo estiver cadastrado no
Dicionrio de Dados (SX3/SX7) e apresentar estas opes disponveis.
Mtodos
New
Descrio
Cria o objeto MsGetDB.
Sintaxe
MSGETDB():NEW( nSuperior, nEsquerda, nInferior, nDireita, nOpc, [ cLinhaOk ], [ cTudoOk ], [ cIniCpos ], [
lApagar ], [ aAlter ], [ nCongelar ], [ lVazio ], [ uPar1 ], cTRB, [ cCampoOk ], [ lCondicional ], [ lAdicionar ],
[ oWnd ], [ lDisparos ], [ uPar2 ], [ cApagarOk ], [ cSuperApagar ] ) -> objeto
Argumentos
Descrio
nSuperior
AdvPl________________________________________________________________317
contm.
nEsquerda
nInferior
nDireita
nOpc
cLinhaOk
cTudoOk
cIniCpos
lApagar
aAlter
nCongelar
lVazio
uPar1
Parmetro reservado.
cTRB
cCampoOk
lConditional
Reservado
lAdacionar
oWnd
AdvPl________________________________________________________________318
lDisparos
uPar2
Parmetro reservado.
cApagarOk
cSuperApagar
Retorno
Objeto.
ForceRefresh
Descrio
Atualiza a MsGetDB com a tabela e posiciona na primeira linha.
Sintaxe
ForceRefresh()
Exemplo
User Function Exemplo()
Local nI
Local oDlg
Local oGetDB
Local nUsado := 0
Local aStruct := {}
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
Private aRotina := {{"Pesquisar", "AxPesqui", 0, 1},;
{"Visualizar", "AxVisual", 0, 2},;
{"Incluir", "AxInclui", 0, 3},;
{"Alterar", "AxAltera", 0, 4},;
{"Excluit", "AxDeleta", 0, 5}}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
While !Eof() .and. SX3->X3_ARQUIVO == "SA1"
If X3Uso(SX3->X3_USADO) .and. cNivel >= SX3->X3_NIVEL
nUsado++
Aadd(aHeader,{Trim(X3Titulo()),;
SX3->X3_CAMPO,;
SX3->X3_PICTURE,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL,;
SX3->X3_VALID,;
"",;
SX3->X3_TIPO,;
"",;
"" })
Aadd(aStruct,{SX3->X3_CAMPO,;
AdvPl________________________________________________________________319
SX3->X3_TIPO,;
SX3->X3_TAMANHO,;
SX3->X3_DECIMAL})
EndIf
DbSkip()
End
Aadd(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL
oGetDB := MSGETDB():NEW(05, 05, 145, 195, 3, "U_LINHAOK", "U_TUDOOK", "+A1_COD", .T.,
{"A1_NOME"}, 1, .F., , cCriaTrab, "U_FIELDOK", , .T., oDlg, .T., ,"U_DELOK",
"U_SUPERDEL")
ACTIVATE MSDIALOG oDlg CENTERED
DbSelectArea(cCriaTrab)
DbCloseArea()
Return
User Function LINHAOK()
ApMsgStop("LINHAOK")
Return .T.
User Function TUDOOK()
ApMsgStop("LINHAOK")
Return .T.
User Function DELOK()
ApMsgStop("DELOK")
Return .T.
User Function SUPERDEL()
ApMsgStop("SUPERDEL")
Return .T.
User Function FIELDOK()
ApMsgStop("FIELDOK")
Return .T.
MsmGet
Conjunto de objetos tipo MsGet/MsCombo para cadastramento de dados baseado no Dicionrio de Dados.
Caractersticas
A MsMGet tambm poder criada a partir da funo Enchoice a qual recebe os mesmos parmetros do
mtodo New porm no retorna o objeto criado.
A MsMGet se baseia no Dicionrio de Dados para verificar campos obrigatrios, validaes, gatilhos,
consulta padro etc. assim como para a criao das Pastas de Cadastro.
A MsMGet pode usar tanto variveis de memria do tipo Private como diretamente os campos da tabela a
que se refere.
Mtodos
New
AdvPl________________________________________________________________320
Descrio
Cria o objeto MsMGet.
Sintaxe
MSMGET():NEW( cAlias, nReg, nOpc, [ uPar1 ], [ uPar2 ], [ uPar3 ], [ aACho ], [ aPos ], [ aCpos ], [
uPar4 ], [ uPar5 ], [ uPar6 ], [ uPar7 ], [ oWnd ], [ uPar8 ], [ lMemoria ], [ lColuna ], [ uPar9 ], [
lSemPastas ] ) -> objeto
Argumentos
Descrio
cAlias
nReg
uPar1
Parmetro reservado.
uPar2
Parmetro reservado.
uPar3
Parmetro reservado.
aAcho
aPos
aCpos
uPar4
uPar5
Parmetro reservado.
uPar6
Parmetro reservado.
uPar7
Parmetro reservado.
oWnd
uPar8
Parmetro reservado.
AdvPl________________________________________________________________321
lMemoria
lColuna
uPar9
Parmetro reservado.
lSemPastas
Retorno
Objeto.
Refresh
Descrio
Atualiza os objetos contidos na MsMGet.
Sintaxe
Refresh()
Hide
Descrio
Esconde a MsMGet.
Sintaxe
Hide()
Show
Descrio
Mostra a MsMGet.
Sintaxe
AdvPl________________________________________________________________322
Show()
Exemplo
User Function Exemplo()
Local i
Local oDlg
Local oMsMGet
Local lInit
Local cCampo
DbSelectArea("SA1")
For i := 1 To FCount()
cCampo := Field(i)
lInit := .F.
If ExistIni(cCampo)
lInit := .t.
M->&(cCampo) := InitPad(SX3->X3_RELACAO)
If ValType(M->&(cCampo)) = "C"
M->&(cCampo) := Padr(M->&(cCampo),SX3->X3_TAMANHO)
EndIf
If M->&(cCampo) == NIL
lInit := .F.
EndIf
EndIf
If !lInit
M->&(cCampo) := FieldGet(i)
If ValType(M->&(cCampo)) = "C"
M->&(cCampo) := Space(Len(M->&(cCampo)))
ElseIf ValType(M->&(cCampo)) = "N"
M->&(cCampo) := 0
ElseIf ValType(M->&(cCampo)) = "D"
M->&(cCampo) := CtoD(" / / ")
ElseIf ValType(M->&(cCampo)) = "L"
M->&(cCampo) := .F.
EndIf
EndIf
Next
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 19,80
MSMGET():NEW("SA1",0,3,,,,,,,,,,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED ON INIT EnchoiceBar(oDlg,{|| oDlg:End()},{|| oDlg:End()})
Return
MBrowse
Monta um Browse com menu de opes.
Sintaxe
MBROWSE( [ uPar1 ], [ uPar2 ], [ uPar3 ], [ uPar4 ], cAlias, [ aFixos ], [ cCpo ], [ uPar5 ], [ cFun ], [
nPadrao ], [ aCores ], [ cExpIni ], [ cExpFim ], [ nCongela ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
uPar1
No
Parmetro reservado.
uPar2
No
Parmetro reservado.
uPar3
No
Parmetro reservado.
uPar4
No
Parmetro reservado.
AdvPl________________________________________________________________323
CAlias
Sim
AFixos
No
CCpo
No
uPar5
No
Parmetro reservado.
cFun
No
nPadrao
No
aCores
No
cExpIni
No
cExpFim
No
nCongela
No
Descrio
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo.
Apenas um dos parmetros ( cCpo, cFun, aColors ) deve ser informado.
(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada
(incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visualizao; 3 incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio no for informada
no validar os acessos.
Exemplo
Private cCadastro := 'Cadastro de Clientes'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0,
{ 'Visualizar' , 'AxVisual' ,
{ 'Incluir' , 'AxInclui' , 0,
{ 'Alterar' , 'AxAltera' , 0,
{ 'Excluir' , 'AxExcluir', 0,
MBROWSE( ,,,, 'SA1',, '!A1_COD',,, 4 )
1 },;
0, 2 },;
3 },;
4 },;
5 }}
Funes
AdvPl________________________________________________________________324
AllGroups
Retorna vetor contendo informaes dos grupos de usurios.
Sintaxe
ALLGROUPS() -> array
Descrio
A funo AllGroups() retorna um vetor principal onde cada elemento refere-se a um grupo de usurios
do sistema, estes elementos so compostos de um vetor multidimensional subdividindo as
informaes dos grupos. Sua estrutura composta de:
Elemento
Descrio
Tipo
Qtd.
1
1
ID
Nome
20
Data de validade
Idioma
Diretrio
100
Impressora
10
Acessos
11
12
13
14
15
16
Tipo de impresso
Formato
Ambiente
Opo de impresso
N
N
N
L
1
1
1
1
17
2
1
Mdulo+nvel+menu
512
AdvPl________________________________________________________________325
Exemplo
Local aGrupos:= {}
aGrupos:= ALLGROUPS()
AllUsers
Retorna vetor contendo informaes dos usurios do sistema.
Sintaxe
ALLUSERS() -> array
Descrio
A funo AllUsers() retorna um vetor principal onde cada elemento refere-se a um usurio do sistema,
estes elementos so compostos de um vetor multidimensional subdividindo as informaes dos
usurios. Sua estrutura composta de:
Elemento
Descrio
Tipo
Qtd.
1
1
ID
Nome
15
Senha
Nome Completo
30
--
Data de validade
10
--
11
ID do superior
12
Departamento
30
13
14
15
16
Cargo
E-Mail
Nmero de acessos simultneos
Data da ltima alterao
C
C
N
D
30
130
4
8
AdvPl________________________________________________________________326
17
Usurio bloqueado
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
1
L
N
L
C
1
1
4
A
N
C
C
C
A
C
N
N
N
L
C
L
-1
100
-512
-10
1
1
1
1
50
1
Mdulo+nvel+menu
Exemplo
Local aUsuario:= {}
aUsuario:= ALLUSERS()
APMsgAlert
Exibe uma mensagem em um dilogo
Sintaxe
APMSGALERT( cMsg, [ cTitulo ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
Exemplo
APMSGALERT(Ateno)
AdvPl________________________________________________________________327
APMsgInfo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGINFO( cMsg, [ cTitulo ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem de aviso.
Exemplo
APMSGINFO(Ateno)
APMsgNoYes
Exibe uma mensagem em um dilogo
Sintaxe
APMSGNOYES( cMsg, [ cTitulo ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso cancele a funo retornar verdadeiro, seno retornar falso.
Exemplo
If !APMSGNOYES(Abandonar?)
Return
EndIf
AdvPl________________________________________________________________328
APMsgStop
Exibe uma mensagem em um dilogo
Sintaxe
APMSGSTOP( cMsg , [ cTitulo ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
Ctitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para alertar o usurio com um boto para confirmar e
um cone de mensagem crtica.
Exemplo
APMSGSTOP(Ateno)
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
Exemplo
If APMSGYESNO(Abandonar ?)
Return
EndIf
AdvPl________________________________________________________________329
APMsgYesNo
Exibe uma mensagem em um dilogo
Sintaxe
APMSGYESNO( cMsg , [ cTitulo ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cMsg
Sim
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo exibe uma mensagem em um dilogo para o usurio com um boto para confirmar e um para
cancelar. Caso confirme a funo retornar verdadeiro, seno retornar falso.
Exemplo
If APMSGYESNO(Abandonar ?)
Return
EndIf
Cabec
Imprime cabealho personalizado nos relatrios.
Sintaxe
CABEC( cTitulo, cCabec1, cCabec2, cPrograma, cTamanho, [ nFormato ], [ uPar ], [ lPerg ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cTitulo
Sim
Ttulo do relatrio.
cCabec1
Sim
cCabec2
Sim
cPrograma
Sim
Nome do relatrio.
cTamanho
Sim
nFormato
No
uPar
No
Reservado
AdvPl________________________________________________________________330
lPerg
No
Descrio
A funo Cabec() imprime o cabealho personalizado de acordo com o contedo dos parmetros cCabec1
e cCabec2. O logo impresso no cabealho uma imagem de extenso .bmp, cujo nome est associado
com o empresa corrente. Ex: LGRL01.BMP, 01 a empresa.
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo'
Local cAlias := 'XXX'
// nome do relatrio
// alias do arquivo
// grupo de perguntas
// no utiliza dicionrio
wrel
SetDefault(
aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus(
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
SetRegua(
RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
AdvPl________________________________________________________________331
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
CABEC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
// cabealho
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
CABEC( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
// cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda(,, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer
TO
dbCommitAll()
OurSpool(
wrel )
Endif
MS_FLUSH()
Return
Capital
Corrige maisculas e minsculas de uma frase.
Sintaxe
CAPITAL( cTexto ) -> caracter
Argumento
Obrigat.
Tipo
Descrio
cTexto
Sim
Descrio
Esta funo coloca a primeira letra de cada palavra em maiscula e o restante em minscula em toda a
frase.
AdvPl________________________________________________________________332
Exemplo
APMsgInfo(
CAPITAL(FrAsE InCoRrEtA) )
CloseBrowse
Fecha a MBrowse ou a MarkBrow.
Sintaxe
CLOSEBROWSE() -> lgico
Descrio
Esta funo fecha a MBrowse ou MarkBrow dependendo de qual estiver ativa.
Conpad1
Exibe a tela de consulta padro.
Sintaxe
CONPAD1( [ uPar1 ], [ uPar2 ], [ uPar3 ], cAlias, [ cCampoRet ], [ uPar4 ], [ lVisual ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
uPar
No
Parmetro reservado.
uPar2
No
Parmetro reservado.
uPar3
No
Parmetro reservado.
cAlias
Sim
cCampoRet
No
uPar4
No
Parmetro Reservado.
lVisual
No
Descrio
Esta funo exibe a tela de consulta padro baseada no Dicionrio de Dados (SXB).
Exemplo
AdvPl________________________________________________________________333
CONPAD1(,,,SA1,,,.F.)
Enchoicebar
Cria barra de botes padro na janela
Sintaxe
ENCHOICEBAR( oDlg, bOk, bCancelar, [ lMensApag ] , [ aBotoes ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
oDlg
Sim
bOk
Sim
bCancelar
Sim
lMensApag
No
aBotoes
No
Descrio
Esta funo cria uma barra com botes padro e outros passados como parmetro na janela tambem
passada por parmetro. A EnchoiceBar dever ser chamada antes do ACTIVATE da janela.
Exemplo
User Function <nome-do-programa>()
Local oDlg
DEFINE MSDIALOG oDlg TITLE "Exemplo" FROM 00,00 TO 300,400 PIXEL
ACTIVATE MSDIALOG oDlg CENTERED ON INIT,;
ENCHOICEBAR(oDlg,{|| APMsgInfo(Ok)}, {|| ApMsgInfo(Cancelar)}, , {{BMPINCLUIR,{||
APMsgInfo(Teste)},Teste}})
Return
FileNoExt
Retorna o nome de um arquivo sem a extenso.
AdvPl________________________________________________________________334
Sintaxe
FILENOEXT( cTexto ) -> caracter
Argumento
Obrigat.
Tipo
Descrio
cTexto
Sim
Descrio
A funo FileNoExt() retorna o nome de um arquivo contido em uma string, ignorando a extenso.
Exemplo
Local cString := '\SIGAADV\ARQZZZ.DBF'
cString := FileNoExt( cString )
// retorno \SIGAADV\ARQZZZ
Final
Utilizada para finalizar o sistema.
Sintaxe
FINAL( [ cMensagem1 ], [ cMensagem2 ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cMensagem1
No
Primeira mensagem.
cMensagem2
No
Segunda mensagem.
Descrio
Esta funo executa operaes bsicas que garantem a integridade dos dados ao finalizar o sistema
desmontando as transaes (se houver), desbloqueando os semforos e fechando as tabelas abertas.
Exemplo
User Function <nome-do-programa>( cUsuario, cSenha )
Local cMensag1 := Usurio invlido!
Local cMensag2 := Opo disponvel para usurios Administradores!
If !PswAdmin( cUsuario, cSenha )
FINAL( cMensag1, cMensag2 )
EndIf
Return
AdvPl________________________________________________________________335
FTPConnect
Cria conexo com servidor FTP.
Sintaxe
FTPCONNECT( cServidor, nPorta, cUsuario, cSenha ) -> lgico
Descrio
A funo FTPConnect() retorna verdadeiro se a operao for realizada com sucesso. Se existir uma
conexo ativa e for solicitada uma nova, retornar falso.
Argumento
Obrigat.
Tipo
Descrio
cServidor
Sim
Endereo do servidor
nPorta
No
cUsuario
No
cSenha
No
Exemplo
Local cServidor
Local cCurDir
cServidor := 'ftp.caminhodoservidor.com.br'
If !FTPCONNECT( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
FTPDirChange
Altera o diretrio corrente do FTP.
Sintaxe
FTPDIRCHANGE( cDiretorio ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cDiretorio
Sim
Nome do diretrio.
Descrio
AdvPl________________________________________________________________336
A funo FTPDirChange () retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
aDirs := FTPDirectory( '*.*', 'D' )
aArqs := FTPDirectory( '*.*' )
EndIf
FTPDirectory
Cria um vetor com informaes de diretrios e arquivos do FTP.
Sintaxe
FTPDIRECTORY( cMascara, [ cAtributo ] ) -> array
Argumento
Obrigat.
Tipo
Descrio
cMascara
Sim
cAtributo
No
Descrio
A funo FTPDirectory() retorna um vetor contendo informaes dos diretrios e arquivos contidos no FTP.
Exemplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
aDirs := FTPDIRECTORY( '*.*', 'D' )
aArqs := FTPDIRECTORY( '*.*' )
EndIf
AdvPl________________________________________________________________337
FTPDisconnect
Elimina conexo atual.
Sintaxe
FTPDISCONNECT() -> lgico
Descrio
A funo FTPDisconnect() retornar verdadeiro (.T.) se a operao for realizada com sucesso. Se no
existir uma conexo a funo retornar falso (.F.). Se a operao for realizada com sucesso a funo
retorna verdadeiro (.T.).
Exemplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDISCONNECT()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
FTPDirChange('diretorio')
aDirs := FTPDirectory( '*.*', 'D' )
aArqs := FTPDirectory( '*.*' )
FTPDownload
Copia um arquivo no servidor FTP para o servidor local.
Sintaxe
FTPDOWNLOAD( cArqDest, cArqOrig ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqDest
Sim
CArqOrig
Sim
Descrio
A funo FTPDownload() copia um arquivo no servidor FTP para uma mquina local em um diretrio
(informado no parmetro cArqDest) abaixo do RootPath do Protheus.
Exemplo
AdvPl________________________________________________________________338
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
If !FTPDOWNLOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' )
APMsgInfo( 'Problemas ao copiar arquivo!' )
EndIf
EndIf
FTPErase
Apaga arquivo no servidor FTP.
Sintaxe
FTPERASE( cArquivo ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
Nome do arquivo
Descrio
A funo FTPErase() apaga arquivo no diretrio corrente do FTP. Se a operao for realizada com sucesso
a funo retornar verdadeiro (.T.).
Exemplo
Local cServidor
Local aArqs
Local aDirs
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
If !FTPERASE( Arquivo.ext )
APMsgInfo(Problemas ao apagar o arquivo! )
EndIf
EndIf
FTPGetCurDir
Retorna o diretrio corrente no FTP.
Sintaxe
AdvPl________________________________________________________________339
FTPGETCURDIR() -> caracter
Exemplo
Local cServidor
Local cCurDir
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
cCurDir := FTPGETCURDIR()
FTPRenameFile
Renomeia arquivo no servidor FTP.
Sintaxe
FTPRENAMEFILE( cArqAtual, cArqNovo ) -> lgico
Argumento
cArqAtual
cArqDest
Obrigat.
Tipo
Descrio
Sim
Sim
Descrio
A funo FTPRenameFile() renomeia um arquivo no diretrio corrente do servidor FTP. Se a operao for
realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
If !FTPRENAMEFILE( 'ARQ00001.ARQ', 'ARQ00002.ARQ' )
APMsgInfo( 'Problemas ao renomear arquivo!' )
EndIf
EndIf
FTPUpload
Copia um arquivo na mquina local para o servidor FTP.
AdvPl________________________________________________________________340
Sintaxe
FTPUPLOAD( cArqOrig, cArqDest ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqOri
Sim
cArqDest
Sim
Descrio
A funo FTPUpload() copia um arquivo na mquina local para o diretrio corrente no servidor FTP. O
arquivo a ser copiado deve estar abaixo do RootPath do Protheus. Se a operao for realizada com
sucesso a funo retornar verdadeiro (.T.).
Exemplo
Local cServidor
cServidor := 'ftp.caminhodoserivor.com.br'
FTPDisconnect()
If !FTPConnect( cServidor )
APMsgInfo( 'Falha na conexo!' )
EndIf
If FTPDirChange('diretorio')
If !FTPUPLOAD( '\DIRETORIO\ARQ00001.ARQ', 'ARQ00001.ARQ' )
APMsgInfo( 'Problemas ao copiar arquivo!' )
EndIf
EndIf
FunDesc
Retorna descrio de uma opo do menu.
Sintaxe
FUNDESC() -> caracter
Descrio
A funo FunName() retornar a descrio de uma opo selecionada no menu do Siga.
Exemplo
Local cDescr
cDescr := FUNDESC()
FunName
Retorna nome de uma funo do menu.
AdvPl________________________________________________________________341
Sintaxe
FUNNAME() -> caracter
Descrio
A funo FunName() retornar o nome de uma funo executada a partir de um menu do Siga
Exemplo
Local cFunction
cFunction := FUNNAME()
GetCountryList
Retorna vetor contendo informaes dos pases localizados.
Sintaxe
GETCOUNTRYLIST() -> array
Descrio
O vetor retornado possui trs dimenses, a primeira refere-se a sigla dos pases, o segundo ao nome do
pas e o terceiro a identificao do pas com dois dgitos.
Exemplo
Local aArray := GETCOUNTRYLIST()
Local cSigla := GetMv( MV_PAISLOC )
Local nPos
nPos := Ascan( aArray, {|d| d[1] == Upper(cSigla) } )
If nPos > 0
APMsgInfo( Pas de localizao + aArray[nPos,2] )
EndIf
GetMark
Retorna string de caracteres aleatrios.
Sintaxe
GETMARK( [ lMaiusc ] ) -> caracter
Argumento
Obrigat.
Tipo
Descrio
AdvPl________________________________________________________________342
lMaiusc
No
Descrio
A GetMark() utilizada junto a funo MarkBrow() onde so utilizados combinaes de caracteres para
controle de marcas.
Exemplo
Function <nome-da-funo>( )
Local aCampos := {{'CB_OK' ,,''},;
{'CB_USERLIB' ,,'Usurio'},;
{'CB_TABHORA' ,,'Hora'},;
{'CB_DTTAB' ,,'Data'}}
Private cMarca := GETMARK()
Private cCadastro := 'Cadastro de Contrato'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 }}
MarkBrow( 'SCB', 'CB_OK','!CB_USERLIB',aCampos,, cMarca,'MarkAll()',,,,'Mark()' )
Return
GetMv
Retorna o contedo de um parmetro cadastrado no SX6.
Sintaxe
GETMV( cPar01, [ lPar02 ], [ uPar03 ] ) -> varivel
Argumento
Obrigat.
Tipo
Descrio
cPar1
Sim
lPar02
No
uPar03
No
Valor default que deve ser retornado pela GetMv quando os parmetro
solicitado no existir. O valor desse
parmetro pode ser caracter,
numrico, lgico ou data.
Descrio
O retorno da funo depende do tipo informado na cadastro do parmetro e da configurao dos
argumentos lPar02 e uPar03.
Se lPar02 for passado como .T. ( Verdadeiro ), o retorno da funo ser um valor lgico indicando se o
parmetro existe.
Quando uPar03 for informado, caso o parmetro informado em cPar01 no exista, o retorno da funo
ser o valor informado em uPar03 caso contrrio retorna o contedo do parmetro. Se uPar03 for
informado o contedo de lPar02 ser desconsiderado.
Exemplo
AdvPl________________________________________________________________343
Local cValor := ""
// Retorna o contedo do parmetro
cValor := GETMV( "MV_ESTADO" )
// Verifica se o parmetro existe
If ( GETMV( "MV_ESTADO", .T. ) )
ApMsgInfo( "O Parmetro MV_ESTADO existe !" )
Else
ApMsgStop( "O Parmetro MV_ESTADO no existe !" )
EndIf
// Retorna o contedo do parmetro
// se no encontrar retorna o valor default passado
cValor := GETMV( "MV_ESTADO", , "SP" )
IncProc
Incrementa rgua de progresso.
Sintaxe
INCPROC() -> nil
Descrio
Para incrementar a rgua criada pela funo Processa(), utilizamos a funo IncProc()
Exemplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
Processa( bAcao, cTitulo, cMsg, lAborta )
Return
Static Function Exemplo(lFim)
Local nI
ProcRegua(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
INCPROC()
Next nI
Return
IncRegua
Incrementa valores na rgua de progresso criada pela funo RptStatus().
AdvPl________________________________________________________________344
Sintaxe
INCREGUA() -> nil
Descrio
Aps executar as funes RptStatus() e SetRegua(), para incrementar valores na rgua utilizamos a
funo IncRegua().
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administrao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
INCREGUA()
dbSkip()
End
IF nLin != 80
// cabealho
AdvPl________________________________________________________________345
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
// cabealho
EndIf
If aReturn[5] = 1
Set Printer
TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
IndRegua
Cria ndice temporrio com expresso de filtro.
Sintaxe
INDREGUA( cAlias, cIndice, cExpress, [ xOrdem] , [ cFor ], [ cMens ], [ lExibir ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cAlias
No
cIndece
Sim
cExpress
Sim
Expresso do ndice.
xOrdem
No
lExibir
No
cFor
No
Expresso de filtro.
cMens
No
Descrio
Esta funo cria um ndice temporrio para o alias especificado podendo ou no ter um filtro e tambem
podendo ser decrescente se o parmetro xOrdem for especificado como D. Durante a criao do ndice
um dilogo com uma barra de progresso ser criada podendo esta ser omitida.
Exemplo
User Function Exemplo()
Local cArquivo
Local cChave
Local cFor
Local nIndex
DbSelectArea("SA1")
cArquivo := CriaTrab(,.F.)
cChave := "A1_NOME"
cFor := "!Empty(A1_NOME)"
AdvPl________________________________________________________________346
INDREGUA("SA1",cArquivo,cChave,,cFor)
DbSelectArea("SA1")
nIndex := RetIndex("SA1")
#IFNDEF TOP
DbSetIndex(cArquivo+OrdBagExt())
#ENDIF
DbSetOrder(nIndex+1)
.
.
.
DbSelectArea("SA1")
RetIndex("SA1")
FErase(cArquivo+OrdBagExt())
Return
MarkBRefresh
Atualiza a MarkBrow.
Sintaxe
MARKBREFRESH() -> nil
Descrio
Esta funo atualiza o browse da MarkBrow.
MarkBrow
Monta um Browse onde as linhas podem ser marcadas ou desmarcadas.
Sintaxe
MARKBROW( cAlias, cCampo, [ cCpo ], [ aCampos ], [ lInverte ], cMarca, [ cCtrlM ], [ uPar ], [
cExpIni ], [ cExpFim ], [ cAval ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cAlias
Sim
cCampo
Sim
cCpo
No
aCampos
No
lInvert
No
Inverte a marcao.
cMarca
Sim
cCtrlM
No
AdvPl________________________________________________________________347
uPar
No
Parmetro reservado.
cExpIni
No
cExpFim
No
cAval
No
Descrio
A funo MarkBrow() permite que os elementos de um browse sejam marcados ou desmarcados.
As variveis cCadastro e aRotina (*) precisam ser declarados como private acima da chamada da funo.
O vetor informado no parmetro aCampos deve conter as seguintes dimenses: 1 nome do campo; 2
- Nada (Nil); 3 - Ttulo do campo; 4 - Mscara (picture).
(*) vetor com as rotinas que sero executadas, nele ser definido o tipo de operao a ser executada
(incluso, alterao, excluso, visualizao, pesquisa, ...) sua estrutura composta de 5 (cinco)
dimenses: 1 - Ttulo; 2 Rotina; 3 Reservado; 4 Operao (1 - pesquisa; 2 - visualizao; 3 incluso; 4 - alterao; 5 - excluso); 5 Acesso relacionado a rotina, se esta posio no for informada
nenhum acesso ser validado.
Exemplo
Function <nome-da-funo>( )
Local aCampos := { {'CB_OK' ,,''},;
{'CB_USERLIB' ,,'Usurio'},;
{'CB_TABHORA' ,,'Hora'},;
{'CB_DTTAB' ,,'Data'}}
Private cMarca := GetMark()
Private cCadastro
:= 'Cadastro de Contrato'
Private aRotina := { { 'Pesquisar' , 'AxPesqui' , 0, 1 }}
MARKBROW( 'SCB', 'CB_OK','!CB_USERLIB',aCampos,, cMarca,'MarkAll()',,,,'Mark()' )
Return
// Grava marca no campo
Function Mark()
If IsMark( 'CB_OK', cMarca )
RecLock( 'SCB', .F. )
Replace CB_OK With Space(2)
MsUnLock()
Else
RecLock( 'SCB', .F. )
Replace CB_OK With cMarca
MsUnLock()
EndIf
Return
// Grava marca em todos os registros validos
Function MarkAll()
Local nRecno := Recno()
dbSelectArea('SCB')
dbGotop()
While !Eof()
Mark()
dbSkip()
End
dbGoto( nRecno )
Return
AdvPl________________________________________________________________348
Ms_Flush
Descarrega spool de impresso.
Sintaxe
MS_FLUSH() -> nil
Descrio
Aps os comandos de impresso as informaes ficam armazenadas no spool e so descarrega em seus
destinos atravs da funo Ms_Flush().
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
nLin := 8
EndIf
// cabealho
AdvPl________________________________________________________________349
@
@
@
@
@
// cabealho
MsAppend
Adiciona registros de um arquivo para outro.
Sintaxe
MSAPPEND( [ cArqDest ], cArqOrig ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqDest
No
cArqOrig
No
Descrio
A funo MsAppend() adiciona registros de um arquivo para outro, respeitando a estrutura das tabelas. Se
a operao for realizada com sucesso o funo retornar verdadeiro (.T.).
Exemplo
dbSelectArea(XXX)
MSAPPEND(,ARQ00001)
MsCopyFile
Executa copia binria de um arquivo.
AdvPl________________________________________________________________350
Sintaxe
MSCOPYFILE( cArqOrig, cArqDest ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqOrig
Sim
cArqDest
Sim
Descrio
Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo
Local cArqOrig := 'ARQ00001.DBF'
Local cArqDest := 'ARQ00002.XXX'
If MSCOPYFILE( cArqOrig, cArqDest )
APMsgInfo('Copia realizada com sucesso!')
EndIf
MsCopyTo
Realiza copia de um arquivo de dados.
Sintaxe
MSCOPYTO( [ cArqOrig ], cArqDest ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqOrig
No
cArqDest
Sim
Descrio
A funo MsCopyTo() copia os registros de uma base de dados para outra, criando o arquivo destino de
acordo com a estrutura da base de dados origem.
Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.)
Exemplo
Local cArqDest := 'SX2ZZZ.DBF'
DbSelectArea('SX2')
If MSCOPYTO( , cArqDest )
APMsgInfo('Copia realizada com sucesso!')
Else
APMsgInfo('Problemas ao copiar o arquivo SX2!')
EndIf
AdvPl________________________________________________________________351
MsCreate
Cria arquivo de dados.
Sintaxe
MSCREATE( cArquivo, aEstrut ,[ cDriver ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArquivo
No
Nome do arquivo.
aEstrut
Sim
Estrutura do arquivo.
cDriver
No
RDD do arquivo.
Descrio
A funo MsCreate() cria um arquivo (tabela) de acordo com a estrutura informada no parmetro aStrut
(*). Se o parmetro cDriver no for informado o RDD corrente ser assumido como padro. Para criao
de tabelas no TopConnect necessrio estar conectado ao banco e o environment do Protheus ser TOP.
Se o arquivo for criado com sucesso a funo retornar verdadeiro (.T.).
(*) vetor contendo a estrutura da tabela: 1 - caracter, nome do campo; 2 - caracter, tipo do campo; 3
- numrico, tamanho do campo; 4 - numrico, decimais.
Exemplo
Local cTarget := '\sigaadv\'
Local aStrut
aStrut := { { 'Campo', 'C', 40, 0 } }
If MSCREATE( cTarget+'ARQ1001', aStrut )
APMsgInfo('Criado com sucesso!')
Else
APMsgInfo('Problemas ao criar o arquivo!')
EndIf
MsErase
Deleta arquivo.
Sintaxe
MSERASE( cArquivo, [ cIndice ], [ cDriver ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
cIndice
No
AdvPl________________________________________________________________352
cDriver
No
Descrio
A funo MsErase() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cArquivo := 'SX2ZZZ.DBF'
Local cIndice := 'SX2ZZZ'+ OrdBagExt()
If MSERASE( cArquivo, cIndice )
APMsgInfo( 'Arquivo deletado com sucesso!' )
Else
APMsgInfo( 'Problemas ao deletar arquivo!' )
EndIf
MsFile
Verifica existncia de um arquivo.
Sintaxe
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
cIndice
No
cDriver
No
Descrio
A funo MsFile() retornar verdadeiro (.T.) se a operao for realizada com sucesso.
Exemplo
Local cArquivo := 'SX2ZZZ.DBF'
Local cIndice := 'SX2ZZZ'+ OrdBagExt()
If !MSFILE( cArquivo, cIndice )
APMsgInfo( 'Arquivo no encontrado!' )
EndIf
AdvPl________________________________________________________________353
MsRename
Renomeia arquivo de acordo com RDD corrente.
Sintaxe
MSRENAME( cArqOrig, cArqDest ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cArqOrig
Sim
cArqDest
Sim
Descrio
A funo MsRename() retornar verdadeiro (.T.) se efetuar a operao com sucesso.
Exemplo
Local cTarget := '\sigaadv\'
Local cArqOrig := 'ARQ00001.DBF'
Local cArqDest := 'ARQ00002.DBF'
If MSRENAME( cTarget + cArqOrig, cTarget + cArqDest )
APMsgInfo('Arquivo renomeado com sucesso!')
Else
APMsgInfo('Problemas ao renomear o arquivo ' + cArqOrig + '!')
EndIf
MsUnlock
Libera lock de registro.
Sintaxe
MSUNLOCK() -> nil
Descrio
A funo MsUnlock() libera os registros bloqueados pela funo RecLock().
No retorna valores.
Exemplo
RecLock( 'XXX' ,.F. )
Replace Campo With '000001'
MSUNLOCK()
AdvPl________________________________________________________________354
OurSpool
Gerenciador de impresso.
Sintaxe
OURSPOOL( [ cArquivo ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
Descrio
A funo OurSpool() executa o gerenciador de impresso do Siga, carregando os relatrios gerados no
diretrio configurado atravs parmetro MV_RELT no dicionrio SX6. Caso quiser visualizar um relatrio
especfico, informe o nome no parmetro cArquivo.
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
AdvPl________________________________________________________________355
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec(
// cabealho
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer To
dbCommitAll()
OURSPOOL( wrel )
Endif
MS_FLUSH()
Return
// cabealho
Pergunte
Inicializa as variveis de pergunta (mv_par??).
Sintaxe
PERGUNTE( cPergunta , [ lPerg ] , [ cTitulo ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cPergunta
Sim
lPerg
No
cTitulo
No
Ttulo do dilogo.
Descrio
Esta funo inicializa as variveis de pergunta (mv_par01,...) baseado na pergunta cadastrado no
Dicionrio de Dados (SX1). Se o parmetro lAsk no for especificado ou for verdadeiro ser exibida a tela
para edio da pergunta e se o usurio confirmar as variveis sero atualizadas e a pergunta no SX1
tambm ser atualizada.
Exemplo
PERGUNTE(CON010)
AdvPl________________________________________________________________356
Processa
Cria dilogo com uma rgua de progresso.
Sintaxe
PROCESSA( bAcao, [ cTitulo ] , [ cMsg ], [ lAborta] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
bAcao
Sim
cMsg
No
cTitulo
No
Ttulo de janela
lAborta
No
Descrio
A funo Processa() cria um dilogo onde a execuo de um determinada funo pode ser acompanhada
atravs de uma rgua de progresso. Para atribuir o valor total da rgua utilizamos a funo ProcRegua()
e para incrementar a rgua utilizamos a funo IncProc().
Exemplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
PROCESSA( bAcao, cTitulo, cMsg, lAborta )
Return
Static Function Exemplo(lFim)
Local nI
ProcRegua(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
IncProc()
Next nI
Return
ProcRegua
AdvPl________________________________________________________________357
Atribui o valor total da rgua de progresso cria pela pela funo Processa().
Sintaxe
PROCREGUA( nTotal ) -> nil
Argumento
nTotal
Obrigat.
Tipo
Descrio
Sim
Descrio
Aps atribuir o valor total da rgua, para incrementar utilizamos a funo IncProc().
Exemplo
User Function <nome-da-funo>( )
Local bAcao := {|lFim| Exemplo(@lFim) }
Local cTitulo := ''
Local cMsg := 'Processando'
Local lAborta := .T.
Processa( bAcao, cTitulo, cMsg, lAborta )
Return
Static Function Exemplo(lFim)
Local nI
PROCREGUA(10000)
For nI := 1 To 10000
If lFim
Exit
EndIf
IncProc()
Next nI
Return
PswAdmin
Verifica se um usurio pertence ao grupo de administradores.
Sintaxe
PSWADMIN( cUsuario, cSenha ) -> numrico
Argumento
Obrigat.
Tipo
Descrio
cUsuario
Sim
Nome do usurio.
cSenha
Sim
Senha do usurio.
Descrio
A funo PswAdmin() retorna 0 (zero) se o usurio for do grupo de administradores, 1 (um) para usurio
no administrador e 2 (dois) se for senha invlida.
AdvPl________________________________________________________________358
Exemplo
User Function <nome-da-funo>( cUsuario, cSenha )
Local lAdminst := .F.
Local nRet
nRet := PSWADMIN( cUsuario, cSenha )
If nRet == 0
lAdminst := .T.
ElseIf nRet == 1
APMsgInfo( Usurio no Administrador ! )
ElseIf nRet == 2
APMsgInfo( Senha invalida ! )
EndIf
Return lAdminst
PswID
Retorna o ID do usurio ou do grupo de usurio.
Sintaxe
PSWID() -> caracter
Descrio
Utilizada para retornar o ID do usurio ou do grupo de usurios aps ter posicionado o arquivo de senha
com a funo PswSeek().
Exemplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
PswOrder(2)
If PswSeek( cUsuario, .T. )
cUserId := PSWID() // Retorna o ID do usurio
EndIf
Return
PswName
Verifica senha de usurio.
Sintaxe
PSWNAME( cSenha ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cSenha
Sim
Senha do usurio.
Descrio
AdvPl________________________________________________________________359
A funo PswName() verifica se a senha informada no parmetro cSenha pertence ao usurio posicionado
no arquivo de senha, se pertencer retornar verdadeiro(.T.).
Exemplo
User Function <nome-da-funo>( cUsuario, cSenha )
Local lOk
PswOrder(2)
If PswSeek( cUsuario, .T. )
lOk := PSWNAME( cSenha )
EndIf
Return lOk
PswOrder
Posiciona a ordem de indexao do arquivo de senhas.
Sintaxe
PSWORDER( nOrdem ) -> nil
Argumento
Obrigat.
Tipo
Descrio
nOrdem
Sim
Ordem de indexao.
Descrio
A funo PswOrder() posiciona a ordem de indexao de acordo com o parametro nOrdem, onde:
1 ID;
2 usurio;
3 senha;e
4 e-mail.
Exemplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
PSWORDER(2)
If PswSeek( cUsuario, .T. )
cUserId := PswID() // Retorna o ID do usurio
EndIf
Return
PswRet
Retorna vetor contendo informaes do Usurio ou do Grupo de Usurios.
AdvPl________________________________________________________________360
Sintaxe
PSWRET() -> array
Descrio
A funo PswRet() retorna dois tipos de vetores distintos, de acordo com o posicionamento do arquivo de
senha. Se no segundo parmetro da funo PswSeek() for informado .T. a PswRet() retornar um vetor
com informaes do Usurios, caso contrrio retornar informaes do Grupo de Usurios.
Exemplo
// Exemplo 1
User Function <nome-da-funo>( cUsuario )
Local aArray := {}
PswOrder(2)
If PswSeek( cUsuario, .T. )
aArray := PSWRET() // Retorna vetor com informaes do usurio
EndIf
Return
// Exemplo 2
User Function <nome-da-funo>( cGrupoID )
Local cGrupo
PswOrder(1)
If PswSeek( cGrupoId, .F. )
cGrupo := PSWRET()[1][2] // Retorna nome do Grupo de Usurio
EndIf
Return
PswSeek
Pesquisa e posiciona o arquivo de senhas.
Sintaxe
PSWSEEK( cID, [ lUsuario ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cID
Sim
lUsuario
No
Se verdadeiro (.T.) pesquisa por usurios, se falso (.F.) pesquisa por grupo
de usurios. O valor assumido como padro .T.
Descrio
A funo PswSeek() pesquisa e posiciona o arquivo de senhas conforme a ordem de indexao e o
parmetro lUsuario, se encontrar o usurio ou grupo de usurios retorna verdadeiro (.T.).
Exemplo
User Function <nome-da-funo>( cUsuario )
Local cUserID
PswOrder(2)// seleciona ordem de indexao
If PSWSEEK( cUsuario, .T. )
AdvPl________________________________________________________________361
cUserId := PswID() // Retorna o ID do usurio
EndIf
Return
ReadVar
Retorna o nome da varivel que esta sendo editada.
Sintaxe
READVAR() -> caracter
Descrio
Retorna o nome da varivel que esta sendo editada pela MsGetDados, MsGetDB e MsMGet (Enchoice) para
ser usada na validao de um campo por exemplo.
Exemplo
cVar := READVAR()
If Type(cVar) == C
APMsgInfo(Opo escolhida: +&cVar)
EndIf
RetAcsName
Retorna a extenso do arquivo de acessos corrente.
Sintaxe
RETACSNAME() -> caracter
Descrio
A funo RetAscName retorna a extenso do arquivo de acessos de acordo com idioma corrente.
Exemplo
Local cExt
cExt := RETACSNAME()
If ACS $ cExt
APMsgInfo( Menu Portugus )
ElseIf ACE $ cExt
APMsgInfo( Menu Espanhol' )
ElseIf ACI $ cExt
APMsgInfo( Menu Ingls )
EndIf
AdvPl________________________________________________________________362
RetExtHlp
Retorna a extenso do help de campo.
Sintaxe
RETEXTHLP() -> caracter
Descrio
Esta funo retorna uma string contendo a extenso do help de campos de acordo com idioma corrente.
Exemplo
Local cExt
cExt := RETEXTHLP()
If HLP $ cExt
APMsgInfo( Help de Campos em Portugus )
ElseIf HLE $ cExt
APMsgInfo( Help de Campos em Espanhol' )
ElseIf HLI $ cExt
APMsgInfo( Help de Campos em Ingls )
EndIf
RetExtHls
Retorna a extenso do help de solues.
Sintaxe
RETEXTHLS() -> caracter
Descrio
Esta funo retorna uma string contendo a extenso do help de solues de acordo com idioma corrente.
Exemplo
Local cExt
cExt := RETEXTHLS()
If HLS $ cExt
APMsgInfo( Help de Solues em Portugus )
ElseIf HSE $ cExt
APMsgInfo( Help de Solues em Espanhol' )
ElseIf HSI $ cExt
APMsgInfo( Help de Solues em Ingls )
EndIf
AdvPl________________________________________________________________363
RetExtHpr
Retorna a extenso do help do programa.
Sintaxe
RETEXTHPR() -> caracter
Descrio
Esta funo retorna uma string contendo a extenso do help de programas de acordo com idioma
corrente.
Exemplo
Local cExt
cExt := RETEXTHPR()
If HPR $ cExt
APMsgInfo( Help de Programas em Portugus )
ElseIf HPE $ cExt
APMsgInfo( Help de Programas em Espanhol' )
ElseIf HPI $ cExt
APMsgInfo( Help de Programas em Ingls )
EndIf
RetExtMnu
Retorna a extenso do menu corrente.
Sintaxe
RETEXTMNU() -> caracter
Descrio
Esta funo retorna uma string contendo a extenso do menu de acordo com idioma corrente.
Exemplo
Local cExt
cExt := RETEXTMNU()
If MNU $ cExt
APMsgInfo( Menu Portugus )
ElseIf MNS $ cExt
APMsgInfo( Menu Espanhol )
ElseIf MNE $ cExt
APMsgInfo( Menu Ingls )
EndIf
AdvPl________________________________________________________________364
RetFileName
Retorna o nome de um arquivo sem o caminho e sem a extenso.
Sintaxe
RETFILENAME( cArquivo ) -> caracter
Argumento
Obrigat.
Tipo
Descrio
cArquivo
Sim
Descrio
A funo RetFileName() retorna o nome de um arquivo contido em uma string, ignorando o caminho e a
extenso.
Exemplo
Local cArquivo := '\SIGAADV\ARQZZZ.DBF'
cArquivo := RETFILENAME( cArquivo )
// retorno ARQZZZ
Roda
Imprime rodap no relatrio.
Sintaxe
RODA( [ uPar1 ], [ uPar2 ], [ cTamanho ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
No
Parmetro reservado
uPar2
No
Parmetro reservado
cTamanho
No
uPar1
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
AdvPl________________________________________________________________365
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
RODA( ,, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
RptStatus
AdvPl________________________________________________________________366
Cria um dilogo com rgua de progresso.
Sintaxe
RPTSTATUS( bAcao, [ cTitulo ] , [ cMsg ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
bAcao
Sim
cTitulo
No
Titulo da janela.
cMsg
No
Descrio
A funo RptStatus() exibe um dilogo onde a execuo da funo de relatrio pode ser acompanhada
atravs de uma rgua de progresso. Para controlar a rgua utilizamos as funes SetRegua() para
atribuir o valor total da rgua, e a funo IncRegua() para incrementar. Caso o processamento seja
interrompido atravs do boto cancelar, um valor lgico retornado no parmetro do cdigo de bloco.
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RPTSTATUS( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
AdvPl________________________________________________________________367
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec(
// cabealho
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
// cabealho
SetDefault
Prepara ambiente de impresso.
Sintaxe
SETDEFAULT( aReturno, [ cAlias ], [ uPar1 ], [ uPar2 ], [ cTamanho ], [ nFormato ] ) -> nil
Argumento
Obrigat.
Tipo
Descrio
aReturno
Sim
Configuraes de impresso.
cAlias
No
uPar1
No
Parmetro reservado.
uPar2
No
Parmetro reservado.
cTamanho
No
nFormato
No
Descrio
Aps executar a funo SetPrint() o vetor aReturn conter as informaes necessrias para que
SetDefault() prepare o ambiente de impresso.
AdvPl________________________________________________________________368
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SETDEFAULT( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
OurSpool( wrel )
AdvPl________________________________________________________________369
Endif
MS_FLUSH()
Return
SetPrint
Interface onde so configuradas as opes de impresso.
Sintaxe
SETPRINT( cAlias, cPrograma, [ cPerg ], [ cTitulo ], [ cDesc1 ], [ cDesc2 ], [ cDesc3 ], [ lDic ], [ aOrd
], [ lCompres ], [ cTam ], [ uPar1 ], lFiltro, [ lCrystal ], [ cNomeDrv ], [ uPar2 ], [ lServidor ], [
cPortaImpr ] ) -> caracter
Argumento
Obrigat.
Tipo
Descrio
Sim
cPrograma
Sim
cPerg
No
cTitulo
No
Ttulo do relatrio
cDesc1
No
Descrio do relatrio.
cDesc2
No
cDesc3
No
lDic
No
aOrd
No
Ordem(s) de impresso.
lCompres
No
cTam
No
uPar1
No
Parmetro reservado
lFiltro
No
lCrystal
No
cNomeDrv
No
uPar2
lServidor
cPortaImpr
No
No
No
U
L
C
Parmetro reservado.
Se verdadeiro (.T.) fora impresso no servidor.
Define uma porta de impresso padro.
cAlias
Descrio
A funo SetPrint() cria a interface (dilogo) onde as opes de impresso de um relatrio podem ser
configuradas. Basicamente duas variveis m_pag (*) e aReturn (**) precisam ser declaradas como
AdvPl________________________________________________________________370
privadas (private) antes de executar a SetPrint(). Aps confirmada, os dados so armazenados no vetor
aReturn que ser passado como parmetro para funo SetDefault().
(*) controla o nmero de pginas.
(**) vetor contendo as opes de impresso, sua estrutura composta de 8 (oito) elementos: 1 caracter, tipo do formulrio; 2 - numrico, opo de margem; 3 - caracter, destinatrio; 4 - numrico,
formato da impresso; 5 - numrico, dispositivo de impresso; 6 - reservado; 7 - reservado; 8 numrico, ordem.
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SETPRINT( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
Set Filter To
Return
EndIf
RptStatus( {|lFim| Imprime( @lFim, cAlias, cTitulo, cProgram, cTamanho ) }, cTitulo )
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SetRegua( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
// cabealho
AdvPl________________________________________________________________371
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 )
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
// cabealho
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
SetRegua
Atribui valor total da rgua de progresso.
Sintaxe
SETREGUA( nTotal ) -> nil
Argumento
nTotal
Obrigat.
Tipo
Descrio
Sim
Descrio
Aps executar a funo RptStatus() necessrio atribuir o valor total da sua rgua, isso ser feito atravs
da funo SetRegua().
Exemplo
User Function <nome-da-funo>( )
Local cProgram := 'Exemplo' // nome do relatrio
Local cAlias := 'XXX' // alias do arquivo
Local cPerg := 'XXXXXX' // grupo de perguntas
Local cTitulo := 'Titulo do relatrio'
Local cDesc1 := 'Descrio'
Local cDesc2 := 'continuao da descrio'
Local cDesc3 := 'continuao da descrio'
Local lDic := .F. // no utiliza dicionrio
Local aOrd := { '1 Ordem', '2 ordem', '3 ordem' }
Local lCompres :=.F.
Local cTam := "G"
Private m_pag := 1
Private aReturn := { "Zebrado", 1,"Administracao", 1, 2, 1, "",1 }
Private wrel
Pergunte( cPerg, .F. )
wrel := SetPrint( cAlias, cProgram, cPerg, @cTitulo, cDesc1, cDesc2, cDesc3, lDic, aOrd ,
lCompres, cTam )
If nLastKey == 27
Set Filter To
Return
EndIf
SetDefault( aReturn, cAlias )
If nLastKey == 27
AdvPl________________________________________________________________372
Set Filter To
Return
EndIf
RptStatus(
Return
// rotina de impresso
Static Function Imprime( lFim, cAlias, cTitulo, cProgram, cTamanho )
Local nLin
:= 80
Local cCabec1 := 'Cabecalho 1'
Local cCabec2 := 'Cabecalho 2'
dbSelectArea( cAlias )
SETREGUA( RecCount() )
While !Eof() .And. ( XX_COD >= MV_PAR01 .And. XX_COD <= MV_PAR02 )
If lFim
@Prow()+1,001 PSAY "CANCELADO PELO OPERADOR"
Exit
EndIf
If nLin > 58
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
nLin := 8
EndIf
@ nLin,000 PSAY __PrtFatLine()
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin++,001 PSAY ...
@ nLin,000 PSAY __PrtThinLine()
IncRegua()
dbSkip()
End
IF nLin != 80
nLin++
If nLin > 60
Cabec( cTitulo, cCabec1, cCabec2, cProgram, cTamanho, 15 ) // cabealho
Endif
@ nLin,000 PSAY __PrtThinLine()
Roda( 0, cTitulo, cTamanho ) // Rodap
EndIf
If aReturn[5] = 1
Set Printer TO
dbCommitAll()
OurSpool( wrel )
Endif
MS_FLUSH()
Return
SixDescricao
Retorna descrio de uma chave de ndice.
Sintaxe
SIXDESCRICAO() -> caracter
Descrio
Esta funo retorna a descrio da chave de ndice, de acordo com o registro posicionado no SIX e idioma
corrente.
Exemplo
AdvPl________________________________________________________________373
User Function <nome-da-funo>( cChave, cOrdem )
Local cSixDesc :=
dbSelectArea(SIX)
dbSetOrder(1)
If dbSeek(cChave+cOrdem)
cSixDescr := SIXDESCRICAO()
EndIf
Return
VerSenha
Verifica se o usurio tem acesso a determinada opo.
Sintaxe
VERSENHA( nOpc ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
nOpc
Sim
Nmero da opo.
Descrio
Esta funo verifica se o usurio corrente tem acesso a determinada opo que foi cadastrada no
Configurador nas propriedades do usurio (Excluir produto,Alterar produto,...).
Exemplo
If !VERSENHA(36) //verifica se o usurio pode alterar a data base do sistema.
Return
EndIf
X1Def01
Retorna o contedo da primeira definio da pergunta (caso seja combo).
Sintaxe
X1DEF01() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
AdvPl________________________________________________________________374
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDef01
Local cDef02
Local cDef03
Local cDef04
Local cDef05
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDef01 := X1DEF01()
cDef02 := X1Def02()
cDef03 := X1Def03()
cDef04 := X1Def04()
cDef05 := X1Def05()
EndIf
Return
X1Def02
Retorna o contedo da segunda definio da pergunta (caso seja combo).
Sintaxe
X1DEF02() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDef01
Local cDef02
Local cDef03
Local cDef04
Local cDef05
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDef01 := X1Def01()
cDef02 := X1DEF02()
cDef03 := X1Def03()
cDef04 := X1Def04()
cDef05 := X1Def05()
EndIf
Return
X1Def03
Retorna o contedo da terceira definio da pergunta (caso seja combo).
Sintaxe
AdvPl________________________________________________________________375
X1DEF03() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDef01
Local cDef02
Local cDef03
Local cDef04
Local cDef05
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDef01 := X1Def01()
cDef02 := X1Def02()
cDef03 := X1DEF03()
cDef04 := X1Def04()
cDef05 := X1Def05()
EndIf
Return
X1Def04
Retorna o contedo da quarta definio da pergunta (caso seja combo).
Sintaxe
X1DEF04() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDef01
Local cDef02
Local cDef03
Local cDef04
Local cDef05
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDef01 := X1Def01()
cDef02 := X1Def02()
cDef03 := X1Def03()
cDef04 := X1DEF04()
cDef05 := X1Def05()
EndIf
Return
AdvPl________________________________________________________________376
X1Def05
Retorna o contedo da quinta definio da pergunta (caso seja combo).
Sintaxe
X1DEF05() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDef01
Local cDef02
Local cDef03
Local cDef04
Local cDef05
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDef01 := X1Def01()
cDef02 := X1Def02()
cDef03 := X1Def03()
cDef04 := X1Def04()
cDef05 := X1DEF05()
EndIf
Return
X1Pergunt
Retorna descrio de uma pergunta contida no dicionrio de dados SX1.
Sintaxe
X1PERGUNT() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX1 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cGrupo, cPerg )
Local cDescr
dbSelectArea(SX1)
dbSetOrder(1)
If dbSeek( cGrupo + cPerg ) // grupo da pergunta + o numero da perg.
cDescr := X1PERGUNT()
EndIf
Return
AdvPl________________________________________________________________377
X2Nome
Retorna o descrio de uma tabela contida no dicionrio de dados SX2.
Sintaxe
X2NOME() -> caracter
Descrio
O contedo retornado pela funo ser de acordo com o registro posicionado no SX2 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( )
Local cTabela
dbSelectArea(SX2)
dbSetOrder(1)
If dbSeek( SA1 )
cTabela := X2NOME()
EndIf
Return
X3CBox
Retorna o contedo de um campo tipo combo contido no dicionrio de dados SX3
Sintaxe
X3CBOX() -> varivel
Descrio
Esta funo retorna contedo do campo combo de acordo com o registro posicionado no SX3 e o idioma
corrente.
Exemplo
User Function <nome-da-funo>( )
Local cTitulo
Local cDescri
Local cCombo
AdvPl________________________________________________________________378
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( cCampo )
cTitulo := X3Titulo()
cDescri := X3Descri()
cCombo := X3CBOX()
EndIf
Return
X3Descric
Retorna o descrio de um campo contido no dicionrio de dados SX3
Sintaxe
X3DESCRIC() -> caracter
Descrio
Esta funo retorna a descrio do campo de acordo com o registro posicionando no SX3 e o idioma
corrente.
Exemplo
User Function <nome-da-funo>( )
Local cTitulo
Local cDescri
Local cCombo
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( cCampo )
cTitulo := X3Titulo()
cDescri := X3DESCRIC()
cCombo := X3Cbox()
EndIf
Return
X3Picture
Retorna a mascara de um campo do dicionrio de dados SX3.
Sintaxe
X3PICTURE( cCampo ) -> caracter
Argumento
Obrigat.
cCampo
Sim
Tipo
C
Descrio
Nome de um campo cadastrado no
Exemplo
User Function <nome-da-funo>( cCampo )
SX3
AdvPl________________________________________________________________379
Local cPicture
cPicture := X3PICTURE( cCampo )
Return cPicture
X3Titulo
Retorna o ttulo de um campo contido no dicionrio de dados SX3
Sintaxe
X3TITULO() -> caracter
Descrio
Esta funo retorna o ttulo do campo de acordo com o registro posicionado no SX3 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( )
Local cTitulo
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( A1_COD )
cTitulo := X3TITULO()
EndIf
Return
X3Uso
Verifica se o campo est disponvel para uso.
Sintaxe
X3USO( cUsado, [ nModulo ] ) -> lgico
Argumento
Obrigat.
Tipo
Descrio
cUsado
Sim
nModulo
No
Descrio
Esta funo retornar um valor lgico, se for uma campo usado verdadeiro (.T.), caso contrrio falso (.F.).
Exemplo
AdvPl________________________________________________________________380
User Function <nome-da-funo>()
Local lUsado := .F.
DbSelectArea(SX3)
DbSetOrder(2)
DbSeek(A1_COD)
If X3USO( SX3->X3_USADO )
lUsado := .T.
EndIf
Return lUsado
X5Descri
Retorna a descrio de uma tabela cadastrada no dicionrio de dados SX5
Sintaxe
X5DESCRI() -> caracter
Descrio
Esta funo retorna a descrio da tabela de acordo com o registro posicionado no SX5 e o idioma
corrente.
Exemplo
User Function <nome-da-funo>( cFilial, cTabela, cChave )
Local cDescr
dbSelectArea(SX5)
dbSetOrder(1)
If dbSeek( cFilial+cTabela+cChave )
cDescr := X5DESCRI()
EndIf
Return
X6Conteud
Retorna o contedo do parmetro cadastrado no dicionrio de dados SX6.
Sintaxe
X6CONTEUD() -> caracter
Descrio
Esta funo retorna o contedo de um parmetro de acordo com o registro posicionado no SX6 e idioma
corrente.
AdvPl________________________________________________________________381
Exemplo
User Function <nome-da-funo>( cFilial, cParam )
Local cDescr
Local cConteud
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr
:= X6Descric()
cDescr
+= X6Desc1()
cDescr
+= X6Desc2()
cConteud := X6CONTEUD()
EndIf
Return
X6Desc1
Retorna o primeiro complemento da descrio de um parmetro cadastrado no dicionrio de dados SX6.
Sintaxe
X6DESC1() -> caracter
Descrio
Esta funo retorna o contedo do primeiro complemento da descrio de um parametro de acordo com o
registro posicionado no SX6 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cFilial, cParam )
Local cDescr
Local cConteud
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr
:= X6Descric()
cDescr
+= X6DESC1()
cDescr
+= X6Desc2()
cConteud := X6Conteud()
EndIf
Return
X6Desc2
Retorna o segundo complemento da descrio de um parmetro cadastrado no dicionrio de dados SX6.
Sintaxe
X6DESC2() -> caracter
Descrio
AdvPl________________________________________________________________382
Esta funo retorna o contedo do segundo complemento da descrio de um parmetro de acordo com o
registro posicionado no SX6 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cFilial, cParam )
Local cDescr
Local cConteud
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr
:= X6Descric()
cDescr
+= X6Desc1()
cDescr
+= X6DESC2()
cConteud := X6Conteud()
EndIf
Return
X6Descric
Retorna a descrio de um parmetro cadastrado no dicionrio de dados SX6.
Sintaxe
X6DESCRIC() -> caracter
Descrio
Esta funo retorna o contedo da descrio de um parmetro de acordo com o registro posicionado no
SX6 e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cFilial, cParam )
Local cDescr
Local cConteud
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr
:= X6DESCRIC()
cDescr
+= X6Desc1()
cDescr
+= X6Desc2()
cConteud := X6Conteud()
EndIf
Return
XADescric
Retorna a descrio dos folders (pastas) cadastrados no dicionrio de dados SXA.
Sintaxe
XADESCRIC() -> caracter
AdvPl________________________________________________________________383
Descrio
Esta funo retorna o contedo da descrio dos folders de acordo com o registro posicionado no SXA e o
idioma corrente.
Exemplo
User Function <nome-da-funo>( cFolder, cNumero )
Local cDescr
dbSelectArea(SXA)
dbSetOrder(1)
If dbSeek( cFolder+cNumero ) // alias do folder + numero do folder
cDescr := XADESCRIC()
EndIf
Return
XBDescri
Retorna descrio de uma consulta SXB.
Sintaxe
XBDESCRI() -> caracter
Descrio
Esta funo retorna o contedo da descrio de uma consulta de acordo com o registro posicionado no
SXB e o idioma corrente.
Exemplo
User Function <nome-da-funo>( cAlias )
Local cDescr
dbSelectArea(SXB)
dbSetOrder(1)
If dbSeek( cAlias + 1 )
cDescr := XBDESCRI()
EndIf
Return
AdvPl________________________________________________________________384
AdvPl________________________________________________________________385
Instalao
Para instalar o SIGA Advanced for Windows com Microsoft Excel, o usurio deve possuir:
Hardware Configurao mnima: Pentium 133 com 16 MB RAM, recomendado Pentium 166 com 32
MB RAM.
Microsoft Excel A verso mnima 7.0 (95), recomendado o uso da verso 8.0 (97)
1.
2.
Observaes
1.
2.
A instalao do Office Kit deve ser feita em todas as estaes que iro utilizar a integrao.
A MICROSIGA envia dois arquivos exemplos de Planilha Excel, ADVDEMO e ADVDEMO7, para
serem utilizados nas verses Excel 97 e Excel 95, respectivamente. Estes arquivos so
instalados no diretrio X:\Arquivos de Programa \ SIGA Advanced Office Kit \ Samples (onde
X: drive onde est instalado o SIGA Advanced).
Utilizando a Integrao
Pode-se acessar o Microsoft Excel a partir de qualquer Mdulo SIGA Advanced, com exceo do SIGACFG
(Configurador ).
1.
2.
OBS: A integrao somente funcionar se o Excel for aberto a partir do Siga Advanced.
2.
Este procedimento recomendado para usurios menos experientes, pois o Microsoft Excel abre uma
janela assistente para que sejam informados os parmetros, facilitando o uso de referncia a outras
clulas.
Clique na clula que deve receber o resultado da funo SIGA Advanced e selecione a opo "Funes"
no menu Inserir.
No lado esquerdo da janela so relacionadas as categorias de funes disponveis. Selecione a categoria
de funes "Definidas pelo usurio".
Na caixa de listagem Nome da Funo , selecione a funo que ser utilizada. Ser apresentada uma
janela Assistente, onde devem ser informados os parmetros da funo, conforme solicitado e definido
pela sua sintaxe.
Informe os parmetros da funo e clique no boto "OK" para finalizar.
Outra forma de se utilizar as funes SIGA, digitando a funo diretamente na clula. Esta forma no
conta com o assistente, e portanto, o usurio deve conhecer a sintaxe da funo para informar
corretamente seus parmetros (recomendada apenas para usurios mais experientes). Para a
informao de uma frmula no Excel, deve-se digitar o sinal de igual =.
AdvPl________________________________________________________________386
3.
A terceira forma utilizar a funo SIGA( ) para identificar o incio da informao de funes SIGA
Advanced. Para tanto, deve ser usada a seguinte sintaxe:
SIGA("nome da funo"; 1 parmetro da funo; 2 parmetro da funo;...)
Por exemplo, informando:
=SIGA("MesExtenso";2)
Desta forma, ser retornado o ms Fevereiro.
Observe que o nome da funo SIGA Advanced informado entre aspas. (" ").
4.
A quarta forma, tambm iniciar a informao com a funo Siga( ), porm as funes SIGA Advanced,
juntamente com seus parmetros, devem ser digitados entre aspas, obedecendo a sintaxe padro que
utiliza os sinais de parnteses. Por exemplo:
=SIGA(MesExtenso(2))
Toda funo do SIGA Advanced utilizada a partir do menu Inserir Frmula do Microsoft Excel ou da sintaxe
=Siga(nomefuno;Par01;Par02) que utiliza valor lgico (.T./.F.) como parmetro, deve obedecer o
padro do Microsoft Excel (ateno! com o idioma do Microsoft Excel):
.T. - VERDADEIRO/TRUE
.F. - FALSO/FALSE
Se ao executar uma funo SIGA Advanced, o Excel retornar o erro "#VALOR" ou a mensagem As funes
do SIGA Advanced no constam na lista de funes definidas pelo usurio, verifique os seguintes tpicos
para solucionar:
Tenha certeza de que o Excel foi iniciado a partir do SIGA Advanced.
Atravs da opo "Suplementos" do Menu "Ferramentas" do Excel, utilize o boto "Procurar" para
localizar o "Add In" do SIGA Advanced (AdvXla80.XLA para a verso 8.0 ou AdvXla para verso 7.0 do
Excel, que esto no diretrio de Bibliotecas do Office).
AdvPl________________________________________________________________387
ExecBlocks
Pode-se utilizar Execblock nas clulas do Microsoft Excel com algumas restries:
Funes Genricas
POSICIONE
Posiciona o arquivo em um determinado registro.
Sintaxe: Posicione(ExpC1, ExpN1, ExpC2, ExpC3)
onde:
ExpC1 - Alias do arquivo
ExpN1 - Ordem utilizada
ExpC2 - Chave pesquisa
ExpC3 - Campo a ser retornado
Ex.: Posicione(SA1,1,xFilial(SA1)+001,A1_NOME)
MEDIA
Calcula a taxa mdia de uma determinada moeda em um ms especfico.
Sintaxe: Media (ExpN1, ExpN2, ExpN3)
onde:
ExpN1 - Moeda a ser calculada a mdia
ExpN2 - Ms a ser calculado
ExpN3 - Ano a ser calculado
Ex.:
Media (2,10,94)
Caso o ms e o ano no sejam passados como parmetros sero assumidos o ms
e ano da database.
SOMAR
Faz o somatrio de um arquivo, retornando o valor acumulado de um campo
determinado.
Sintaxe: Somar(ExpC1, ExpC2, ExpC3)
onde:
ExpC1 - Alias do arquivo
AdvPl________________________________________________________________388
ExpC2 - Condio para soma
ExpC3 - Campo a ser somado
Ex.:
Somar(SI1",I1_CLASSE='S' ,I1_SALANT)
Caso o usurio no deseje definir nenhuma condio, a ExpC2 deve ser .T..
GRUPO
Retorna o somatrio das clulas pertencentes a um determinado grupo.
Sintaxe: Grupo(ExpC1)
onde:
ExpC1 - Grupo a ser somado
Ex.: Grupo(1)
CONTAR
Conta o nmero de registros de acordo com a condio determinada.
Sintaxe: Contar(ExpC1, ExpC2)
onde:
ExpC1 - Alias do arquivo
ExpC2 - Condio para a contagem
Ex:
Contar(SC1,C1_DATPRF < dDataBase)
Funes Contbeis
SALDO
Devolve o saldo de uma determinada conta.
Sintaxe: Saldo(ExpC1, ExpN1,ExpN2)
onde:
ExpC1 - Cdigo da Conta
ExpN1 - Perodo do saldo desejado
ExpN2 - Moeda desejada para obteno do saldo.
Ex.: Saldo(11101,12,1)
MOVIMENTO
Devolve o movimento (dbito-crdito) de uma determinada conta.
Sintaxe: Movimento(ExpC1,ExpN1,ExpN2,ExpD1)
onde:
ExpC1 - Cdigo da conta
ExpN1 - Ms do movimento desejado
ExpN2 - Moeda desejada para obteno do movimento
ExpD1 - Data do exerccio desejado
Ex.:
Movimento(43,1,1, CTOD ("01/01/95") :
retorna o 1 perodo
Movimento(`43,1,1,CTOD(01/01/96) :
retorna o 13 perodo
DEBITO
Devolve o valor a dbito de uma determinada conta.
Sintaxe: Debito(ExpC1, ExpN1, ExpN2)
onde:
ExpC1 - Cdigo da Conta
ExpN! - Ms do movimento desejado
ExpN2 - Moeda desejada para obteno do valor a dbito
Ex.: Debito(11103,03,1)
CREDITO
Devolve o valor a crdito de uma conta.
Sintaxe: Credito(ExpC1, ExpN1, ExpN2)
AdvPl________________________________________________________________389
onde:
ExpC1 - Cdigo da Conta
ExpN1 - Ms do movimento desejado
ExpN2 - Moeda desejada para obteno do valor a crdito
Ex.: Credito(11103,03,1)
SOMAMOVIM
Retorna o movimento dentro de um intervalo de contas analticas
Sintaxe: SomaMovim(ExpC1, ExpC2, ExpN1, ExpN2)
onde:
ExpC1 - Cdigo da conta De
ExpC2 - Cdigo da conta At
ExpN1 - Referente ao ms
Exp N2 - Moeda desejada para obteno do valor
Ex.: SomaMovim(41304,41305,12,1)
SOMASALDO
Retorna o saldo atual entre um intervalo de contas.
Sintaxe SomaSaldo(ExpC1, ExpC2, ExpN1, ExpN2)
onde:
ExpC1 - Cdigo da conta De
ExpC2 - Cdigo da conta At
ExpN1 - Referente ao perodo
ExpN2 - Moeda desejada para obteno do valor
Ex.: SomaSaldo(31001,31010,12,1)
ORADO
Retorna o valor orado de uma conta..
Sintaxe Orcado(ExpC1, ExpN1, ExpN2, ExpD1)
onde:
ExpC1 - Cdigo da conta De
ExpN1 - Referente ao perodo
ExpN2 - Moeda desejada para obteno do valor
ExpD1 - Data para converso (em formato data ou caracter), caso no informa-da,
ser utilizada a DataBase do sistema.
Ex.: Orcado(11102001,1,1)
MESEXTENSO
Devolve o nome do ms por extenso.
Sintaxe: MesExtenso(ExpX1)
onde:
ExpX1 - Poder ser enviado o nmero de um ms, tanto do tipo caracter como
numrico, ou poder ser enviada uma data. Caso nada seja informado,
ser devolvido o nome do ms referente a Data Base.
Ex.: MesExtenso(01)
VARIAO
Retorna a variao em percentual entre dois valores.
Sintaxe: Variao(ExpN1, ExpN2)
onde:
ExpN1 - Primeiro fator comparativo
ExpN2 - Segundo fator comparativo
Ex.: Variacao(100000,50000)
MOVIMCC
Retorna o movimento de um centro de custo mais conta contbil (extracontbil).
Sintaxe: MovimCC(ExpC1, ExpC2, ExpN1, ExpN2)
onde:
ExpC1 - Cdigo do centro de custo
ExpC2 - Cdigo da conta contbil
ExpN1 - Referente ao ms
AdvPl________________________________________________________________390
ExpN2 - Moeda desejada para obteno do valor
Ex.:
MovimCC(3001, 111001,Month(Ddatabase),1)
ORCADOCC
Recupera o valor orado da Conta x Centro de Custo para utilizao na planilha.
Sintaxe: OrcadoCC(ExpC1,ExpC2,ExpN1,ExpN2,ExpD1),
onde:
ExpC1 - Conta
ExpC2 - Centro de Custo
ExpN1 - Perodo (default ms da database)
ExpN2 - Moeda (default 1)
ExpD1 - Data para converso se moeda de 2 a 5 - (default dDataBase).
Ex.: OrcadoCC( 111001,3001,3,2)
SUMMOVIMCC
Retorna o movimento de um intervalo de centro de custos extracontbeis. Poder ser
parametrizados tambm um grupo de contas.
Sintaxe:
SumMovimCC(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2)
onde:
ExpC1 - do Centro de Custo
ExpC2 - at Centro de Custo
ExpC3 - da Conta
ExpC4 - at a Conta
ExpN1 - Ms (default ms da database)
ExpN2 - Moeda (default 1)
Ex.:
SumMovimCC( 3001,3100,31001,31010,12,1)
GRAVAORCADO
Permite que um determinado valor calculado pela planilha seja gravado no Arquivo
de Oramentos.
Sintaxe:
GravaOrcado(ExpC1,ExpN1,ExpN2,ExpN3)
onde:
ExpC1 - Conta Contbil a ser orada
ExpN1 - Nmero da clula onde o valor estar contido
ExpN2 - Ms a ser orado (se nulo, ser ms corrente)
ExpN3 - Moeda a ser orada (se nula, ser moeda nacional)
Por exemplo: Obtm-se um valor na clula 022 referente conta 11102001, sendo que este dever ser
orado na contabilidade para o ms 07 e na moeda 1. Para tanto, cria-se em outra clula a seguinte
frmula:
GravaOrcado(11102001,#022,7,1)
Uma grande vantagem deste recurso que caso a planilha seja recalculada e o valor alterado, o valor orado
ser automaticamente atualizado. Esta funo ir devolver planilha o contedo <<< Orado >>>
Para inibir a impresso destas clulas, basta acessar as suas propriedades e desabilitar a visibilidade.
SALDOCUSTO
Calcula o saldo dos centro de custos extracontbeis.
Sintaxe:
SaldoCusto(ExpC1,ExpC2,ExpC3,ExpC4,ExpN1,ExpN2)
onde:
ExpC1 - Centro de Custo Inicial
ExpC2 - Centro de Custo Final
ExpC3 - Conta Inicial
ExpC4 - Conta Final
ExpN1 - Ms (se nula, assume o ms de referncia da database)
ExpN2 - Moeda (se nula, ser assumido 1 )
Ex.: SaldoCusto(1007, 1099, 3, 4, 10, 1)
SOMACONTAS
AdvPl________________________________________________________________391
Retorna o saldo acumulado de um grupo de contas, de acordo com a sintaxe apresentada. Esta funo
considera somente contas de classe A analtica
Sintaxe: SomaContas(ExpC1,ExpN1,ExpN2)
onde:
ExpC1 - Lista de contas, cercada por aspas ().
O Separador : (dois pontos) forma intervalo de contas De - At. O separador , (vrgula) , informa
separao de contas.
ExpN1 - Ms (default ms da database)
ExpN2 - Moeda (default 1)
Exemplos:
SomaContas(11101001,3,1)
Devolve o saldo da conta em questo no ms 3 na moeda 1.
SomaContas(11101001,11101002,11102237)
Devolve a soma dos saldos das contas em questo.
SomaContas(11101001:11102,31101001)
Devolve a soma dos saldos das contas 11101001 at 11102 mais o saldo da conta 31101001.
Funes Financeiras
SLDBCO
Retorna o saldo bancrio em uma data.
Sintaxe: SldBco(ExpC1,ExpC2,ExpC3,ExpD1,ExpN1)
onde:
ExpC1 - Cdigo do Banco
ExpC2 - Agncia Bancria
ExpC3 - Conta Bancria
ExpD1 - Data do Saldo
ExpN1 - Moeda do Saldo Bancrio
Ex.: SldBco(409,00198,011122, dDataBase,1)
SLDRECEBER
Retorna o saldo a receber em uma data.
Sintaxe: SldReceber(ExpD1,ExpN1,ExpL1)
onde:
ExpD1 - Data do Movimento a Receber.
ExpN1 - Moeda - Default 1
ExpL1 - Se .T. At a Data, .F. Somente Data (o padro .T.)
Ex.: SldReceber(Data,1,.T.)
SLDPAGAR
Retorna o saldo a pagar em uma determinada data.
Sintaxe: SldPagar(ExpD1,ExpN1,ExpL1)
onde:
ExpD1 - Data do Movimento a Pagar
( padro dDataBase)
ExpN1 - Moeda (padro 1)
ExpL1 - Se .T. At a Data, .F. Somente Data (padro .T.)
Ex.: SldPagar(dDataBase,1,.T.)
SLDCLIENTE
Retorna o saldo a receber do cliente em uma determinada data.
Sintaxe: SldCliente(ExpC1,ExpD1,ExpN1,ExpL1)
onde:
ExpC1 - Cliente+Loja
ExpD1 - Data do Movimento a Receber
(padro dDataBase)
ExpN1 - Moeda
ExpL1 - Se .T. considera o saldo do SE5
AdvPl________________________________________________________________392
(padro .T.)
Ex.: SldCliente(00000101,dDataBase)
SLDFORNECE
Retorna o saldo a pagar do fornecedor em uma data
Sintaxe: SldFornece(ExpC1,ExpD1,ExpN1,ExpL1)
onde:
ExpC1 - Fornecedor+Loja
ExpD1 - Data do Movimento a Pagar (padro dDataBase)
ExpN1 - Moeda - (padro 1)
ExpL1 - Se .T. considera o saldo do SE5
(padro .T.)
Ex.: SldFornece(00000101")
FINNATPRV
Retorna o valor previsto de cada natureza.
Sintaxe: FinatPrv(ExpC1,ExpD1,ExpD2,ExpN1)
onde:
ExpC1 - Natureza a ser Pesquisada
ExpD1 - Data Inicial para clculo
ExpD2 - Data Final de clculo
ExpN1 - Moeda de Sada
Ex.:
FinNatPrv(R001,CtoD(01/01/98),dDataBase,1)
FINNATREA
Retorna o valor realizado da Natureza.
SintaxeFinNatRea(ExpC1,ExpD1,ExpD2,ExpN1)
onde:
ExpC1 - Natureza a ser Pesquisada
ExpD1 - Data Inicial para clculo
ExpD2 - Data Final de clculo
ExpN1 - Moeda de Sada
Ex.: FinNatRea(R001,CtoD(01/01/98),dDataBase,1)
FINNATORC
Retorna o valor orado da natureza.
Sintaxe: FinNatOrc(ExpC1,ExpN1,ExpN2)
onde:
ExpC1 - Natureza a ser Pesquisada
ExpN1 - Ms para clculo
ExpN2 - Moeda de Sada
Ex.: FinNatOrc(R001,10,1)
AdvPl________________________________________________________________393
instalao
do
SQL
de
ser
selecionada
opo
Custom
Character
Set/sort
order/Unicode
AdvPl________________________________________________________________394
Topconnect_2 / Em Propriedades de Ambiente. Configurao do ODBC SQL Server Setup : Name =
TOPSQL, SERVER=(nome do servidor )[ Caso o TOPconnect esteja no mesmo servidor que o
SQL/Server deve-se manter a opo LOCAL Desta forma a conexo entre o TOPConnect e o SQL
no estar trafegando na Rede], NEXT>.
Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server to
obtain default setings .... Login ID : SIGA , Password .:SIGA.
NEXT>
Marcar.: [] Change the default database to: ( Selecionar o Database criado para o Siga) e desmarcar as
opes [] Use ANSI quoted e [] Use ANSI nulls, paddings and warnings . NEXT>.
Prxima tela marcar [] Perform Translation for character data, e os demais parametros sero marcados
deacordo com a poltica de administrao do Banco.
Selecionar na Barra de Ferramentas do Topconnect o cone = a uma Chave ( ou Editar Licenas), para que
possa ser detectado o n de srie, da mquina e assim entrar em contato com o suporte Topconnect
(CLIENTE DEVER ENTRAR EM CONTATO COM O ATENDIMENTO DO DISK-SIGA.: (0xx11)39817100)para obter a chave de acesso conforme a quantidade de usurios adquiridos.
SIGA ADVANCED 4.07 : No diretrio Sigaadv\WINSQL, existe um arquivo chamado ADV97.INI. Edite-o,
os parmetros corretos para o SigaAdv com SQL Server so: Database = MSSQL7, Alias = TOPSQL,
Contype = NPIPE, Server = NOME do servidor NT com o TOPConnect.
AP5
: Localizar em AP5\BIN
clausula [TOPCONNECT] como segue o exemplo conformo o padro adotado neste roteiro:
[TopConnect]
DataBase=MSSQL7
Server= *nome do servidor ou o endereo IP do servidor
ALIAS=TOPSQL
Contype=NPIPE
Caso seja necessrio a migrao de base DBF para o Banco verifique, antes de executar o
DBF2SQL, o DBF2SQL.INI. O Alias tem que ser igual MSSQL7/TOPSQL, neste exemplo.
Est pronta toda sua configurao.
CASO seja necessrio que o" SQL SERVER deva estar em UM SERVIDOR NT E TOPCONNECT EM OUTRO
NT".
No 1 Instalar o SQL SERVER. No 2 instalar o client do SQL e o topconnect, e apontar o client para a 1
mquina, o TOPCONNECT deve apontar para o SQL Server (1 mquina) o ADV97.INI dever indicar o
nome do servidor da 2 mquina, aonde o Topconnect est instalado.
ftp://ftp.microsiga.com.br/topconnect/nt - Download Instalador do TOPConnect_2.
1.1.
- Memria
= 512 MB ou mais
AdvPl________________________________________________________________395
- Discos
(com mais de 1GB de dados) recomendamos um Disk Array do tipo Raid5 de 4 Discos de 9GB com memria de 256 a 512 para cache de leitura.
- Processador
- Rede
2.
Locall Server
A proxima opo ir definir a criao de uma Instance para isto desmarque a opo Default., caso
Na proxima opo selecionar a forma Custom, que permitirar selecionar o local para a instalao do
SERVICES ACCOUNTS
Selecionar a forma que o Sql ira Startar.
Ex: Service Settings
Use The Local System Account
AUTHEMTICATION MODE
COLLATION SETTINGS
Sql collations
Binary order, for use with the 437 (U.S.English) Character Set.
Segue o resultado do Query Analyzer ao executar o sp_helpsort :Latin1-General, binary sort for
Unicode Data, SQL Server Sort Order 30 on Code Page 437 for non-Unicode Data
Acessar a Ferramenta Enterprise Manager do Microsoft SQL/Server 2000, no servidor SQL destinado para
o Siga, abrir a rvore indicada pelo sinal de "+" ao lado esquerdo deste Server.
AdvPl________________________________________________________________396
Abrir a pasta Databases, clique com o boto direito sobre qualquer Database e escolha New Database.
Onde o Nome deste Database, por exemplo, ser DADOSADV, cria-lo com o tamanho previamente
definido e demais parametros default , e em TRANSACTIO LOG ser definido a rea destinada a Log e o
ideal que seja em outro disco (NO OUTRA PARTIO) diferente do que estiver armazenado o DATABASE,
o tamanho tambm dever ser previamente definido. Ex.: DATABASE 500MB e em TRANSACTION LOG
150MB.
Em PROPERTIES/OPTIONS do DATABASE a opo "Truncat Log on Checkpoint", tem a funo de
estratgia de Backup, se a empresa optar por efetuar Backup`s de Log, tal opo poder ficar
desmarcada.
Agora entre em Security e em Logins, e com o boto direito sobre qualquer outro login, escolha New
Login, seguindo o exemplo, Nome = SIGA, ativar o SQL Server authentication Password = SIGA, Server
Roles marcar a opo SYSTEM ADMINSTRATORS e em DATABASE ACCESS atribuir permisses (permit)
para o database criado, no caso DADOSADV.
A parte do SQL Server est pronta. Agora resta apenas a configurao do TOPConnect Manager e do
SigaAdv.
Instalar o TOPConnect, e aps o termino do Install, encerrar todos os servio e reiniciar o
Servidor, Caso o processo seja de Atualizao do TOPConnect_1 para TOPConnect_2, deve ser efetuada
a remoo do TOPConnect_1(e o que for referente ao topconnect) atravs de Adicionar e Remover
Programas que est no Painel de Controle do Windows NT, antes de Instalar o TOPConnect_2.
Topconnect_2 / Em Propriedades de Ambiente. Configurao do ODBC SQL Server Setup : Name =
TOPSQL, SERVER=(nome do servidor )[ Caso o TOPconnect esteja no mesmo servidor que o
SQL/Server deve-se manter a opo LOCAL Desta forma a conexo entre o TOPConnect e o SQL
no estar trafegando na Rede], NEXT>.
Marcar a opes () With SQL Server authentication using a login ID .... e [] Connect to SQL Server to
obtain default setings .... Login ID : SIGA , Password .:SIGA.
NEXT>
Marcar.: [] Change the default database to: ( Selecionar o Database criado para o Siga) e desmarcar as
opes [] Use ANSI quoted e [] Use ANSI nulls, paddings and warnings . NEXT>.
Prxima tela marcar [] Perform Translation for character data, e os demais parametros sero marcados
deacordo com a poltica de administrao do Banco.
Selecionar na Barra de Ferramentas do Topconnect o cone = a uma Chave ( ou Editar Licenas), para que
possa ser detectado o n de srie, da mquina e assim entrar em contato com o suporte Topconnect
(CLIENTE DEVER ENTRAR EM CONTATO COM O ATENDIMENTO DO DISK-SIGA.: (0xx11)39817100)para obter a chave de acesso conforme a quantidade de usurios adquiridos.
CLIENTE SIGAADVANCED
No diretrio AP5\BIN, existe um arquivo chamado AP5SRV.INI. Edite-o, os parmetros corretos para O
PROTHEUS com SQL Server so: Database = MSSQL7, Alias = TOPSQL, Contype = NPIPE, Server =
NOME do servidor NT com o TOPConnect.
ftp://ftp.microsiga.com.br/topconnect/nt
atualizaes do TOPConnect_2.
e das
AdvPl________________________________________________________________397