Escolar Documentos
Profissional Documentos
Cultura Documentos
Intermediária PDF
Intermediária PDF
ADVPL Intermedirio
(Capacitao Interna)
OBJETIVOS DO CURSO................................................................................................................................. 9
MDULO 04: Desenvolvendo aplicaes em ADVPL ................................................................................... 10
1. A linguagem ADVPL........................................................................................................................... 10
2. Estrutura de um Programa ADVPL..................................................................................................... 12
2.1. reas de um Programa ADVPL .................................................................................................. 14
3. Declarao e Atribuio de Variveis ................................................................................................ 17
3.1. Tipo de Dados ........................................................................................................................... 17
3.2. Declarao de variveis ............................................................................................................ 18
3.3. Escopo de variveis................................................................................................................... 19
3.4. Entendendo a influncia do escopo das variveis...................................................................... 23
4. Regras adicionais da linguagem ADVPL............................................................................................. 24
4.1. Palavras reservadas.................................................................................................................. 24
4.2. Pictures de formatao disponveis .......................................................................................... 25
5. Programas de Atualizao................................................................................................................. 26
5.1. Modelo1() ou AxCadastro() ...................................................................................................... 27
5.2. Modelo2() ................................................................................................................................. 29
5.2.1. Componentes de uma tela no formato Modelo 2 ........................................................................... 29
5.2.2. Estrutura de um programa utilizando a Modelo2()......................................................................... 37
5.2.3. Funo Modelo2() ..................................................................................................................... 45
5.3. Modelo3() ................................................................................................................................. 49
5.3.1. Estrutura de um programa utilizando a Modelo3()......................................................................... 52
5.3.2. Funo Modelo3() ..................................................................................................................... 61
5.4. Mbrowse() ................................................................................................................................ 65
5.4.1. AxFunctions()........................................................................................................................... 70
5.4.2. FilBrowse() .............................................................................................................................. 72
5.4.3. EndFilBrw() .............................................................................................................................. 72
5.4.4. PesqBrw()................................................................................................................................ 73
5.4.5. BrwLegenda () ......................................................................................................................... 73
5.5. MarkBrowse() ........................................................................................................................... 77
6. Arquivos e ndices Temporrios ........................................................................................................ 81
6.1. Utilizao de arquivos e ndices temporrios ............................................................................ 81
6.2. Funes para manipulao de arquivos e ndices temporrios.................................................. 81
6.2.1. CriaTrab()................................................................................................................................ 81
6.2.2. dbUseArea()............................................................................................................................. 82
6.2.3. IndRegua() .............................................................................................................................. 82
7. Relatrios no grficos...................................................................................................................... 86
7.1.1. Estrutura de relatrios baseados na SetPrint().............................................................................. 86
8. Manipulao de arquivos I ................................................................................................................ 96
8.1. Gerao e leitura de arquivos em formato texto ....................................................................... 96
1. Famlia de funes de gravao e leitura de arquivos texto ........................................................... 97
2. Famlia de funes de gravao e leitura de arquivos texto ......................................................... 102
9. Oficina de programao I ................................................................................................................ 104
9.1. Interfaces com sintaxe clssica .............................................................................................. 104
9.2. Rguas de processamento ...................................................................................................... 107
9.2.1. RptStatus() ............................................................................................................................ 107
SETREGUA()............................................................................................................................... 109
INCREGUA()............................................................................................................................... 110
9.2.2. Processa() ............................................................................................................................. 111
-2-
ADVPL Intermedirio
SETPROC()................................................................................................................................. 113
INCPROC()................................................................................................................................. 113
9.2.3. MsNewProcess(). .................................................................................................................... 114
9.2.4. MsAguarde(). ......................................................................................................................... 116
9.2.5. MsgRun()............................................................................................................................... 118
9.3. ListBox()................................................................................................................................. 119
9.3.1. ListBox simples ...................................................................................................................... 119
9.3.2. ListBox mltiplas colunas......................................................................................................... 122
9.4. ScrollBox().............................................................................................................................. 124
9.5. ParamBox() ............................................................................................................................ 128
MDULO 05: Introduo a orientao objetos ...................................................................................... 133
10. Conceitos de orientao objetos............................................................................................... 133
10.1. Definies ............................................................................................................................... 133
10.2. Conceitos Bsicos ................................................................................................................... 136
10.3. O Modelo de Objetos (OMT) .................................................................................................... 137
10.3.1. Objetos e Classes ............................................................................................................... 137
10.3.2. Atributos ........................................................................................................................... 138
10.3.3. Operaes e Mtodos .......................................................................................................... 139
10.3.4. Sugestes de desenvolvimento............................................................................................. 140
11. Orientao a objetos em ADVPL .................................................................................................. 141
11.1. Sintaxe e operadores para orientao a objetos ..................................................................... 141
11.2. Estrutura de uma classe de objetos em ADVPL ....................................................................... 143
11.3. Implementao dos mtodos de uma classe em ADVPL .......................................................... 144
MDULO 06: ADVPL Orientado objetos I............................................................................................... 148
12. Componentes da interface visual do ADVPL ................................................................................ 148
12.1. Particularidades dos componentes visuais.............................................................................. 155
12.1.1. Configurando as cores para os componentes.......................................................................... 155
13. Aplicaes com a interface visual do ADVPL ............................................................................... 157
13.1. Captura de informaes simples (Multi-Gets) ......................................................................... 157
13.1.1. Enchoice() ......................................................................................................................... 158
13.1.2. MsMGet() .......................................................................................................................... 160
13.2. Captura de mltiplas informaes (Multi-Lines) ..................................................................... 162
13.2.1. MsGetDB()......................................................................................................................... 163
13.2.2. MsGetDados() .................................................................................................................... 167
13.2.3. MsNewGetDados() .............................................................................................................. 171
13.2.3.1. Definindo cores personalizadas para o objeto MsNewGetDados() .......................................... 176
13.3. Barras de botes..................................................................................................................... 181
13.3.1. EnchoiceBar() .................................................................................................................... 181
13.3.2. TBar() ............................................................................................................................... 183
13.3.3. ButtonBar.......................................................................................................................... 184
13.3.4. Imagens pr-definidas para as barras de botes..................................................................... 187
APNDICES.............................................................................................................................................. 188
BOAS PRTICAS DE PROGRAMAO ........................................................................................................ 188
14. Arredondamento ......................................................................................................................... 188
15. Utilizao de Identao............................................................................................................... 188
16. Capitulao de Palavras-Chave ................................................................................................... 190
16.1. Palavras em maisculo ........................................................................................................... 190
17. Utilizao da Notao Hngara ................................................................................................... 191
18. Tcnicas de programao eficiente ............................................................................................. 191
LISTAS DE EXERCCIOS ........................................................................................................................... 201
Mdulo 04.1.: Desenvolvendo aplicaes em ADVPL .......................................................................... 201
Mdulo 04.2.: Oficina de Programao I............................................................................................. 206
-3-
ADVPL Intermedirio
Mdulo 05: Introduo a orientao objetos ................................................................................... 208
Mdulo 06: ADVPL orientado objetos I ............................................................................................ 209
Projeto: Avaliao prtica do treinamento de ADVPL Intermedirio.................................................... 211
REFERNCIAS BIBLIOGRFICAS.............................................................................................................. 212
GUIA DE REFERNCIA RPIDA: Funes e Comandos ADVPL .................................................................. 214
Converso entre tipos de dados........................................................................................................... 214
CTOD()...................................................................................................................................... 214
CVALTOCHAR()........................................................................................................................... 214
DTOC()...................................................................................................................................... 215
DTOS()...................................................................................................................................... 215
STOD()...................................................................................................................................... 215
STR() ........................................................................................................................................ 216
STRZERO() ................................................................................................................................ 216
VAL() ........................................................................................................................................ 217
Matemticas ........................................................................................................................................ 218
ACOS()...................................................................................................................................... 218
CEILING() .................................................................................................................................. 218
COS()........................................................................................................................................ 218
LOG10() .................................................................................................................................... 219
SIN()......................................................................................................................................... 219
SQRT() ...................................................................................................................................... 220
TAN() ........................................................................................................................................ 220
Anlise de variveis............................................................................................................................. 221
TYPE() ....................................................................................................................................... 221
VALTYPE().................................................................................................................................. 221
Manipulao de arrays......................................................................................................................... 222
AADD()...................................................................................................................................... 222
ACLONE() .................................................................................................................................. 223
ACOPY() .................................................................................................................................... 223
ADEL() ...................................................................................................................................... 224
ADIR()....................................................................................................................................... 225
AFILL() ...................................................................................................................................... 226
AINS()....................................................................................................................................... 226
ARRAY() .................................................................................................................................... 227
ASCAN() .................................................................................................................................... 227
ASCANX() .................................................................................................................................. 228
ASIZE() ..................................................................................................................................... 229
ASORT() .................................................................................................................................... 230
ATAIL() ..................................................................................................................................... 231
Manipulao de blocos de cdigo......................................................................................................... 232
EVAL()....................................................................................................................................... 232
DBEVAL()................................................................................................................................... 232
AEVAL()..................................................................................................................................... 234
Manipulao de strings........................................................................................................................ 235
ALLTRIM().................................................................................................................................. 235
ASC() ........................................................................................................................................ 235
AT() .......................................................................................................................................... 236
BITON()..................................................................................................................................... 237
CAPITAL() .................................................................................................................................. 237
CHR()........................................................................................................................................ 237
DESCEND() ................................................................................................................................ 238
GETDTOVAL()............................................................................................................................. 238
ISALPHA().................................................................................................................................. 239
ISDIGIT() .................................................................................................................................. 239
ISLOWER() ................................................................................................................................ 240
ISUPPER().................................................................................................................................. 240
LEN() ........................................................................................................................................ 240
LOWER().................................................................................................................................... 241
LTRIM() ..................................................................................................................................... 241
MATHC().................................................................................................................................... 242
OEMTOANSI() ............................................................................................................................ 242
PADL() / PADR() / PADC()............................................................................................................ 243
RAT() ........................................................................................................................................ 243
REPLICATE() .............................................................................................................................. 244
-4-
ADVPL Intermedirio
RTRIM()..................................................................................................................................... 244
SPACE()..................................................................................................................................... 245
STRTOKARR()............................................................................................................................. 245
STRTRAN()................................................................................................................................. 246
STUFF() ..................................................................................................................................... 246
SUBSTR() .................................................................................................................................. 247
TRANSFORM() ............................................................................................................................ 247
UPPER()..................................................................................................................................... 248
Manipulao de data / hora................................................................................................................. 249
CDOW()..................................................................................................................................... 249
CMONTH() ................................................................................................................................. 249
DATE() ...................................................................................................................................... 250
DAY() ........................................................................................................................................ 250
DOW()....................................................................................................................................... 251
DTOC()...................................................................................................................................... 251
DTOS()...................................................................................................................................... 252
ELAPTIME() ................................................................................................................................ 252
MONTH() ................................................................................................................................... 253
SECONDS() ................................................................................................................................ 253
TIME()....................................................................................................................................... 254
YEAR() ...................................................................................................................................... 254
Manipulao de variveis numricas ................................................................................................... 255
ABS() ........................................................................................................................................ 255
ALEATORIO() ............................................................................................................................. 255
INT()......................................................................................................................................... 256
NOROUND() ............................................................................................................................... 256
RANDOMIZE() ............................................................................................................................ 257
ROUND() ................................................................................................................................... 257
Manipulao de arquivos ..................................................................................................................... 258
ADIR()....................................................................................................................................... 258
CGETFILE() ................................................................................................................................ 259
CPYS2T() ................................................................................................................................... 265
CPYT2S() ................................................................................................................................... 265
CURDIR()................................................................................................................................... 266
DIRECTORY() ............................................................................................................................. 267
DIRREMOVE()............................................................................................................................. 268
DISKSPACE() ............................................................................................................................. 269
EXISTDIR() ................................................................................................................................ 270
FCLOSE()................................................................................................................................... 270
FCREATE() ................................................................................................................................. 271
FERASE() ................................................................................................................................... 272
FILE()........................................................................................................................................ 272
FILENOEXT() .............................................................................................................................. 273
FOPEN() .................................................................................................................................... 274
FREAD() .................................................................................................................................... 276
FREADSTR () .............................................................................................................................. 276
FRENAME() ................................................................................................................................ 277
FSEEK()..................................................................................................................................... 278
FT_FEOF() ................................................................................................................................. 278
FT_FGOTO()............................................................................................................................... 279
FT_FGOTOP() ............................................................................................................................. 279
FT_FLASTREC() .......................................................................................................................... 279
FT_FREADLN()............................................................................................................................ 280
FT_FRECNO() ............................................................................................................................. 281
FT_FSKIP() ................................................................................................................................ 281
FT_FUSE() ................................................................................................................................. 281
FWRITE() ................................................................................................................................... 282
MSCOPYFILE() ............................................................................................................................ 284
MSCOPYTO() .............................................................................................................................. 285
MSCREATE() .............................................................................................................................. 285
MSERASE() ................................................................................................................................ 286
MSRENAME().............................................................................................................................. 287
RETFILENAME() .......................................................................................................................... 287
Manipulao de arquivos e ndices temporrios .................................................................................. 288
CRIATRAB() ............................................................................................................................... 288
Manipulao de bases de dados........................................................................................................... 289
ALIAS() ..................................................................................................................................... 289
-5-
ADVPL Intermedirio
BOF() / EOF()............................................................................................................................. 289
COPY() ...................................................................................................................................... 290
COPY STRUCTURE() .................................................................................................................... 293
DBAPPEND() .............................................................................................................................. 293
DBCLEARALLFILTER() .................................................................................................................. 294
DBCLEARFILTER() ....................................................................................................................... 295
DBCLEARINDEX()........................................................................................................................ 295
DBCLOSEALL() ........................................................................................................................... 296
DBCLOSEAREA() ......................................................................................................................... 296
DBCOMMIT() .............................................................................................................................. 297
DBCOMMITALL() ......................................................................................................................... 297
DBCREATE()............................................................................................................................... 298
DBCREATEINDEX()...................................................................................................................... 299
DBDELETE() ............................................................................................................................... 300
DBF() ........................................................................................................................................ 301
DBFIELDINFO() .......................................................................................................................... 301
DBFILTER() ................................................................................................................................ 302
DBGOTO() ................................................................................................................................. 303
DBGOTOP()................................................................................................................................ 303
DBGOBOTTON().......................................................................................................................... 304
DBINFO()................................................................................................................................... 304
DBNICKINDEXKEY() .................................................................................................................... 305
DBORDERINFO()......................................................................................................................... 306
DBORDERNICKNAME()................................................................................................................. 307
DBPACK() .................................................................................................................................. 307
DBRECALL() ............................................................................................................................... 308
DBRECORDINFO()....................................................................................................................... 308
DBREINDEX() ............................................................................................................................. 309
DBRLOCK() ................................................................................................................................ 310
DBRLOCKLIST().......................................................................................................................... 310
DBRUNLOCK() ............................................................................................................................ 311
DBSETDRIVER() ......................................................................................................................... 311
DBSETINDEX() ........................................................................................................................... 312
DBSETNICKNAME() ..................................................................................................................... 313
DBSELECTAREA()........................................................................................................................ 313
DBSETORDER() .......................................................................................................................... 314
DBSEEK() E MSSEEK()................................................................................................................. 315
DBSKIP() ................................................................................................................................... 316
DBSETFILTER()........................................................................................................................... 317
DBSTRUCT() .............................................................................................................................. 318
DBUNLOCK() .............................................................................................................................. 318
DBUNLOCKALL() ......................................................................................................................... 319
DBUSEAREA() ............................................................................................................................ 319
DELETED() ................................................................................................................................. 320
FCOUNT() .................................................................................................................................. 320
FOUND().................................................................................................................................... 321
INDEXKEY() ............................................................................................................................... 321
INDEXORD() .............................................................................................................................. 322
LUPDATE() ................................................................................................................................. 322
MSAPPEND() .............................................................................................................................. 323
MSUNLOCK().............................................................................................................................. 323
ORDBAGEXT() ............................................................................................................................ 324
ORDKEY() .................................................................................................................................. 324
RECLOCK() ................................................................................................................................ 325
RECNO().................................................................................................................................... 326
SELECT() ................................................................................................................................... 326
SET FILTER TO ........................................................................................................................... 327
SOFTLOCK()............................................................................................................................... 328
USED() ...................................................................................................................................... 329
ZAP........................................................................................................................................... 329
Controle de numerao seqencial ...................................................................................................... 330
GETSXENUM() ............................................................................................................................ 330
CONFIRMSXE() ........................................................................................................................... 330
ROLLBACKSXE() ......................................................................................................................... 330
Validao............................................................................................................................................. 331
ALLWAYSFALSE()........................................................................................................................ 331
ALLWAYSTRUE() ......................................................................................................................... 331
EXISTCHAV() ............................................................................................................................. 331
EXISTCPO() ............................................................................................................................... 332
-6-
ADVPL Intermedirio
LETTERORNUM()......................................................................................................................... 332
NAOVAZIO() .............................................................................................................................. 332
NEGATIVO() ............................................................................................................................... 332
PERTENCE() ............................................................................................................................... 333
POSITIVO() ................................................................................................................................ 333
TEXTO() .................................................................................................................................... 333
VAZIO()..................................................................................................................................... 333
Manipulao de parmetros do sistema............................................................................................... 334
GETMV() .................................................................................................................................... 334
GETNEWPAR() ............................................................................................................................ 334
PUTMV() .................................................................................................................................... 335
SUPERGETMV()........................................................................................................................... 335
Controle de impresso......................................................................................................................... 336
AVALIMP() ................................................................................................................................. 336
CABEC() .................................................................................................................................... 337
IMPCADAST() ............................................................................................................................. 340
MS_FLUSH()............................................................................................................................... 340
OURSPOOL() .............................................................................................................................. 342
RODA()...................................................................................................................................... 343
SETDEFAULT()............................................................................................................................ 345
SETPRC() ................................................................................................................................... 346
SETPRINT()................................................................................................................................ 346
Controle de processamentos ............................................................................................................... 348
ABREEXCL() ............................................................................................................................... 348
CLOSEOPEN()............................................................................................................................. 348
CLOSESFILE() ............................................................................................................................ 348
CHKFILE().................................................................................................................................. 349
CONOUT().................................................................................................................................. 350
CRIAVAR() ................................................................................................................................. 350
DISARMTRANSACTION() .............................................................................................................. 351
EXECBLOCK() ............................................................................................................................. 352
EXISTBLOCK()............................................................................................................................ 352
ERRORBLOCK() .......................................................................................................................... 353
FINAL() ..................................................................................................................................... 355
FINDFUNCTION() ........................................................................................................................ 355
FUNDESC() ................................................................................................................................ 356
FUNNAME() ................................................................................................................................ 356
GETAREA()................................................................................................................................. 356
GETCOUNTRYLIST() .................................................................................................................... 357
ISINCALLSTACK() ....................................................................................................................... 357
REGTOMEMORY()........................................................................................................................ 358
RESTAREA() ............................................................................................................................... 359
USEREXCEPTION() ...................................................................................................................... 359
Utilizao de recursos do ambiente ERP .............................................................................................. 361
AJUSTASX1() ............................................................................................................................. 361
ALLUSERS() ............................................................................................................................... 363
ALLGROUPS() ............................................................................................................................. 365
CGC()........................................................................................................................................ 366
CONPAD1() ................................................................................................................................ 366
DATAVALIDA()............................................................................................................................ 367
EXISTINI() ................................................................................................................................. 367
EXTENSO() ................................................................................................................................ 368
FORMULA() ................................................................................................................................ 368
GETADVFVAL() ........................................................................................................................... 368
HELP()....................................................................................................................................... 369
MESEXTENSO() .......................................................................................................................... 370
OBRIGATORIO() ......................................................................................................................... 370
OPENFILE() ................................................................................................................................ 373
PERGUNTE()............................................................................................................................... 374
PESQPICT()................................................................................................................................ 374
PESQPICTQT() ............................................................................................................................ 375
POSICIONE().............................................................................................................................. 375
PUTSX1()................................................................................................................................... 376
RETINDEX() ............................................................................................................................... 377
SIXDESCRICAO() ........................................................................................................................ 377
TABELA() ................................................................................................................................... 378
TAMSX3() .................................................................................................................................. 378
TM().......................................................................................................................................... 379
-7-
ADVPL Intermedirio
X1DEF01() ................................................................................................................................. 380
X1PERGUNT()............................................................................................................................. 381
X2NOME().................................................................................................................................. 381
X3CBOX() .................................................................................................................................. 382
X3DESCRIC() ............................................................................................................................. 382
X3PICTURE() .............................................................................................................................. 383
X3TITULO()................................................................................................................................ 384
X3USO() .................................................................................................................................... 384
X5DESCRI() ............................................................................................................................... 385
X6CONTEUD() ............................................................................................................................ 386
X6DESCRIC() ............................................................................................................................. 387
XADESCRIC() ............................................................................................................................. 388
XBDESCRI() ............................................................................................................................... 388
XFILIAL() ................................................................................................................................... 389
Componentes da interface visual......................................................................................................... 390
MSDIALOG() .............................................................................................................................. 390
MSGET() .................................................................................................................................... 391
SAY() ........................................................................................................................................ 392
BUTTON() .................................................................................................................................. 392
SBUTTON() ................................................................................................................................ 393
CHECKBOX() .............................................................................................................................. 394
COMBOBOX() ............................................................................................................................. 395
FOLDER()................................................................................................................................... 396
RADIO() .................................................................................................................................... 397
Interfaces de cadastro ........................................................................................................................ 398
AXCADASTRO() .......................................................................................................................... 398
MBROWSE() ............................................................................................................................... 398
AXPESQUI() ............................................................................................................................... 398
AXVISUAL() ............................................................................................................................... 399
AXINCLUI() ................................................................................................................................ 399
AXALTERA() ............................................................................................................................... 400
AXDELETA() ............................................................................................................................... 401
Interfaces visuais para aplicaes....................................................................................................... 402
ALERT() ..................................................................................................................................... 402
AVISO()..................................................................................................................................... 402
FORMBACTH() ............................................................................................................................ 403
MSGFUNCTIONS()....................................................................................................................... 404
Recursos das interfaces visuais........................................................................................................... 405
GDFIELDGET()............................................................................................................................ 405
GDFIELDPOS() ........................................................................................................................... 405
GDFIELDPUT()............................................................................................................................ 405
GETMARK() ................................................................................................................................ 406
MARKBREFRESH()....................................................................................................................... 407
READVAR() ................................................................................................................................ 407
-8-
ADVPL Intermedirio
OBJETIVOS DO CURSO
Objetivos especficos do curso:
-9-
ADVPL Intermedirio
MDULO 04: Desenvolvendo aplicaes em ADVPL
1. 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.
Podem-se criar rotinas para a customizao do sistema ERP Microsiga Protheus, desde
processos adicionais at mesmo relatrios. A grande vantagem aproveitar todo o ambiente
montado pelos mdulos do ERP Microsiga Protheus. Porm, com o ADVPL possvel at
mesmo criar toda uma aplicao, ou mdulo, do comeo.
- 10 -
ADVPL Intermedirio
Programao Sem Interface Prpria com o Usurio
As rotinas criadas sem interface so consideradas nesta categoria porque geralmente tm uma
utilizao mais especfica do que um processo adicional ou um relatrio novo. Tais rotinas no
tm interface com o usurio atravs do Protheus Remote, e qualquer tentativa nesse sentido
(como a criao de uma janela padro) ocasionar uma exceo em tempo de execuo. Estas
rotinas so apenas processos, ou Jobs, executados no Protheus Server. Algumas vezes, a
interface destas rotinas fica a cargo de aplicaes externas, desenvolvidas em outras
linguagens, que so responsveis por iniciar os processos no servidor Protheus atravs dos
meios disponveis de integrao e conectividade no Protheus.
Rotinas escritas em ADVPL podem ser iniciadas como processos individuais (sem interface) no
Protheus Server atravs de duas maneiras: Iniciadas por outra rotina ADVPL atravs da
chamada de funes como StartJob() ou CallProc() ou iniciadas automaticamente na
inicializao do Protheus Server (quando propriamente configurado).
Programao de RPC
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 Protheus 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 PROTHEUS 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.
- 11 -
ADVPL Intermedirio
2. Estrutura de um Programa ADVPL
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 as 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
- 12 -
ADVPL Intermedirio
Todas as linhas iniciadas com um sinal de asterisco so consideradas como comentrio. Pode-
se utilizar a palavra NOTE ou dois smbolos da letra "e" comercial (&&) para realizar a funo
do sinal de asterisco. Porm todas estas formas de comentrio de linhas so obsoletas e
existem apenas para compatibilizao com o padro xBase. A melhor maneira de comentar
linhas em ADVPL utilizar duas barras transversais:
/*
Programa para clculo do total
Autor: Microsiga Software S.A.
Data: 2 de outubro de 2001
*/
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
adicionando-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 (;).
GravaDados(cNome,cEnd,cTel,cFax,cEmail)
Endif
Neste exemplo existe uma linha de comando para a checagem das variveis utilizadas. Como a
linha torna-se muito grande, pode-se dividi-la em mais de uma linha fsica utilizando o sinal de
- 13 -
ADVPL Intermedirio
ponto-e-vrgula. Se um sinal de ponto-e-vrgula for esquecido nas duas primeiras linhas,
durante a execuo do programa ocorrer um erro, pois a segunda linha fsica ser
considerada como uma segunda linha de comando na compilao. E durante a execuo esta
linha no ter sentido.
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:
#include protheus.ch
/*
+===========================================+
| 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
// Termina o programa
Return
rea de Identificao
Declarao dos includes
Declarao da funo
Identificao do programa
Corpo do Programa
Preparao para o processamento
Processamento
rea de Encerramento
- 14 -
ADVPL Intermedirio
rea de Identificao
O formato para esta rea no definido. Pode-se colocar qualquer tipo de informao
desejada e escolher a formatao apropriada.
#include protheus.ch
/*
+==========================================+
| Programa: Clculo do Fatorial |
| Autor : Microsiga Software S.A. |
| Data : 02 de outubro de 2001 |
+==========================================+
*/
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
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
- 15 -
ADVPL Intermedirio
A preparao para o processamento formada pelo conjunto de validaes e processamentos
necessrios antes da realizao do processamento em si.
// Clculo do fatorial
nFator := GetFator()
// GetFator funo ilustrativa na qual a varivel recebe a informao do
usurio.
If nFator <= 0
Alert(Informao invlida)
Return
Endif
rea de Encerramento
// Termina o programa
Return
- 16 -
ADVPL Intermedirio
3. Declarao e Atribuio de Variveis
O ADVPL no uma linguagem de tipos rgidos (strongly typed), o que significa que variveis
de memria podem receber diferentes tipos de dados durante a execuo do programa.
As variveis podem tambm conter objetos, mas os tipos primrios da linguagem so:
Numrico
O ADVPL no diferencia valores inteiros de valores com ponto flutuante, portanto podem-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).
Caractere
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 caractere 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.
- 17 -
ADVPL Intermedirio
Array
Arrays 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.
A partir do momento que uma varivel criada, no necessrio mais se referenciar ao seu
contedo, e sim ao seu nome.
Portanto se forem criadas duas variveis cujos 10 primeiros caracteres forem iguais, como
nTotalGeralAnual e nTotalGeralMensal, as referncias a qualquer uma delas no programa
resultaro o mesmo, ou seja, sero a mesma varivel:
nTotalGeralMensal := 100
nTotalGeralAnual := 300
Alert("Valor mensal: " + cValToChar(nTotalGeralMensal))
Quando o contedo da varivel nTotalGeralMensal exibido, o seu valor ser de 300. Isso
acontece porque no momento que esse valor foi atribudo varivel nTotalGeralAnual, o
ADVPL considerou apenas os 10 primeiros caracteres (assim como o faz quando deve exibir o
valor da varivel nTotalGeralMensal), ou seja, considerou-as como a mesma varivel. Assim o
valor original de 100 foi substitudo pelo de 300.
- 18 -
ADVPL Intermedirio
3.3. Escopo de variveis
Local nNumero := 10
Esta linha de cdigo declara uma varivel chamada nNumero indicando que pertence seu
escopo local.
Local
Static
Private
Public
nNumero2 := 15
Devido a essa caracterstica, quando se pretende 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.
- 19 -
ADVPL Intermedirio
Variveis de escopo local
Variveis de escopo local so pertencentes apenas ao escopo da funo onde foram declaradas
e 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.)
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 de escopo local 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.
Variveis de escopo static funcionam basicamente como as variveis de escopo local, mas
mantm seu valor atravs da execuo e devem ser declaradas explicitamente no cdigo com
o identificador STATIC.
O escopo das variveis static 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 afeta a todas as funes declaradas
no fonte. Neste exemplo, a varivel nVar declarada como static e inicializada com o valor 10:
Function Pai()
Static nVar := 10
.
<comandos>
.
Filha()
.
<mais comandos>
.
Return(.T.)
- 20 -
ADVPL Intermedirio
Quando a funo Filha executada, nVar ainda existe mas no pode ser acessada. Diferente
de variveis declaradas como LOCAL ou PRIVATE, nVar continua a existir e mantm seu valor
atual quando a execuo da funo Pai termina. Entretanto, somente pode ser acessada por
execues subseqentes da funo Pai.
A declarao opcional para variveis privadas. Mas podem ser declaradas explicitamente com
o identificador PRIVATE.
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 com escopo private e inicializada com o valor 10.
Quando a funo Filha executada, nVar ainda existe e, diferente de uma varivel de escopo
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.
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
- 21 -
ADVPL Intermedirio
Variveis de escopo public
possvel criar uma varivel de escopo private com o mesmo nome de uma varivel de escopo
public existente, entretanto, no permitido criar uma varivel de escopo public com o mesmo
nome de uma varivel de escopo private existente.
Uma vez criada, uma varivel de escopo public visvel em todo o programa onde foi
declarada at que seja escondida por uma varivel de escopo private criada com o mesmo
nome. A nova varivel de escopo private criada esconde a varivel de escopo public existente,
e esta se tornar inacessvel at que a nova varivel private seja destruda. Por exemplo:
Function Pai()
Public nVar := 10
<comandos>
.
Filha()
<mais comandos>
.
Return(.T.)
Neste exemplo, nVar criada como public e inicializada com o valor 10. Quando a funo Filha
executada, nVar ainda existe e pode ser acessada. Diferente de variveis locais ou privates,
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).
No ambiente ERP Protheus, existe uma conveno adicional a qual deve ser
respeitada que variveis em uso pela aplicao no sejam incorretamente
manipuladas. Por esta conveno deve ser adicionado o caracter _ antes
do nome de variveis PRIVATE e PUBLIC. Maiores informaes avaliar o
tpico: Boas Prticas de Programao.
- 22 -
ADVPL Intermedirio
3.4. Entendendo a influncia do escopo das variveis
Se esta linha for executada em um programa ADVPL, ocorrer um erro de execuo com a
mensagem "variable does not exist: nPercentual", pois esta varivel est sendo utilizada em
uma expresso de clculo sem ter sido declarada. Para solucionar este erro, deve-se declarar a
varivel previamente:
ou
aconselhvel optar pelo operador de atribuio composto de dois pontos e sinal de igual, pois
o operador de atribuio utilizando somente o sinal de igual pode ser facilmente confundido
com o operador relacional (para comparao) durante a criao do programa.
- 23 -
ADVPL Intermedirio
4. Regras adicionais da linguagem ADVPL
- 24 -
ADVPL Intermedirio
4.2. Pictures de formatao disponveis
Funes
Contedo Funcionalidade
A Permite apenas caracteres alfabticos.
C Exibe CR depois de nmeros positivos.
E Exibe numrico com o ponto e vrgula invertidos (formato Europeu).
R Insere caracteres diferentes dos caracteres de template na exibio, mas no os
insere na varivel do GET.
S<n> Permite rolamento horizontal do texto dentro do GET, <n> um nmero inteiro
que identifica o tamanho da regio.
X Exibe DB depois de nmeros negativos.
Z Exibe zeros como brancos.
( Exibe nmeros negativos entre parnteses com os espaos em branco iniciais.
) Exibe nmeros negativos entre parnteses sem os espaos em branco iniciais.
! Converte caracteres alfabticos para maisculo.
Templates
Contedo Funcionalidade
X Permite qualquer caractere.
9 Permite apenas dgitos para qualquer tipo de dado, incluindo o sinal para
numricos.
# Permite dgitos, sinais e espaos em branco para qualquer tipo de dado.
! Converte caracteres alfabticos para maisculo.
* Exibe um asterisco no lugar dos espaos em branco iniciais em nmeros.
. Exibe o ponto decimal.
, Exibe a posio do milhar.
A1_NOME Caracter - 40
Picture: @!
- 25 -
ADVPL Intermedirio
5. Programas de Atualizao
- 26 -
ADVPL Intermedirio
5.1. Modelo1() ou AxCadastro()
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros:
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | XCADSA2 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao da funo AXCADASTRO() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
dbSelectArea(cAlias)
dbSetOrder(1)
AxCadastro(cAlias,cTitulo,cVldExc,cVldAlt)
Return Nil
- 27 -
ADVPL Intermedirio
Exemplo: Funo de validao da alterao
/*/
+------------------------------------------------------------------------------
| Funo | VLDALT | Autor | ARNALDO RAYMUNDO JR. | Data | |
+------------------------------------------------------------------------------
| Descrio | Funo de validao de alterao para a AXCADASTRO() |
+------------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------------
/*/
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(Aterao concluda com sucesso!)
Endif
RestArea(aArea)
Return lRet
/*/
+------------------------------------------------------------------------------
| Funo | VLDEXC | Autor | ARNALDO RAYMUNDO JR. | Data | |
+------------------------------------------------------------------------------
| Descrio | Funo de validao de excluso para a AXCADASTRO() |
+------------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------------
/*/
nOpcao := AxExclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo(Excluso concluda com sucesso!)
Endif
RestArea(aArea)
Return lRet
- 28 -
ADVPL Intermedirio
5.2. Modelo2()
O nome Modelo 2 foi conceituado pela Microsiga por se tratar de um prottipo de tela para
entrada de dados. Inicialmente vamos desmistificar dois pontos:
Prottipo Modelo 2 Trata-se de uma tela, como a figura abaixo, onde seu
objetivo efetuar a manuteno em vrios registros de uma s vez. Por
exemplo: efetuar o movimento interno de vrios produtos do estoque em um
nico lote.
Objeto MsDialog()
Deve ser utilizada como janela padro para entrada de dados, um tipo de objeto modal, ou
seja, no permite que outra janela ativa receba dados enquanto esta estiver ativa.
- 29 -
ADVPL Intermedirio
Toda vez que utilizar este comando o ADVPL exige que seja declarado a diretiva Include no
cabealho do programa o arquivo Protheus.ch, isto porque o compilador precisar porque
este comando trata-se de um pseudo cdigo e sua traduo ser feita na compilao. Vale
lembrar tambm que este s ser acionado depois que instanciado e ativado por outro
comando.
DEFINE MSDIALOG oDlg TITLE "Prottipo Modelo 2" FROM 0,0 TO 280,552 OF;
oMainWnd PIXEL
Funo EnchoiceBar()
Funo que cria uma barra de botes padro de Ok e Cancelar, permitindo a implementao
de botes adicionais.
Parmetros:
- 30 -
ADVPL Intermedirio
Figura: Prottipo Modelo2 Enchoice
Objeto TPanel()
Repare que para facilitar o desenvolvimento foi utilizado o objeto TPanel para ajudar o
alinhamento dos objetos TSay e TGet, ou seja, a utilizao deste recurso permite que o
programador no se preocupe com coordenadas complexas para deixar a unio dos objetos
simtricos.
Utilize o objeto TPanel quando desejar criar um painel esttico, onde podem ser criados outros
controles com o objetivo de organizar ou agrupar componentes visuais.
Parmetros:
- 31 -
ADVPL Intermedirio
Comando SAY - Objeto: TSay()
O comando SAY ou objeto TSay exibe o contedo de texto esttico sobre uma janela.
Sintaxe SAY:
Parmetros:
- 32 -
ADVPL Intermedirio
Comando MSGET - Objeto: TGet()
O comando MsGet ou o objeto TGet utilizado para criar um controle que armazene ou altere
o contedo de uma varivel atravs de digitao. O contedo da varivel s modificado
quando o controle perde o foco de edio para outro controle.
Sintaxe MSGET:
Parmetros:
- 33 -
ADVPL Intermedirio
lPar19 Reservado.
abChange Bloco de cdigo, opcional. Executado quando o controle
modifica o valor da varivel associada.
alReadOnly Lgico, opcional. Se .T. o controle no poder ser editado.
alPassword Lgico, opcional. Se .T. o controle exibir asteriscos * no
lugar dos caracteres exibidos pelo controle para simular
entrada de senha.
cPar23 Reservado.
acReadVar Caractere, opcional. Nome da varivel que o controle dever
manipular, dever ser a mesma varivel informada no
parmetro abSetGet, e ser o retorno da funo ReadVar( ).
cPar25 Reservado.
lPar26 Reservado.
nPar27 Reservado.
lPar18 Reservado.
Objeto MsGetDados()
Objeto tipo lista com uma ou mais colunas para cadastramento de dados baseado em um
vetor. Sua utilizao exige que seja utilizado trs variveis com seu escopo Private, so elas:
aRotina, aHeader e aCOLS.
Observaes importantes:
- 34 -
ADVPL Intermedirio
Sintaxe: MSGETDADOS():NEW( nSuperior, nEsquerda, nInferior, nDireita,
nOpc, [ cLinhaOk ], [ cTudoOk ], [ cIniCpos ], [ lApagar ], [ aAlter], ,
[ uPar1 ], [ lVazio ], [ nMax], [ cCampoOk ], [ cSuperApagar ],
[ uPar2 ], [ cApagaOk ], [ oWnd ] )
Parmetros:
Array com as rotinas que sero executadas na MBrowse e que definir o tipo de operao que
est sendo executada, por exemplo: Pesquisar, Visualizar, Incluir, Alterar, Excluir e outros.
Elemento Contedo
1 Ttulo da opo.
2 Nome da rotina (Function).
3 Reservado.
4 Operao (1-Pesquisar;2-Visualizar;3-Incluir;4-Alterar;5-Excluso).
Acesso relacionado a rotina, se est opo no for informada nenhum
5
acesso ser validado.
- 35 -
ADVPL Intermedirio
Varivel Private aHeader
Array com informaes das colunas, ou seja, com as caractersticas dos campos que esto
contidas no dicionrio de dados (SX3), este vetor precisa estar no formato abaixo:
Elemento Contedo
1 Ttulo do campo
2 Nome do campo
3 Mscara do campo
4 Tamanho do campo
5 Decimal do campo
6 Validao de usurio do campo
7 Uso do campo
8 Tipo do campo (caractere, numrico, data e etc.)
9 Prefixo da tabela
10 Contexto do campo (real ou virtual)
Vetor com as linhas a serem editadas. As colunas devem ser construdas com base no vetor
aHeader e mais uma ltima coluna com o valor lgico que determina se a linha foi excluda,
inicialmente esta dever ter o seu contedo igual a falso (.F.).
- 36 -
ADVPL Intermedirio
5.2.2. Estrutura de um programa utilizando a Modelo2()
Estrutura do programa
Linhas Programa
1 Funo principal;
2 Declarao e atribuio de variveis;
3 Acesso a tabela principal e sua ordem;
4 Chamada da funo MBrowse;
5 Fim da funo principal.
6
7 Funo de visualizao, alterao e excluso;
8 Declarao e atribuio de variveis;
9 Acesso ao primeiro registro da chave em que est posicionado na MBrowse;
10 Montagem das variveis estticas em tela;
11 Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS de todos os registros referente a chave principal em que est
12
posicionado na MBrowse;
13 Instncia da MsDialog;
14 Instncia dos objetos TSay e TGet;
15 Instncia do objeto MsGetDados;
16 Ativar o objeto principal que o objeto da janela;
17 Se for operao diferente de visualizao e clicou no boto OK;
18 A operao e de Alterao?
19 Chamar a funo para alterar os dados;
20 Caso contrrio
21 Chamar a funo para excluir os dados;
22 Fim da funo de visualizao, alterao e excluso.
23
24 Funo de incluso;
25 Declarao e atribuio de variveis;
26 Montagem das variveis estticas em tela;
27 Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS com o seu contedo conforme o inicializador padro do campo ou
28
vazio, pois trata-se de uma incluso;
29 Instncia da MsDialog;
30 Instncia dos objetos TSay e TGet;
31 Instncia do objeto MsGetDados;
32 Ativar o objeto principal que o objeto da janela;
33 Se clicou no boto OK;
34 Chamar a funo para incluir os dados;
35 Fim da funo de incluso.
- 37 -
ADVPL Intermedirio
Rotina principal
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | xModelo2 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo do prottipo Modelo2. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
User Function xModelo2()
Private cCadastro := "Prottipo Modelo 2"
Private aRotina := {}
dbSelectArea("ZA3")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA3")
Return
Rotina de incluso
//+--------------------------------------------------------------------+
//| Rotina | Mod2Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Private aHeader := {}
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
- 38 -
ADVPL Intermedirio
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
oTPanel1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel1:Align := CONTROL_ALIGN_TOP
oTPanel2 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel2:Align := CONTROL_ALIGN_BOTTOM
oGet := MSGetDados():New(0,0,0,0,nOpc,"U_Mod2LOk()",;
".T.","+ZA3_ITEM",.T.)
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Local oDlg
Local oGet
Local oTPanel1
Local oTPAnel2
Private aHeader := {}
- 39 -
ADVPL Intermedirio
Private aCOLS := {}
Private aREG := {}
dbSelectArea( cAlias )
dbGoTo( nReg )
cCodigo := ZA3->ZA3_CODIGO
cNome := ZA3->ZA3_NOME
cData := ZA3->ZA3_DATA
Mod2aHeader( cAlias )
Mod2aCOLS( cAlias, nReg, nOpc )
oTPane1 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPane1:Align := CONTROL_ALIGN_TOP
oTPanel2 := TPanel():New(0,0,"",oDlg,NIL,.T.,;
.F.,NIL,NIL,0,16,.T.,.F.)
oTPanel2:Align := CONTROL_ALIGN_BOTTOM
If nOpc == 4
oGet := MSGetDados():New(0,0,0,0,nOpc,"U_Mod2LOk()",;
".T.","+ZA3_ITEM",.T.)
Else
oGet := MSGetDados():New(0,0,0,0,nOpc)
Endif
oGet:oBrowse:Align := CONTROL_ALIGN_ALLCLIENT
- 40 -
ADVPL Intermedirio
Montagem do array aHeader
//+--------------------------------------------------------------------+
//| Rotina | Mod2aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek( cAlias )
While !EOF() .And. X3_ARQUIVO == cAlias
If X3Uso(X3_USADO) .And. cNivel >= X3_NIVEL
AADD( aHeader, { Trim( X3Titulo() ),;
X3_CAMPO,;
X3_PICTURE,;
X3_TAMANHO,;
X3_DECIMAL,;
X3_VALID,;
X3_USADO,;
X3_TIPO,;
X3_ARQUIVO,;
X3_CONTEXT})
Endif
dbSkip()
End
RestArea(aArea)
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod2aCOLS( cAlias, nReg, nOpc )
Local aArea := GetArea()
Local cChave := ZA3->ZA3_CODIGO
Local nI := 0
If nOpc <> 3
dbSelectArea( cAlias )
dbSetOrder(1)
dbSeek( xFilial( cAlias ) + cChave )
While !EOF() .And. ;
ZA3->( ZA3_FILIAL + ZA3_CODIGO ) == xFilial( cAlias ) + cChave
AADD( aREG, ZA3->( RecNo() ) )
- 41 -
ADVPL Intermedirio
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
If aHeader[nI,10] == "V"
aCOLS[Len(aCOLS),nI] := CriaVar(aHeader[nI,2],.T.)
Else
aCOLS[Len(aCOLS),nI] :=
FieldGet(FieldPos(aHeader[nI,2]))
Endif
Next nI
aCOLS[Len(aCOLS),Len(aHeader)+1] := .F.
dbSkip()
End
Else
AADD( aCOLS, Array( Len( aHeader ) + 1 ) )
For nI := 1 To Len( aHeader )
aCOLS[1, nI] := CriaVar( aHeader[nI, 2], .T. )
Next nI
aCOLS[1, GdFieldPos("ZA3_ITEM")] := "01"
aCOLS[1, Len( aHeader )+1 ] := .F.
Endif
Restarea( aArea )
Return
Efetivao da incluso
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvI | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na incluso. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod2GrvI()
Local aArea := GetArea()
Local nI := 0
Local nX := 0
dbSelectArea("ZA3")
dbSetOrder(1)
For nI := 1 To Len( aCOLS )
If ! aCOLS[nI,Len(aHeader)+1]
RecLock("ZA3",.T.)
ZA3->ZA3_FILIAL := xFilial("ZA3")
ZA3->ZA3_CODIGO := cCodigo
ZA3->ZA3_DATA := dData
For nX := 1 To Len( aHeader )
FieldPut( FieldPos( aHeader[nX, 2] ), aCOLS[nI, nX] )
Next nX
MsUnLock()
Endif
Next nI
RestArea(aArea)
Return
- 42 -
ADVPL Intermedirio
Efetivao da alterao
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvA | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para gravar os dados na alterao. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod2GrvA()
Local aArea := GetArea()
Local nI := 0
Local nX := 0
dbSelectArea("ZA3")
For nI := 1 To Len( aREG )
If nI <= Len( aREG )
dbGoTo( aREG[nI] )
RecLock("ZA3",.F.)
If aCOLS[nI, Len(aHeader)+1]
dbDelete()
Endif
Else
RecLock("ZA3",.T.)
Endif
If !aCOLS[nI, Len(aHeader)+1]
ZA3->ZA3_FILIAL := xFilial("ZA3")
ZA3->ZA3_CODIGO := cCodigo
ZA3->ZA3_DATA := dData
For nX := 1 To Len( aHeader )
FieldPut( FieldPos( aHeader[nX, 2] ), aCOLS[nI, nX] )
Next nX
Endif
MsUnLock()
Next nI
RestArea( aArea )
Return
- 43 -
ADVPL Intermedirio
Efetivao da excluso
//+--------------------------------------------------------------------+
//| Rotina | Mod2GrvE | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para excluir os registros. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod2GrvE()
Local nI := 0
dbSelectArea("ZA3")
For nI := 1 To Len( aCOLS )
dbGoTo(aREG[nI])
RecLock("ZA3",.F.)
dbDelete()
MsUnLock()
Next nI
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod2Vend | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar o cdigo do vendedor. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod2Vend( cCodigo, cNome )
If ExistCpo("SA3",cCodigo) .And. ExistChav("ZA3",cCodigo)
cNome := Posicione("SA3",1,xFilial("SA3")+cCodigo,"A3_NOME")
Endif
Return(!Empty(cNome))
//+--------------------------------------------------------------------+
//| Rotina | Mod2LOk | Autor | Robson Luiz (rleg) | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar a linha de dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
User Function Mod2LOk()
Local lRet := .T.
Local cMensagem := "No ser permitido linhas sem o centro de custo."
If !aCOLS[n, Len(aHeader)+1]
If Empty(aCOLS[n,GdFieldPos("ZA3_CCUSTO")])
MsgAlert(cMensagem,cCadastro)
lRet := .F.
Endif
Endif
Return( lRet )
- 44 -
ADVPL Intermedirio
Funo auxiliar: Validao do cdigo do centro de custo para todas as linhas
//+--------------------------------------------------------------------+
//| Rotina | Mod2TOk | Autor | Robson Luiz (rleg) | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar toda as linhas de dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
A funo Modelo2() uma interface pr-definida pela Microsiga que implementa de forma
padronizada os compontes necessrios a manipulao de estruturas de dados nas quais o
cabealho e os itens da informao compartilham o mesmo registro fsico.
Seu objetivo atuar como um facilitador de codificao, permitindo a utilizao dos recursos
bsicos dos seguintes componentes visuais:
MsDialog()
TGet()
TSay()
MsNewGetDados()
EnchoiceBar()
Da mesma forma, o Browse deve ser tratado por esta rotina, sendo
comum a Modelo2() estar vinculada ao uso de uma MBrowse().
- 45 -
ADVPL Intermedirio
Sintaxe: Modelo2([cTitulo], [aCab], [aRoda], [aGrid], [nOpc], [cLinhaOk],
[cTudoOk])
Parmetros:
Retorno:
- 46 -
ADVPL Intermedirio
Exemplo: Utilizao da Modelo2() para visualizao do Cadastro de Tabelas (SX5)
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRW2SX5| Autor | ARNALDO RAYMUNDO JR. | Data |01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | UTILIZACAO DA MODELO2() PARA VISUALIZAO DO SX5. |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
//Local nUsado := 0
Local cTitulo := "Inclusao de itens - Arquivo de Tabelas"
Local aCab := {} // Array com descricao dos campos do Cabecalho do Modelo
2
Local aRoda := {} // Array com descricao dos campos do Rodape do Modelo 2
Local aGrid := {80,005,050,300} //Array com coordenadas da GetDados no
modelo2 - Padrao: {44,5,118,315}
// Linha Inicial - Coluna Inicial - +Qts Linhas - +Qts
Colunas : {080,005,050,300}
Local cLinhaOk := "AllwaysTrue()" // Validacoes na linha da GetDados da
Modelo 2
Local cTudoOk := "AllwaysTrue()" // Validacao geral da GetDados da Modelo 2
Local lRetMod2 := .F. // Retorno da funo Modelo2 - .T. Confirmou / .F.
Cancelou
Local nColuna := 0
- 47 -
ADVPL Intermedirio
Exemplo (continuao):
// Montagem do aHeader
AADD(aHeader,{"Chave" ,"X5_CHAVE","@!",5,0,"AllwaysTrue()",;
"","C","","R"})
AADD(aHeader,{"Descricao" ,"X5_DESCRI","@!",40,0,"AllwaysTrue()",;
"","C","","R"})
// Montagem do aCols
aCols := Array(1,Len(aHeader)+1)
// Inicializao do aCols
For nColuna := 1 to Len(aHeader)
If aHeader[nColuna][8] == "C"
aCols[1][nColuna] := SPACE(aHeader[nColuna][4])
ElseIf aHeader[nColuna][8] == "N"
aCols[1][nColuna] := 0
ElseIf aHeader[nColuna][8] == "D"
aCols[1][nColuna] := CTOD("")
ElseIf aHeader[nColuna][8] == "L"
aCols[1][nColuna] := .F.
ElseIf aHeader[nColuna][8] == "M"
aCols[1][nColuna] := ""
Endif
Next nColuna
IF lRetMod2
//MsgInfo("Voc confirmou a operao","MBRW2SX5")
For nLinha := 1 to len(aCols)
// Campos de Cabealho
Reclock("SX5",.T.)
SX5->X5_FILIAL := cX5Filial
SX5->X5_TABELA := cX5Tabela
// Campos do aCols
//SX5->X5_CHAVE := aCols[nLinha][1]
//SX5->X5_DESCRI := aCols[nLinha][2]
For nColuna := 1 to Len(aHeader)
SX5->&(aHeader[nColuna][2]) := aCols[nLinha][nColuna]
Next nColuna
MsUnLock()
Next nLinha
ELSE
MsgAlert("Voc cancelou a operao","MBRW2SX5")
ENDIF
Return
- 48 -
ADVPL Intermedirio
5.3. Modelo3()
O nome Modelo 3, assim como a Modelo 2 foi conceituado pela Microsiga por se tratar de um
prottipo de tela para entrada de dados. Inicialmente vamos desmistifica dois pontos:
Prottipo Modelo 3 Trata-se de uma tela, como a figura abaixo, onde seu
objetivo efetuar a manuteno em vrios registros de uma s vez relacionada
a outro registro de outra tabela, ou seja, aqui teremos o relacionamento de
registros pai e filho, ento preciso se preocupar com este relacionamento.
Por exemplo: efetuar a manuteno em um pedido de vendas, onde ter um
registro em uma tabela referente cabea do pedido e outra tabela com os
registros referentes aos itens deste pedido de vendas.
Para ganharmos tempo no ser apresentado aqui toda a explicao e montagens para a
funo EnchoiceBar, comando MsDialog, Say e MsGet e para os vetores aHeader e
aCOLS, entretanto todos estes estaro na codificao do cdigo fonte. A figura abaixo mostra
exatamente o que a tela prottipo Modelo 3:
- 49 -
ADVPL Intermedirio
Este prottipo constitudo de MsDialog, EnchoiceBar, Enchoice, MsGetDados, Say e Get.
Diante dos expostos at o momento houve um novo nome para ns, ele a funo Enchoice, o
que ?
Sintaxe: Enchoice( cAlias, nReg, nOpc, aAc, cOpc, cTextExclui, aAcho, aPos,
aCpos, nNum, nColMens, cMensagem, cTudOk, oObj, lVirtual)
Parmetros:
- 50 -
ADVPL Intermedirio
Vale lembrar que ns programadores reaproveitamos muito o que j existe, isto para
simplesmente ganharmos tempo, e no caso da utilizao da funo Enchoice preciso criar as
variveis de memrias que levam o mesmo nome dos campos da tabela em questo. Por
exemplo o campo A2_NOME da tabela SA2 (cadastro de fornecedores) quando queremos
referenciar o campo usa-se o prefixo da tabela e o campo em questo, desta forma:
SA2->A2_NOME
Agora quando queremos referenciar a uma varivel que est com o contedo do mesmo
campo criamos outro recurso, desta forma:
M->A2_NOME
E para criar variveis com o nome do campo utilizamos um cdigo de bloco (code-block) e
mais um lao de leitura para atribuir valores iniciais a cada uma dela. Ento fica assim o
procedimento:
E em outro momento aproveitamos est varivel bCampo para facilitar a atribuio, veja o
exemplo abaixo :
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := Atribuio inicial ou atribuio de valor
Next nX
Ou seja, fazer para todos os campos, e a cada campo criar a varivel com a atribuio inicial
ou atribuio de valor.
- 51 -
ADVPL Intermedirio
5.3.1. Estrutura de um programa utilizando a Modelo3()
Estrutura do programa
Linhas Programa
1 Funo principal;
2 Declarao e atribuio de variveis;
3 Acesso a tabela principal e sua ordem;
4 Chamada da funo MBrowse;
5 Fim da funo principal.
6
7 Funo de visualizao, alterao e excluso;
8 Declarao e atribuio de variveis;
9 Acesso ao primeiro registro da chave em que est posicionado na MBrowse;
10 Construo das variveis de memria M->???;
11 Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS de todos os registros referente a chave principal em que est
12
posicionado na MBrowse;
13 Instncia da MsDialog;
14 Execuo da funo Enchoice;
15 Instncia do objeto MsGetDados;
16 Ativar o objeto principal que o objeto da janela;
17 Se for operao diferente de visualizao e clicou no boto OK;
18 A operao e de Alterao?
19 Chamar a funo para alterar os dados;
20 Caso contrrio
21 Chamar a funo para excluir os dados;
22 Fim da funo de visualizao, alterao e excluso.
23
24 Funo de incluso;
25 Declarao e atribuio de variveis;
26 Construo das variveis de memria M->???;
27 Montagem do vetor aHeader por meio do dicionrio de dados;
Montagem do vetor aCOLS com o seu contedo conforme o inicializador padro do campo ou
28
vazio, pois trata-se de uma incluso;
29 Instncia da MsDialog;
30 Instncia dos objetos TSay e TGet;
31 Instncia do objeto MsGetDados;
32 Ativar o objeto principal que o objeto da janela;
33 Se clicou no boto OK;
34 Chamar a funo para incluir os dados;
35 Fim da funo de incluso.
- 52 -
ADVPL Intermedirio
Rotina principal
//+--------------------------------------------------------------------+
//| Rotina | xModelo3 | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo do prottipo Modelo3. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
#Include "Protheus.ch"
Private aSize := {}
Private aInfo := {}
Private aObj := {}
Private aPObj := {}
Private aPGet := {}
dbSelectArea("ZA1")
dbSetOrder(1)
dbGoTop()
MBrowse(,,,,"ZA1")
Return
- 53 -
ADVPL Intermedirio
Funo de Incluso
//+--------------------------------------------------------------------+
//| Rotina | Mod3Inc | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para incluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
User Function Mod3Inc( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private aHeader := {}
Private aCOLS := {}
Private aGets := {}
Private aTela := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := CriaVar( FieldName( nX ), .T. )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
// Atualizao do total
@ aPObj[3,1],aPGet[1,3] SAY "Valor Total: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,4] SAY oTotal VAR nTotal ;
PICT "@E 9,999,999,999.99" SIZE 70,7 OF oDlg PIXEL
oGet := MSGetDados():New(aPObj[2,1],aPObj[2,2],aPObj[2,3],aPObj[2,4],;
nOpc,"U_Mod3LOk()",".T.","+ZA2_ITEM",.T.)
- 54 -
ADVPL Intermedirio
Funo de Visualizao, Alterao e Excluso
//+--------------------------------------------------------------------+
//| Rotina | Mod3Mnt | Autor | Robson Luiz (rleg) | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para Visualizar, Alterar e Excluir dados. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
User Function Mod3Mnt( cAlias, nReg, nOpc )
Local oDlg
Local oGet
Local nX := 0
Local nOpcA := 0
Private aHeader := {}
Private aCOLS := {}
Private aGets := {}
Private aTela := {}
Private aREG := {}
dbSelectArea( cAlias )
dbSetOrder(1)
For nX := 1 To FCount()
M->&( Eval( bCampo, nX ) ) := FieldGet( nX )
Next nX
Mod3aHeader()
Mod3aCOLS( nOpc )
DEFINE MSDIALOG oDlg TITLE cCadastro FROM ;
aSize[7],aSize[1] TO aSize[6],aSize[5] OF oMainWnd PIXEL
EnChoice( cAlias, nReg, nOpc, , , , , aPObj[1])
// Atualizao do total
@ aPObj[3,1],aPGet[1,3] SAY "Valor Total: " SIZE 70,7 OF oDlg PIXEL
@ aPObj[3,1],aPGet[1,4] SAY oTotal VAR nTotal PICTURE ;
"@E 9,999,999,999.99" SIZE 70,7 OF oDlg PIXEL
U_Mod3Cli()
oGet := MSGetDados():New(aPObj[2,1],aPObj[2,2],aPObj[2,3],aPObj[2,4],;
nOpc,"U_Mod3LOk()",".T.","+ZA2_ITEM",.T.)
- 55 -
ADVPL Intermedirio
Funo para montar o vetor aHeader
//+--------------------------------------------------------------------+
//| Rotina | Mod3aHeader | Autor | Robson Luiz (rleg) |Data|01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aHeader. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod3aHeader()
Local aArea := GetArea()
dbSelectArea("SX3")
dbSetOrder(1)
dbSeek("ZA2")
While !EOF() .And. X3_ARQUIVO == "ZA2"
If X3Uso(X3_USADO) .And. cNivel >= X3_NIVEL
AADD( aHeader, { Trim( X3Titulo() ),;
X3_CAMPO,;
X3_PICTURE,;
X3_TAMANHO,;
X3_DECIMAL,;
X3_VALID,;
X3_USADO,;
X3_TIPO,;
X3_ARQUIVO,;
X3_CONTEXT})
Endif
dbSkip()
End
RestArea(aArea)
Return
//+--------------------------------------------------------------------+
//| Rotina | Mod3aCOLS | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para montar o vetor aCOLS. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod3aCOLS( nOpc )
Local aArea := GetArea()
Local cChave := ""
Local cAlias := "ZA2"
Local nI := 0
If nOpc <> 3
cChave := ZA1->ZA1_NUM
dbSelectArea( cAlias )
dbSetOrder(1)
dbSeek( xFilial( cAlias ) + cChave )
- 56 -
ADVPL Intermedirio
Continuao:
//+--------------------------------------------------------------------+
//| Rotina | Mod3Cli | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para atualizar a varivel com o nome do cliente. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
- 57 -
ADVPL Intermedirio
Funo para validar a mudana de linha na MsGetDados()
//+--------------------------------------------------------------------+
//| Rotina | Mod3LOk | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para atualizar a varivel com o total dos itens. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
User Function Mod3LOk()
Local nI := 0
nTotal := 0
For nI := 1 To Len( aCOLS )
If aCOLS[nI,Len(aHeader)+1]
Loop
Endif
nTotal+=Round(aCOLS[nI,GdFieldPos("ZA2_QTDVEN")]*;
aCOLS[nI,GdFieldPos("ZA2_PRCVEN")],2)
Next nI
oTotal:Refresh()
Return(.T.)
//+--------------------------------------------------------------------+
//| Rotina | Mod3TOk | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para validar os itens se foram preenchidos. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod3TOk()
Local nI := 0
Local lRet := .T.
For nI := 1 To Len(aCOLS)
If aCOLS[nI, Len(aHeader)+1]
Loop
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_PRODUT")]) .And. lRet
MsgAlert("Campo PRODUTO preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_QTDVEN")]) .And. lRet
MsgAlert("Campo QUANTIDADE preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If Empty(aCOLS[nI,GdFieldPos("ZA2_PRCVEN")]) .And. lRet
MsgAlert("Campo PRECO UNITARIO preenchimento obrigatorio",cCadastro)
lRet := .F.
Endif
If !lRet
Exit
Endif
Next i
Return( lRet )
- 58 -
ADVPL Intermedirio
Funo para efetuar a gravao dos dados em ZA1 e ZA2 na incluso, alterao e
excluso.
//+--------------------------------------------------------------------+
//| Rotina | Mod3Grv | Autor | Robson Luiz (rleg) |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Rotina para efetuar a gravao nas tabelas. |
//+--------------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+--------------------------------------------------------------------+
Static Function Mod3Grv( nOpc, aAltera )
Local nX := 0
Local nI := 0
// Se for incluso
If nOpc == 3
// Grava os itens
dbSelectArea("ZA2")
dbSetOrder(1)
For nX := 1 To Len( aCOLS )
If !aCOLS[ nX, Len( aCOLS ) + 1 ]
RecLock( "ZA2", .T. )
For nI := 1 To Len( aHeader )
FieldPut( FieldPos( Trim( aHeader[nI, 2] ) ),
aCOLS[nX,nI] )
Next nI
ZA2->ZA2_FILIAL := xFilial("ZA2")
ZA2->ZA2_NUM := M->ZA1_NUM
MsUnLock()
Endif
Next nX
// Grava o Cabealho
dbSelectArea( "ZA1" )
RecLock( "ZA1", .T. )
For nX := 1 To FCount()
If "FILIAL" $ FieldName( nX )
FieldPut( nX, xFilial( "ZA1" ) )
Else
FieldPut( nX, M->&( Eval( bCampo, nX ) ) )
Endif
Next nX
MsUnLock()
Endif
// Se for alterao
If nOpc == 4
// Grava os itens conforme as alteraes
dbSelectArea("ZA2")
dbSetOrder(1)
For nX := 1 To Len( aCOLS )
If nX <= Len( aREG )
dbGoto( aREG[nX] )
RecLock("ZA2",.F.)
If aCOLS[ nX, Len( aHeader ) + 1 ]
dbDelete()
Endif
Else
- 59 -
ADVPL Intermedirio
Continuao:
// Grava o Cabealho
dbSelectArea("ZA1")
RecLock( "ZA1", .F. )
For nX := 1 To FCount()
If "FILIAL" $ FieldName( nX )
FieldPut( nX, xFilial("ZA1"))
Else
FieldPut( nX, M->&( Eval( bCampo, nX ) ) )
Endif
Next
MsUnLock()
Endif
// Se for excluso
If nOpc == 5
// Deleta os Itens
dbSelectArea("ZA2")
dbSetOrder(1)
dbSeek(xFilial("ZA2") + M->ZA1_NUM)
While !EOF() .And. ZA2->(ZA2_FILIAL + ZA2_NUM) == xFilial("ZA2") +;
M->ZA1_NUM
RecLock("ZA2")
dbDelete()
MsUnLock()
dbSkip()
End
// Deleta o Cabealho
dbSelectArea("ZA1")
RecLock("ZA1",.F.)
dbDelete()
MsUnLock()
Endif
Return
- 60 -
ADVPL Intermedirio
5.3.2. Funo Modelo3()
A funo Modelo3) uma interface pr-definida pela Microsiga que implementa de forma
padronizada os compontes necessrios a manipulao de estruturas de dados nas quais o
cabealho e os itens da informao esto em tabelas separadas.
Seu objetivo atuar como um facilitador de codificao, permitindo a utilizao dos recursos
bsicos dos seguintes componentes visuais:
MsDialog()
Enchoice()
EnchoiceBar()
MsNewGetDados()
Da mesma forma, o Browse deve ser tratado por esta rotina, sendo
comum a Modelo3() estar vinculada ao uso de uma MBrowse().
Parmetros:
- 61 -
ADVPL Intermedirio
Retorno:
#INCLUDE "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | MBRWMOD3| Autor | ARNALDO RAYMUNDO JR. |Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | EXEMPLO DE UTILIZACAO DA MODELO3(). |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse( 6,1,22,75,cAlias)
Return
- 62 -
ADVPL Intermedirio
Exemplo (continuao):
//
// Opcoes de acesso para a Modelo 3
//
Do Case
Case nOpcx==3; nOpcE:=3 ; nOpcG:=3 // 3 - "INCLUIR"
Case nOpcx==4; nOpcE:=3 ; nOpcG:=3 // 4 - "ALTERAR"
Case nOpcx==2; nOpcE:=2 ; nOpcG:=2 // 2 - "VISUALIZAR"
Case nOpcx==5; nOpcE:=2 ; nOpcG:=2 // 5 - "EXCLUIR"
EndCase
//
// Cria variaveis M->????? da Enchoice
//
RegToMemory("SC5",(nOpcx==3 .or. nOpcx==4 )) // Se for inclusao ou alteracao
permite alterar o conteudo das variaveis de memoria
//
// Cria aHeader e aCols da GetDados
//
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If Alltrim(x3_campo)=="C6_ITEM"
dbSkip()
Loop
Endif
If X3USO(x3_usado).And.cNivel>=x3_nivel
nUsado:=nUsado+1
Aadd(aHeader,{ TRIM(x3_titulo), x3_campo, x3_picture,;
x3_tamanho, x3_decimal,"AllwaysTrue()",;
x3_usado, x3_tipo, x3_arquivo, x3_context } )
Endif
dbSkip()
End
If nOpcx==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
aCols[1,nX]:=CriaVar(aHeader[nX,2])
Next
Else
aCols:={}
dbSelectArea("SC6")
dbSetOrder(1)
dbSeek(xFilial()+M->C5_NUM)
While !eof().and.C6_NUM==M->C5_NUM
AADD(aCols,Array(nUsado+1))
For nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
- 63 -
ADVPL Intermedirio
Exemplo (continuao):
If Len(aCols)>0
//
// Executa a Modelo 3
//
aCposE := {"C5_CLIENTE"}
Return
- 64 -
ADVPL Intermedirio
5.4. Mbrowse()
Browse padro para visualizao das informaes da base de dados, de acordo com as
configuraes do SX3 Dicionrio de Dados (campo browse).
Parmetros:
[n][1]=>Descrio do campo
aFixe [n][2]=>Nome do campo
Arquivos de trabalho
[n][1]=>Descrio do campo
[n][2]=>Nome do campo
[n][3]=>Tipo
[n][4]=>Tamanho
[n][5]=>Decimal
[n][6]=>Picture
- 65 -
ADVPL Intermedirio
Parmetros:
- 66 -
ADVPL Intermedirio
Variveis private adicionais
[n][1] - Ttulo;
[n][2] Rotina;
[n][3] Reservado;
[n][4] Operao (1 - pesquisa; 2 - visualizao; 3 - incluso; 4 -
aRotina alterao; 5 - excluso);
AADD(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0,2})
AADD(aRotina,{"Incluir" ,"AxInclui",0,3})
AADD(aRotina,{"Alterar" ,"AxAltera",0,4})
AADD(aRotina,{"Excluir" ,"AxDeleta",0,5})
cCadastro Ttulo do browse que ser exibido.
Ao definir as funes no array aRotina, se o nome da funo no for especificado com (), a
Mbrowse passar como parmetros as seguintes variveis de controle:
1. Pesquisar
2. Visualizar
3. Incluir
4. Alterar
5. Excluir
6. Livre
- 67 -
ADVPL Intermedirio
Exemplo: Funo Mbrowse()
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MBRWSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao da funo MBROWSE() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
AADD(aRotina,{"Pesquisar" ,"AxPesqui",0,1})
AADD(aRotina,{"Visualizar" ,"AxVisual",0,2})
AADD(aRotina,{"Incluir" ,"AxInclui",0,3})
AADD(aRotina,{"Alterar" ,"AxAltera",0,4})
AADD(aRotina,{"Excluir" ,"AxDeleta",0,5})
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return Nil
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MBRWSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao da funo MBROWSE() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 68 -
ADVPL Intermedirio
Exemplo (continuao):
dbSelectArea(cAlias)
dbSetOrder(1)
mBrowse(6,1,22,75,cAlias)
Return Nil
/*/
+-----------------------------------------------------------------------------
| Funo | INCLUI | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de incluso especfica chamando a AXINCLUI() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
nOpcao := AxInclui(cAlias,nReg,nOpc,,,,cTudoOk)
If nOpcao == 1
MsgInfo(Incluso concluda com sucesso!)
ElseIf == 2
MsgInfo(Incluso cancelada!)
Endif
Return Nil
- 69 -
ADVPL Intermedirio
Exemplo: Determinando a opo do aRotina pela informao recebida em nOpc
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | EXCLUI | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de excluso especifica chamando a AxDeleta |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
nOpcao := AxDeleta(cAlias,nReg,aRotina[nOpc,4])
// Identifica corretamente a opo definida para o funo em aRotinas com mais
// do que os 5 elementos padres.
If nOpcao == 1
MsgInfo(Excluso realizada com sucesso!)
ElseIf == 2
MsgInfo(Excluso cancelada!)
Endif
Return Nil
5.4.1. AxFunctions()
AXPESQUI()
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
- 70 -
ADVPL Intermedirio
AXPESQUI()
Sintaxe AXPESQUI()
Funo de pesquisa padro em registros exibidos pelos browses do sistema,
a qual posiciona o browse no registro pesquisado. Exibe uma tela que
Descrio
permite a seleo do ndice a ser utilizado na pesquisa e a digitao das
informaes que compe a chave de busca.
AXVISUAL()
AXINCLUI()
AXALTERA()
AXDELETA()
- 71 -
ADVPL Intermedirio
5.4.2. FilBrowse()
Parmetros:
5.4.3. EndFilBrw()
Parmetros:
- 72 -
ADVPL Intermedirio
5.4.4. PesqBrw()
A PesqBrw() uma funcionalidade que permite a pesquisa dentro da MBrowse(). Esta funo
dever obrigatoriamente substituir a funo AxPesqui, no array do aRotina, sempre que for
utilizada a funo FilBrowse().
Parmetros:
5.4.5. BrwLegenda ()
Parmetros:
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PINK
BR_PRETO
- 73 -
ADVPL Intermedirio
Exemplo: Mbrowse() utilizando as funes acessrias
#Include "Protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | MBrwSA2 | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Exemplo da MBrowse utilizando a tabela de Cadastro de |
| | Fornecedores |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
/*
-- CORES DISPONIVEIS PARA LEGENDA --
BR_AMARELO
BR_AZUL
BR_BRANCO
BR_CINZA
BR_LARANJA
BR_MARRON
BR_VERDE
BR_VERMELHO
BR_PINK
BR_PRETO
*/
dbSelectArea(cAlias)
dbSetOrder(1)
- 74 -
ADVPL Intermedirio
Exemplo (continuao):
//+------------------------------------------------------------
//| Cria o filtro na MBrowse utilizando a funo FilBrowse
//+------------------------------------------------------------
Eval(bFiltraBrw)
dbSelectArea(cAlias)
dbGoTop()
mBrowse(6,1,22,75,cAlias,,,,,,aCores)
//+------------------------------------------------
//| Deleta o filtro utilizado na funo FilBrowse
//+------------------------------------------------
EndFilBrw(cAlias,aIndexSA2)
Return Nil
//+---------------------------------------
//|Funo: BInclui - Rotina de Incluso
//+---------------------------------------
User Function BInclui(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxInclui(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Incluso efetuada com sucesso!")
Else
MsgInfo("Incluso cancelada!")
Endif
Return Nil
//+-----------------------------------------
//|Funo: BAltera - Rotina de Alterao
//+-----------------------------------------
User Function BAltera(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxAltera(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Alterao efetuada com sucesso!")
Else
MsgInfo("Alterao cancelada!")
Endif
Return Nil
- 75 -
ADVPL Intermedirio
Exemplo (continuao):
//+-----------------------------------------
//|Funo: BDeleta - Rotina de Excluso
//+-----------------------------------------
User Function BDeleta(cAlias,nReg,nOpc)
Local nOpcao := 0
nOpcao := AxDeleta(cAlias,nReg,nOpc)
If nOpcao == 1
MsgInfo("Excluso efetuada com sucesso!")
Else
MsgInfo("Excluso cancelada!")
Endif
Return Nil
//+-------------------------------------------
//|Funo: BLegenda - Rotina de Legenda
//+-------------------------------------------
User Function BLegenda()
Local aLegenda := {}
Return Nil
- 76 -
ADVPL Intermedirio
5.5. MarkBrowse()
Parmetros:
Ao definir as funes no array aRotina, se o nome da funo no for especificado com (), a
MarkBrowse passar como parmetros as seguintes variveis de controle:
- 77 -
ADVPL Intermedirio
Exemplo: Funo MarkBrow() e acessrias
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | MkBrwSA1 | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | MarkBrowse Genrico |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aCpos := {}
Local aCampos := {}
Local nI := 0
Local cAlias := "SA1"
Private aRotina := {}
Private cCadastro := "Cadastro de Clientes"
Private aRecSel := {}
AADD(aCpos, "A1_OK" )
AADD(aCpos, "A1_FILIAL" )
AADD(aCpos, "A1_COD" )
AADD(aCpos, "A1_LOJA" )
AADD(aCpos, "A1_NOME" )
AADD(aCpos, "A1_TIPO" )
dbSelectArea("SX3")
dbSetOrder(2)
For nI := 1 To Len(aCpos)
IF dbSeek(aCpos[nI])
AADD(aCampos,{X3_CAMPO,"",IIF(nI==1,"",Trim(X3_TITULO)),;
Trim(X3_PICTURE)})
ENDIF
Next
DbSelectArea(cAlias)
DbSetOrder(1)
Return Nil
- 78 -
ADVPL Intermedirio
Exemplo: Funo VisLote() utilizao das funes acessrias da MarkBrow()
/*/
+-----------------------------------------------------------------------------
| Programa | VisLote() | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | Funo utilizada para demonstrar o uso do recurso da MarkBrowse|
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
USER FUNCTION VisLote()
Local cMarca := ThisMark()
Local nX := 0
Local lInvert := ThisInv()
Local cTexto := ""
Local cEOL := CHR(10)+CHR(13)
Local oDlg
Local oMemo
DbSelectArea("SA1")
DbGoTop()
While SA1->(!EOF())
SA1->(dbSkip())
Enddo
IF Len(aRecSel) > 0
cTexto := "Cdigo | Loja | Nome Reduzido "+cEol
// "1234567890123456789012345678901234567890
// "CCCCCC | LL | NNNNNNNNNNNNNNNNNNNN +cEol
For nX := 1 to Len(aRecSel)
Next nX
RETURN
- 79 -
ADVPL Intermedirio
Exemplo: Funo LimpaMarca() utilizao das funes acessrias da MarkBrow()
/*/
+-----------------------------------------------------------------------------
| Programa | LimpaMarca | Autor | ARNALDO RAYMUNDO JR. | Data | |
+-----------------------------------------------------------------------------
| Desc. | Funo utilizada para demonstrar o uso do recurso da MarkBrowse|
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nX := 0
For nX := 1 to Len(aRecSel)
SA1->(DbGoto(aRecSel[nX][1]))
RecLock("SA1",.F.)
SA1->A1_OK := SPACE(2)
MsUnLock()
Next nX
RETURN
- 80 -
ADVPL Intermedirio
6. Arquivos e ndices Temporrios
6.2.1. CriaTrab()
A CriaTrab() uma funcionalidade que permite criar um arquivo fsico ou gerar um nome
aleatrio.
Parmetros
- 81 -
ADVPL Intermedirio
6.2.2. dbUseArea()
A dbUseArea() uma funcionalidade que permite definir um arquivo de base de dados, com
uma rea de trabalho disponvel na aplicao.
Parmetros
6.2.3. IndRegua()
A IndRegua() uma funcionalidade que permite criar ndices temporrios para o alias
especificado, podendo ou no ter um filtro.
Parmetros
- 82 -
ADVPL Intermedirio
Exemplo 01: Gerao de arquivo e ndice temporrios
#include protheus.ch
/*/
+-----------------------------------------------------------------------------
| Programa | GeraTrab | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Desc. | Utilizao de arquivos e ndices temporrios |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aStru := {}
Local aArqTRB := {}
Local nI := 0
Local cIndTRB := ""
Local cNomArq := ""
dbSelectArea("SX3")
dbSetOrder(2)
For nI := 1 To Len( aStru )
dbSeek( aStru[nI,2] )
AADD( aArqTRB, { aStru[nI,1], X3_TIPO, X3_TAMANHO, X3_DECIMAL } )
Next nI
- 83 -
ADVPL Intermedirio
Exemplo (continuao):
dbSelectArea("TRB")
dbCloseArea()
Return Nil
O array aStru foi criado com base nos campos existentes no sistema,
ao invs de criarmos novas estruturas dos campos, utilizamos as j
existentes no dicionrios de dados (SX3).
- 84 -
ADVPL Intermedirio
Exemplo 02: Utilizando dois ndices temporrios com RDD DBFCDX
/*/
+-----------------------------------------------------------------------------
| Programa | IndTwoReg | Autor | MICHEL DANTAS | Data | |
+-----------------------------------------------------------------------------
| Desc. | Utilizao de dois ndices temporrios com DBFCDX |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
LOCAL nOrder := 0
LOCAL cArq1 := CriaTrab(NIL,.F.)
LOCAL cChave1 := "A1_FILIAL+A1_EST"
LOCAL cArq2 := CriaTrab(NIL,.F.)
LOCAL cChave2 := "A1_FILIAL+A1_NOME"
dbSelectArea("SA1")
IndRegua("SA1",cArq1,cChave1,,,"Selecionando Regs...")
IndRegua("SA1",cArq2,cChave2,,,"Selecionando Regs...")
nOrder := RetIndex("SA1")
dbSetIndex(cArq1+OrdBagExt())
dbSetIndex(cArq2+OrdBagExt())
dbsetOrder(nOrder+1)
dbGoTop()
While !Eof()
Alert("Estado : " + SA1->A1_EST +" "+" Nome : " + SA1->A1_NOME)
dbSkip()
End
dbSetOrder(nOrder+2)
dbGoTop()
While !Eof()
Alert("Estado : " + SA1->A1_EST +" "+" Nome : " + SA1->A1_NOME)
dbSkip()
End
RetIndex("SA1")
Ferase(cArq1+OrdBagext())
Ferase(cArq2+OrdBagext())
Return
- 85 -
ADVPL Intermedirio
7. Relatrios no grficos
Este tipo de relatrio caracterizado por um formato de impresso tipo PostScript, e permite
a gerao de um arquivo em formato texto (.txt), com uma extenso prpria da aplicao ERP
(.##R).
Neste tpico ser demonstrada a construo de relatrio no grfico baseado no uso da funo
SetPrint() o qual atende os formatos de base de dados ISAM e Topconnect, porm no
contemplando a tecnologia Protheus Embedded SQL.
Estrutura do programa
Linhas Programa
1 Funo principal;
2 Declarao e atribuio de variveis;
3 Atualizao do arquivo de perguntas atravs da funo especfica CriaSX1();
4 Definio as perguntas atravs da funo Pergunte();
5 Definio das ordens disponveis para impresso do relatrio;
6 Chamada da funo SetPrint;
7 Atualizao das configuraes de impresso com a funo SetDefault();
8 Execuo da rotina de impresso atravs da funo RptStatus()
9 Fim da funo principal.
- 86 -
ADVPL Intermedirio
Funo Principal
//+-----------------------------------------------------------------+
//| Rotina | Inform | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para gerar relatrio utilizando as funes |
//| | SetPrint() e SetDefault(). |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+-----------------------------------------------------------------+
Continuao:
- 87 -
ADVPL Intermedirio
AADD( aOrd, "Fornecedor" )
AADD( aOrd, "Titulo" )
AADD( aOrd, "Emisso" )
AADD( aOrd, "Vencimento" )
AADD( aOrd, "Vencto. Real" )
//+-------------------------------------------------
//| Disponibiliza para usurio digitar os parmetros
//+-------------------------------------------------
Pergunte(cPerg,.F.)
//cPerg -> Nome do grupo de perguntas, .T. mostra a tela,;
// .F. somente carrega as variveis
//+---------------------------------------------------
//| Solicita ao usurio a parametrizao do relatrio.
//+---------------------------------------------------
wnrel :=
SetPrint(cString,wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,aOrd,.F., ;
Tamanho,.F.,.F.)
//SetPrint(cAlias,cNome,cPerg,cDesc,cCnt1,cCnt2,cCnt3,lDic,aOrd,lCompres,;
//cSize,aFilter,lFiltro,lCrystal,cNameDrv,lNoAsk,lServer,cPortToPrint)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
//+------------------------------------------------------------------
//| Estabelece os padres para impresso, conforme escolha do usurio
//+------------------------------------------------------------------
SetDefault(aReturn,cString)
//+-------------------------------------
//| Verificar se ser reduzido ou normal
//+-------------------------------------
nTipo := IIF(aReturn[4] == 1, 15, 18)
//+--------------------
//| Se teclar ESC, sair
//+--------------------
If nLastKey == 27
Return
Endif
Continuao:
- 88 -
ADVPL Intermedirio
//+-----------------------------------
//| Chama funo que processa os dados
//+-----------------------------------
RptStatus({|lEnd| ImpRel(@lEnd) }, Titulo, "Processando e imprimindo dados,;
aguarde...", .T. )
Return
//+-----------------------------------------------------------------+
//| Rotina | ImpRel | Autor | Robson Luiz (rleg) | Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina de processamento e impresso. |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+-----------------------------------------------------------------+
Local nIndice := 0
Local cArq := ""
Local cIndice := ""
Local cFiltro := ""
Local aCol := {}
Local cFornec := ""
Local nValor := 0
Local nPago := 0
Local nSaldo := 0
Local nT_Valor := 0
Local nT_Pago := 0
Local nT_Saldo := 0
Local cArqExcel := ""
Local cAliasImp
Local oExcelApp
Titulo += aOrd[aReturn[8]]
#IFNDEF TOP
cAliasImp := "SE2"
If aReturn[8] == 1 //Fornecedor
cIndice := "E2_FORNECE+E2_LOJA+E2_NUM"
Elseif aReturn[8] == 2 //Titulo
cIndice := "E2_NUM+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 3 //Emissao
Continuao:
- 89 -
ADVPL Intermedirio
cIndice := "Dtos(E2_EMISSAO)+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 4 //Vencimento
cIndice := "Dtos(E2_VENCTO)+E2_FORNECE+E2_LOJA"
Elseif aReturn[8] == 5 //Vencimento Real
cIndice := "Dtos(E2_VENCREA)+E2_FORNECE+E2_LOJA"
Endif
cArq := CriaTrab(NIL,.F.)
dbSelectArea(cAliasImp)
IndRegua(cAliasImp,cArq,cIndice,,cFiltro)
nIndice := RetIndex()
nIndice := nIndice + 1
dbSetIndex(cArq+OrdBagExt())
dbSetOrder(nIndice)
#ELSE
cAliasImp := GetNextAlias()
If aReturn[8] == 1 //Fornecedor
cQuery += "E2_FORNECE,E2_LOJA,E2_NUM"
Elseif aReturn[8] == 2 //Titulo
cQuery += "E2_NUM,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 3 //Emissao
cQuery += "E2_EMISSAO,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 4 //Vencimento
cQuery += "E2_VENCTO,E2_FORNECE,E2_LOJA"
Elseif aReturn[8] == 5 //Vencimento Real
cQuery += "E2_VENCREA,E2_FORNECE,E2_LOJA"
Endif
Continuao:
- 90 -
ADVPL Intermedirio
Elseif aReturn[8] == 5 //Vencimento Real
cOrder := "E2_VENCREA,E2_FORNECE,E2_LOJA"
Endif
dbGoTop()
SetRegua(0)
//+--------------------
//| Coluna de impresso
//+--------------------
AADD( aCol, 004 ) //Prefixo
AADD( aCol, 012 ) //Titulo
AADD( aCol, 024 ) //Parcela
AADD( aCol, 031 ) //Tipo
AADD( aCol, 036 ) //Emissao
AADD( aCol, 046 ) //Vencimento
AADD( aCol, 058 ) //Vencimento Real
AADD( aCol, 070 ) //Valor Original
AADD( aCol, 090 ) //Pago
AADD( aCol, 110 ) //Saldo
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
Continuao:
- 91 -
ADVPL Intermedirio
@ Li, aCol[1] PSay "Cod/Loj/Nome: "+(cAliasImp)->E2_FORNECE+;
"-"+(cAliasImp)->E2_LOJA+" "+(cAliasImp)->E2_NOMFOR
Li ++
IncRegua()
If Li > 55
Cabec(Titulo,Cabec1,Cabec2,NomeProg,Tamanho,nTipo)
Endif
If mv_par07 == 2
@ Li, aCol[1] PSay (cAliasImp)->E2_PREFIXO
@ Li, aCol[2] PSay (cAliasImp)->E2_NUM
@ Li, aCol[3] PSay (cAliasImp)->E2_PARCELA
@ Li, aCol[4] PSay (cAliasImp)->E2_TIPO
@ Li, aCol[5] PSay (cAliasImp)->E2_EMISSAO
@ Li, aCol[6] PSay (cAliasImp)->E2_VENCTO
@ Li, aCol[7] PSay (cAliasImp)->E2_VENCREA
@ Li, aCol[8] PSay (cAliasImp)->E2_VALOR ;
PICTURE "@E 99,999,999,999.99"
@ Li, aCol[9] PSay (cAliasImp)->E2_VALOR -;
(cAliasImp)->E2_SALDO ;
PICTURE "@E 99,999,999,999.99"
@ Li, aCol[10] PSay (cAliasImp)->E2_SALDO ;
PICTURE "@E 99,999,999,999.99"
Li ++
Endif
nValor += (cAliasImp)->E2_VALOR
nPago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nSaldo += (cAliasImp)->E2_SALDO
nT_Valor += (cAliasImp)->E2_VALOR
nT_Pago += ((cAliasImp)->E2_VALOR-(cAliasImp)->E2_SALDO)
nT_Saldo += (cAliasImp)->E2_SALDO
dbSkip()
End
cFornec := (cAliasImp)->E2_FORNECE+(cAliasImp)->E2_LOJA
nValor := 0
nPago := 0
nSaldo := 0
End
Continuao:
- 92 -
ADVPL Intermedirio
If lEnd
@ Li, aCol[1] PSay cCancel
Return
Endif
If Li <> 80
Roda(cbCont,cbTxt,Tamanho)
Endif
//+----------------------------------------------------------------------
//| Gera arquivo do tipo .DBF com extenso .XLS p/ usurio abrir no Excel
//+----------------------------------------------------------------------
cArqExcel := __RELDIR+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS"
Copy To &cArqExcel
#IFNDEF TOP
dbSelectArea(cAliasImp)
RetIndex(cAliasImp)
Set Filter To
#ELSE
dbSelectArea(cAliasImp)
dbCloseArea()
#ENDIF
dbSetOrder(1)
dbGoTop()
If aReturn[5] == 1
Set Printer TO
dbCommitAll()
OurSpool(wnrel)
EndIf
//+------------------------
//| Abrir planilha MS-Excel
//+------------------------
If mv_par08 == 1
__CopyFile(cArqExcel,"c:\"+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS")
If ! ApOleClient("MsExcel")
MsgAlert("MsExcel no instalado")
Return
Endif
oExcelApp := MsExcel():New()
oExcelApp:WorkBooks:Open( "c:\"+NomeProg+"_"+Substr(cUsuario,7,4)+".XLS" )
oExcelApp:SetVisible(.T.)
Endif
Ms_Flush()
Return
- 93 -
ADVPL Intermedirio
Funo para gerar o grupo de parmetros no SX1
//+-----------------------------------------------------------------+
//| Rotina | CriaSX1 | Autor | Robson Luiz (rleg)| Data | 01.01.07 |
//+-----------------------------------------------------------------+
//| Descr. | Rotina para criar o grupo de parmetros. |
//+-----------------------------------------------------------------+
//| Uso | Para treinamento e capacitao. |
//+-----------------------------------------------------------------+
Static Function CriaSx1()
Local aP := {}
Local i := 0
Local cSeq
Local cMvCh
Local cMvPar
Local aHelp := {}
/******
Parmetros da funo padro
---------------------------
PutSX1(cGrupo,;cOrdem,;
cPergunt,cPerSpa,cPerEng,;
cVar,;
cTipo,;
nTamanho,;
nDecimal,;
nPresel,;
cGSC,;
cValid,;
cF3,;
cGrpSxg,;
cPyme,;
cVar01,;
cDef01,cDefSpa1,cDefEng1,;
cCnt01,;
cDef02,cDefSpa2,cDefEng2,;
cDef03,cDefSpa3,cDefEng3,;
cDef04,cDefSpa4,cDefEng4,;
cDef05,cDefSpa5,cDefEng5,;
aHelpPor,aHelpEng,aHelpSpa,;
cHelp)
- 94 -
ADVPL Intermedirio
Continuao:
PutSx1(cPerg,;
cSeq,;
aP[i,1],aP[i,1],aP[i,1],;
cMvCh,;
aP[i,2],;
aP[i,3],;
aP[i,4],;
0,;
aP[i,5],;
aP[i,6],;
aP[i,7],;
"",;
"",;
cMvPar,;
aP[i,8],aP[i,8],aP[i,8],;
"",;
aP[i,9],aP[i,9],aP[i,9],;
aP[i,10],aP[i,10],aP[i,10],;
aP[i,11],aP[i,11],aP[i,11],;
aP[i,12],aP[i,12],aP[i,12],;
aHelp[i],;
{},;
{},;
"")
Next i
Return
- 95 -
ADVPL Intermedirio
8. Manipulao de arquivos I
Arquivos do tipo texto (tambm conhecidos como padro TXT) so arquivos com registros de
tamanho varivel. A indicao do final de cada registro representada por dois bytes, 0D
0A em hexadecimal ou 13 10 em decimal ou, ainda, CR LF para padro ASCII.
Apesar do tamanho dos registros ser varivel, a maioria dos sistemas gera este tipo de arquivo
com registros de tamanho fixo, de acordo com um layout especfico que indica quais
so os dados gravados.
Para ilustrar estes procedimentos, sero gerados arquivos textos, com duas famlias de
funes:
- 96 -
ADVPL Intermedirio
1. Famlia de funes de gravao e leitura de arquivos texto
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | GeraTXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Gera o arquivo TXT, a partir do Cadastro de Clientes |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
//+--------------------------------+
//| Declarao de Variveis |
//+--------------------------------+
Local oGeraTxt
Private cPerg := "EXPSA1"
Private cAlias := "SA1"
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
dbSelectArea(cAlias)
dbSetOrder(1)
//+-----------------------------------+
//| Montagem da tela de processamento.|
//+-----------------------------------+
Return Nil
- 97 -
ADVPL Intermedirio
Exemplo (continuao):
/*/
+-----------------------------------------------------------------------------
| Funo | OKGERATXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo chamada pelo boto OK na tela inicial de processamento. |
| | Executa a gerao do arquivo texto. |
+-----------------------------------------------------------------------------
/*/
//+-----------------------------------------------------------------------------
//| Cria o arquivo texto
//+-----------------------------------------------------------------------------
Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl := fCreate(cArqTxt)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser executado! Verifique os
parmetros.","Ateno!")
Return
Endif
Return Nil
/*/
+-----------------------------------------------------------------------------
| Funo | RUNCONT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo auxiliar chamada pela PROCESSA. A funo PROCESSA |
| | monta a janela com a rgua de processamento. |
+-----------------------------------------------------------------------------
/*/
Local cLin
dbSelectArea(cAlias)
dbGoTop()
ProcRegua(RecCount()) // Numero de registros a processar
While (cAlias)->(!EOF())
//Incrementa a rgua
IncProc()
cLin := (cAlias)->A1_FILIAL
cLin += (cAlias)->A1_COD
cLin += (cAlias)->A1_LOJA
cLin += (cAlias)->A1_NREDUZ
cLin += STRZERO((cAlias)->A1_MCOMPRA*100,16) // 14,2
cLin += DTOS((cAlias)->A1_ULTCOM)//AAAAMMDD
cLin += CRLF
- 98 -
ADVPL Intermedirio
Exemplo (continuao):
//+-------------------------------------------------------------------+
//| Gravao no arquivo texto. Testa por erros durante a gravao da |
//| linha montada. |
//+-------------------------------------------------------------------+
If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin)
If !MsgAlert("Ocorreu um erro na gravao do arquivo."+;
"Continua?","Ateno!")
Exit
Endif
Endif
(cAlias)->(dbSkip())
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na funo
anterior
fClose(nHdl)
Return Nil
Note que para a gerao do arquivo TXT foram utilizadas, basicamente, as funes
FCreate, FWrite e FClose que, respectivamente, gera o arquivo, adiciona dados e fecha
o arquivo. No exemplo, o formato estabelecido pela concatenao dos dados na
varivel cLin a qual utilizada na gravao dos dados. Para a leitura de dados TXT sero
utilizada as funes FOpen e FRead.
#Include "protheus.ch"
/*/
+-----------------------------------------------------------------------
| Programa | LeTXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------
| Descrio | Leitura de arquivo TXT |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
User Function LeTXT()
//+-------------------------------------------------------------------+
//| Declarao de Variveis |
//+-------------------------------------------------------------------+
//CriaSx1(cPerg)
//Pergunte(cPerg,.F.)
- 99 -
ADVPL Intermedirio
Exemplo (continuao):
dbSelectArea(cAlias)
dbSetOrder(1)
//+-------------------------------------------------------------------+
// Montagem da tela de processamento |
//+-------------------------------------------------------------------+
Return Nil
/*/
+-----------------------------------------------------------------------------
| Funo | OKLETXT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo chamada pelo boto OK na tela inicial de processamento |
| | Executa a leitura do arquivo texto |
+-----------------------------------------------------------------------------
/*/
//+-------------------------------------------------------------------+
//| Abertura do arquivo texto |
//+-------------------------------------------------------------------+
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" no pode ser aberto! Verifique os
parmetros.","Ateno!")
Return
Endif
- 100 -
ADVPL Intermedirio
Exemplo (continuao):
/*/
+-----------------------------------------------------------------------------
| Funo | RUNCONT | Autor | SERGIO FUZINAKA | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo auxiliar chamada pela PROCESSA. A funo PROCESSA |
| | monta a janela com a rgua de processamento. |
+-----------------------------------------------------------------------------
/*/
Local nTamFile := 0
Local nTamLin := 56
Local cBuffer := ""
Local nBtLidos := 0
Local cFilSA1 := ""
Local cCodSA1 := ""
Local cLojaSA1 := ""
//1234567890123456789012345678901234567890123456789012345678901234567890
//00000000010000000002000000000300000000040000000005000000000600000000070
//FFCCCCCCLLNNNNNNNNNNNNNNNNNNNNVVVVVVVVVVVVVVVVDDDDDDDD
//A1_FILIAL - 01, 02 - TAM: 02
//A1_COD - 03, 08 - TAM: 06
//A1_LOJA - 09, 10 - TAM: 02
//A1_NREDUZ - 11, 30 - TAM: 20
//A1_MCOMPRA - 31, 46 - TAM: 14,2
//A1_ULTCOM - 47, 54 - TAM: 08
nTamFile := fSeek(nHdl,0,2)
fSeek(nHdl,0,0)
cBuffer := Space(nTamLin) // Varivel para criao da linha do registro para
leitura
//Incrementa a rgua
IncProc()
While .T.
IF dbSeek(cFilSA1+cCodSA1+cLojaSA1)
cCodSA1 := SOMA1(cCodSA1)
Loop
Else
Exit
Endif
Enddo
- 101 -
ADVPL Intermedirio
Exemplo (continuao):
dbSelectArea(cAlias)
RecLock(cAlias,.T.)
(cAlias)->A1_FILIAL := cFilSA1 //- 01, 02 - TAM: 02
(cAlias)->A1_COD := cCodSA1 //- 03, 08 - TAM: 06
(cAlias)->A1_LOJA := cLojaSA1 //- 09, 10 - TAM: 02
(cAlias)->A1_NREDUZ := Substr(cBuffer,11,20)
//- 11, 30 - TAM: 20
(cAlias)->A1_MCOMPRA := Val(Substr(cBuffer,31,16))/100
//- 31, 46 - TAM: 14,2
(cAlias)->A1_ULTCOM := STOD(Substr(cBuffer,47,08))
//- 47, 54 - TAM: 08
MSUnLock()
EndDo
// O arquivo texto deve ser fechado, bem como o dialogo criado na funo
anterior.
fClose(nHdl)
Return Nil
#Include "Protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | LeArqTXT | Autor | Robson Luiz | Data | |
+-----------------------------------------------------------------------------
| Descrio | Leitura de arquivo TXT |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
User Function LeArqTxt()
Private nOpc := 0
Private cCadastro := "Ler arquivo texto"
Private aSay := {}
Private aButton := {}
AADD( aSay, "O objetivo desta rotina e efetuar a leitura em um arquivo texto" )
If nOpc == 1
Processa( {|| Import() }, "Processando..." )
Endif
Return Nil
- 102 -
ADVPL Intermedirio
Exemplo (continuao):
//+-------------------------------------------
//| Funo - Import()
//+-------------------------------------------
Static Function Import()
/***
* _________________________________________________________
* cGetFile(<ExpC1>,<ExpC2>,<ExpN1>,<ExpC3>,<ExpL1>,<ExpN2>)
*
* <ExpC1> - Expresso de filtro
* <ExpC2> - Titulo da janela
* <ExpN1> - Numero de mascara default 1 para *.Exe
* <ExpC3> - Diretrio inicial se necessrio
* <ExpL1> - .F. boto salvar - .T. boto abrir
* <ExpN2> - Mascara de bits para escolher as opes de visualizao do objeto
* (prconst.ch)
*/
cFileOpen := cGetFile(cExtens,cTitulo1,,cMainPath,.T.)
If !File(cFileOpen)
MsgAlert("Arquivo texto: "+cFileOpen+" no localizado",cCadastro)
Return
Endif
FT_FUSE(cFileOpen) //ABRIR
FT_FGOTOP() //PONTO NO TOPO
ProcRegua(FT_FLASTREC()) //QTOS REGISTROS LER
// Capturar dados
cBuffer := FT_FREADLN() //LENDO LINHA
MsgInfo(cMsg)
- 103 -
ADVPL Intermedirio
9. Oficina de programao I
Para ilustrar a diferena na utilizao destes dois includes, segue abaixo as diferentes
definies para o componentes Dialog e MsDialog:
#include rwmake.ch
#include protheus.ch
DEFINE MSDIALOG oDlg TITLE "Janela em sintaxe ADVPL "FROM 000,000 TO 400,600
PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Os componentes da interface visual que sero tratados neste tpico, utilizando a sintaxe
clssica da linguagem ADVPL so:
BUTTON()
CHECKBOX()
COMBOBOX()
FOLDER()
MSDIALOG()
MSGET()
- 104 -
ADVPL Intermedirio
RADIO()
SAY()
SBUTTON()
BUTTON()
CHECKBOX()
COMBOBOX()
FOLDER()
MSDIALOG()
- 105 -
ADVPL Intermedirio
MSGET()
RADIO()
SAY()
SBUTTON()
- 106 -
ADVPL Intermedirio
9.2. Rguas de processamento
RPTSTATUS()
PROCESSA()
MSNEWPROCESS()
MSAGUARDE()
MSGRUN()
9.2.1. RptStatus()
Retorno: Nil
Parmetros:
Aparncia
- 107 -
ADVPL Intermedirio
Exemplo: Funo RPTStatus() e acessrias
/*/
+---------------------------------------------------------------------------
| Funo | GRPTSTATUS | Autor | ROBSON LUIZ | Data | |
+---------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao das funes RPTSTATUS() |
| | SETREGUA() E INCREGUA() |
+---------------------------------------------------------------------------
| Uso | Curso ADVPL |
+---------------------------------------------------------------------------
/*/
CriaSX1()
Pergunte(cPerg,.F.)
If nOpc <> 1
Return Nil
Endif
Return Nil
- 108 -
ADVPL Intermedirio
Exemplo: Funes acessrias da RPTStatus()
/*/
+-----------------------------------------------------------------------------
| Funo | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de processamento executada atravs da RPTSTATUS() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5")+mv_par01,.T.)
dbSeek(xFilial("SX5")+mv_par01,.T.)
SetRegua(nCnt)
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA <= mv_par02
IncRegua()
If lEnd
MsgInfo(cCancel,"Fim")
Exit
Endif
dbSkip()
End
Return .T.
SETREGUA()
A funo SetRegua() utilizada para definir o valor mximo da rgua de progresso criada
atravs da funo RptStatus().
Sintaxe: SetRegua(nMaxProc)
Parmetros:
nMaxProc Varivel que indica o valor mximo de processamento (passos) que sero
indicados pela rgua.
Retorno:
Nenhum .
- 109 -
ADVPL Intermedirio
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetRegua(LastRec())
While !Eof()
IncRegua()
If Li > 60
...
INCREGUA()
A funo IncRegua() utilizada para incrementar valor na rgua de progresso criada atravs
da funo RptStatus()
Sintaxe: IncRegua(cMensagem)
Parmetros:
Retorno:
Nenhum .
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetRegua(LastRec())
While !Eof()
IncRegua(Avaliando cliente:+SA1->A1_COD)
If Li > 60
...
- 110 -
ADVPL Intermedirio
9.2.2. Processa()
Retorno: Nil
Parmetros:
Aparncia
/*/
+-----------------------------------------------------------------------------
| Funo | GPROCES1 | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao das funes PROCESSA() |
| | PROCREGUA() E INCPROC() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 111 -
ADVPL Intermedirio
Exemplo (continuao):
CriaSX1()
Pergunte(cPerg,.F.)
If nOpc <> 1
Return Nil
Endif
Return Nil
/*/
+-----------------------------------------------------------------------------
| Funo | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de processamento executada atravs da PROCRSSA() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5")+mv_par01,.T.)
dbSeek(xFilial("SX5")+mv_par01,.T.)
ProcRegua(nCnt)
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA <= mv_par02
IncProc("Processando tabela: "+SX5->X5_CHAVE)
If lEnd
MsgInfo(cCancela,"Fim")
Exit
Endif
dbSkip()
End
Return .T.
- 112 -
ADVPL Intermedirio
SETPROC()
A funo SetProc() utilizada para definir o valor mximo da rgua de progresso criada
atravs da funo Processa().
Sintaxe: Processa(nMaxProc)
Parmetros:
nMaxProc Varivel que indica o valor mximo de processamento (passos) que sero
indicados pela rgua.
Retorno:
Nenhum .
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetProc(LastRec())
While !Eof()
IncProc()
If Li > 60
...
INCPROC()
A funo IncProc() utilizada para incrementar valor na rgua de progresso criada atravs da
funo Processa()
Sintaxe: IncProc(cMensagem)
Parmetros:
Retorno:
Nenhum .
Exemplo:
...
dbSelectArea("SA1")
dbGoTop()
SetProc(LastRec())
While !Eof()
IncProc(Avaliando cliente:+SA1->A1_COD)
If Li > 60
...
- 113 -
ADVPL Intermedirio
9.2.3. MsNewProcess().
Parmetros:
Aparncia
Mtodos:
- 114 -
ADVPL Intermedirio
Exemplo: Objeto MsNewProcess() e mtodos acessrios
/*/
+-----------------------------------------------------------------------------
| Funo | GPROCES2 | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto MsNewProcess() |
| | e seus mtodos IncReguaX() e SetReguaX() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Return Nil
/*/
+-----------------------------------------------------------------------------
| Funo | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de processamento executada atravs da MsNewProcess() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
aTabela := {{"00",0},{"13",0},{"35",0},{"T3",0}}
dbSelectArea("SX5")
cFilialSX5 := xFilial("SX5")
dbSetOrder(1)
For i:=1 To Len(aTabela)
dbSeek(cFilialSX5+aTabela[i,1])
While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1]
If lEnd
Exit
Endif
nCnt++
dbSkip()
End
aTabela[i,2] := nCnt
nCnt := 0
Next i
- 115 -
ADVPL Intermedirio
Exemplo (continuao):
oObj:SetRegua1(Len(aTabela))
For i:=1 To Len(aTabela)
If lEnd
Exit
Endif
oObj:IncRegua1("Lendo Tabela: "+aTabela[i,1])
dbSelectArea("SX5")
dbSeek(cFilialSX5+aTabela[i,1])
oObj:SetRegua2(aTabela[i,2])
While !Eof() .And. X5_FILIAL+X5_TABELA == cFilialSX5+aTabela[i,1]
oObj:IncRegua2("Lendo chave: "+X5_CHAVE)
If lEnd
Exit
Endif
dbSkip()
End
Next i
Return
9.2.4. MsAguarde().
Retorno: Nil
Parmetros:
Aparncia
- 116 -
ADVPL Intermedirio
Exemplo: MSAguarde()
/*/
+-----------------------------------------------------------------------------
| Funo | GMSAGUARDE | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao das funes MSAGUARDE() |
| | e MSPROCTXT() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
RETURN
/*/
+-----------------------------------------------------------------------------
| Funo | RUNPROC | Autor | ROBSON LUIZ | Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo de processamento |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX5")
dbSetOrder(1)
dbGoTop()
While !Eof()
If lEnd
MsgInfo(cCancel,"Fim")
Exit
Endif
MsProcTxt("Tabela: "+SX5->X5_TABELA+" Chave: "+SX5->X5_CHAVE)
dbSkip()
End
RETURN
- 117 -
ADVPL Intermedirio
9.2.5. MsgRun().
Retorno: Nil
Parmetros:
Aparncia
Exemplo: MSGRun()
/*/
+-----------------------------------------------------------------------------
| Funo | GMSGRUN | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao das funes MSGRUN() |
| | e DBEVAL() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SX1")
dbGoTop()
RETURN
- 118 -
ADVPL Intermedirio
9.3. ListBox()
A sintaxe clssica da linguagem ADVPL permite que o componente visual ListBox implemente
dois tipos distintos de objetos:
Lista com colunas: lista com diversas colunas que necessita de um cabealho no
formato de um aHeader (array de cabealho).
Sintaxe:
Parmetros:
Aparncia:
- 119 -
ADVPL Intermedirio
Exemplo: LISTBOX como lista simples
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | LISTBOXITE | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do LISTBOX() como lista |
| | simples. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
User Function ListBoxIte()
Local aVetor := {}
Local oDlg := Nil
Local oLbx := Nil
Local cTitulo := "Consulta Tabela"
Local nChave := 0
Local cChave := ""
dbSelectArea("SX5")
dbSetOrder(1)
dbSeek(xFilial("SX5"))
CursorWait()
//+-----------------------------------------+
//| Carrega o vetor conforme a condio |
//+-----------------------------------------+
While !Eof() .And. X5_FILIAL == xFilial("SX5") .And. X5_TABELA=="00"
AADD( aVetor, Trim(X5_CHAVE)+" - "+Capital(Trim(X5_DESCRI)) )
dbSkip()
End
CursorArrow()
If Len( aVetor ) == 0
Aviso( cTitulo, "No existe dados a consultar", {"Ok"} )
Return
Endif
//+-----------------------------------------------+
//| Monta a tela para usurio visualizar consulta |
//+-----------------------------------------------+
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 0,0 TO 240,500 PIXEL
@ 10,10 LISTBOX oLbx VAR nChave ITEMS aVetor SIZE 230,95 OF oDlg PIXEL
oLbx:bChange := {|| cChave := SubStr(aVetor[nChave],1,2) }
DEFINE SBUTTON FROM 107,183 TYPE 14 ACTION LoadTable(cChave) ENABLE OF oDlg
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
Return
- 120 -
ADVPL Intermedirio
Exemplo: LISTBOX como lista simples funes acessrias
/*/
+-----------------------------------------------------------------------------
| Funo | LISTBOXITE | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo que carrega os dados da tabela selecionada em um |
| | listbox. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
LOCAL aTabela := {}
LOCAL oDlg := NIL
LOCAL oLbx := NIL
dbSelectArea("SX5")
dbSeek(xFilial("SX5")+cTabela)
//+-------------------------------------------------------------
//| O vetor pode receber carga de duas maneiras, acompanhe... |
//+-------------------------------------------------------------
//| Utilizando While/End |
//+-------------------------------------------------------------
dbEval({|| AADD(aTabela,{X5_CHAVE,Capital(X5_DESCRI)})},,{||
X5_TABELA==cTabela})
If Len(aTabela)==0
Aviso( "FIM", "Necessrio selecionar um item", {"Ok"} )
Return
Endif
DEFINE MSDIALOG oDlg TITLE "Dados da tabela selecionada" FROM 300,400 TO 540,900
PIXEL
@ 10,10 LISTBOX oLbx FIELDS HEADER "Tabela", "Descrio" SIZE 230,095 OF oDlg
PIXEL
oLbx:SetArray( aTabela )
oLbx:bLine := {|| {aTabela[oLbx:nAt,1],aTabela[oLbx:nAt,2]} }
DEFINE SBUTTON FROM 107,213 TYPE 1 ACTION oDlg:End() ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg
RETURN
- 121 -
ADVPL Intermedirio
9.3.2. ListBox mltiplas colunas
Sintaxe:
Parmetros:
Mtodos:
Atributos:
Aparncia:
- 122 -
ADVPL Intermedirio
Exemplo: LISTBOX com grid
#include protheus.ch
/*/
+-----------------------------------------------------------------------------
| Funo | LIST_BOX | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao de um LISTBOX() com |
| | grid. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aVetor := {}
Local oDlg
Local oLbx
Local cTitulo := "Cadastro de Bancos"
Local cFilSA6
dbSelectArea("SA6")
dbSetOrder(1)
cFilSA6 := xFilial("SA6")
dbSeek(cFilSA6)
oLbx:SetArray( aVetor )
oLbx:bLine := {|| {aVetor[oLbx:nAt,1],;
aVetor[oLbx:nAt,2],;
aVetor[oLbx:nAt,3],;
aVetor[oLbx:nAt,4],;
aVetor[oLbx:nAt,5],;
aVetor[oLbx:nAt,6],;
aVetor[oLbx:nAt,7]}}
- 123 -
ADVPL Intermedirio
Exemplo (continuao):
Return
9.4. ScrollBox()
O ScrollBox o objeto utilizado para permitir a um Dialog exibir barras de rolagem verticais e
Horizontais. Algumas aplicaes com objetos definem automaticamente o ScrollBox, tais como:
Enchoice() ou MsMGet()
NewGetDados()
ListBox()
MsDialog() ScrollBox()
ScrollBox() Componentes Visuais
Sintaxe:
Parmetros:
- 124 -
ADVPL Intermedirio
Aparncia:
#INCLUDE "PROTHEUS.CH"
/*/
+------------------------------------------------------------------------
| Funo | SCROLL() | Autor | ROBSON LUIZ |Data | |
+------------------------------------------------------------------------
| Descrio | Programa que demonstra como montar uma enchoice apenas |
| | com variveis, incluindo o recurso de rolagem. |
+------------------------------------------------------------------------
| Uso | Curso ADVPL |
+------------------------------------------------------------------------
/*/
- 125 -
ADVPL Intermedirio
Exemplo (continuao):
cProcesso := "P00001"
cPrefixo := "UNI"
cTipo := "MAN"
cCliente := "000001"
cLoja := "01"
cNome := "JOSE DA SILVA SANTOS SOARES"
cCGC := "00.000.000/0001-91"
dData := "26/03/03"
nTotal := 5922.00
nUFESP := 1000.00
cStatus := "Z"
cCond := "001"
DEFINE MSDIALOG oDlg TITLE cTitulo FROM 122,0 TO 432,600 OF oDlg PIXEL
@ 013,002 TO 154,192 LABEL "Parcelamento" OF oDlg PIXEL
@ 013,195 TO 082,298 LABEL "Ttulos" OF oDlg PIXEL
@ 083,195 TO 154,298 LABEL "AIIPM" OF oDlg PIXEL
//scrollbox
@ 019,006 SCROLLBOX oScroll HORIZONTAL VERTICAL SIZE 131,182 OF oDlg BORDER
For n:=1 TO Len(aSay)
- 126 -
ADVPL Intermedirio
Exemplo (continuao):
TSay():New(nTop,5,bGet,oScroll,,,.F.,.F.,.F.,.T.,,,;
GetTextWidth(0,Trim(aSay[n][1])),15,;
.F.,.F.,.F.,.F.,.F.)
oGet:=TGet():New(nTop-2,40,&cGet,oScroll,,7,cPict,,,,,.F.,,.T.,;
,.F.,,.F.,.F.,,.T.,.F.,,(cVar),,,,.T.)
nTop+=11
Next n
//listbox ttulos
@ 019,199 LISTBOX oLbx1 FIELDS HEADER ;
"Parcela","Vencto","Vencto.Real","Valor R$","Qtd.UFESP";
COLSIZES 21,24,33,63,100;
SIZE 095,059 OF oDlg PIXEL
oLbx1:SetArray( aTitulo )
oLbx1:bLine := {||{aTitulo[oLbx1:nAt,1],aTitulo[oLbx1:nAt,2],;
aTitulo[oLbx1:nAt,3],aTitulo[oLbx1:nAt,4],aTitulo[oLbx1:nAt,5]}}
//listbox aiipm
@ 089,199 LISTBOX oLbx2 FIELDS HEADER "AIIPM","Placa","Data Multa" ;
COLSIZES 24,21,30 SIZE 095,061 OF oDlg PIXEL
oLbx2:SetArray( aAIIPM )
oLbx2:bLine :=
{||{aAIIPM[oLbx2:nAt,1],aAIIPM[oLbx2:nAt,2],aAIIPM[oLbx2:nAt,3]}}
RETURN
- 127 -
ADVPL Intermedirio
9.5. ParamBox()
Cuidados
Ao utilizar a ParamBox em uma funo que tambm utilize parmetros definidos pela
funo Pergunte() deve-se:
Parmetros:
- 128 -
ADVPL Intermedirio
Aparncia:
[1] Tipo do parmetro: Para cada tipo de parmetro as demais posies do array variam de
contedo conforme abaixo:
1- MsGet
[2] : Descrio
[3] : String contendo o inicializador do campo
[4] : String contendo a Picture do campo
[5] : String contendo a validao
[6] : Consulta F3
[7] : String contendo a validao When
[8] : Tamanho do MsGet
[9] : Flag .T./.F. Parmetro Obrigatrio ?
2- Combo
[2] : Descrio
[3] : Numrico contendo a opo inicial do combo
[4] : Array contendo as opes do Combo
[5] : Tamanho do Combo
[6] : Validao
[7] : Flag .T./.F. Parmetro Obrigatrio ?
- 129 -
ADVPL Intermedirio
3- Radio
[2] : Descrio
[3] : Numrico contendo a opo inicial do Radio
[4] : Array contendo as opes do Radio
[5] : Tamanho do Radio
[6] : Validao
[7] : Flag .T./.F. Parmetro Obrigatrio ?
6 - File
[2] : Descrio
[3] : String contendo o inicializador do campo
[4] : String contendo a Picture do campo
[5] : String contendo a validao
[6] : String contendo a validao When
[7] : Tamanho do MsGet
[8] : Flag .T./.F. Parmetro Obrigatrio ?
[9] : Texto contendo os tipos de arquivo
Ex.: "Arquivos .CSV |*.CSV"
[10]: Diretrio inicial do CGETFILE()
[11]: Parmetros do CGETFILE()
8- MsGet Password
[2] : Descrio
[3] : String contendo o inicializador do campo
[4] : String contendo a Picture do campo
[5] : String contendo a validao
[6] : Consulta F3
[7] : String contendo a validao When
[8] : Tamanho do MsGet
[9] : Flag .T./.F. Parmetro Obrigatrio ?
- 130 -
ADVPL Intermedirio
9- MsGet Say
[2] : String Contendo o Texto a ser apresentado
[3] : Tamanho da String
[4] : Altura da String
[5] : Negrito (lgico)
#include protheus.ch
/*/
+-----------------------------------------------------------------------
| Funo | xParamBox | Autor | ROBSON LUIZ |Data | |
+-----------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao da PARAMBOX como |
| | forma alternativa de disponibilizar parmetros em um |
| | processamento. |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local aRet := {}
Local aParamBox := {}
Local aCombo :=
{"Janeiro","Fevereiro","Maro","Abril","Maio","Junho","Julho","Agosto","Setembro
","Outubro","Novembro","Dezembro"}
Local i := 0
Private cCadastro := "xParambox"
AADD(aParamBox,{1,"Produto",Space(15),"","","SB1","",0,.F.})
AADD(aParamBox,{2,"Tipo de cliente",1,aCombo,50,"",.F.})
AADD(aParamBox,{3,"Mostra
deletados",IIF(Set(_SET_DELETED),1,2),{"Sim","No"},50,"",.F.})
AADD(aParamBox,{6,"Qual arquivo",Space(50),"","","",50,.F.,;
"Arquivo .DBF |*.DBF"})
AADD(aParamBox,{7,"Monte o filtro","SX5","X5_FILIAL==xFilial('SX5')"})
AADD(aParamBox,{8,"Digite a senha",Space(15),"","","","",80,.F.})
If ParamBox(aParamBox,"Teste Parmetros...",@aRet)
For i:=1 To Len(aRet)
MsgInfo(aRet[i],"Opo escolhida")
Next
Endif
Return
- 131 -
ADVPL Intermedirio
Exemplo: Protegendo os parmetros MV_PARs da Pergunte() em uso.
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | XPARBOX() | Autor | ARNALDO RAYMUNDO JR.|Data | |
+-----------------------------------------------------------------------------
| Descrio | Funo utilizando a PARAMBOX() e protegendo os MV_PARs |
| | ativos do programa principal. |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Static Function XPARBOX(cPerg)
Local aParamBox := {}
Local cTitulo := "Transferncia para Operao"
Local bOk := {|| .T.}
Local aButtons := {}; Local aRet := {}
Local nPosx; Local nPosy; Local nX := 0
Local cLoad := ""
Local lCentered := .T.; Local lCanSave := .F.; Local lUserSave := .F.
Local aParamAtu := Array(4)
Return
- 132 -
ADVPL Intermedirio
MDULO 05: Introduo a orientao objetos
Neste tpico sero os conceitos de programao orientada a objetos listados abaixo. Esta
breve viso geral do paradigma permitir entender melhor os conceitos associados
programao orientada a objetos e, em particular, s construes implementadas atravs da
linguagem ADVPL.
Objetos
Herana
Atributos
Mtodos
Classes
Abstrao
Generalizao
Encapsulamento
Polimorfismo
10.1. Definies
Objeto
Um objeto uma entidade do mundo real que tem uma identidade. Objetos podem
representar entidades concretas (um arquivo no meu computador, uma bicicleta) ou entidades
conceituais (uma estratgia de jogo, uma poltica de escalonamento em um sistema
operacional). Cada objeto ter sua identidade significa que dois objetos so distintos mesmo
que eles apresentem exatamente as mesmas caractersticas.
- 133 -
ADVPL Intermedirio
Classe
Cada classe descreve um conjunto (possivelmente infinito) de objetos individuais. Cada objeto
dito ser uma instncia de uma classe. Assim, cada instncia de uma classe tem seus prprios
valores para cada atributo, mas dividem os nomes dos atributos e mtodos com as outras
instncias da classe. Implicitamente, cada objeto contm uma referncia para sua prpria
classe, em outras palavras, ele sabe o que ele .
- 134 -
ADVPL Intermedirio
Polimorfismo
Polimorfismo tambm implica que uma operao de uma mesma classe pode ser
implementada por mais de um mtodo. O usurio no precisa saber quantas implementaes
existem para uma operao, ou explicitar qual mtodo deve ser utilizado: a linguagem de
programao deve ser capaz de selecionar o mtodo correto a partir do nome da operao,
classe do objeto e argumentos para a operao. Desta forma, novas classes podem ser
adicionadas sem necessidade de modificao de cdigo j existente, pois cada classe apenas
define os seus mtodos e atributos.
No mundo real, alguns objetos e classes podem ser descritos como casos especiais, ou
especializaes, de outros objetos e classes. Por exemplo, a classe de computadores pessoais
com processador da linha 80x86 uma especializao de computadores pessoais, que por sua
vez uma especializao de computadores. No desejvel que tudo que j foi descrito para
computadores tenha de ser repetido para computadores pessoais ou para computadores
pessoais com processador da linha 80x86.
Herana
- 135 -
ADVPL Intermedirio
10.2. Conceitos Bsicos
Abstrao
Abstrao consiste de focalizar nos aspectos essenciais inerentes a uma entidade e ignorar
propriedades acidentais. Em termos de desenvolvimento de sistemas, isto significa
concentrar-se no que um objeto e faz antes de se decidir como ele ser implementado. O
uso de abstrao preserva a liberdade para tomar decises de desenvolvimento ou de
implementao apenas quando h um melhor entendimento do problema a ser resolvido.
Encapsulamento
Compartilhamento
- 136 -
ADVPL Intermedirio
O desenvolvimento orientado a objetos no apenas permite que a informao dentro de um
projeto seja compartilhada como tambm oferece a possibilidade de reaproveitar projetos e
cdigo em projetos futuros. As ferramentas para alcanar este compartilhamento, tais como
abstrao, Encapsulamento e herana, esto presentes na metodologia; uma estratgia de
reuso entre projetos a definio de bibliotecas de elementos reusveis. Entretanto,
orientao a objetos no uma frmula mgica para alcanar reusabilidade; para tanto,
preciso planejamento e disciplina para pensar em termos genricos, no voltados
simplesmente para a aplicao corrente.
Uma vez que as principais definies e conceitos da abordagem de orientao a objetos esto
definidos, possvel introduzir o modelo de objetos que ser adotado ao longo deste texto. O
modelo apresentado um subconjunto do modelo OMT (Object Modeling Technique), proposto
por Rumbaugh entre outros. Este modelo tambm introduz uma representao diagramtica
para este modelo, a qual ser tambm apresentada aqui.
Objeto definido neste modelo como um conceito, abstrao ou coisa com limites e
significados bem definidos para a aplicao em questo. Objetos tm dois propsitos:
promover o entendimento do mundo real e suportar uma base prtica para uma
implementao computacional. No existe uma maneira correta de decompor um problema
em objetos; esta decomposio depende do julgamento do projetista e da natureza do
problema. Todos os objetos tm identidade prpria e so distinguveis.
Uma classe de objetos descreve um grupo de objetos com propriedades (atributos) similares,
comportamentos (operaes) similares, relacionamentos comuns com outros objetos e uma
semntica comum. Por exemplo, Pessoa e Companhia so classes de objetos. Cada pessoa
tem um nome e uma idade; estes seriam os atributos comuns da classe. Companhias tambm
podem ter os mesmos atributos nome e idade definidos. Entretanto, devido distino
semntica elas provavelmente estariam agrupados em outra classe que no Pessoa. Como se
pode observar, o agrupamento em classes no leva em conta apenas o compartilhamento de
propriedades.
Todo objeto sabe a que classe ele pertence, ou seja, a classe de um objeto um atributo
implcito do objeto. Este conceito suportado na maior parte das linguagens de programao
orientada a objetos, inclusive em ADVPL.
- 137 -
ADVPL Intermedirio
Figura: Representao diagramtica de OMT para classes e objetos
10.3.2. Atributos
Um atributo um valor de dado assumido pelos objetos de uma classe. Nome, idade e peso
so exemplos de atributos de objetos Pessoa. Cor, peso e modelo so possveis atributos de
objetos Carro. Cada atributo tem um valor para cada instncia de objeto. Por exemplo, o
atributo idade tem valor ``29'' no objeto Pedro Y. Em outras palavras, Pedro Y tem 29 anos de
idade. Diferentes instncias de objetos podem ter o mesmo valor para um dado atributo.
Cada nome de atributo nico para uma dada classe, mas no necessariamente nico entre
todas as classes. Por exemplo, ambos Pessoa e Companhia podem ter um atributo chamado
endereo.
- 138 -
ADVPL Intermedirio
10.3.3. Operaes e Mtodos
Uma operao uma funo ou transformao que pode ser aplicada a ou por objetos em uma
classe. Por exemplo, abrir, salvar e imprimir so operaes que podem ser aplicadas a objetos
da classe Arquivo. Todos os objetos em uma classe compartilham as mesmas operaes.
Uma mesma operao pode se aplicar a diversas classes diferentes. Uma operao como esta
dita ser polimrfica, ou seja, ela pode assumir distintas formas em classes diferentes.
Um mtodo a implementao de uma operao para uma classe. Por exemplo, a operao
imprimir pode ser implementada de forma distinta, dependendo se o arquivo a ser impresso
contm apenas texto ASCII, um arquivo de um processador de texto ou binrio. Todos estes
mtodos executam a mesma operao: imprimir o arquivo; porm, cada mtodo ser
implementado por um diferente cdigo.
- 139 -
ADVPL Intermedirio
10.3.4. Sugestes de desenvolvimento
- 140 -
ADVPL Intermedirio
11. Orientao a objetos em ADVPL
Neste tpico ser detalhada a forma com a qual a linguagem ADVPL implementa os conceitos
de orientao a objetos e a sintaxe utilizada no desenvolvimento de aplicaes.
Palavras reservadas
CLASS
CONSTRUCTOR
DATA
ENDCLASS
FROM
METHOD
SELF
CLASS
CONSTRUCTOR
DATA
ENDCLASS
Sintaxe ENDCLASS
- 141 -
ADVPL Intermedirio
FROM
METHOD
SELF
Operadores especficos
Local nPosCurso := 0
Local nNota := 0
nNota := ::aCursos[nPosCurso][2]
ENDIF
Return nNota
- 142 -
ADVPL Intermedirio
11.2. Estrutura de uma classe de objetos em ADVPL
Declarao da classe
Exemplo:
#include protheus.ch
CLASS Pessoa()
Desta forma recomendado o uso da notao Hngara tambm para a definio dos atributos
de forma a facilitar a anlise, interpretao e utilizao da classe e seus objetos instanciados.
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
A prototipao dos mtodos uma regra utilizada pelas linguagens orientadas a objetos,
atravs da qual so especificadas as operaes que podem ser realizadas pelo objeto,
diferenciando os mtodos de outras funes internas de uso da classe, e para especificar quais
so os mtodos construtores.
- 143 -
ADVPL Intermedirio
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
ENDCLASS
Mtodo Construtor
O mtodo construtor possui a caracterstica de retornar um objeto com o tipo da classe da qual
o mesmo foi instanciado. Por esta razo diz-se que o tipo do objeto instanciado a classe
daquele objeto.
Para produzir este efeito, o mtodo construtor utiliza a palavra reservada SELF, a qual
utilizada pela linguagem ADVPL para referncia a prpria classe daquele objeto.
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
ENDCLASS
::cNome := cNome
::nIdade := nIdade
Return SELF
- 144 -
ADVPL Intermedirio
Manipulao de atributos
Os atributos definidos para uma classe com a utilizao da palavra reservada DATA em sua
declarao podem ser manipulados por seus mtodos utilizando o operador ::.
Exemplo:
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
::cNome := cNome
::nIdade := nIdade
Return SELF
#include protheus.ch
Local oPessoa
Local cNome :=
Local dNascimento:= CTOD()
Local aDados := {}
aDados := GetDados()
oPessoa := Pessoa():Create(cNome,dNascimento)
Return
- 145 -
ADVPL Intermedirio
Exemplo parte 02: Classe Pessoa
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
DATA dNascimento
ENDCLASS
Seguindo o principio da orientao a objetos, a linguagem ADVPL permite que uma classe
receba por herana os mtodos e atributos definidos em uma outra classe, a qual tornasse a
superclasse desta instncia.
Para utilizar este recurso deve ser utilizada a palavra reservada FROM na declarao da
classe, especificando a superclasse que ser referenciada.
Em ADVPL o exemplo prtico desta situao a superclasse TSrvObject, a qual utilizada pela
maioria das classes e componentes da interface visual, como demonstrado no mdulo 06.
#include protheus.ch
CLASS Pessoa()
DATA cNome
DATA nIdade
DATA dNascimento
ENDCLASS
- 146 -
ADVPL Intermedirio
Exemplo parte 02: Declarao da classe Aluno
#include protheus.ch
CLASS Aluno() FROM Pessoa
DATA nID
DATA aCursos
ENDCLASS
Quanto utilizado o recurso de herana entre classes, o construtor da classe instanciada deve
receber um tratamento adicional, para que o objeto instanciado seja criado com os atributos e
mtodos definidos na superclasse.
Nestes casos, logo aps a definio do mtodo construtor da classe, dever ser executado o
mtodo construtor da superclasse.
METHOD Create(cNome,dNascimento,nID)
:Create(cNome,dNascimento) // Chamada do mtodo construtor da classe Pessoa.
::nID := ID
Return SELF
- 147 -
ADVPL Intermedirio
MDULO 06: ADVPL Orientado objetos I
Neste mdulo sero tratados os componentes e objetos da interface visual da linguagem
ADVPL, permitindo o desenvolvimento de aplicaes com interfaces grficas com sintaxe
orientada a objetos.
A linguagem ADVPL possui diversos componentes visuais e auxiliares, os quais podem ser
representados utilizando a estrutura abaixo:
Classes de Janelas
Msdialog
Tdialog
Twindow
Classes de Componentes
Tcontrol
Classes de Componentes
Visuais
Brgetddb
Mscalend
Mscalendgrid
Msselbr
Msworktime
Sbutton
Tbar
Tbitmap
Tbrowsebutton
Tbtnbmp
Tbtnbmp2
Tbutton
Tcbrowse
Tcheckbox
Tcolortriangle
Tcombobox
Tfolder
Tfont
Tget
Tgroup
Thbutton
Tibrowser
Tlistbox
Tmenu
Tmenubar
Tmeter
Tmsgraphic
Tmsgbar
Tmultibtn
Tmultiget
Tolecontainer
Tpageview
Tpanel
Tradmenu
Tsbrowse
Tsay
Tscrollbox
Tsimpleeditor
Tslider
- 148 -
ADVPL Intermedirio
Classes de Componentes
Visuais
Tsplitter
Ttabs
Ttoolbox
Twbrowse
Vcbrowse
TSRVOBJECT()
Classes auxiliares
TFONT()
Classes de janelas
MSDIALOG()
Classe de objetos que deve ser utilizada como padro de janela para
entrada de dados. MSDialog um tipo de janela dilogo modal, isto ,
Descrio
no permite que outra janela ativa receba dados enquanto esta estiver
ativa.
TDIALOG()
TWINDOW()
Classes de componentes
TCONTROL()
- 149 -
ADVPL Intermedirio
Classes de componentes visuais
BRGETDDB()
MSCALEND()
MSCALENDGRID()
MSSELBR()
MSWORKTIME()
SBUTTON()
TBAR()
TBITMAP()
TBROWSEBUTTON()
TBTNBMP()
- 150 -
ADVPL Intermedirio
TBTNBMP2()
TBUTTON()
TCBROWSE()
TCHECKBOX()
TCOLORTRIANGLE()
TCOMBOBOX()
TFOLDER()
TGET()
TGROUP()
- 151 -
ADVPL Intermedirio
THBUTTON()
TIBROWSER()
TLISTBOX()
TMENU()
TMENUBAR()
TMETER()
TMSGRAPHIC()
TMSGBAR()
TMULTIBTN()
TMULTIGET()
- 152 -
ADVPL Intermedirio
TOLECONTAINER()
TPAGEVIEW()
TPANEL()
TRADMENU()
TSBROWSE()
TSAY()
TSCROLLBOX()
TSIMPLEEDITOR()
TSLIDER()
TSPLITTER()
- 153 -
ADVPL Intermedirio
TTABS()
TTOOLBOX()
TWBROWSE()
VCBROWSE()
Classe de objetos visuais do tipo controle VCBrowse, a qual permite
Descrio
criar um controle visual do tipo Grid.
- 154 -
ADVPL Intermedirio
12.1. Particularidades dos componentes visuais
As cores deste padro so definidas pela seguinte frmula, a qual deve ser avaliada tendo
como base a paleta de cores no formato RGB:
Com base nesta paleta, podemos definir os valores das seguintes cores bsicas:
Cor R G B Valor
Preto 0 0 0 0
Azul 0 0 255 16711680
Verde 0 255 0 65280
Ciano 0 255 255 16776960
Vermelho 255 0 0 255
Rosa 255 0 255 16711935
Amarelo 255 255 0 65535
Branco 255 255 255 16777215
- 155 -
ADVPL Intermedirio
Para atribuir as cores aos objetos visuais devem ser observados os atributos utilizados para
estes fins em cada objeto, como por exemplo:
MSDIALOG()
TSAY()
Funo RGB()
A linguagem ADVPL possui a funo RGB() a qual retorna o valor da cor a ser definido, de
acordo com a parametrizao de cada um dos elementos da paleta RGB.
- 156 -
ADVPL Intermedirio
13. Aplicaes com a interface visual do ADVPL
Um Enchoice pode ser facilmente entendida como diversos conjuntos de objetos TSay e TGet
alinhados de forma a visualizar ou capturar informaes, normalmente vinculadas a arquivos
de cadastros ou movimentaes simples.
Abaixo temos a visualizao de uma Enchoice para o arquivo padro do ERP Protheus de
Cadastro de Clientes (SA1):
- 157 -
ADVPL Intermedirio
A linguagem ADVPL permite a implementao da Enchoice de duas formas similares:
13.1.1. Enchoice()
Sintaxe: Enchoice( cAlias, nReg, nOpc, aCRA, cLetra, cTexto, aAcho, aPos,
aCpos, nModelo, nColMens, cMensagem, cTudoOk, oWnd, lF3,
lMemoria, lColumn, caTela, lNoFolder, lProperty)
Retorno: Nil
Parmetros:
- 158 -
ADVPL Intermedirio
Exemplo: Utilizao da funo Enchoice()
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MBRWENCH | Autor | ARNALDO RAYMUNDO JR.|Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao da funo Enchoice() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
Local aCpoEnch := {}
Local aAlter := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
- 159 -
ADVPL Intermedirio
Exemplo (continuao):
aAlterEnch := aClone(aCpoEnch)
Return
13.1.2. MsMGet()
- 160 -
ADVPL Intermedirio
lMemoria Indica se a enchoice utilizar variveis de memria ou os
campos da tabela na edio
lColumn Indica se a apresentao dos campos ser em forma de
coluna
caTela Nome da varivel tipo "private" que a enchoice utilizar no
lugar da propriedade aTela
lNoFolder Indica se a enchoice no ir utilizar as Pastas de Cadastro
(SXA)
lProperty Indica se a enchoice no utilizar as variveis aTela e aGets,
somente suas propriedades com os mesmos nomes
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MBRWMSGET | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto MsMget() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SA1")
DbSetOrder(1)
MBrowse(6,1,22,75,"SA1")
Return
- 161 -
ADVPL Intermedirio
Exemplo (continuao):
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
oDlg := MSDIALOG():New(000,000,400,600,cCadastro,,,,,,,,,.T.)
RegToMemory(cAliasE, If(nOpc==3,.T.,.F.))
oDlg:lCentered := .T.
oDlg:Activate()
Return
A linguagem ADVPL permite a utilizao de basicamente dois tipos de objetos do tipo grid, ou
como tambm so conhecidos: multi-line:
MSGETDB()
MSGETDADOS()
MSNEWGETDADOS()
TWBROWSE()
MAWNDBROWSE()
MBROWSE()
Neste tpico sero tratadas as grids digitveis disponveis na linguagem ADVPL para o
desenvolvimento de interfaces de cadastros e manuteno de informaes.
- 162 -
ADVPL Intermedirio
13.2.1. MsGetDB()
A classe de objetos visuais MsGetDB() permite a criao de um grid digitvel com uma ou mais
colunas, baseado em uma tabela temporria.
Parmetros:
- 163 -
ADVPL Intermedirio
Aparncia:
Variveis private:
1- Pesquisar
2- Visualizar
3- Incluir
4- Alterar
5- Excluir
- 164 -
ADVPL Intermedirio
Variveis pblicas:
Funes de validao:
Mtodos adicionais:
#include protheus.ch
/*/
+-----------------------------------------------------------------------------
| Funo | GETDBSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto MsGetDB() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDB
Local nUsado := 0
Local aStruct := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 165 -
ADVPL Intermedirio
Exemplo (continuao):
AADD(aStruct,{"FLAG","L",1,0})
cCriaTrab := CriaTrab(aStruct,.T.)
DbUseArea(.T.,__LocalDriver,cCriaTrab,,.T.,.F.)
oDlg:lCentered := .T.
oDlg:Activate()
DbSelectArea(cCriaTrab)
DbCloseArea()
Return
- 166 -
ADVPL Intermedirio
13.2.2. MsGetDados()
A classe de objetos visuais MsGetDados() permite a criao de um grid digitvel com uma ou
mais colunas, baseado em um array.
Parmetros:
- 167 -
ADVPL Intermedirio
Aparncia:
Variveis private:
6- Pesquisar
7- Visualizar
8- Incluir
9- Alterar
10- Excluir
- 168 -
ADVPL Intermedirio
Variveis pblicas:
Funes de validao:
Mtodos adicionais:
#include protheus.ch
/*/
+-----------------------------------------------------------------------------
| Funo | GETDADOSA1 | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto MSGETADOS() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
Local nI
Local oDlg
Local oGetDados
Local nUsado := 0
Private lRefresh := .T.
Private aHeader := {}
Private aCols := {}
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek("SA1")
- 169 -
ADVPL Intermedirio
Exemplo (continuao):
AADD(aCols,Array(nUsado+1))
For nI := 1 To nUsado
aCols[1][nI] := CriaVar(aHeader[nI][2])
Next
aCols[1][nUsado+1] := .F.
oDlg:lCentered := .T.
oDlg:Activate()
Return
- 170 -
ADVPL Intermedirio
13.2.3. MsNewGetDados()
A classe de objetos visuais MsNewGetDados() permite a criao de um grid digitvel com uma
ou mais colunas, baseado em um array.
Parmetros:
- 171 -
ADVPL Intermedirio
Aparncia:
Variveis private:
1- Pesquisar
2- Visualizar
3- Incluir
4- Alterar
5- Excluir
- 172 -
ADVPL Intermedirio
Variveis pblicas:
Funes de validao:
Mtodos adicionais:
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MBRWGETD | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao dos objetos |
| | MsNewGetDados() e MsMGet() combinados |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
- 173 -
ADVPL Intermedirio
Exemplo (continuao):
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
- 174 -
ADVPL Intermedirio
Exemplo (continuao):
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
nUsado:=nUsado+1
AADD(aHeader,{ TRIM(x3_titulo), x3_campo, x3_picture,x3_tamanho,;
x3_decimal,"AllwaysTrue()",x3_usado, x3_tipo, x3_arquivo, x3_context } )
Endif
dbSkip()
End
If nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
Next
Else
aCols:={}
dbSelectArea("SC6")
dbSetOrder(1)
dbSeek(xFilial()+M->C5_NUM)
While !eof().and.C6_NUM==M->C5_NUM
AADD(aCols,Array(nUsado+1))
For nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
oEnch := MsMGet():New(cAliasE,nReg,nOpc,/*aCRA*/,/*cLetra*/,/*cTexto*/,;
aCpoEnch,aPos,aAlterEnch, nModelo, /*nColMens*/, /*cMensagem*/,;
/*cTudoOk*/, oDlg,lF3, lMemoria,lColumn,caTela,lNoFolder,;
lProperty)
- 175 -
ADVPL Intermedirio
13.2.3.1. Definindo cores personalizadas para o objeto MsNewGetDados()
Conforme visto no tpico sobre definio das propriedades de cores para os componentes
visuais, cada objeto possui caractersticas que devem ser respeitadas para correta utilizao
deste recurso.
Atributos adicionais:
lUseDefaultColors Atributo que dever ser definido como .F. para que as
alteraes nas cores sejam permitidas.
Mtodos adicionais:
SetBlkBackColor Mtodo que define a cor que ser utilizada para cada linha do
grid. No necessrio utilizar o mtodo Refresh() aps a
definio da cor por este mtodo.
Aparncia:
- 176 -
ADVPL Intermedirio
Exemplo: Definindo cores personalizadas para o objeto MsNewGetDados()
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MRBWGTCL | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao dos objetos |
| | MsNewGetDados() e MsMGet() combinados e tratamento de cores |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DbSelectArea("SC5")
DbSetOrder(1)
MBrowse(6,1,22,75,"SC5")
Return
Local nX := 0
Local nUsado := 0
Local aButtons := {}
Local aCpoEnch := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
Local aPos := {000,000,080,400}
Local nModelo := 3
Local lF3 := .F.
Local lMemoria := .T.
Local lColumn := .F.
Local caTela := ""
Local lNoFolder := .F.
Local lProperty := .F.
Local aCpoGDa := {}
Local cAliasGD := "SC6"
Local nSuperior := 081
Local nEsquerda := 000
Local nInferior := 250
Local nDireita := 400
Local cLinOk := "AllwaysTrue"
Local cTudoOk := "AllwaysTrue"
Local cIniCpos := "C6_ITEM"
Local nFreeze := 000
Local nMax := 999
- 177 -
ADVPL Intermedirio
Exemplo (continuao):
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0]
Private aGETS[0]
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
aAlterEnch := aClone(aCpoEnch)
DbSelectArea("SX3")
DbSetOrder(1)
MsSeek(cAliasGD)
aAlterGDa := aClone(aCpoGDa)
nUsado:=0
dbSelectArea("SX3")
dbSeek("SC6")
aHeader:={}
While !Eof().And.(x3_arquivo=="SC6")
If X3USO(x3_usado).And.cNivel>=x3_nivel
nUsado:=nUsado+1
AADD(aHeader,{ TRIM(x3_titulo), x3_campo, x3_picture,;
x3_tamanho, x3_decimal,"AllwaysTrue()",;
x3_usado, x3_tipo, x3_arquivo, x3_context } )
Endif
dbSkip()
End
- 178 -
ADVPL Intermedirio
Exemplo (continuao):
If nOpc==3 // Incluir
aCols:={Array(nUsado+1)}
aCols[1,nUsado+1]:=.F.
For nX:=1 to nUsado
IF aHeader[nX,2] == "C6_ITEM"
aCols[1,nX]:= "0001"
ELSE
aCols[1,nX]:=CriaVar(aHeader[nX,2])
ENDIF
Next
Else
aCols:={}
dbSelectArea("SC6")
dbSetOrder(1)
dbSeek(xFilial()+M->C5_NUM)
While !eof().and.C6_NUM==M->C5_NUM
AADD(aCols,Array(nUsado+1))
For nX:=1 to nUsado
aCols[Len(aCols),nX]:=FieldGet(FieldPos(aHeader[nX,2]))
Next
aCols[Len(aCols),nUsado+1]:=.F.
dbSkip()
End
Endif
RegToMemory("SC5", If(nOpc==3,.T.,.F.))
oGetD:oBrowse:lUseDefaultColors := .F.
oGetD:oBrowse:SetBlkBackColor({|| GETDCLR(oGetD:aCols,oGetD:nAt,aHeader)})
Return
- 179 -
ADVPL Intermedirio
Exemplo (continuao):
Return nRet
- 180 -
ADVPL Intermedirio
13.3. Barras de botes
13.3.1. EnchoiceBar()
Funo que cria uma barra de botes no formato padro utilizado pelas interfaces de cadastro
da aplicao Protheus.
Esta barra possui os botes padres para confirmar ou cancelar a interface e ainda permite a
adio de botes adicionais com a utilizao do parmetro aButtons.
Sintaxe:
Parmetros:
Aparncia:
- 181 -
ADVPL Intermedirio
Exemplo: Utilizao da funo EnchoiceBar()
#include "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | DENCHBAR | Autor | ARNALDO RAYMUNDO JR. |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao da funo |
| | EnchoiceBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
DEFINE MSDIALOG oDlg TITLE "Teste EnchoiceBar" FROM 000,000 TO 400,600 PIXEL OF;
oMainWnd
Return
- 182 -
ADVPL Intermedirio
13.3.2. TBar()
Parmetros:
Aparncia:
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------------
| Funo | TSTBAR | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto TBar() |
+-----------------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------------
/*/
- 183 -
ADVPL Intermedirio
Exemplo (continuao):
oDlg:lCentered := .T.
oDlg:Activate()
Return
13.3.3. ButtonBar
Sintaxe:
Retorno: ().
Parmetros:
- 184 -
ADVPL Intermedirio
A sintaxe ButtonBar requer a adio dos botes como recursos adicionais da barra
previamente definida utilizando a sintaxe abaixo:
Sintaxe adicional:
Parmetros:
Aparncia:
#include 'protheus.ch'
/*/
+-----------------------------------------------------------------------
| Funo | TstBBar | Autor | MICROSIGA |Data | |
+-----------------------------------------------------------------------
| Descrio | Programa que demonstra a utilizao do objeto TBar() |
+-----------------------------------------------------------------------
| Uso | Curso ADVPL |
+-----------------------------------------------------------------------
/*/
Local oDlg
Local oBtn1
Local oBtn2
- 185 -
ADVPL Intermedirio
Exemplo (continuao):
oBtn1:cTitle:="Calc"
DEFINE BUTTON RESOURCE "S4WB009N" OF oBar ACTION Agenda() TOOLTIP "Agenda"
DEFINE BUTTON RESOURCE "S4WB010N" OF oBar ACTION OurSpool() TOOLTIP "Spool"
DEFINE BUTTON RESOURCE "S4WB016N" OF oBar GROUP;
ACTION HelProg() TOOLTIP "Ajuda"
oBtn2:cTitle:="Param."
Return
- 186 -
ADVPL Intermedirio
13.3.4. Imagens pr-definidas para as barras de botes
Conforme mencionado nos tpicos anteriores, os botes visuais do tipo barra de botes
permitem a definio de itens com aes e imagens vinculadas.
Dentre os objetos e funes mencionados, foi citada a EnchoiceBar(), a qual permite a adio
de botes adicionais atravs do parmetro aButton, sendo que os itens deste array devem
possuir o seguinte formato:
Estrutura:
DESTINOS DISCAGEM
EDIT EDITABLE
EXCLUIR FORM
GRAF2D GRAF3D
LINE NOTE
OBJETIVO OK
PENDENTE PRECO
PRODUTO S4SB014N
S4WB001N S4WB005N
S4WB006N S4WB007N
S4WB008N S4WB009N
S4WB010N S4WB011N
S4WB013N S4WB014A
S4WB016N SIMULACA
VENDEDOR USER
Exemplo:
AADD(aButtons,{"USER",{||AllwaysTrue()},"Usurio"})
- 187 -
ADVPL Intermedirio
APNDICES
Para evitar esses problemas de arredondamento, deve ser utilizada a funo Round(),
principalmente antes de realizar uma comparao e antes de se utilizar a funo Int().
Exemplo 01:
Exemplo 02:
obrigatria a utilizao da identao, pois torna o cdigo muito mais legvel. Veja os
exemplos abaixo:
While !SB1->(Eof())
If mv_par01 == SB1->B1_COD
dbSkip()
Loop
Endif
Do Case
Case SB1->B1_LOCAL == 01 .OR. SB1->B1_LOCAL == 02
TrataLocal(SB1->B1_COD, SB1->B1_LOCAL)
Case SB1->B1_LOCAL == 03
TrataDefeito(SB1->B1_COD)
OtherWise
TrataCompra(SB1->B1_COD, SB1->B1_LOCAL)
EndCase
dbSkip()
EndDo
- 188 -
ADVPL Intermedirio
A utilizao da identao seguindo as estruturas de controle de fluxo (while, IF, caso 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
Para identar o cdigo utilize a tecla <TAB> e na ferramenta DEV-Studio, a qual pode ser
configurada atravs da opo Preferncias:
- 189 -
ADVPL Intermedirio
16. Capitulao de Palavras-Chave
dbSeek()
dbSelectArea()
Constantes:
Variveis de memria:
Campos:
SC6->C6_NUMPED
Querys:
SELECT * FROM...
- 190 -
ADVPL Intermedirio
17. Utilizao da Notao Hngara
Funcionalmente correto
Eficiente
Legvel
Reutilizvel
Extensvel
Portvel
- 191 -
ADVPL Intermedirio
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 envolve a utilizao de poucos
recursos de mquina, poucos chamadas de funes ou tornar mais rpido um processo.
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
cVar := Space(11)
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.
- 192 -
ADVPL Intermedirio
Utilizao de solues simples
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 primeira 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:
If cVar == "A" .Or. cVar == "B" .Or cVar == "C" .Or. cVar == "D"
If cVar $ "ABCD"
A melhor soluo aquela que envolve o problema imediato e previne problemas no futuro.
Considere o exemplo:
- 193 -
ADVPL Intermedirio
Existe uma opo de soluo de auto-ajuste disponvel que fcil de digitar e tem a garantia
de executar a tarefa igualmente (tornar todos os caracteres maisculos):
Este cdigo pode ser escrito de uma forma muito mais simples, conforme demonstrado abaixo:
nVar := nVar + 1
nVar := nVar -1
++nVar
--nVar
Deve-se apenas tomar cuidado com a precedncia destes operadores, pois o "++" ou o "--"
podem aparecer antes ou depois de uma varivel, e em alguns casos quando a varivel for
utilizada dentro de uma expresso, a prefixao ou sufixao destes operadores afetar o
resultado. Para maiores detalhes, consulte a documentao de operadores da linguagem
ADVPL.
- 194 -
ADVPL Intermedirio
Evitar passos desnecessrios
Existe uma diferena entre um bom hbito e perda de tempo. Algumas vezes estes conceitos
podem estar muito prximos, mas um modo de diferenci-los balancear os benefcios de
realizar alguma ao contra o problema que resultaria se no fosse executada. Observe o
exemplo:
Local nCnt := 0
For nCnt := 1 To 10
<cdigo>
Next nCnt
Neste exemplo no h nenhum ponto negativo e nada errado ocorrer se a varivel no for
inicializada, portanto aconselhvel evitar este tipo de inicializao, pois no torna o cdigo
mais seguro e tambm no expressa a inteno do cdigo mais claramente.
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.
- 195 -
ADVPL Intermedirio
Utilizao de alternativas
Quando se est trabalhando em uma simples rotina, deve-se tomar algum tempo para
explorar duas ou trs diferentes abordagens. Quando se est trabalhando em algo mais
complexo, deve-se planejar prototipar algumas a mais. Considere o seguinte cdigo:
If cHair = "A"
Replace hair With "Loira"
Else
If cHair = "B"
Replace hair With "Morena"
Else
If cHair = "C"
Replace hair With "Ruiva"
Else
If cHair = "D"
Replace hair With "Grisalho"
Else
Replace hair With "Preto"
Endif
Endif
Endif
Endif
Um cdigo de uma nica letra, (A at E), foi informado para indicar a cor de cabelo. Este
cdigo foi ento convertido e armazenado como uma string. Pode-se notar que a cor "Preto"
ser atribuda se nenhuma outra opo for verdadeira.
Uma alternativa que reduz o nvel de identao torna o cdigo mais fcil de ler enquanto reduz
o nmero de comandos replace:
Do Case
Case cHair == "A"
cColor := "Loira"
Case cHair == "B"
cColor := "Morena"
Case cHair == "C"
cColor := "Ruiva"
Case cHair == "D"
cColor := "Grisalho"
OtherWise
cColor := "Preto"
EndCase
- 196 -
ADVPL Intermedirio
Utilizao de arquivos de cabealho quando necessrio
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 a
ferramenta TOTVS DevStudio para a re-identao de cdigo. Para maiores detalhes, consulte a
documentao sobre a identao de cdigos fontes disponvel nos demais tpicos deste
material.
Espaos em branco extras tornam o cdigo mais fcil para a leitura. No necessrio imensas
reas em branco, mas agrupar pedaos de cdigo atravs da utilizao de espaos em branco
funciona muito bem. Costuma-se separar parmetros com espaos em branco.
Com o objetivo de tornar o cdigo mais fcil de ler e imprimir, as linhas do cdigo no devem
estender o limite da tela ou do papel. Podem ser "quebradas" em mais de uma linha de texto
utilizando o ponto-e-vrgula (;).
Capitulao de palavras-chave
local ncnt
while ( ncnt++ < 10 )
ntotal += ncnt * 2
enddo
- 197 -
ADVPL Intermedirio
O mesmo ficaria muito mais claro se re-escrito conforme abaixo:
Local nCnt
O mesmo vlido para nomes de funes, que devem descrever um pouco sobre o que a
funo faz. Novamente nomes extremamente curtos no so aconselhveis.
Utilizao de comentrios
Sempre que possvel, funes criadas devem ter uma breve descrio do seu objetivo,
parmetros e retorno. Alm de servir como documentao, os comentrios embelezam o
cdigo ao separar as funes umas das outras. Os comentrios devem ser utilizados com bom
senso, pois reescrever a sintaxe ADVPL em portugus torna-se apenas perda de tempo:
- 198 -
ADVPL Intermedirio
Criao de mensagens sistmicas significantes e consistentes
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":
Apesar do ADVPL suportar a abreviao de comandos em quatro letras (por exemplo, repl no
lugar de replace) no h necessidade de utilizar tal funcionalidade. Isto apenas torna o cdigo
mais difcil de ler e no torna a compilao mais rpida ou simples.
No deve-se criar constantes para expresses complexas. Isto tornar o cdigo muito difcil de
compreender e poder causar erros primrios, pois pode-se imaginar que uma atribuio
efetuada a uma varivel quando na verdade h toda uma expresso disfarada:
If ISDISK == 1
NUMLINES := 55
Endif
NUMPAGES += 1
- 199 -
ADVPL Intermedirio
A impresso que se tem aps uma leitura deste cdigo de que valores esto sendo atribudos
s variveis ou que constantes esto sendo utilizadas. Se o objetivo flexibilidade, o cdigo
anterior deve ser substitudo por:
#define NUMLINES 1
#define NUMPAGES 2
#define ISDISK 5
If aReturn[ISDISK] == 1
aPrintDefs[ NUMLINES ] := 55
Endif
aPrintDefs[ NUMPAGES ] += 1
Dada sua natureza binria, tudo pode ou no acontecer dentro de um computador. Adicionar
pedaos de cdigo apenas para "garantir a segurana" freqentemente utilizado como uma
desculpa para evitar corrigir o problema real. Isto pode incluir a checagem para validar
intervalos de datas ou para tipos de dados corretos, o que comumente utilizando em
funes:
Por exemplo, se existe uma mensagem comum como "Imprimindo, por favor aguarde..."
em muitas partes do cdigo, corre-se o risco de no seguir um padro para uma das
mensagens em algum lugar do cdigo. E mant-las em um nico lugar, como um arquivo de
cabealho, torna fcil a produo de documentao e a internacionalizao em outros idiomas.
- 200 -
ADVPL Intermedirio
LISTAS DE EXERCCIOS
Mdulo 04.1.: Desenvolvendo aplicaes em ADVPL
- 201 -
ADVPL Intermedirio
Implementar no Mbrowse() desenvolvido no item anterior a funo de
04
legenda.
- 202 -
ADVPL Intermedirio
Desenvolver um programa que implemente uma MarkBrowse() para a tabela
08 padro do sistema SA1 Cadastro de Cliente, contemplando uma funo que
permita a visualizao dos dados principais de mltiplos clientes selecionados.
- 203 -
ADVPL Intermedirio
Implementar na Modelo3() desenvolvida no item anterior as funcionalidades e
12
Alterao e Excluso.
- 204 -
ADVPL Intermedirio
Desenvolver um programa que implemente um relatrio que permita a
16
impresso de uma listagem simples das notas fiscais e seus respectivos itens.
- 205 -
ADVPL Intermedirio
Mdulo 04.2.: Oficina de Programao I
- 206 -
ADVPL Intermedirio
Desenvolver uma rotina que implementar um ListBox simples que permita
23
visualizar as tabelas cadastradas no SX5 Cadastro de Tabelas.
- 207 -
ADVPL Intermedirio
Mdulo 05: Introduo a orientao objetos
- 208 -
ADVPL Intermedirio
Mdulo 06: ADVPL orientado objetos I
- 209 -
ADVPL Intermedirio
Implementar na rotina desenvolvida no item anterior o uso da funo
33 EnchoiceBar() com um boto que permita ao usurio visualizar um dos itens
exibidos na interface.
- 210 -
ADVPL Intermedirio
Projeto: Avaliao prtica do treinamento de ADVPL Intermedirio
Objetivos do projeto
Dever ser entregue na data estabelecida pelo instrutor, contendo os fontes e demais arquivos
necessrios. A avaliao do projeto ser realizada aps a entrega, no prazo estabelecido pelo
instrutor;
Pode ser realizado em grupos de at 03 pessoas. Caso existam alunos sem grupos, estes podero
integrar equipes j formadas com o total de membros estabelecido, mediante aprovao do
instrutor;
Avaliao do projeto
Desenvolver uma aplicao utilizando a linguagem ADVPL que contemple as seguintes funcionalidades:
- 211 -
ADVPL Intermedirio
REFERNCIAS BIBLIOGRFICAS
Referncias bibliogrficas
Oficina de Programao
Robson Luiz Estefani Gonalves
Colaboradores
- 212 -
ADVPL Intermedirio
Educao Corporativa
CTOD()
Realiza a converso de uma informao do tipo caracter no formato DD/MM/AAAA para uma
varivel do tipo data.
Sintaxe: CTOD(cData)
Parmetros
Exemplo:
cData := 31/12/2006
dData := CTOD(cData)
CVALTOCHAR()
Realiza a converso de uma informao do tipo numrico em uma string, sem a adio de
espaos a informao.
Sintaxe: CVALTOCHAR(nValor)
Parmetros
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
- 214 -
Guia de Referncia Rpida
ADVPL Intermedirio
DTOC()
Realiza a converso de uma informao do tipo data para em caracter, sendo o resultado no
formato DD/MM/AAAA.
Sintaxe: DTOC(dData)
Parmetros
Exemplo:
DTOS()
Sintaxe: DTOS(dData)
Parmetros
Exemplo:
STOD()
Sintaxe: STOD(sData)
Parmetros
Exemplo:
sData := LERSTR(01,08) // Funo que realiza a leitura de uma string de um txt previamente
// aberto
dData := STOD(sData)
- 215 -
Guia de Referncia Rpida
ADVPL Intermedirio
STR()
Realiza a converso de uma informao do tipo numrico em uma string, adicionando espaos
direita.
Sintaxe: STR(nValor)
Parmetros
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
STRZERO()
Realiza a converso de uma informao do tipo numrico em uma string, adicionando zeros
esquerda do nmero convertido, de forma que a string gerada tenha o tamanho especificado
no parmetro.
Exemplo:
FOR nPercorridos := 1 to 10
MSGINFO(Passos percorridos: +CvalToChar(nPercorridos))
NEXT nPercorridos
- 216 -
Guia de Referncia Rpida
ADVPL Intermedirio
VAL()
Sintaxe: VAL(cValor)
Parmetros
Exemplo:
- 217 -
Guia de Referncia Rpida
ADVPL Intermedirio
Matemticas
ACOS()
Sintaxe: ACOS(nValor)
Parmetros:
Retorno:
CEILING()
Funo utilizada para calcular o valor mais prximo possvel de um valor nMax informado como
parmetro para a funo.
Sintaxe: CELLING(nMax)
Parmetros
Retorno:
Numrico
Valor do tipo double, representando o menor inteiro que maior ou igual ao
valor de nX. No h retorno de erro na funo.
COS()
Sintaxe: COS(nAngulo)
Parmetros:
Retorno:
- 218 -
Guia de Referncia Rpida
ADVPL Intermedirio
Situaes invlidas:
LOG10()
Funo utilizada para calcular o logaritmo natural de um valor numrico, em base 10.
LOG10() uma funo numrica que calcula o logaritmo natural de um nmero. O logaritmo
natural tem como base o valor 10. Devido ao arredondamento matemtico, os valores
retornados por LOG() podem no coincidir exatamente.
Sintaxe: LOG10(nNatural)
Parmetros:
Retorno:
SIN()
Funo utilizada para calcular o valor do seno ou seno hiperblico. Devemos informar como
parmetro para a funo um valor que representa o angulo em radianos.
Sintaxe: SIN(nAngulo)
Parmetros:
Retorno:
Situaes invlidas:
- 219 -
Guia de Referncia Rpida
ADVPL Intermedirio
SQRT()
Sintaxe: SQRT(nValor)
Parmetros:
Retorno:
TAN()
Sintaxe: TAN(nAngulo)
Parmetros:
Retorno:
Situaes invlidas:
- 220 -
Guia de Referncia Rpida
ADVPL Intermedirio
Anlise de variveis
TYPE()
Determina o tipo do contedo de uma varivel, a qual no foi definida na funo em execuo.
Sintaxe: TYPE(cVariavel)
Parmetros
Exemplo:
IF TYPE(dDataBase) == D
MSGINFO(Database do sistema: +DTOC(dDataBase))
ELSE
MSGINFO(Varivel indefinida no momento)
ENDIF
VALTYPE()
Determina o tipo do contedo de uma varivel, a qual no foi definida na funo em execuo.
Sintaxe: VALTYPE(cVariavel)
Parmetros
Exemplo:
STATIC FUNCTION GETTEXTO(nTamanho, cTitulo, cSay)
LOCAL cTexto :=
LOCAL nColF, nLargGet := 0
PRIVATE oDlg
Default cTitulo := "Tela para informar texto"
Default cSay := "Informe o texto:"
Default nTamanho := 1
- 221 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de arrays
AADD()
A funo AADD() permite a insero de um item em um array j existente, sendo que este
item podem ser um elemento simples, um objeto ou outro array.
Exemplo:
aDados := {} // Define que a varivel aDados um array, sem especificar suas dimenses.
aItem := {} // Define que a varivel aItem um array, sem especificar suas dimenses.
// Neste ponto o array a Item possui 03 elementos os quais podem ser acessados com:
// aItem[1] -> corresponde ao contedo de cVariavel1
// aItem[2] -> corresponde ao contedo de cVariavel2
// aItem[3] -> corresponde ao contedo de cVariavel3
// Neste ponto, o array a aDados possui apenas um elemento, que tambm um array
// contendo 03 elementos:
// aDados [1][1] -> corresponde ao contedo de cVariavel1
// aDados [1][2] -> corresponde ao contedo de cVariavel2
// aDados [1][3] -> corresponde ao contedo de cVariavel3
AADD(aDados, aItem)
AADD(aDados, aItem)
// Neste ponto, o array aDados possui 03 elementos, aonde cada qual um array com outros
// 03 elementos, sendo:
- 222 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
// Desta forma, o array aDados montando com uma estrutura de 03 linhas e 03 colunas, com
// o contedo definido por variveis externas, mas com a mesma forma obtida com o uso do
// comando: aDados := ARRAY(3,3).
ACLONE()
A funo ACLONE() realiza a cpia dos elementos de um array para outro array integralmente.
Sintaxe: AADD(aArray)
Parmetros
aArray Array pr-existente que ter seu contedo copiado para o array especificado.
Exemplo:
// Neste ponto, o array aItens possui exatamente a mesma estrutura e informaes do array
// aDados.
ACOPY()
Funo de array que copia elementos do array aOrigem para array aDestino. O array destino
aDestino j deve ter sido declarado e grande o bastante para conter os elementos que sero
copiados. Se o array aOrigem contiver mais elementos, alguns dos elementos no sero
copiados. ACOPY() copia os valores de todos os dados, incluindo valores nulos (NIL) e cdigos
de bloco.
- 223 -
Guia de Referncia Rpida
ADVPL Intermedirio
nQtde indica a quantidade de elementos a serem copiados a partir do array
aOrigem. iniciando-se a contagem a partir da posio nInicio. Se nQtde
no for especificado, todos os elementos do array aOrigem sero copiados,
iniciando-se a partir da posio nInicio.
nPosDestino a posio do elemento inicial no array aDestino que receber os
elementos de aOrigem. Se no especificado, ser assumido 01.
Retorno:
Exemplo:
ADEL()
Exemplo:
- 224 -
Guia de Referncia Rpida
ADVPL Intermedirio
ADIR()
Funo que preenche os arrays passados com os dados dos arquivos encontrados, atravs da
mscara informada. Tanto arquivos locais (Remote) como do servidor podem ser informados.
Parmetros:
Retorno:
Exemplo:
LOCAL aFiles[ADIR("*.TXT")]
ADIR("*.TXT", aFiles)
AEVAL(aFiles, { |element| QOUT(element) })
- 225 -
Guia de Referncia Rpida
ADVPL Intermedirio
AFILL()
Funo de manipulao de arrays, que preenche os elementos do array com qualquer tipo de
dado. Incluindo code-block. Esta funo no deve ser usada para preencher um array com
outro array.
Retorno:
Exemplo:
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()
Exemplo:
AINS(aAlunos,3)
// Neste ponto o array aAlunos ter o seguinte contedo:
// {Edson, Robson, nulo, Renato, Tatiana}
- 226 -
Guia de Referncia Rpida
ADVPL Intermedirio
Similar ao efeito da funo ADEL(), o elemento inserido no array pela funo
AINS() ter um contedo nulo, sendo necessrio trata-lo aps a realizao
deste comando.
ARRAY()
A funo Array() utilizada na definio de variveis de tipo array, como uma opo a sintaxe
utilizando chaves ({}).
Exemplo:
aDados := Array(3,3) // Cria um array de trs linhas, cada qual com 3 colunas.
ASCAN()
A funo ASCAN() permite que seja identificada a posio do array que contm uma
determinada informao, atravs da anlise de uma expresso descrita em um bloco de
cdigo.
Exemplo:
- 227 -
Guia de Referncia Rpida
ADVPL Intermedirio
Durante a execuo da funo aScan, a varivel x receber o contedo o
item que est posicionado no momento, no caso aAlunos[x]. Como aAlunos[x]
uma posio do array que contm o nome do aluno, x poderia ser
renomeada para cNome, e a definio do bloco bSeek poderia ser re-escrita
como:
Sempre opte por analisar como o bloco de cdigo ser utilizado e ao invs de
x, y e similares, defina os parmetros com nomes que representem seu
contedo. Ser mais simples o seu entendimento e o entendimento de outros
que forem analisar o cdigo escrito.
ASCANX()
Funo utilizada para varrer um vetor procurando um valor especificado, operando de forma
similar a funo ASCAN.
A diferena fundamental da funo ASCANX que esta funo recebe um segundo parmetro
em seu code-block representando o ndice do array.
Sintaxe: ASCANX ( < xDestino > , < bSeek > , [ nInicio ] , [ nCont ] )
Parmetros:
xDestino Representa o objeto a ser varrido pela funo, pode ser atribudo ao
parmetro um array um Objeto.
bSeek Representa o valor que ser pesquisado, podendo ser um bloco de cdigo.
nInicio Representa o elemento a partir do qual ter inicio a pesquisa, quando este
argumento no for informado o valor default ser 1.
nCont Representa a quantidade de elementos que sero pesquisados a partir da
posio inicial, quando este argumento no for informado todos elementos
do array sero pesquisados.
Exemplo.:
- 228 -
Guia de Referncia Rpida
ADVPL Intermedirio
No cdigo demonstrado acima, note a incluso no code-block do Y, onde a
funo ir terminar sua execuo em 3 condies:
ASIZE()
nTamanho Tamanho com o qual deseja-se redefinir o array. Se o tamanho for menor do
que o atual, sero removidos os elementos do final do array, j se o
tamanho for maior do que o atual sero inseridos itens nulos ao final do
array.
Exemplo:
// Utilizando o array aItens, o qual teve um elemento excludo pelo uso da funo ADEL()
ASIZE(aItens,Len(aItens-1))
// Neste ponto o array aItens possui 02 elementos, ambos com contedos vlidos.
- 229 -
Guia de Referncia Rpida
ADVPL Intermedirio
ASORT()
A funo ASORT() permite que os itens de um array sejam ordenados a partir de um critrio
pr-estabelecido.
aArray Array pr-existente que ter seu contedo ordenado atravs de um critrio
estabelecido.
nInicio Posio inicial do array para incio da ordenao. Caso no seja informado, o
array ser ordenado a partir de seu primeiro elemento.
nItens Quantos itens, a partir da posio inicial devero ser ordenados. Caso no
seja informado, sero ordenados todos os elementos do array.
bOrdem Bloco de cdigo que permite a definio do critrio de ordenao do array.
Caso bOrdem no seja informado, ser utilizado o critrio ascendente.
Com base nesse requisito, pode-se definir um bloco de cdigo com a estrutura
abaixo:
aSort(aAlunos)
- 230 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo 02 Ordenao descendente
// Durante a execuo da funo aSort(), a varivel x receber o contedo do item que est
// posicionado. Como o item que est posicionado a posio aAlunos[x] e aAlunos[x] ->
// string contendo o nome de um aluno, pode-se substituir x por cNomeAtu.
// A varivel y receber o contedo do prximo item a ser avaliado, e usando a mesma
// analogia de x, pode-se substituir y por cNomeProx. Desta forma o bloco de cdigo
// bOrdem pode ser re-escrito como:
aSort(aAlunos,,bOrdem)
ATAIL()
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 )]
Retorno:
Exemplo:
- 231 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de blocos de cdigo
EVAL()
Exemplo:
nInt := 10
bBloco := {|N| x:= 10, y:= x*N, z:= y/(x*N)}
nValor := EVAL(bBloco, nInt)
// O retorno ser dado pela avaliao da ultima ao da lista de expresses, no caso z.
// Cada uma das variveis definidas em uma das aes da lista de expresses fica disponvel
// para a prxima ao.
// Desta forma temos:
// N recebe nInt como parmetro (10)
// X tem atribudo o valor 10 (10)
// Y resultado da multiplicao de X por N (100)
// Z resultado a diviso de Y pela multiplicao de X por N ( 100 / 100) 1
DBEVAL()
A funo DBEval() permite que todos os registro de uma determinada tabela sejam analisados
e para cada registro ser executado o bloco de cdigo definido.
bBloco Bloco de cdigo principal, contendo as expresses que sero avaliadas para
cada registro do alias ativo.
bFor Condio para continuao da anlise dos registros, com o efeito de uma
estrutura For ... Next.
bWhile Condio para continuao da anlise dos registros, com o efeito de uma
estrutura While ... End
- 232 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo 01:
// Considerando o trecho de cdigo abaixo:
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
Exemplo 02:
// Considerando o trecho de cdigo abaixo:
dbSelectArea(SX5)
dbSetOrder(1)
dbGotop()
- 233 -
Guia de Referncia Rpida
ADVPL Intermedirio
AEVAL()
A funo AEVAL() permite que todos os elementos de um determinada array sejam analisados
e para cada elemento ser executado o bloco de cdigo definido.
bBloco Bloco de cdigo principal, contendo as expresses que sero avaliadas para
cada elemento do array informado.
Exemplo 01:
AADD(aCampos,A1_FILIAL)
AADD(aCampos,A1_COD)
SX3->(dbSetOrder(2))
For nX:=1 To Len(aCampos)
SX3->(dbSeek(aCampos[nX]))
AADD(aTitulos,AllTrim(SX3->X3_TITULO))
Next nX
- 234 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de strings
ALLTRIM()
Retorna uma string sem os espaos direita e esquerda, referente ao contedo informado
como parmetro.
A funo ALLTRIM() implementa as aes das funes RTRIM (right trim) e LTRIM (left
trim).
Sintaxe: ALLTRIM(cString)
Parmetros
cString String que ser avaliada para remoo dos espaos a direita e a esquerda.
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
ASC()
Converte uma informao caractere em seu valor de acordo com a tabela ASCII.
Sintaxe: ASC(cCaractere)
Parmetros
Exemplo:
- 235 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
EndCase
cRet := cRet+cLetra
Next
Return UPPER(cRet)
AT()
Exemplo:
STATIC FUNCTION NOMASCARA(cString,cMascara,nTamanho)
RETURN cNoMascara
- 236 -
Guia de Referncia Rpida
ADVPL Intermedirio
BITON()
Funo utilizada para ligar determinados bits de uma String passada por parmetro para a
funo. Alm da string ser alterada, a funo tambm recebe como parmetro um numrico
que indica o bit de inicio a ser alterado, um numrico que indica a quantidade de bits a serem
alterados(ligados) e o tamanho da string passada.
Sintaxe: BITON ( < cValue > , < nBitIni > , < nBitEnd > , < nStrLen > )
Parmetros
CAPITAL()
Funo que avalia a string passada como parmetro alterando a primeira letra de cada palavra
para maiscula e as demais letras como minsculas.
Sintaxe: CAPITAL(cFrase)
Parmetros:
Retorno:
CHR()
Converte um valor nmero referente a uma informao da tabela ASCII no caractere que esta
informao representa.
Sintaxe: CHR(nASCII)
Parmetros
Exemplo:
- 237 -
Guia de Referncia Rpida
ADVPL Intermedirio
DESCEND()
Retorno:
Exemplo:
// Este exemplo utiliza DESCEND() em uma expresso INDEX para criar um ndice de datas de
// ordem descendente:
// Depois, DESCEND() pode ser utilizado para fazer uma pesquisa (SEEK) no ndice
// descendente:
DbSEEK(DESCEND(DTOS(dFindDate)))
GETDTOVAL()
Funo utilizada para retornar um numero formatado, de acordo com o valor passado por
parmetro, sendo que ir apenas manter os valores numricos contidos na string passada por
parmetro, verificando se existe algum caractere '.' retornando um numero fracionrio, na
ordem dos nmeros contidos na string.
A funo muito til quando desejamos utilizar o valor numrico de uma data que est
contida em uma string.
Parmetros:
cDtoVal Representa uma string contendo um valor numrico no qual ser convertido.
Retorno:
- 238 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
ISALPHA()
Parmetros:
Retorno:
ISDIGIT()
Parmetros:
Retorno:
Lgico Retorna verdadeiro (.T.) caso o primeiro caractere da cadeia seja um dgito
entre zero e nove; caso contrrio, retorna falso (.F.).
- 239 -
Guia de Referncia Rpida
ADVPL Intermedirio
ISLOWER()
Funo utilizada para determinar se o caractere mais esquerda uma letra minscula,
permitindo avaliar se o primeiro caractere de um string uma letra minscula. o contrrio
de ISUPPER(), a qual determina se a cadeia de caracteres comea com uma letra maiscula.
ISLOWER() e ISUPPER() ambas so relacionadas s funes LOWER() e UPPER(), que
convertem caracteres minsculos para maisculos, e vice-versa.
Parmetros:
Retorno:
Lgico Retorna verdadeiro (.T.) caso o primeiro caractere da cadeia seja minsculo ,
caso contrrio, retorna falso (.F.).
ISUPPER()
Funo utilizada para determinar se o caractere mais esquerda uma letra maiscula,
permitindo avaliar se o primeiro caractere de um string uma letra maiscula. o contrrio
de ISLOWER (), a qual determina se a cadeia de caracteres comea com uma letra minscula.
ISLOWER() e ISUPPER() ambas so relacionadas s funes LOWER() e UPPER(), que
convertem caracteres minsculos para maisculos, e vice-versa.
Parmetros:
Retorno:
Lgico Retorna verdadeiro (.T.) caso o primeiro caractere da cadeia seja maisculo ,
caso contrrio, retorna falso (.F.).
LEN()
Sintaxe: LEN(cString)
Parmetros
Exemplo:
cNome := ALLTRIM(SA1->A1_NOME)
MSGINFO(Dados do campo A1_NOME:+CRLF
Tamanho: + CVALTOCHAR(LEN(SA1->A1_NOME))+CRLF
Texto: + CVALTOCHAR(LEN(cNome)))
- 240 -
Guia de Referncia Rpida
ADVPL Intermedirio
LOWER()
Retorna uma string com todos os caracteres minsculos, tendo como base a string passada
como parmetro.
Sintaxe: LOWER(cString)
Parmetros
Exemplo:
cTexto := ADVPL
MSGINFO(Texto:+LOWER(cTexto))
LTRIM()
Funo para tratamento de caracteres utilizada para formatar cadeias de caracteres que
possuam espaos em branco esquerda. Pode ser o caso de, por exemplo, nmeros
convertidos para cadeias de caracteres atravs da funo STR().
Retorno:
Caracter LTRIM() retorna uma cpia de <cString>, sendo que os espaos em branco
esquerda foram removidos. Caso <cString> seja uma cadeia de caracteres
nula ("") ou toda composta de espaos em branco, LTRIM() retorna uma
cadeia de caracteres nula ("").
- 241 -
Guia de Referncia Rpida
ADVPL Intermedirio
MATHC()
Funo utilizada para realizar operaes matemticas com strings que contm um valor
numrico. MATHC() realiza algumas operaes matemticas como: Soma, Subtrao, Diviso,
Multiplicao e Exponenciao.
A funo ir retornar uma string contendo o resultado da operao matemtica, com uma
especificao de at 18 casas de preciso no numero.
Sintaxe: MATHC ( < cNum1 > , < cOperacao > , < cNum2 > )
Parmetros:
Retorno:
OEMTOANSI()
Funo que transforma uma string no Formato OEM / MS-DOS Text para uma string ANSI
Text ( formato do Windows ).
Quando utilizamos um programa baseado no MS-DOS para alimentar uma base de dados , os
acentos e caracteres especiais so gravados como texto OEM . Para tornar possvel a correta
visualizao destes dados em uma interface Windows , utilizamos a funo OemToAnsi() para
realizar a converso.
Ao utilizarmos um programa baseado no Windows para alimentar uma base de dados , o texto
capturado no formato ANSI Text . Caso este texto seja utilizado para alimentar uma base de
dados a ser acessada atravs de um programa MS-DOS , devemos converter o dado para OEM
antes de grav-lo , atravs da funo AnsiToOem().
Retorno:
- 242 -
Guia de Referncia Rpida
ADVPL Intermedirio
PADL() / PADR() / PADC()
PADC(), PADL(), e PADR() so utilizadas para exibir cadeias de caracteres de tamanho varivel
em uma rea de tamanho fixo. Elas podem ser usadas, por exemplo, para assegurar o
alinhamento com comandos ?? consecutivos. Outra utilizao exibir textos em uma tela de
tamanho fixo, para certificar-se de que o texto anterior foi completamente sobrescrito.
Sintaxe: PADL / PADR / PADC ( < cExp > , < nTamanho > , [ cCaracPreench ] )
Parmetros
Retorno:
RAT()
- 243 -
Guia de Referncia Rpida
ADVPL Intermedirio
REPLICATE()
A funo Replicate() utilizada para gerar uma cadeira de caracteres repetidos a partir de um
caracter base informado, podendo a string gerada conter at 64KB. Caso seja especificado no
parmetro de itens a repetir o nmero zero, ser retornada uma string vazia.
Parmetros:
Retorno:
RTRIM()
Funo para tratamento de caracteres utilizada para formatar cadeias de caracteres que
contenham espaos em branco direita. Ela til quando voc deseja eliminar espaos em
branco direita ao se concatenar cadeias de caracteres. o caso tpico com campos de banco
de dados que so armazenados em formato de tamanho fixo. Por exemplo, voc pode usar
RTRIM() para concatenar o primeiro e o ltimo campos de nome para formar uma cadeia de
caracteres de nome.
Parmetros:
Retorno:
Caracter RTRIM() retorna uma cpia de <cString>, sendo que os espaos em branco
direita foram removidos. Caso <cString> seja uma cadeia de caracteres
nula ("") ou totalmente composta por espaos, RTRIM() retorna uma cadeia
de caracteres nula ("").
- 244 -
Guia de Referncia Rpida
ADVPL Intermedirio
SPACE()
Parmetros:
Retorno:
STRTOKARR()
Funo utilizada para retornar um array, de acordo com os dados passados como parmetro
para a funo. Esta funo recebe uma string <cValue> e um caracter <cToken> que
representa um separador, e para toda ocorrncia deste separador em <cValue> adicionado
um item no array.
Parmetros:
Retorno:
Exemplo:
- 245 -
Guia de Referncia Rpida
ADVPL Intermedirio
STRTRAN()
Funo utilizada para realizar a busca da ocorrncia da string, sendo case sensitive.
Sintaxe: STRTRAN ( < cString > , < cSearch > , [ cReplace ] , [ nStart ] , [
nCount ] )
Parmetros:
Retorno:
STUFF()
Parmetros:
Retorno:
- 246 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
SUBSTR()
Retorna parte do contedo de uma string especificada, de acordo com a posio inicial deste
contedo na string e a quantidade de caracteres que dever ser retornada a partir daquele
ponto (inclusive).
Exemplo:
cCampo := A1_NOME
nPosUnder := AT(cCampo)
cPrefixo := SUBSTR(cCampo,1, nPosUnder) // A1_
TRANSFORM()
Funo de converso que formata valores caractere, data, lgicos e numricos conforme um
string de mscara especificado, a qual inclui uma combinao de strings de template e funes
de picture. Ela faz o mesmo que a clusula PICTURE do comando @...SAY, sendo normalmente
utilizada para formatar dados a serem enviados tela ou impressora.
Parmetros:
cExp O valor a ser formatado. Esta expresso pode ser qualquer tipo de dados
vlidos, exceto vetor, bloco de cdigo, e NIL.
cSayPicture Uma string de caracteres de mscara e template usado para descrever o
formato da cadeia de caracteres a ser retornada.
Retorno:
- 247 -
Guia de Referncia Rpida
ADVPL Intermedirio
UPPER()
Retorna uma string com todos os caracteres maisculos, tendo como base a string passada
como parmetro.
Sintaxe: UPPER(cString)
Parmetros
Exemplo:
cTexto := ADVPL
MSGINFO(Texto:+LOWER(cTexto))
- 248 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de data / hora
CDOW()
Retorno:
cDayWeek Nome do dia da semana como uma cadeia de caracteres. A primeira letra
maiscula e as demais minsculas.
Exemplo:
CMONTH()
Funo de converso de datas que retorna uma cadeia de caracteres com o nome do ms em
ingls.
Retorno:
Exemplo:
- 249 -
Guia de Referncia Rpida
ADVPL Intermedirio
DATE()
Funo que retorna a data do atual sistema. O formato de sada controlado pelo comando
SET DATE, sendo que o formato padro mm/dd/yy.
Sintaxe: DATE()
Parmetros:
Nenhum .
Retorno:
Exemplo:
DAY()
Funo de converso de datas usada para converter o valor data em um nmero inteiro que
representa o dia do ms. Esta funo pode ser usada em conjunto com CMONTH() e YEAR()
para formatar datas. Pode ser usada tambm em diversos clculos envolvendo datas.
Retorno:
Exemplo:
// 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
- 250 -
Guia de Referncia Rpida
ADVPL Intermedirio
DOW()
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.
Retorno:
Exemplo:
DTOC()
Funo para converso de 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().
Em expresses de ndices de arquivo, use DTOS() no lugar de DTOC() para converter datas
para cadeia de caracteres.
Retorno:
Exemplo:
- 251 -
Guia de Referncia Rpida
ADVPL Intermedirio
DTOS()
Funo para converso de uma data que pode ser usada para criar expresses de ndice. O
resultado estruturado visando manter a ordem correta do ndice (ano, ms, dia).
Retorno:
sData 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.
Exemplo:
ELAPTIME()
Funo que 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.
Retorno:
Exemplo:
- 252 -
Guia de Referncia Rpida
ADVPL Intermedirio
MONTH()
Funo de converso que extrai da data o valor numrico do ms, semelhante a funo que
retorna o nome do ms a partir do valor de dData.
Retorno:
Exemplo:
SECONDS()
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.
Sintaxe: SECONDS()
Parmetros:
Nenhum .
Retorno:
Exemplo:
- 253 -
Guia de Referncia Rpida
ADVPL Intermedirio
TIME()
Funo que retorna a hora do sistema como uma cadeia de caracteres, e que est relacionada
com SECONDS(), que retorna o valor inteiro representando o nmero de segundos desde a
meia-noite. SECONDS() geralmente usada no lugar de TIME() para clculos.
Sintaxe: TIME()
Parmetros:
Nenhum .
Retorno:
Exemplo:
YEAR()
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.
Retorno:
Exemplo 01:
- 254 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo 02:
// Este exemplo cria uma funo de usurio que usa a funo YEAR() para formatar o valor da
// data:
ABS()
Sintaxe: ABS(nValor)
Parmetros
Exemplo:
nPessoas := 20
nLugares := 18
ALEATORIO()
Gera um nmero aleatrio de acordo com a semente passada. Esta funo retorna um nmero
aleatrio menor ou igual ao primeiro parmetro informado, usando como semente o segundo
parmetro. recomendado que esta semente seja sempre o ltimo nmero aleatrio gerado
por esta funo.
Sintaxe: Aleatorio(nMax,nSeed)
Parmetros
- 255 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo Funo ALEATORIO()
nSeed := 0
For i := 1 to 100
nSeed := Aleatorio(100,nSeed)
? Str(i,3)+ numero aleatorio gerado: +Str(nSeed,3)
Next i
inkey(0)
Return
INT()
Sintaxe: INT(nValor)
Parmetros
Exemplo:
RETURN nQuantidade
NOROUND()
- 256 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo Funo NOROUND()
nBase := 2.985
nValor := NOROUND(nBase,2) 2.98
RANDOMIZE()
Observao :
O limite inferior recebido atravs do parmetro nMinimo "maior ou igual a ", podendo
ser sorteado e fazer parte do retorno; porm o limite superior "menor que", de modo
a nunca ser atingido ou devolvido no resultado. Por exemplo , a chamada da funo
RANDOMIZE(1,2) sempre retornar 1 .
Parmetros
Retorno:
ROUND()
Exemplo:
nBase := 2.985
nValor := ROUND(nBase,2) 2.99
- 257 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de arquivos
ADIR()
Funo que preenche os arrays passados com os dados dos arquivos encontrados, atravs da
mscara informada. Tanto arquivos locais (Remote) como do servidor podem ser informados.
Parmetros:
Retorno:
Exemplo:
LOCAL aFiles[ADIR("*.TXT")]
ADIR("*.TXT", aFiles)
AEVAL(aFiles, { |element| QOUT(element) })
- 258 -
Guia de Referncia Rpida
ADVPL Intermedirio
CGETFILE()
Parmetros:
Exemplo:
- 259 -
Guia de Referncia Rpida
ADVPL Intermedirio
Aparncia:
- 260 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo: Seleo de mltiplos arquivos com CGETFILE, DIRECTORY() e LISTBOX()
#include "protheus.ch"
//+--------------------------------------------------------------------+
//| Rotina | SELFILE | Autor | ARNALDO R. JUNIOR | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo para seleo de mltiplos arquivos. |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
IF !PARBOXFILE()
RETURN
ENDIF
IF !aArquivos[nArq][1]
LOOP
ENDIF
<...processamento...>
NEXT nArq
RETURN
- 261 -
Guia de Referncia Rpida
ADVPL Intermedirio
Funo auxiliar: PARBOXFILE()
//+--------------------------------------------------------------------+
//| Rotina | PARBOXFILE | Autor | ARNALDO R. JUNIOR Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo de uso da PARAMBOX em conjunto com CGETFILE|
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
Local aParamBox := {}
Local cTitulo := "Filtros Adicionais"
Local aRet := {}
Local bOk := {|| .T.}
Local aButtons := {}
Local lCentered := .T.
Local nPosx
Local nPosy
Local cLoad := ""
Local lCanSave := .F.
Local lUserSave := .F.
Local nX := 0
Local lRet := .T.
AADD(aParamBox,{2,"Tipo de arquivo"
,2,{"*.dbf","*.dtc"},100,"AllwaysTrue()",.T.})
RETURN lRet
- 262 -
Guia de Referncia Rpida
ADVPL Intermedirio
Funo auxiliar: MARKFILE()
//+--------------------------------------------------------------------+
//| Rotina | MARKFILE | Autor | ARNALDO R. JUNIOR | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Descr. | Funo exemplo para marcao de mltiplos arquivos. |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
Local aChaveArq := {}
Local cTitulo := "Arquivos para importao: "
Local bCondicao := {|| .T.}
// Variveis utilizadas na seleo de categorias
Local oChkQual,lQual,oQual,cVarQ
// Carrega bitmaps
Local oOk := LoadBitmap( GetResources(), "LBOK")
Local oNo := LoadBitmap( GetResources(), "LBNO")
// Variveis utilizadas para lista de filiais
Local nx := 0
Local nAchou := 0
//+--------------------------------------------------------------------+
//| Carrega os arquivos do diretrio no array da ListBox |
//+--------------------------------------------------------------------+
For nX := 1 to Len(aArquivos)
//+--------------------------------------------------------------------+
//| aChaveArq - Contem os arquivos que sero exibidos para seleo |
//+--------------------------------------------------------------------+
AADD(aChaveArq,{.F.,aArquivos[nX][1],cDiretorio})
Next nX
//+--------------------------------------------------------------------+
//| Monta tela para seleo dos arquivos contidos no diretrio |
//+--------------------------------------------------------------------+
DEFINE MSDIALOG oDlg TITLE cTitulo STYLE DS_MODALFRAME From 145,0 To 445,628;
OF oMainWnd PIXEL
oDlg:lEscClose := .F.
@ 05,15 TO 125,300 LABEL UPPER(cDriver) OF oDlg PIXEL
@ 15,20 CHECKBOX oChkQual VAR lQual PROMPT "Inverte Seleo" SIZE 50, 10;
OF oDlg PIXEL;
ON CLICK (AEval(aChaveArq, {|z| z[1] := If(z[1]==.T.,.F.,.T.)}),;
oQual:Refresh(.F.))
@ 30,20 LISTBOX oQual VAR cVarQ Fields HEADER "","Cdigo","Descrio" SIZE;
273,090 ON DBLCLICK (aChaveArq:=Troca(oQual:nAt,aChaveArq),oQual:Refresh());
NoScroll OF oDlg PIXEL
oQual:SetArray(aChaveArq)
oQual:bLine := { || {If(aChaveArq[oQual:nAt,1],oOk,oNo),;
aChaveArq[oQual:nAt,2],aChaveArq[oQual:nAt,3]}}
DEFINE SBUTTON FROM 134,240 TYPE 1 ACTION IIF(MarcaOk(aChaveArq),;
(lSelecao := .T., oDlg:End(),.T.),.F.) ENABLE OF oDlg
DEFINE SBUTTON FROM 134,270 TYPE 2 ACTION (lSelecao := .F., oDlg:End());
ENABLE OF oDlg
ACTIVATE MSDIALOG oDlg CENTERED
RETURN aChaveArq
- 263 -
Guia de Referncia Rpida
ADVPL Intermedirio
Funo auxiliar: TROCA()
//+--------------------------------------------------------------------+
//| Rotina | TROCA | Autor | ARNALDO R. JUNIOR | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
//+--------------------------------------------------------------------+
//| Rotina | MARCAOK | Autor | ARNALDO R. JUNIOR | Data | 01.01.2007 |
//+--------------------------------------------------------------------+
//| Uso | CURSO DE ADVPL |
//+--------------------------------------------------------------------+
Return lRet
- 264 -
Guia de Referncia Rpida
ADVPL Intermedirio
CPYS2T()
Funo utilizada para copiar um arquivo do servidor para o cliente (Remote), sendo que os
caracteres * e ? so aceitos normalmente. Caso a compactao seja habilitada
(lCompacta), os dados sero transmitidos de maneira compacta e descompactados antes do
uso.
Sintaxe: CPYS2T ( < cOrigem > , < cDestino > , [ lCompacta ] )
Parmetros:
cOrigem Nome(s) dos arquivos a serem copiados, aceita apenas arquivos no servidor,
WildCards ( * e ? ) so aceitos normalmente.
cDestino Diretrio com o destino dos arquivos no Client ( Remote ).
lCompacta Indica se a cpia deve ser feita compactando o arquivo antes do envio.
Retorno:
Lgico lSucess retorna .T. caso o arquivo seja copiado com sucesso , ou .F. em caso
de falha na cpia.
Exemplo:
// Copia arquivos do servidor para o remote local, compactando antes de transmitir
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .T. )
// Copia arquivos do servidor para o remote local, sem compactar antes de transmitir
CpyS2T( "\BKP\MANUAL.DOC", "C:\TEMP", .F. )
CPYT2S()
Funo utilizada para copiar um arquivo do cliente (Remote) para o servidor, sendo que os
caracteres * e ? so aceitos normalmente. Caso a compactao seja habilitada
(lCompacta), os dados sero transmitidos de maneira compacta e descompactados antes do
uso.
Sintaxe: CpyT2S( cOrigem, cDestino, [ lCompacta ])
Parmetros:
cOrigem Nomes dos arquivos a serem copiados, aceita apenas arquivos locais (
Cliente ), WildCards so aceitos normalmente.
cDestino Diretrio com o destino dos arquivos no remote ( Cliente ).
lCompacta Indica se a cpia deve ser feita compactando o arquivo antes.
Retorno:
Exemplo:
// Copia arquivos do cliente( remote ) para o Servidor compactando antes de transmitir
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP", .T. )
// Copia arquivos do cliente( remote ) para o Servidor sem compactar.
CpyT2S( "C:\TEMP\MANUAL.DOC", "\BKP" )
- 265 -
Guia de Referncia Rpida
ADVPL Intermedirio
CURDIR()
Funo que retorna o diretrio corrente do servidor. O caminho retornado sempre relativo ao
RootPath definido na configurao do Environment no .INI do Protheus Server. Inicialmente , o
diretrio atual da aplicao o constante na chave StartPath , tambm definido na
configurao do Environment no .INI do Protheus Server.
Caso seja passado o parmetro cNovoPath , este path assumido como sendo o Path atual.
Caso o path recebido como parmetro no exista , seja invlido , ou seja um path absoluto
(iniciado com uma letra de drive ou caminho de rede), a funo no ir setar o novo path,
mantendo o atual .
Parmetros:
cNovoPath Caminho relativo , com o novo diretrio que ser ajustado como corrente.
Retorno:
Exemplo:
cOldDir := curdir()
cNewDir := '\webadv\xis'
curdir(cNewDir) // Troca o path
If cNewDir <> '\'+curdir() // E verifica se trocou mesmo
conout('Falha ao Trocar de Path de '+cOldDir + ' para '+cNewDir)
Else
conout('Path de '+cOldDir + ' trocado para '+cNewDir+' com sucesso.')
Endif
- 266 -
Guia de Referncia Rpida
ADVPL Intermedirio
DIRECTORY()
Para tornar as referncias aos vrios elementos de cada sub-vetor de arquivo mais legveis,
fornecido o arquivo header Directry.ch, que contm os #defines para os subarray subscripts.
Atributo Significado
H Incluir arquivos ocultos
S Incluir arquivos de sistema
D Incluir diretrios
V Procura pelo volume DOS e exclui outros arquivos
Nota: Arquivos normais so sempre includos na pesquisa, a no ser que V seja especificado.
Parmetros:
- 267 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
Exemplo:
#INCLUDE "Directry.ch"
aDirectory := DIRECTORY("*.*","D")
AEVAL( aDirectory, {|aFile| CONOUT(aFile[F_NAME])} )
DIRREMOVE()
Funo que elimina um diretrio especifico. Caso especifiquemos um path sem a unidade de
disco , ele ser considerado no ambiente do Servidor , a partir do RootPath do ambiente ( caso
o path comece com \ ), ou a partir do diretrio corrente (caso o path no seja iniciado com \ ).
Quando especificado um path absoluto ( com unidade de disco preenchida ), a funo ser
executada na estao onde est sendo executado o Protheus Remote. Quando executamos a
funo DirRemove() em JOB ( processo isolado no Server , sem interface ), no possvel
especificar um Path absoluto de disco. Caso isto seja realizado , a funo retornar .F. e
FError() retornar -1 ( Syntax Error ).
Note que necessrio ter direitos suficientes para remover um diretrio, e o diretrio a ser
eliminado precisa estar vazio, sem subdiretrios ou arquivos dentro do mesmo.
Parmetros:
Retorno:
Lgico lSucesso ser .T. caso o diretrio tenha sido eliminado , ou .F. caso no seja
possvel excluir o diretrio. Quando a funo DirRemove retornar .F. ,
possvel obter mais detalhes da ocorrncia recuperando o cdigo do Erro
atravs da funo FError().
Exemplo:
cDelPath := 'c:\TmpFiles'
lRemoveOk := DIRREMOVE(cDelPath)
IF !lRemoveOk
MsgStop('Falha ao remover a pasta '+cDelPath+' ( File Error '+str(Fewrror(),4)+' ) ')
Else
MsgStop('Pasta '+cDelPath+' removida com sucesso.')
Endif
- 268 -
Guia de Referncia Rpida
ADVPL Intermedirio
DISKSPACE()
Funo de ambiente que determina quantos bytes esto disponveis em uma determinada
unidade de disco. Esta funo obtm a informao sempre relativa estao onde est sendo
executado o Protheus Remote. Atravs do parmetro nDrive , selecionamos qual a unidade de
disco que desejamos obter a informao do espao livre , onde:
Caso a funo DiskSpace seja executada atravs de um Job ( processo isolado no Servidor ,
sem interface Remota ) , ou seja passado um argumento de unidade de disco inexistente ou
indisponvel , a funo DISKSPACE() retornar -1
Parmetros:
Retorno:
Exemplo:
If nBytes_A == -1
MsgStop('Unidade A: no est disponvel ou no h disco no Drive')
ElseIf nBytes_A < 8192
MsgStop('No h espao disponvel no disco. Substitua o disco na Unidade A:')
Else
MsgStop('Unidade A: Verificada . '+str(nBytes_A,12)+' bytes livres.')
Endif
- 269 -
Guia de Referncia Rpida
ADVPL Intermedirio
EXISTDIR()
Parmetros:
cPath String contendo o diretrio que ser verificado, caso seja feita uma
verificao a partir do server, devemos informar a partir do rootPath do
Protheus, caso contrrio devemos passar o path completo do diretrio.
Retorno:
lRet := ExistDir('\teste')
lRet := ExistDir('c:\APO')
FCLOSE()
Funo de tratamento de arquivos de baixo nvel utilizada para fechar arquivos binrios e
forar que os respectivos buffers do DOS sejam escritos no disco. Caso a operao falhe,
FCLOSE() retorna falso (.F.). FERROR() pode ento ser usado para determinar a razo exata
da falha. Por exemplo, ao tentar-se usar FCLOSE() com um handle (tratamento dado ao
arquivo pelo sistema operacional) invlido retorna falso (.F.) e FERROR() retorna erro 6 do
DOS, invalid handle. Consulte FERROR() para obter uma lista completa dos cdigos de erro.
Nota: Esta funo permite acesso de baixo nvel aos arquivos e dispositivos do DOS. Ela deve
ser utilizada com extremo cuidado e exige que se conhea a fundo o sistema operacional
utilizado.
Parmetros:
Retorno:
Lgico Retorna falso (.F.) se ocorre um erro enquanto os buffers esto sendo
escritos; do contrrio, retorna verdadeiro (.T.).
- 270 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
#include "Fileio.ch"
If !FCLOSE(nHandle)
conout( "Erro ao fechar arquivo, erro numero: ", FERROR() )
EndIf
FCREATE()
Funo de baixo-nvel que permite a manipulao direta dos arquivos textos como binrios. Ao
ser executada FCREATE() cria um arquivo ou elimina o seu contedo, e retorna o handle
(manipulador) do arquivo, para ser usado nas demais funes de manuteno de arquivo.
Aps ser utilizado , o Arquivo deve ser fechado atravs da funo FCLOSE().
Na tabela abaixo , esto descritos os atributos para criao do arquivo , definidos no arquivo
header fileio.ch
Caso desejemos especificar mais de um atributo , basta som-los . Por exemplo , para criar
um arquivo protegido contra gravao e escondido , passamos como atributo FC_READONLY +
FC_HIDDEN. .
Nota: Caso o arquivo j exista , o contedo do mesmo ser ELIMINADO , e seu tamanho ser
truncado para 0 ( ZERO ) bytes.
Parmetros:
cArquivo Nome do arquivo a ser criado , podendo ser especificado um path absoluto
ou relativo , para criar arquivos no ambiente local ( Remote ) ou no Servidor,
respectivamente .
nAtributo Atributos do arquivo a ser criado (Vide Tabela de atributos abaixo). Caso no
especificado, o DEFAULT FC_NORMAL.
Retorno:
Numrico A funo retornar o Handle do arquivo para ser usado nas demais funes
de manuteno de arquivo. O Handle ser maior ou igual a zero. Caso no
seja possvel criar o arquivo , a funo retornar o handle -1 , e ser
possvel obter maiores detalhes da ocorrncia atravs da funo FERROR() .
- 271 -
Guia de Referncia Rpida
ADVPL Intermedirio
FERASE()
Funo utilizada para apagar um arquivo no disco . O Arquivo pode estar no Servidor ou na
estao local (Remote). O arquivo para ser apagado deve estar fechado, no sendo permitido
a utilizao de caracteres coringa (wildcards).
Parmetros:
cArquivo Nome do arquivo a ser apagado . Pode ser especificado um path absoluto ou
relativo , para apagar arquivos na estao local ( Remote ) ou no Servidor,
respectivamente.
Retorno:
Numrico A funo retornar 0 caso o arquivo seja apagado com sucesso , e -1 caso
no seja possvel apagar o arquivo. Caso a funo retorne -1, possvel
obter maiores detalhes da ocorrncia atravs da funo FERROR().
Exemplo:
#include 'DIRECTRY.CH'
FILE()
Funo que verifica se existe um arquivo ou um padro de arquivos, no diretrio. Podem ser
especificados caminhos absolutos ( arquivos na estao - Remote ) ou relativos ( a partir do
RootPath do Protheus Server) , sendo os caracteres * e ? ( wildcards) aceitos.
Parmetros:
Retorno:
Lgico O retorno ser .T. caso o arquivo especificado exista. Caso o mesmo no
exista no path especificado , a funo retorna .F.
- 272 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
FILENOEXT()
Funo que retorna o nome de um arquivo contido em uma string, ignorando a extenso.
Parmetros
Exemplo:
- 273 -
Guia de Referncia Rpida
ADVPL Intermedirio
FOPEN()
Funo de tratamento de arquivo de baixo nvel que abre um arquivo binrio existente para
que este possa ser lido e escrito, dependendo do argumento <nModo>. Toda vez que houver
um erro na abertura do arquivo, FERROR() pode ser usado para retornar o cdigo de erro do
Sistema Operacional. Por exemplo, caso o arquivo no exista, FOPEN() retorna -1 e FERROR()
retorna 2 para indicar que o arquivo no foi encontrado. Veja FERROR() para uma lista
completa dos cdigos de erro.
Nota: Esta funo permite acesso de baixo nvel a arquivos e dispositivos. Ela deve ser
utilizada com extremo cuidado e exige que se conhea a fundo o sistema operacional utilizado.
Parmetros:
cArq Nome do arquivo a ser aberto que inclui o path caso haja um.
nModo Modo de acesso DOS solicitado que indica como o arquivo aberto deve ser
acessado. O acesso de uma das categorias relacionadas na tabela A e as
restries de compartilhamento relacionada na Tabela B. O modo padro
zero, somente para leitura, com compartilhamento por Compatibilidade. Ao
definirmos o modo de acesso , devemos somar um elemento da Tabela A
com um elemento da Tabela B.
Retorno:
Numrico FOPEN() retorna o handle de arquivo aberto na faixa de zero a 65.535. Caso
ocorra um erro, FOPEN() retorna -1.
- 274 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
#include 'fileio.ch'
...
nH := fopen('\sigaadv\error.log' , FO_READWRITE + FO_SHARED )
If nH == -1
MsgStop('Erro de abertura : FERROR '+str(ferror(),4))
Else
MsgStop('Arquivo aberto com sucesso.')
...
fclose(nH)
Endif
...
- 275 -
Guia de Referncia Rpida
ADVPL Intermedirio
FREAD()
Funo que realiza a leitura dos dados a partir um arquivo aberto, atravs de FOPEN(),
FCREATE() e/ou FOPENPORT(), e armazena os dados lidos por referncia no buffer informado.
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 especificado em
nQtdBytes. FREAD() l normalmente caracteres de controle (ASC 128, ASC 0, etc.) e l a partir
da posio atual do ponteiro atual do arquivo , que pode ser ajustado ou modificado pelas
funes FSEEK() , FWRITE() ou FREADSTR().
A varivel String a ser utilizada como buffer de leitura deve ser sempre pr-alocado e passado
como referncia. Caso contrrio, os dados no podero ser retornados.
Sintaxe: FREAD ( < nHandle > , < cBuffer > , < nQtdBytes > )
Parmetros:
Retorno:
Numrico Quantidades de bytes lidos. Caso a quantidade seja menor que a solicitada,
isto indica erro de leitura ou final de arquivo, Verifique a funo FERROR()
para maiores detalhes.
FREADSTR ()
Parmetros:
Retorno:
- 276 -
Guia de Referncia Rpida
ADVPL Intermedirio
FRENAME()
Atravs da funo FRENAME() possvel renomear um arquivo para outro nome, tanto no
servidor como na estao. Ao renomear um arquivo no esquea que esta arquivo dever
estar fechado ( isto , no pode estar em uso por nenhum outro processo ou estao). Caso o
arquivo esteja aberto por outro processo , a operao de renomear o arquivo no possvel. A
funo fRename() no aceita wildcards ( * e/ou ? ).
Parmetros:
Retorno:
- 277 -
Guia de Referncia Rpida
ADVPL Intermedirio
FSEEK()
Parmetros:
Retorno:
Numrico FSEEK() retorna a nova posio do ponteiro de arquivo com relao ao incio
do arquivo (posio 0) na forma de um valor numrico inteiro. Este valor no
leva em conta a posio original do ponteiro de arquivos antes da execuo
da funo FSEEK().
FT_FEOF()
Funo que retorna verdadeiro (.t.) se o arquivo texto aberto pela funo FT_FUSE() estiver
posicionado no final do arquivo, similar funo EOF() utilizada para arquivos de dados.
Sintaxe: FT_FEOF( )
Parmetros:
Nenhum .
Retorno:
Lgico Retorna true caso o ponteiro do arquivo tenha chegado ao final, false caso
contrrio.
- 278 -
Guia de Referncia Rpida
ADVPL Intermedirio
FT_FGOTO()
Funo utilizada para mover o ponteiro, que indica a leitura do arquivo texto, para a posio
absoluta especificada pelo argumento <nPos>.
Parmetros:
nPos Indica a posio que ser colocado o ponteiro para leitura dos dados no
arquivo.
Retorno:
Nenhum .
FT_FGOTOP()
A funo tem como objetivo mover o ponteiro, que indica a leitura do arquivo texto, para a
posio absoluta especificada pelo argumento <nPos>.
Parmetros:
nPos Indica a posio que ser colocado o ponteiro para leitura dos dados no
arquivo.
Retorno:
Nenhum .
FT_FLASTREC()
Funo que retorna o nmero total de linhas do arquivo texto aberto pela FT_FUse. As linhas
so delimitadas pela seqncia de caracteres CRLF o LF.
Sintaxe: FT_FLASTREC( )
Parmetros:
Nenhum .
Retorno:
- 279 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
FT_FREADLN()
Funo que retorna uma linha de texto do arquivo aberto pela FT_FUse. As linhas so
delimitadas pela seqncia de caracteres CRLF ( chr(13) + chr(10) ) , ou apenas LF ( chr(10 ),
e o tamanho mximo de cada linha 1022 bytes.
Sintaxe: FT_FREADLN( )
Parmetros:
Nenhum .
Retorno:
Caracter Retorna a linha inteira na qual est posicionado o ponteiro para leitura de
dados.
- 280 -
Guia de Referncia Rpida
ADVPL Intermedirio
FT_FRECNO()
Sintaxe: FT_FRECNO ( )
Parmetros:
Nenhum .
Retorno:
FT_FSKIP()
Funo que move o ponteiro do arquivo texto aberto pela FT_FUSE() para a prxima linha,
similar ao DBSKIP() usado para arquivos de dados.
Retorno
Nenhum .
FT_FUSE()
Funo que abre ou fecha um arquivo texto para uso das funes FT_F*. As funes FT_F* so
usadas para ler arquivos texto, onde as linhas so delimitadas pela seqncia de caracteres
CRLF ou LF (*) e o tamanho mximo de cada linha 1022 bytes.. O arquivo aberto em uma
rea de trabalho, similar usada pelas tabelas de dados.
cTXTFile Corresponde ao nome do arquivo TXT a ser aberto. Caso o nome no seja
passado, e j exista um arquivo aberto. o mesmo fechado.
Retorno:
- 281 -
Guia de Referncia Rpida
ADVPL Intermedirio
FWRITE()
Caso acontea alguma falha na gravao , a funo retornar um nmero menor que o
nQtdBytes. Neste caso , a funo FERROR() pode ser utilizada para determinar o erro
especfico ocorrido. A gravao no arquivo realizada a partir da posio atual do ponteiro ,
que pode ser ajustado atravs das funes FSEEK() , FREAD() ou FREADSTR().
Parmetros:
Retorno:
Exemplo:
#INCLUDE "FILEIO.CH"
#DEFINE F_BLOCK 1024 // Define o bloco de Bytes a serem lidos / gravados por vez
- 282 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
// l os dados do Arquivo
nBytesLidos := FREAD(nHOrigem, @cBuffer, nBytesLer )
- 283 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
Enddo
If lCopiaOk
MsgStop('Cpia de Arquivos finalizada com sucesso. '+;
str(nTamArquivo,12,0)+' bytes copiados.','Final')
Else
MsgStop( 'Falha na Cpia. Arquivo de Destino incompleto. '+;
'Do total de '+str(nTamArquivo,12,0)+' bytes, faltaram
'+str(nBytesFalta,12,0)+' bytes.','Final')
Endif
Return
MSCOPYFILE()
Parmetros:
Retorno:
Lgico Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo:
- 284 -
Guia de Referncia Rpida
ADVPL Intermedirio
MSCOPYTO()
Funo que realiza a cpia dos registros de uma base de dados para outra, criando o arquivo
destino de acordo com a estrutura da base de dados origem.
Parmetros:
Retorno:
Lgico Se a copia for realizada com sucesso a funo retornar verdadeiro (.T.).
Exemplo:
MSCREATE()
Funo que cria um arquivo (tabela) de acordo com a estrutura informada no parmetro
aStruct. 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.
Parmetros:
- 285 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
Exemplo:
MSERASE()
Parmetros:
Retorno:
Exemplo:
- 286 -
Guia de Referncia Rpida
ADVPL Intermedirio
MSRENAME()
Parmetros:
Retorno:
Exemplo:
RETFILENAME()
Funo que retorna o nome de um arquivo contido em uma string, ignorando o caminho e a
extenso.
Parmetros:
Retorno:
Exemplo:
- 287 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de arquivos e ndices temporrios
CRIATRAB()
Funo que cria um arquivo de trabalho com uma estrutura especificada, sendo que:
Caso o parmetro lDbf seja definido como .T., a funo criar um arquivo DBF com este
nome e a estrutura definida em aArray.
Caso o parmetro lDbf seja definido como .F., a funo no criar arquivo de nenhum
tipo, apenas fornecer um nome vlido.
Sintaxe: CriaTrab(aArray,lDbf)
Parmetros:
Retorno:
Exemplo:
CriaTrab(Nil, .F.)
- 288 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de bases de dados
ALIAS()
Funo de banco de dados utilizada para determinar o alias da rea de trabalho especificada.
Alias o nome atribuido a uma rea de trabalho quando um arquivo de banco de dados est
em uso. O nome real atribuido o nome do arquivo de banco de dados, ou um nome que foi
explicitamente atribuido atravs da clusula ALIAS do comando USE.
A funo ALIAS() o inverso da funao SELECT() pois retorna o alias atravs do nmero da
rea de trabalho, enquanto SELECT() retorna o nmero da rea de trabalho atravs do alias.
Parmetros:
Retorno:
Exemplo:
cAlias := alias()
IF empty(cAlias)
alert('No h Area em uso')
Else
alert(Area em uso atual : '+cAlias)
Endif
BOF() / EOF()
BOF() uma funo de tratamento de banco de dados utilizada para testar uma
condio de limite de inicial do arquivo quando o ponteiro de registros est se
movendo para trs em um arquivo de banco de dados.
EOF() uma funo de tratamento de banco de dados utilizada para testar uma
condio de limite de final de arquivo quando o ponteiro de registros est se
movendo para frente em um arquivo de banco de dados.
- 289 -
Guia de Referncia Rpida
ADVPL Intermedirio
Sintaxe: BOF() / EOF()
Parmetros:
Nenhum .
Retorno:
Lgico Retorna verdadeiro (.T.) quando feita uma tentativa de mover o ponteiro de
registros para alm do primeiro registro lgico em um arquivo de banco de
dados, do contrrio, ela retorna falso (.F.).
Lgico Retorna verdadeiro (.T.) quando feita uma tentativa de mover o ponteiro de
registros para alm do ltimo registro lgico em um arquivo de banco de
dados, do contrrio, ela retorna falso (.F.). Caso nao haja nenhum arquivo
de banco de dados aberto na rea de trabalho corrente, EOF() retorna falso
(.F.). Se o arquivo de banco de dados corrente no possui registros, EOF()
retorna verdadeiro (.T.).
COPY()
O comando COPY TO permite a cpia de todos ou parte dos registros da tabela atualmente
selecionada como rea de trabalho atual, para um novo arquivo. Os registros considerados
para a cpia podem ser limitados pela clusula <escopo>, atravs de expresses FOR/WHILE,
e/ou atravs de um filtro.
Se o filtro para registros deletados ( SET DELETED ) estiver desligado (OFF), registros
deletados ( marcados para deleo ) so copiados para o arquivo de destino, mantendo este
status. Caso contrrio, nenhum registro deletado copiado. Da mesma maneira, caso exista
uma condio de filtro na tabela atual ( SET FILTER ), apenas os registros que satisfaam a
condio de fintro sero copiados.
Os registros so lidos na tabela atual, respeitando a ordem de ndice setada. Caso no hajam
ndices abertos, ou a ordem de navegao nos ndices (SET ORDER ) seja 0 (zero), os registros
so lidos em orden natural ( ordem de RECNO ) .
- 290 -
Guia de Referncia Rpida
ADVPL Intermedirio
A tabela de destino dos dados copiados criada, e aberta em modo exclusivo, antes da
operao de cpia efetiva ser iniciada.
Sintaxe:
- 291 -
Guia de Referncia Rpida
ADVPL Intermedirio
Parmetros:
Retorno:
Nenhum .
- 292 -
Guia de Referncia Rpida
ADVPL Intermedirio
COPY STRUCTURE()
O comando COPY STRUCTURE cria uma nova tabela vazia, com a estrutura da tabela ativa na
rea de trabalho atual. Se a tabela a ser criada j exista, a mesma sobrescrita. A tabela de
destino criada utiliza o mesmo RDD da tabela de origem ( tabela ativa na rea de trabalho
atual ).
Sintaxe:
Parmetros:
Retorno:
Nenhum .
DBAPPEND()
Parmetros:
Retorno:
Nenhum .
- 293 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
DBCLEARALLFILTER()
Sintaxe: DBCLEARALLFILTER()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
- 294 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBCLEARFILTER()
Sintaxe: DBCLEARFILTER()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
DBCLEARINDEX()
Sintaxe: DBCLEARINDEX()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
- 295 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBCLOSEALL()
Sintaxe: DBCLOSEALL()
Parmetros:
Nenhum .
Retorno:
Nenhum .
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()
A funo DBCLOSEAREA() permite que um alias presente na conexo seja fechado, o que
viabiliza seu reuso em outro operao. Este comando tem efeito apenas no alias ativo na
conexo, sendo necessria sua utilizao em conjunto com o comando DbSelectArea().
Sintaxe: DBCLOSEAREA()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
- 296 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBCOMMIT()
Sintaxe: DBCOMMIT()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
DBCOMMITALL()
Sintaxe: DBCOMMITALL()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
- 297 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBCREATE()
A funo DBCREATE() 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}.
Parmetros:
cNOME Nome do arquivo a ser criado. Se contm pasta, ela se localiza abaixo do
"RootPath". Se no, criado por padro no caminho formado por
"RootPath"+"StartPath"
aESTRUTURA Lista com as informaes dos campos para ser criada a tabela.
cDRIVER Nome da RDD a ser utilizado para a criao da tabela. Se for omitido ser
criada com a corrente.
Retorno:
Nenhum .
Exemplo:
// Este exemplo mostra como se pode criar novo arquivo 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}}
// Cria a tabela com o RDD corrente
DBCREATE('\teste\cliente.dbf', aEstrutura)
USE '\teste\cliente.dbf' VIA 'DBFCDX' NEW
1. DBCreate - Data base files can only be created on the server: O nome
do arquivo a ser criado no pode conter 'driver', pois, por conveno, ele
seria criado na mquina onde o Remote est rodando.
2. DBCreate - Invalid empty filename: Nome do arquivo no foi
especificado
3. DBCreate - Field's name cannot be 'DATA': Algumas RDD's no
suportam este nome de campo. uma palavra reservada.
4. DBCreate - The length of Field's name must be at most 10: Nome do
campo no pode ter mais que 10 caracteres.
5. DBCreate - Field's name must be defined: Nome do campo no foi
definido.
6. DBCreate - Field's type is not defined: Tipo do campo no foi definido.
7. DBCreate - invalid Field's type: Tipo do campo diferente de 'C', 'N',
'D', 'M' ou 'L'.
- 298 -
Guia de Referncia Rpida
ADVPL Intermedirio
total do campo numrico e 'dec' o nmero de decimais, ocorre este erro se:
(len>1) .and. (len< dec + 2): Se o tamanho total maior que 1, ele
deve ser maior que o nmero de decimais mais 2, para comportar o
separador de decimais e ter pelo menos um algarismo na parte inteira.
DBCREATEINDEX()
A funo DBCREATEINDEX() 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:
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.
Parmetros:
Retorno:
Nenhum .
- 299 -
Guia de Referncia Rpida
ADVPL Intermedirio
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:
DBDELETE()
Para filtrar os registro marcados do alias corrente pode-se utilizar o comando SET DELETED e
para apag-los fisicamente pode-se utilizar a funo __DBPACK().
Sintaxe: DBDELETE ( )
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
IF Found()
RecLock(SA1,.F.) // Define que ser realizada uma alterao no registro posicionado
DbDelete() // Efetua a excluso lgica do registro posicionado.
MsUnLock() // Confirma e finaliza a operao
ENDIF
- 300 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBF()
A funo DBF() verifica qual o Alias da rea de trabalho corrente. O Alias definido
quando a tabela aberta atravs do parmetro correspondente (DBUSEAREA()). Esta funo
o inverso da funo SELECT(), pois nesta retornado o nmero da rea de trabalho do Alias
correspondente.
Sintaxe: DBF()
Parmetros:
Nenhum .
Retorno:
Caracter Retorna o Alias corrente. Caso no exista Alias corrente retorna "" (String
vazia).
Exemplo:
DBFIELDINFO()
Parmetros:
- 301 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
Exemplo:
DBFILTER()
A funo DBFILTER() utilizada para verificar a expresso de filtro ativo na rea de trabalho
corrente.
Sintaxe: DBFILTER()
Parmetros:
Nenhum .
Retorno:
Exemplo:
- 302 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBGOTO()
Move o cursor da rea de trabalho ativa para o record number (recno) especificado, realizando
um posicionamento direto, sem a necessidade uma busca (seek) prvio.
Sintaxe: DbGoto(nRecno)
Parmetros
Exemplo:
DbSelectArea(SA1)
DbGoto(100) // Posiciona no registro 100
DBGOTOP()
Sintaxe: DbGoTop()
Parmetros
Nenhum .
Exemplo:
- 303 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBGOBOTTON()
Sintaxe: DbGoBotton()
Parmetros
Nenhum .
Exemplo:
DBINFO()
DBINFO() utilizada para obter informaes sobre a tabela corrente. O tipo de informao
(primeiro argumento) escolhido de acordo com as constantes abaixo:
- 304 -
Guia de Referncia Rpida
ADVPL Intermedirio
Sintaxe: DBINFO(<nINFOTIPO>)
Parmetros:
Retorno:
Exemplo:
DBNICKINDEXKEY()
Funo que retorna o IndexKey,ou seja, a expresso de ndice da ordem especificada pelo
NickName. Se no existe ndice com o nickname, retorna uma string vazia.
Sintaxe: DBNICKINDEXKEY(<cNick>)
Parmetros:
Retorno:
- 305 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBORDERINFO()
Sintaxe: DBORDERINFO(<nINFOTIPO>)
Parmetros:
Retorno:
Caracter Retorna a informao da Ordem requisitada pelo usurio (pode ser de tipo
numrico se for nmero de ordens no ndice, tipo caracter se for nome do
arquivo de ndice). Caso no exista ordem corrente ou a posio da ordem
especificada est invlida retorna NIL.
Exemplo:
- 306 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBORDERNICKNAME()
Sintaxe: DBORDERNICKNAME(<cAPELIDO>)
Parmetros:
Retorno:
Exemplo:
IF !DBORDERNICKNAME("IndNome")
Messagebox("Registro no encontrado","Erro", 0)
ENDIF
DBPACK()
A funo DBPACK() remove fisicamente todos os registros com marca de excludo da tabela.
Sintaxe: __DBPACK()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
USE Clientes NEW
DBGOTO(100)
DBDELETE()
DBGOTO(105)
DBDELETE()
DBGOTO(110)
DBDELETE()
- 307 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBRECALL()
A funo DBRECALL() 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.
Sintaxe: DBRECALL()
Parmetros:
Nenhum .
Retorno:
Nenhum .
USE Cliente
DBGOTO(100)
DBDELETE()
DELETED() // Retorna: .T.
DBRECALL()
DELETED() // Retorna: .F.
USE Cliente
DBGOTOP()
WHILE !EOF()
DBRECALL()
DBSKIP()
ENDDO
DBRECORDINFO()
- 308 -
Guia de Referncia Rpida
ADVPL Intermedirio
Sintaxe: DBRECORDINFO ( < nINFOTIPO > , [ nREGISTRO ] ) --> xINFO
Parmetros:
Retorno:
Exemplo:
DBREINDEX()
Sintaxe: DBREINDEX()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
- 309 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBRLOCK()
A funo DBRLOCK() 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().
Esta funo o oposto DBRUNLOCK, que libera registros bloqueados.
Sintaxe: DBRLOCK([nREGISTRO])
Parmetros:
Retorno:
Exemplo:
DBRLOCKLIST()
A funo DBRLOCKLIST() utilizada para verificar quais registros esto locados na tabela
corrente. Para tanto, retornada uma tabela unidimensional com os nmeros dos registros.
Sintaxe: DBRLOCKLIST()
Parmetros:
Nenhum .
Retorno:
- 310 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
DBRUNLOCK()
Sintaxe: DBRUNLOCK([nREGISTRO])
Parmetros:
Retorno:
Nenhum .
Exemplo:
DBSETDRIVER()
A funo DBSETDRIVER() 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.
Sintaxe: DBSETDRIVER([cNOVORDD])
Parmetros:
Retorno:
- 311 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
DBSETDRIVER("CTREECDX") // Retorna: DBFCDX
DBSETDRIVER() // Retorna: CTREECDX
DBSETINDEX()
Para utilizar os arquivos de extenso padro do RDD este dado deve ser
especificado.
Sintaxe: DBSETINDEX(<@cARQINDICE>)
Parmetros:
Retorno:
Nenhum .
Exemplo:
USE Cliente NEW
DBSETINDEX("Ind1")
DBSETINDEX("\teste\Ind2.cdx")
- 312 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBSETNICKNAME()
Parmetros:
Retorno:
Exemplo:
DBSELECTAREA()
Define a rea de trabalho especificada com sendo a rea ativa. Todas as operaes
subseqentes que fizerem referncia a uma rea de trabalho a utilizao, a menos que a rea
desejada seja informada explicitamente.
- 313 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo 02: DbselectArea(cArea)
DBSETORDER()
Define qual ndice ser utilizada pela rea de trabalho ativa, ou seja, pela rea previamente
selecionada atravs do comando DbSelectArea(). As ordens disponveis no ambiente Protheus
so aquelas definidas no SINDEX /SIX, ou as ordens disponibilizadas por meio de ndices
temporrios.
Sintaxe: DbSetOrder(nOrdem)
Parmetros
Nmero de referncia da ordem que deseja ser definida como ordem ativa
nOrdem
para a rea de trabalho.
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // De acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
DBORDERNICKNAME()
Define qual ndice criado pelo usurio seja utilizado. O usurio pode incluir os seus prprios
ndices e no momento da incluso deve criar o NICKNAME para o mesmo.
Sintaxe: DbOrderNickName(NickName)
Parmetros
Exemplo:
DbSelectArea(SA1)
DbOrderNickName(Tipo) // De acordo com o arquivo SIX -> A1_FILIAL+A1_TIPO
NickName: Tipo
- 314 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBSEEK() E MSSEEK()
DbSelectArea(SA1)
DbSetOrder(1) // acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
Else
MsgAlert(Cliente no encontrado, Consulta por cliente)
Endif
DbSelectArea(SA1)
DbSetOrder(1) // acordo com o arquivo SIX -> A1_FILIAL+A1_COD+A1_LOJA
- 315 -
Guia de Referncia Rpida
ADVPL Intermedirio
MsSeek(): Funo desenvolvida pela rea de Tecnologia da Microsiga, a qual possui as
mesmas funcionalidades bsicas da funo DbSeek(), com a vantagem de no necessitar
acessar novamente a base de dados para localizar uma informao j utilizada pela thread
(conexo) ativa.
DBSKIP()
Move o cursor do registro posicionado para o prximo (ou anterior dependendo do parmetro),
em funo da ordem ativa para a rea de trabalho.
Sintaxe: DbSkip(nRegistros)
Parmetros
DbSelectArea(SA1)
DbSetOrder(2) // A1_FILIAL + A1_NOME
DbGotop() // Posiciona o cursor no incio da rea de trabalho ativa
While !EOF() // Enquanto o cursor da rea de trabalho ativa no indicar fim de arquivo
MsgInfo(Voc est no cliente: + A1_NOME)
DbSkip()
End
DbSelectArea(SA1)
DbSetOrder(2) // A1_FILIAL + A1_NOME
DbGoBotton() // Posiciona o cursor no final da rea de trabalho ativa
While !BOF() // Enquanto o cursor da rea de trabalho ativa no indicar incio de arquivo
MsgInfo(Voc est no cliente: + A1_NOME)
DbSkip(-1)
End
- 316 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBSETFILTER()
Define um filtro para a rea de trabalho ativa, o qual pode ser descrito na forma de um bloco
de cdigo ou atravs de uma expresso simples.
While !EOF()
MsgInfo(Voc est no cliente:+A1_COD)
DbSkip()
End
While !EOF()
MsgInfo(Voc est no cliente:+A1_COD)
DbSkip()
End
- 317 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBSTRUCT()
Retorna um array contendo a estrutura da rea de trabalho (alias) ativo. A estrutura ser um
array bidimensional conforme abaixo:
*ndice do array
Sintaxe: DbStruct()
Parmetros
Nenhum .
Exemplo:
cCampos :=
DbSelectArea(SA1)
aStructSA1 := DbStruct()
FOR nX := 1 to Len(aStructSA1)
cCampos += aStructSA1[nX][1] + /
NEXT nX
ALERT(cCampos)
DBUNLOCK()
Sintaxe: DBUNLOCK()
Parmetros:
Nenhum .
Retorno:
Nenhum .
- 318 -
Guia de Referncia Rpida
ADVPL Intermedirio
DBUNLOCKALL()
Sintaxe: DBUNLOCKALL()
Parmetros:
Nenhum .
Retorno:
Nenhum .
DBUSEAREA()
Define um arquivo de base de dados como uma rea de trabalho disponvel na aplicao.
Parmetros
Exemplo:
- 319 -
Guia de Referncia Rpida
ADVPL Intermedirio
DELETED()
A funo DELETED() Verifica se o registro est com marca de excludo. Quando o registro
excludo, permanece fisicamente na tabela, mas fica marcado como excludo. Esta funo
verifica este estado. Se nenhuma rea est selecionada, retorna .F.. Quando executada a
funo DBPACK() todos os registros marcados como deletados so apagados fisicamente. A
funo DBRECALL() retira todas as marcas.
Sintaxe: DELETED()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
FCOUNT()
Sintaxe: FCOUNT()
Parmetros:
Nenhum .
Retorno:
Exemplo:
DbSelectArea(SA1)
nFields := FCOUNT()
IF nFields > 0
MSGINFO(A estrutura da tabela contm :+CvalToChar(nFields)+campos.)
ENDIF
- 320 -
Guia de Referncia Rpida
ADVPL Intermedirio
FOUND()
Sintaxe: FOUND()
Parmetros:
Nenhum .
Retorno:
Exemplo:
Pergunte(cPerg,.T.)
DbSelectArea(SA1)
DbSetOrder(1)
DbSeek(xFilial(SA1)+MVPAR01)
IF Found()
MSGINFO(Cliente encontrado)
ELSE
MSGALERT(Dados no encontrados)
ENDIF
INDEXKEY()
Sintaxe: INDEXKEY()
Parmetros:
Retorno:
Exemplo:
cExpressao := SA1->(IndexKey())
- 321 -
Guia de Referncia Rpida
ADVPL Intermedirio
INDEXORD()
Sintaxe: INDEXORD()
Parmetros:
Nenhum .
Retorno:
Exemplo:
LUPDATE()
Sintaxe: LUPDATE()
Parmetros:
Nenhum .
Retorno:
Exemplo:
- 322 -
Guia de Referncia Rpida
ADVPL Intermedirio
MSAPPEND()
A funo MsAppend() adiciona registros de um arquivo para outro, respeitando a estrutura das
tabelas.
Parmetros:
Retorno:
Lgico Se a operao for realizada com sucesso o funo retornar verdadeiro (.T.).
Exemplo:
dbSelectArea(XXX)
MsAppend(,ARQ00001)
MSUNLOCK()
Sintaxe: MsUnLock()
Parmetros
Nenhum .
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
- 323 -
Guia de Referncia Rpida
ADVPL Intermedirio
ORDBAGEXT()
Sintaxe: ORDBAGEXT()
Parmetros:
Nenhum .
Retorno:
Exemplo:
cArqTRB := CriaTrab(aStruTRB,.T.)
// RDD UTILIZADA: DBFCDXADS
DbUseArea(.T., DBFCDXADS, cArqTRB, "TRBSA1", .F., .F.)
DbSelectArea("TRBSA1")
cArqInd := CriaTrab(Nil,.F.)
IndRegua("TRBSA1",cArqInd,cChaveInd,,"","Selecionando registros ...")
#IFNDEF TOP
DbSetIndex(cArqInd+OrdBagExt())
// RETORNO: .CDX
#ENDIF
DbSetOrder(1)
ORDKEY()
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.
Parmetros:
- 324 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
Exemplo:
RECLOCK()
Sintaxe: RecLock(cAlias,lInclui)
Parmetros
Exemplo 01 - Incluso
DbSelectArea(SA1)
RecLock(SA1,.T.)
SA1->A1_FILIAL := xFilial(SA1) // Retorna a filial de acordo com as configuraes do ERP
SA1->A1_COD := 900001
SA1->A1_LOJA := 01
MsUnLock() // Confirma e finaliza a operao
Exemplo 02 - Alterao
DbSelectArea(SA1)
DbSetOrder(1) // A1_FILIAL + A1_COD + A1_LOJA
DbSeek(01 + 900001 + 01) // Busca exata
RLOCK()
DBRLOCK()
- 325 -
Guia de Referncia Rpida
ADVPL Intermedirio
A sintaxe e a descrio destas funes esto disponveis no Guia de
Referncia Rpido ao final deste material.
UNLOCK()
DBUNLOCK()
DBUNLOCKALL()
RECNO()
Sintaxe: RECNO()
Parmetros:
Nenhum .
Retorno:
Exemplo:
DbSelectArea(SA1)
DbGoto(100) // Posiciona no registro de recno 100.
MSGINFO(Registro posicionado:+cValToChar(RECNO()))
SELECT()
Sintaxe: SELECT([cAlias])
Parmetros:
Retorno:
- 326 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
nArea := Select(SA1)
SET FILTER TO
O comando SET FILTER TO define uma condio de filtro que ser aplicada a rea de trabalho
ativa.
Parmetros:
cCondicao Expresso que ser avaliada pela SET FILTER, definindo os registros que
ficaro disponveis na rea de trabalho ativa.
Esta expresso obrigatoriamente deve ter um retorno lgico.
Retorno:
Nenhum .
Exemplo:
SET FILTER TO
- 327 -
Guia de Referncia Rpida
ADVPL Intermedirio
SOFTLOCK()
Permite a reserva do registro posicionado na rea de trabalho ativa de forma que outras
operaes, com exceo da atual, no possam atualizar este registro. Difere da funo
RecLock() pois no gera uma obrigao de atualizao, e pode ser sucedido por ele.
Sintaxe: SoftLock(cAlias)
Parmetros
Exemplo:
DbSelectArea(SA1)
DbSetOrder(1)
DbSeek(cChave)
IF Found()
SoftLock() // Reserva o registro localizado
lConfirma := AlteraSA1() // Funo ilustrativa que exibe os dados do registro
// posicionado e pemite a alterao dos mesmos.
IF lConfirma
RecLock(SA1,.F.)
GravaSA1() // Funo ilustrativa que altera os dados conforme a AlertaSA1()
MsUnLock() // Liberado o RecLock() e o SoftLock() do registro.
Endif
Endif
- 328 -
Guia de Referncia Rpida
ADVPL Intermedirio
USED()
Sintaxe: USED()
Parmetros:
Nenhum .
Retorno:
Lgico Verdadeiro (.T.) caso haja um arquivo de banco de dados em uso; caso
contrrio, retorna falso (.F.).
Exemplo:
USE Customer NEW
CONOUT(USED()) // Resulta: .T.
CLOSE
CONOUT (USED()) // Resulta: .F.
ZAP
O comando ZAP remove fisicamente todos os registro da tabela corrente. necessrio que o
alias em questo seja aberto em modo exclusivo para esta operao ser realizada.
Sintaxe: ZAP
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
cTabela := RetSqlName("SA4")
cAlias := "TMP"
USE (cTabela) ALIAS (cAlias) EXCLUSIVE NEW VIA "TOPCONN"
IfNetErr()
MsgStop("Nao foi possivel abrir "+cTabela+" em modo EXCLUSIVO.")
Else
ZAP
USE
MsgStop("Registros da tabela "+cTabela+" eliminados com sucesso.")
Endif
- 329 -
Guia de Referncia Rpida
ADVPL Intermedirio
Controle de numerao seqencial
GETSXENUM()
CONFIRMSXE()
Sintaxe: CONFIRMSXE(lVerifica)
Parmetros
ROLLBACKSXE()
Sintaxe: ROLLBACKSXE()
Parmetros
Nenhum .
- 330 -
Guia de Referncia Rpida
ADVPL Intermedirio
Validao
ALLWAYSFALSE()
A funo AllwaysFalse() foi criada com o objetivo de compatibilidade, sendo que sempre ir
retornar um valor lgico falso, facilitando a especificao desta situao nas parametrizaes
de validaes de modelos de interface pr-definidos no sistema.
Sintaxe: ALLWAYSFALSE()
Parmetros:
Nenhum .
Retorno:
ALLWAYSTRUE()
A funo AllwaysTrue() foi criada com o objetivo de compatibilidade, sendo que sempre ir
retornar um valor lgico verdadeiro, facilitando a especificao desta situao nas
parametrizaes de validaes de modelos de interface pr-definidos no sistema.
Sintaxe: ALLWAYSTRUE()
Parmetros:
Nenhum .
Retorno:
EXISTCHAV()
Retorna .T. ou .F. se o contedo especificado existe no alias especificado. Caso exista ser
exibido um help de sistema com um aviso informando da ocorrncia.
- 331 -
Guia de Referncia Rpida
ADVPL Intermedirio
EXISTCPO()
Retorna .T. ou .F. se o contedo especificado no existe no alias especificado. Caso no exista
ser exibido um help de sistema com um aviso informando da ocorrncia.
LETTERORNUM()
Sintaxe: LETTERORNUM(cString)
Parmetros:
Retorno:
Lgico Indica que se a string avaliada contm apenas letras e nmero, ou seja,
alfanumrico.
NAOVAZIO()
Sintaxe: NaoVazio()
Parmetros
Nenhum .
NEGATIVO()
Sintaxe: Negativo()
Parmetros
Nenhum .
- 332 -
Guia de Referncia Rpida
ADVPL Intermedirio
PERTENCE()
Retorna .T. ou .F. se o contedo digitado para o campo est contido na string definida como
parmetro da funo. Normalmente utilizada em campos com a opo de combo, pois caso
contrrio seria utilizada a funo ExistCpo().
Sintaxe: Pertence(cString)
Parmetros
POSITIVO()
Sintaxe: Positivo()
Parmetros
Nenhum .
TEXTO()
Retorna .T. ou .F. se o contedo digitado para o campo contm apenas nmeros ou
alfanumricos.
Sintaxe: Texto()
Parmetros
Nenhum .
VAZIO()
Sintaxe: Vazio()
Parmetros
Nenhum .
- 333 -
Guia de Referncia Rpida
ADVPL Intermedirio
Manipulao de parmetros do sistema
GETMV()
Sintaxe: GETMV(cParametro)
Parmetros
GETNEWPAR()
Difere do SuperGetMV() pois considera que o parmetro pode no existir na verso atual do
sistema, e por conseqncia no ser exibida a mensagem de help.
cPadrao Contedo padro que ser utilizado caso o parmetro no exista no SX6.
Define para qual filial ser efetuada a consulta do parmetro. Padro filial
cFilial
corrente da conexo.
- 334 -
Guia de Referncia Rpida
ADVPL Intermedirio
PUTMV()
SUPERGETMV()
cPadrao Contedo padro que ser utilizado caso o parmetro no exista no SX6.
Define para qual filial ser efetuada a consulta do parmetro. Padro filial
cFilial
corrente da conexo.
- 335 -
Guia de Referncia Rpida
ADVPL Intermedirio
Controle de impresso
AVALIMP()
Sintaxe: AVALIMP(nLimite)
Parmetros:
Retorno:
Exemplo:
/*/
+-----------------------------------------------------------------------------
| Funo | XAVALIMP | Autor | ARNALDO RAYMUNDO JR. | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao da funo AXCADASTRO() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
wnrel:= SetPrint(cString,wnrel,cPerg,cTitulo,cDesc1,cDesc2,cDesc3,.T.)
SetDefault(aReturn,cString)
- 336 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
If nLastKey == 27
Return
Endif
RptStatus({|| RunReport(cString)},cTitulo)
Return
/*/
+-----------------------------------------------------------------------------
| Funo | RUNREPORT | Autor | -------------------- | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Funo interna de processamento utilizada pela XAVALIMP() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
//+-------------------------------------------------------------------------+
//| Chamada da funo AVALIMP() |
//+-------------------------------------------------------------------------+
@ 00,00 PSAY AvalImp(220)
dbSelectArea(cString)
dbSeek(xFilial()+mv_par01+mv_par03,.T.)
...
Return
CABEC()
Parmetros:
- 337 -
Guia de Referncia Rpida
ADVPL Intermedirio
Parmetros (continuao):
Retorno:
Nenhum .
Exemplo:
#INCLUDE "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Funo | MPTR001 | Autor | ARNALDO RAYMUNDO JR. | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao das funes de impresso CABEC() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
Local cDesc1 := "Este programa tem como objetivo imprimir relatorio "
Local cDesc2 := "de acordo com os parametros informados pelo usuario."
Local cDesc3 := "Listagem de clientes"
Local cTitulo := "Listagem de clientes"
Local lImprime := .T.
// Parametros da SetPrint()
Local cString := "SA1"
Local cPerg := ""
Local lDic := .T. // Habilita a visalizacao do dicionario
Local aOrd := RetSixOrd(cString)
Local lCompres := .T. // .F. - Normal / .T. - Comprimido
Local lFilter := .T. // Habilita o filtro para o usuario
Local cNomeProg := "MPTR002"
Local cTamanho := "M"
Local nTipo := 18
Local nLimite := 132
Private nLastKey := 0
Private m_pag := 01
Private wnrel := "MPTR002"
dbSelectArea("SA1")
dbSetOrder(1)
- 338 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
//
// Monta a interface padrao com o usuario...
//
wnrel :=
SetPrint(cString,cNomeProg,cPerg,@cTitulo,cDesc1,cDesc2,cDesc3,lDic,aOrd,lCompre
s,cTamanho,,lFilter)
If nLastKey == 27
Return
Endif
If nLastKey == 27
Return
Endif
nTipo := IIF(aReturn[4]==1,15,18)
//
// Processamento. RPTSTATUS monta janela com a regua de processamento.
//
RptStatus({||
RunReport(cTitulo,cString,cNomeProg,cTamanho,nTipo,nLimite)},cTitulo)
Return
/*/
+-----------------------------------------------------------------------------
| Funo | RUNREPORT | Autor | -------------------- | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Funo interna de processamento utilizada pela MPTR001() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
Local nLin := 80
Local cCabec1 := ""
Local cCabec2 := ""
Local cArqInd
dbSelectArea("TRBSA1")
dbGoTop()
SetRegua(RecCount())
- 339 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
While !EOF()
IMPCADAST()
A funo IMPCADAST() cria uma interface simples que permite a impresso dos cadastros do
sistema com parametrizao DE/ATE.
Parmetros:
Retorno:
Nenhum .
MS_FLUSH()
Sintaxe: MS_FLUSH()
Parmetros:
Nenhum .
- 340 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
Nenhum .
Exemplo:
/*/
+-----------------------------------------------------------------------------
| Funo | RUNREPORT | Autor | -------------------- | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Funo interna de processamento utilizada pela MPTR001() |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
| Observao| Continuao do exemplo da funo CABEC() |
|+----------------------------------------------------------------------------
/*/
Local nLin := 80
Local cCabec1 := ""
Local cCabec2 := ""
Local cArqInd
dbSelectArea("TRBSA1")
dbGoTop()
SetRegua(RecCount())
While !EOF()
- 341 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
If aReturn[5]==1
dbCommitAll()
SET PRINTER TO
OurSpool(wnrel)
Endif
MS_FLUSH()
RETURN
OURSPOOL()
Sintaxe: OURSPOOL(cArquivo)
Parmetros:
Retorno:
. .
Exemplo:
- 342 -
Guia de Referncia Rpida
ADVPL Intermedirio
RODA()
A funo RODA() imprime o rodap da pgina do relatrio, o que pode ser feito a cada pgina,
ou somente ao final da impresso.
Parmetros:
Retorno:
Nenhum .
Exemplo:
/*/
+-----------------------------------------------------------------------------
| Funo | TESTIMPR | Autor | MICROSIGA | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Exemplo de utilizao da funo RODA() em conjunto com a CABEC.|
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
#include "protheus.ch"
SetDefault(aReturn,cString)
RptStatus({|lEnd| TestRel(@lEnd,wnRel,cString,Tamanho,NomeProg)},titulo)
Return
- 343 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
/*/
+-----------------------------------------------------------------------------
| Funo | TESTREL | Autor | MICROSIGA | Data | 01.01.2007 |
+-----------------------------------------------------------------------------
| Descrio | Funo interna de impresso da TestImpr(). |
|+----------------------------------------------------------------------------
| Uso | Curso ADVPL |
|+----------------------------------------------------------------------------
/*/
User Function TestRel(lEnd,WnRel,cString,Tamanho,NomeProg)
LOCAL cabec1,cabec2
LOCAL cRodaTxt := oemtoansi("Rodap")
Local nCntImpr
Local nTipo
nCntImpr := 0
li := 80
m_pag := 1
nTipo := 15
titulo:= oemtoansi("Lista de Clientes")
cabec1:= oemtoansi("COD LOJA NOME"+Space(27)+ "NOME FANTASIA")
cabec2:=""
dbSelectArea("SA1")
dbGoTop()
SetRegua(LastRec())
While !Eof()
IncRegua()
If Li > 60
cabec(titulo,cabec1,cabec2,nomeprog,tamanho,15)
@ Li,0 PSAY __PrtThinLine()
Endif
nCntImpr++
Li++
@ Li,01 PSAY A1_COD
@ Li,05 PSAY A1_LOJA
@ Li,10 PSAY A1_NOME
@ Li,51 PSAY A1_NREDUZ
If Li > 60
Li:=66
Endif
dbSkip()
EndDO
If li != 80
Roda(nCntImpr,cRodaTxt,Tamanho)
EndIf
- 344 -
Guia de Referncia Rpida
ADVPL Intermedirio
SETDEFAULT()
Sintaxe: SetDefault ( < aReturn > , < cAlias > , [ uParm3 ] , [ uParm4 ] ,
[cSize] , [ nFormat ] )
Parmetros:
Retorno:
Nenhum .
Estrutura aReturn:
- 345 -
Guia de Referncia Rpida
ADVPL Intermedirio
SETPRC()
Parmetros:
Retorno:
Nenhum .
Exemplo:
SETPRINT()
A funo SetPrint() cria uma interface padro onde as opes de impresso de um relatrio
podem ser configuradas. Basicamente duas variveis m_pag e aReturn precisam ser
declaradas como privadas (private) antes de executar a SetPrint(), sendo que:
Aps confirmada, os dados so armazenados no vetor aReturn que ser passado como
parmetro para funo SetDefault().
Sintaxe: SetPrint ( < cAlias > , < cProgram > , [ cPergunte ] , [ cTitle ] , [
cDesc1 ] , [ cDesc2 ] , [ cDesc3 ] , [ lDic ] , [ aOrd ] , [ lCompres ] , [
cSize ] , [ uParm12 ] , [ lFilter ] , [ lCrystal ] , [ cNameDrv ] , [
uParm16 ] , [ lServer ] , [ cPortPrint ] ) --> cReturn
Parmetros:
- 346 -
Guia de Referncia Rpida
ADVPL Intermedirio
Parmetros (continuao):
Retorno:
Estrutura aReturn:
- 347 -
Guia de Referncia Rpida
ADVPL Intermedirio
Controle de processamentos
ABREEXCL()
A funo ABREEXCL() fecha o arquivo cujo alias est expresso em <cAlias> e o reabre em
modo exclusivo para proceder operaes em que isto necessrio, como por exemplo, PACK.
Se outra estao estiver usando o arquivo, o retorno ser .F..
Sintaxe: ABREEXCL(cAlias)
Parmetros:
Retorno:
CLOSEOPEN()
A funo CLOSEOPEN() utilizada para fechar e re-abrir uma lista de arquivos especificada.
Parmetros:
aClose Array contendo os Aliases dos arquivos que devero ser fechados.
aOpen Array contendo os Aliases dos arquivos que devero ser abertos.
Retorno:
CLOSESFILE()
A funo CLOSESFILE() fecha todos os arquivos em uso pela conexo, com exceo dos SXs
(inclusive SIX), SM2 e SM4.
Sintaxe: CLOSESFILE(cAlias)
Parmetros:
cAlias String contendo os nomes dos demais Aliases que no devero ser fechados,
separando os itens com /.
Retorno:
- 348 -
Guia de Referncia Rpida
ADVPL Intermedirio
CHKFILE()
A funo CHKFILE() retorna verdadeiro (.T.) se o arquivo j estiver aberto ou se o Alias no for
informado. Sempre que desejar mudar o modo de acesso do arquivo (de compartilhado para
exclusivo ou vice-versa), feche-o antes de cham-la.
Sintaxe: ChkFile(cAlias,lExcl,cNewAlias)
Parmetros:
Retorno:
Exemplo:
dbSelectArea(SA1)
dbCloseArea()
lOk := .T.
While .T.
IF !ChkFile(SA1,.T.)
nResp := Alert(Outro usurio usando! Tenta de novo?,{Sim,Nao})
If nResp == 2
lOk := .F.
Exit
Endif
Endif
EndDo
If lOk
// Faz o processamento com o arquivo...
Endif
// Finaliza
If Select(SA1)
dbCloseArea()
Endif
ChkFile(SA1,.F.)
Return
- 349 -
Guia de Referncia Rpida
ADVPL Intermedirio
CONOUT()
Sintaxe: CONOUT(cMensagem)
Parmetros:
Retorno:
Nenhum .
CRIAVAR()
A funo CRIAVAR() cria uma varivel, retornando o valor do campo, de acordo com o
dicionrio de dados, inclusive avaliando o inicializador padro, permitindo um retorno de
acordo com o tipo de dado definido no dicionrio.
Sintaxe: CriaVar(cCampo,lIniPad,cLado)
Parmetros:
Retorno:
Exemplo:
- 350 -
Guia de Referncia Rpida
ADVPL Intermedirio
DISARMTRANSACTION()
Ao utilizar esta funo, todas as alteraes realizadas no intervalo delimitado pela transao
so desfeitas, restaurando a situao da base de dados ao ponto imediatamente anterior ao
incio do processamento.
Sintaxe: DISARMTRANSACTION()
Parmetros:
Nenhum .
Retorno:
Nenhum .
Exemplo:
lMsErroAuto := .F.
MSExecAuto({|x,y| MATA240(x,y)}, aCampos, 3)
If lMsErroAuto
aAutoErro := GETAUTOGRLOG()
DisarmTransaction()
MostraErro()
EndIf
- 351 -
Guia de Referncia Rpida
ADVPL Intermedirio
EXECBLOCK()
A funo EXECBLOCK() executa uma funo de usurio que esteja compilada no repositrio.
Esta funo normalmente utilizada pelas rotinas padres da aplicao Protheus para executar
pontos de entrada durante seu processamento.
EXISTBLOCK()
Sintaxe: EXISTBLOCK(cFuno)
Parmetros:
Retorno:
Exemplo:
IF EXISTBLOCK(MT100GRV)
EXECBLOCK(MT100GRV,.F.,.F.,aParam)
ENDIF
- 352 -
Guia de Referncia Rpida
ADVPL Intermedirio
Sintaxe: EXECBLOCK(cFuno, lReserv1, lReserv2, xParam)
Parmetros:
Retorno:
Exemplo:
IF EXISTBLOCK(MT100GRV)
lGravou := EXECBLOCK(MT100GRV,.F.,.F.,aParam)
ENDIF
RETURN .T.
ERRORBLOCK()
<objError> um error object que contm informaoes sobre o erro.Dentro do bloco de cdigo,
podem ser enviadas mensagens ao error object para obter informaoes sobre o erro. Se o
bloco de tratamento de erros retornar verdadeiro (.T.), a operaao que falhou repetida, e se
retornar falso (.F.), o processamento recomea.
- 353 -
Guia de Referncia Rpida
ADVPL Intermedirio
uma importante consequncia do fato de os blocos de tratamento de erros serem especificados
como blocos de cdigo, que eles podem ser passados pararotinas e funoes definidas por
usurio e depois retornadas como valores.
Retorno:
Code-block Retorna o bloco de cdigo corrente que tratar o erro. Caso nao tenha sido
enviado nenhum bloco de tratamento de erro desde que o programa foi
invocado, ERRORBLOCK() retorna o bloco de tratamento de erro padrao.
Exemplo:
Function CA010Form()
LOCAL xResult
LOCAL cForm:= Upper(&(ReadVar()))
LOCAL bBlock:= ErrorBlock( { |e| ChecErro(e) } )
LOCAL cOutMod
Local lOptimize := GetNewPar("MV_OPTNFE",.F.) .Or. GetNewPar("MV_OPTNFS",.F.)
PRIVATE lRet:=.T.
While ! Empty(cOutMod)
If Left(cOutMod, At(",", cOutMod) - 1) $ Upper(cForm) // no modulo
Help( " ",1,"ERR_FORM,,"Variavel nao disponivel para este modulo"
Return .F.
Endif
cOutMod := Subs(cOutMod, At(",", cOutMod) + 1)
EndDo
If ("LERSTR"$cForm .or. "LERVAL"$cForm .or. "LERDATA"$cForm) .And. M->I5_CODIGO >
"499"
Help( " ",1,"CA010TXT")
ErrorBlock(bBlock)
Return .F.
Endif
BEGIN SEQUENCE
If !"EXECBLOCK"$cForm .and. !"LERSTR"$cForm .And.; // nao executa execblock
!"LERVAL"$cForm .And.; // nem funcao de leitura
!"LERDATA"$cForm .And.; // de texto no cadastramento
IIf(!lOptimize,.T.,!"CTBANFS"$cForm .And. !"CTBANFE"$cForm)
xResult := &cForm
Endif
END SEQUENCE
ErrorBlock(bBlock)
Return lRet
- 354 -
Guia de Referncia Rpida
ADVPL Intermedirio
FINAL()
A funo FINAL() executa as 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, finalizando-o em seguinda.
Parmetros:
Retorno:
Nenhum .
Exemplo:
Return
FINDFUNCTION()
Sintaxe: FINDFUNCTION(cFuno)
Parmetros:
Retorno:
- 355 -
Guia de Referncia Rpida
ADVPL Intermedirio
FUNDESC()
Sintaxe: FUNDESC()
Parmetros:
Nenhum .
Retorno:
FUNNAME()
Sintaxe: FUNNAME()
Parmetros:
Nenhum .
Retorno:
GETAREA()
Sintaxe: GETAREA()
Retorno: Array contendo {Alias(),IndexOrd(),Recno()}
Parmetros
Nenhum .
- 356 -
Guia de Referncia Rpida
ADVPL Intermedirio
GETCOUNTRYLIST()
Sintaxe: GetCountryList()
Parmetros:
Nenhum .
Retorno:
Array
Array de duas dimenses, sendo uma linha para cada pas localizado,
contendo em cada posio a sigla dos pases, o nome do pas e a
identificao do pas com dois dgitos.
Exemplo:
ISINCALLSTACK()
A funo ISINCALLSTACK() verifica se uma determinada funo est existe dentro da pilha de
chamadas do processamento corrente.
Parmetros:
Retorno:
- 357 -
Guia de Referncia Rpida
ADVPL Intermedirio
REGTOMEMORY()
Inicializa as variveis de memria identificadas pelo uso do alias M-> de acordo com a
estrutura e/ou informaes contidas no arquivo definido como referncia.
Parmetros:
cAlias Alias do arquivo que ser utilizado como referncia para inicializao das
variveis de memria.
lInclui Identifica se as variveis devero ser inicializadas com contedos padres,
ou contendo as informaes do registro posicionado do alias especificado.
Retorno:
Nenhum .
- 358 -
Guia de Referncia Rpida
ADVPL Intermedirio
RESTAREA()
Funo utilizada para devolver a situao do ambiente salva atravs do comando GETAREA().
Deve-se observar que a ltima rea restaurada a rea que ficar ativa para a aplicao.
Sintaxe: RESTAREA(aArea)
Parmetros
Exemplo:
LOCAL cVar
LOCAL aArea := GetArea()
LOCAL lRet := .T.
cVar := &(ReadVar())
dbSelectArea("SX5")
IF !dbSeek(xFilial()+"Z1"+cVar)
ENDIF
RestArea(aArea)
Return( lRet )
USEREXCEPTION()
Sintaxe: USEREXCEPTION(cMensagem)
Parmetros:
Retorno:
- 359 -
Guia de Referncia Rpida
ADVPL Intermedirio
Nenhum .
- 360 -
Guia de Referncia Rpida
ADVPL Intermedirio
Utilizao de recursos do ambiente ERP
AJUSTASX1()
Parmetros:
Retorno:
Nenhum .
- 361 -
Guia de Referncia Rpida
ADVPL Intermedirio
Estrutura Item do array aPerg (continuao):
- 362 -
Guia de Referncia Rpida
ADVPL Intermedirio
ALLUSERS()
Sintaxe: ALLUSERS()
Parmetros:
Nenhum .
Retorno:
- 363 -
Guia de Referncia Rpida
ADVPL Intermedirio
Array de informaes dos usurios: Configuraes de impresso
- 364 -
Guia de Referncia Rpida
ADVPL Intermedirio
ALLGROUPS()
Sintaxe: ALLGROUPS()
Parmetros:
Nenhum .
Retorno:
- 365 -
Guia de Referncia Rpida
ADVPL Intermedirio
CGC()
A funo CGC() valida o CGC digitado, utilizando o algoritmo nacional para verificao do dgito
de controle.
Sintaxe: CGC(cCGC)
Parmetros:
Retorno:
CONPAD1()
A funo CONPAD1() exibe uma tela de consulta padro baseada no Dicionrio de Dados
(SXB).
Parmetros:
Retorno:
Nenhum .
- 366 -
Guia de Referncia Rpida
ADVPL Intermedirio
DATAVALIDA()
A funo DATAVALIDA() retorna a primeira data vlida a partir de uma data especificada como
referncia, considerando inclusive a data informada para anlise.
Sintaxe: DATAVALIDA(dData)
Parmetros:
dData Data a partir da qual ser avaliada a prxima data vlida, considerando-a
inclusive como uma possibilidade.
Retorno:
EXISTINI()
Sintaxe: EXISTINI(cCampo)
Parmetros:
Retorno:
Exemplo:
Return
- 367 -
Guia de Referncia Rpida
ADVPL Intermedirio
EXTENSO()
A funo EXTENSO() retorna uma string referente a descrio por extenso de um valor
numrico, sendo comumente utilizada para impresso de cheques, valor de duplicatas, etc.
Parmetros:
Retorno:
FORMULA()
Interpreta uma frmula cadastrada. Esta funo interpreta uma frmula, previa-mente
cadastrada no Arquivo SM4 atravs do Mdulo Configurador, e retorna o resultado com tipo de
dado de acordo com a prpria frmula.
Sintaxe: Formula(cFormula)
Parmetros:
Retorno:
GETADVFVAL()
Sintaxe: GetAdvFVal(cAlias,uCpo,uChave,nOrder,uDef)
Parmetros:
- 368 -
Guia de Referncia Rpida
ADVPL Intermedirio
Retorno:
HELP()
Esta funo exibe a ajuda especificada para o campo e permite sua edio. Se for
um help novo, escreve-se o texto em tempo de execuo.
Parmetros:
Retorno:
Nenhum .
Por esta razo, em rotinas que podem ser chamadas atravs da funo
MSEXECAUTO() deve-se sempre utilizar avisos utilizando esta funo, para
que este tipo de processamento no seja travado indevidamente.
Exemplo:
IF lAuto // Se for rotina automtica
Help("ESPECIFICO",1,"HELP","PROCESSAMENTO","Parmetros do JOB Invlidos",1,0)
ELSE
MsgAlert(Parmetros do JOB Invlidos, PROCESSAMENTO)
ENDIF
- 369 -
Guia de Referncia Rpida
ADVPL Intermedirio
MESEXTENSO()
Sintaxe: MESEXTENSO(nMes)
Parmetros:
Este parmetro pode ser definido tambm como caracter ou como data.
Retorno:
OBRIGATORIO()
Parmetros:
Retorno:
- 370 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
#INCLUDE "protheus.ch"
/*/
+-----------------------------------------------------------------------------
| Programa | ATFA010A | Autor | ARNALDO R. JUNIOR | Data | |
+-----------------------------------------------------------------------------
| Desc. | Cadastro de dados complementares do bem Ativo Fixo |
+----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
dbSelectArea("SN1")
dbSetOrder(1)
dbSelectArea(cString)
mBrowse( 6,1,22,75,cString)
Return
/*/
+-----------------------------------------------------------------------------
| Programa | A010AATU | Autor | ARNALDO R. JUNIOR | Data | |
+-----------------------------------------------------------------------------
| Desc. | Atualizao de dados do bem Ativo Fixo |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Local aCpoEnch := {}
Local aAlter := {}
Local aButtons := {}
Local cAliasE := cAlias
Local aAlterEnch := {}
Local aPos := {015,000,400,600
Local nModelo :=
Local lF3 := .F.
Local lMemoria := .T.
Local lColumn := .F.
Local caTela := ""
Local lNoFolder := .F.
Local lProperty := .F.
- 371 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
Private oDlg
Private oGetD
Private oEnch
Private aTELA[0][0] // Variveis que sero atualizadas pela Enchoice()
Private aGETS[0] // e utilizadas pela funo OBRIGATORIO()
DbSelectArea("SX3")
DbSetOrder(1)
DbSeek(cAliasE)
//+--------------------------------------------------------------------------+
//|Campos da enchoice |
//+--------------------------------------------------------------------------+
While !Eof() .And. SX3->X3_ARQUIVO == cAliasE
If !(SX3->X3_CAMPO $ "A1_FILIAL") .And. cNivel >= SX3->X3_NIVEL .And.
X3Uso(SX3->X3_USADO)
AAdd(aCpoEnch,SX3->X3_CAMPO)
EndIf
DbSkip()
End
//+--------------------------------------------------------------------------+
//|Campos alterveis da enchoice |
//+--------------------------------------------------------------------------+
AADD(aAlterEnch,"N1_TIPOADT") // Controle de Adiantamentos
AADD(aAlterEnch,"N1_DESCRIC") // Descrio
AADD(aAlterEnch,"N1_CHAPA") // Numero da plaqueta
AADD(aAlterEnch,"N1_FORNEC") // Fornecedor
AADD(aAlterEnch,"N1_LOJA") // Loja do Fornecedor
AADD(aAlterEnch,"N1_NSERIE") // Serie da Nota
AADD(aAlterEnch,"N1_NFISCAL") // Numero da Nota
AADD(aAlterEnch,"N1_NFITEM") // Item da Nota
AADD(aAlterEnch,"N1_UM") // Unidade de Medida
AADD(aAlterEnch,"N1_PRODUTO") // Cdigo do Produto
AADD(aAlterEnch,"N1_PEDIDO") // Codigo do Pedido de Compras
AADD(aAlterEnch,"N1_ITEMPED") // Item do Pedido de Compras
AADD(aAlterEnch,"N1_PRCIMP") // Codigo do Processo de Importacao
AADD(aAlterEnch,"N1_CODPAIS") // Codigo do Pais
AADD(aAlterEnch,"N1_ORIGCPR") // Origem de Compras
AADD(aAlterEnch,"N1_CODSP") // Codigo da SP Interna
AADD(aAlterEnch,"N1_CHASSIS") // Numero de serie
//+--------------------------------------------------------------------------+
//|Montagem do DIALOG |
//+--------------------------------------------------------------------------+
DEFINE MSDIALOG oDlg TITLE cCadastro FROM 000,000 TO 400,600 PIXEL
RegToMemory("SN1", .F.)
RETURN
- 372 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo (continuao):
/*/
+-----------------------------------------------------------------------------
| Programa | A010AGRV | Autor | ARNALDO R. JUNIOR | Data | |
+-----------------------------------------------------------------------------
| Desc. | Validao da enchoice e gravao dos dados do bem |
+-----------------------------------------------------------------------------
| Uso | Curso de ADVPL |
+-----------------------------------------------------------------------------
/*/
Static Function A010AGRV(aCpos,aAlter,nOpc)
Return .T.
OPENFILE()
Sintaxe: OPENFILE(cEmp)
Parmetros:
Retorno:
Nenhum .
- 373 -
Guia de Referncia Rpida
ADVPL Intermedirio
PERGUNTE()
Parmetros:
Retorno:
PESQPICT()
Sintaxe: PesqPict(cAlias,cCampo,nTam)
Parmetros:
Retorno:
- 374 -
Guia de Referncia Rpida
ADVPL Intermedirio
PESQPICTQT()
Sintaxe: PesqPictQt(cCampo,nEdio)
Parmetros:
Retorno:
String Picture ideal para o espao definido por nEdio, sem a separao dos
milhares por vrgula.
POSICIONE()
Parmetros:
Retorno:
- 375 -
Guia de Referncia Rpida
ADVPL Intermedirio
PUTSX1()
Parmetros:
- 376 -
Guia de Referncia Rpida
ADVPL Intermedirio
RETINDEX()
Sintaxe: RETINDEX(cAlias)
Parmetros:
Retorno:
SIXDESCRICAO()
Sintaxe: SIXDESCRICAO()
Parmetros:
Nenhum .
Retorno:
Exemplo:
dbSelectArea(SIX)
dbSetOrder(1)
If dbSeek(cChave+cOrdem)
cSixDescr := SixDescricao()
EndIf
Return
- 377 -
Guia de Referncia Rpida
ADVPL Intermedirio
TABELA()
A funo TABELA() retorna o contedo de uma tabela cadastrada no Arquivo de Tabelas (SX5)
de acordo com a chave especificada. Caso a tabela ou a chave especificada no existir ser
exibido um HELP() padro do sistema.
Sintaxe: Tabela(cTab,cChav,lPrint)
Parmetros:
Retorno:
TAMSX3()
Sintaxe: TAMSX3(cCampo)
Parmetros:
Retorno:
- 378 -
Guia de Referncia Rpida
ADVPL Intermedirio
TM()
A funo TM() retorna a picture de impresso para valores numricos dependendo do espao
disponvel.
Parmetros:
Retorno:
MV_MILHAR Determina se deve haver separao de milhar;
MV_CENT Nmero de casas decimais padro da moeda corrente.
- 379 -
Guia de Referncia Rpida
ADVPL Intermedirio
X1DEF01()
Sintaxe: X1DEF01()
Parmetros:
Nenhum .
Retorno:
Exemplo:
dbSelectArea(SX1)
dbSetOrder(1)
Return
- 380 -
Guia de Referncia Rpida
ADVPL Intermedirio
X1PERGUNT()
Sintaxe: X1PERGUNT()
Parmetros:
Nenhum .
Retorno:
Exemplo:
X2NOME()
Sintaxe: X2NOME()
Parmetros:
Nenhum .
Retorno:
Exemplo:
- 381 -
Guia de Referncia Rpida
ADVPL Intermedirio
X3CBOX()
Sintaxe: X3CBOX()
Parmetros:
Nenhum .
Retorno:
Exemplo:
Local cTitulo
Local cDescri
Local cCombo
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( cCampo )
cTitulo := X3Titulo()
cDescri := X3Descri()
cCombo := X3Cbox()
EndIf
Return
X3DESCRIC()
Sintaxe: X3DESCRIC()
Parmetros:
Nenhum .
Retorno:
- 382 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
Local cTitulo
Local cDescri
Local cCombo
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( cCampo )
cTitulo := X3Titulo()
cDescri := X3Descri()
cCombo := X3Cbox()
EndIf
Return
X3PICTURE()
Sintaxe: X3PICTURE(cCampo)
Parmetros:
Retorno:
Exemplo:
Local cPicture
- 383 -
Guia de Referncia Rpida
ADVPL Intermedirio
X3TITULO()
Sintaxe: X3TITULO()
Parmetros:
Nenhum .
Retorno:
Exemplo:
Local cTitulo
dbSelectArea(SX3)
dbSetOrder(2)
If dbSeek( A1_COD )
cTitulo := X3Titulo()
EndIf
Return
X3USO()
Parmetros:
Retorno:
- 384 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
DbSelectArea(SX3)
DbSetOrder(2)
DbSeek(A1_COD)
If X3Uso( SX3->X3_USADO )
lUsado := .T.
EndIf
Return lUsado
X5DESCRI()
Sintaxe: X5DESCRI()
Parmetros:
Nenhum .
Retorno:
Exemplo:
dbSelectArea(SX5)
dbSetOrder(1)
If dbSeek( cFilial+cTabela+cChave )
cDescr := X5Descri()
EndIf
Return
- 385 -
Guia de Referncia Rpida
ADVPL Intermedirio
X6CONTEUD()
Sintaxe: X6CONTEUD()
Parmetros:
Nenhum .
Retorno:
Exemplo:
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr := X6Descric()
cDescr += X6Desc1()
cDescr += X6Desc2()
cConteud := X6Conteud()
EndIf
Return
- 386 -
Guia de Referncia Rpida
ADVPL Intermedirio
X6DESCRIC()
Sintaxe: X6DESCRIC()
Parmetros:
Nenhum .
Retorno:
X6DESC01() retorna o primeiro complemento da descrio.
X6DESC02() retorna o segundo complemento da descrio.
Exemplo:
Local cDescr
Local cConteud
dbSelectArea(SX6)
dbSetOrder(1)
If dbSeek( cFilial+cParm )
cDescr := X6Descric()
cDescr += X6Desc1()
cDescr += X6Desc2()
cConteud := X6Conteud()
EndIf
Return
- 387 -
Guia de Referncia Rpida
ADVPL Intermedirio
XADESCRIC()
A funo XADESCRI() retorna o contedo da descrio dos folders de acordo com o registro
posicionado no Dicionrio de Dados (SXA) no idioma corrente.
Sintaxe: XADESCRIC()
Parmetros:
Nenhum .
Retorno:
Exemplo:
XBDESCRI()
Sintaxe: XBDESCRI()
Parmetros:
Nenhum .
Retorno:
Exemplo:
- 388 -
Guia de Referncia Rpida
ADVPL Intermedirio
XFILIAL()
Esta funo utilizada para permitir que pesquisas e consultas em arquivos trabalhem
somente com os dados da filial corrente, dependendo claro se o arquivo est compartilhado
ou no (definio que feita atravs do mdulo Configurador Dicionrio de Dados (SX2)).
importante verificar que esta funo no tem por objetivo retornar apenas a filial corrente,
mas retorn-la caso o arquivo seja exclusivo. Se o arquivo estiver compartilhado, a funo
xFilial retornar dois espaos em branco.
Sintaxe: XFILIAL(cAlias)
Parmetros:
Retorno:
- 389 -
Guia de Referncia Rpida
ADVPL Intermedirio
Componentes da interface visual
MSDIALOG()
Define o componente MSDIALOG(), o qual utilizado como base para os demais componentes
da interface visual, pois um componente MSDIALOG() uma janela da aplicao.
Sintaxe:
Parmetros
oObjetoDLG Posio do objeto Say em funo da janela em que ele ser definido.
Exemplo:
- 390 -
Guia de Referncia Rpida
ADVPL Intermedirio
MSGET()
Define o componente visual MSGET, o qual utilizado para captura de informaes digitveis
na tela da interface.
Sintaxe:
Parmetros
nLinha, nColuna Posio do objeto MsGet em funo da janela em que ele ser definido.
Varivel da aplicao que ser vinculada ao objeto MsGet, que definir
VARIAVEL suas caractersticas e na qual ser armezanado o que for informado no
campo.
nLargura,nAltura Dimenses do objeto MsGet para exibio do texto.
cF3 String que define a consulta padro que ser vinculada ao campo.
Exemplo:
@ 010,050 MSGET cCGC SIZE 55, 11 OF oDlg PIXEL PICTURE "@R 99.999.999/9999-99";
VALID !Vazio()
- 391 -
Guia de Referncia Rpida
ADVPL Intermedirio
SAY()
Define o componente visual SAY, o qual utilizado para exibio de textos em uma tela de
interface.
Sintaxe:
Parmetros
nLinha, nColuna Posio do objeto Say em funo da janela em que ele ser definido.
Exemplo:
BUTTON()
Define o componente visual Button, o qual permite a incluso de botes de operao na tela
da interface, os quais sero visualizados somente com um texto simples para sua identificao.
Sintaxe: BUTTON()
Parmetros
nLinha,nColuna Posio do objeto Button em funo da janela em que ele ser definido.
- 392 -
Guia de Referncia Rpida
ADVPL Intermedirio
Exemplo:
SBUTTON()
Define o componente visual SButton, o qual permite a incluso de botes de operao na tela
da interface, os quais sero visualizados dependendo da interface do sistema ERP utilizada
somente com um texto simples para sua identificao, ou com uma imagem (BitMap) pr-
definido.
Sintaxe: SBUTTON()
Parmetros
Exemplo:
DEFINE SBUTTON FROM 020, 120 TYPE 2 ACTION (nOpca := 2,oDlg:End());
ENABLE OF oDlg
- 393 -
Guia de Referncia Rpida
ADVPL Intermedirio
CHECKBOX()
Define o componente visual CheckBox, o qual permite a utilizao da uma marca para habilitar
ou no uma opo escolhida, sendo esta marca acompanhada de um texto explicativo. Difere
do RadioMenu pois cada elemento do check nico, mas o Radio permite a utilizao de uma
lista junto com um controle de seleo.
Sintaxe:
Parmetros:
Exemplo:
@ 110,10 CHECKBOX oChk VAR lChk PROMPT "Marca/Desmarca" SIZE 60,007 PIXEL OF oDlg ;
ON CLICK(aEval(aVetor,{|x| x[1]:=lChk}),oLbx:Refresh())
- 394 -
Guia de Referncia Rpida
ADVPL Intermedirio
COMBOBOX()
Define o componente visual ComboBox, o qual permite seleo de um item dentro de uma lista
de opes de textos simples no formato de um vetor.
Sintaxe:
Parmetros:
Exemplo:
@ 40, 10 COMBOBOX oCombo VAR cCombo ITEMS aCombo SIZE 180,10 PIXEL OF
oFld:aDialogs[2]
- 395 -
Guia de Referncia Rpida
ADVPL Intermedirio
FOLDER()
Define o componente visual Folder, o qual permite a incluso de diversos Dialogs dentro de
uma mesma interface visual. Um Folder pode ser entendido como um array de Dialogs, aonde
cada painel recebe seus componentes e tem seus atributos definidos independentemente dos
demais.
Sintaxe:
Parmetros
Exemplo:
@ 50,06 FOLDER oFld OF oDlg PROMPT "&Buscas", "&Consultas", "Check-&Up / Botes" PIXEL
SIZE 222,078
- 396 -
Guia de Referncia Rpida
ADVPL Intermedirio
RADIO()
Define o componente visual Radio, tambm conhecido como RadioMenu, o qual seleo de
uma opo ou de mltiplas opes atravs de uma marca para os itens exibidos de uma lista.
Difere do componente CheckBox, pois cada elemento de check sempre nico, e o Radio pode
conter um ou mais elementos.
Sintaxe:
Parmetros
Exemplo:
- 397 -
Guia de Referncia Rpida
ADVPL Intermedirio
Interfaces de cadastro
AXCADASTRO()
MBROWSE()
AXPESQUI()
Funo de pesquisa padro em registros exibidos pelos browses do sistema, a qual posiciona o
browse no registro pesquisado. Exibe uma tela que permite a seleo do ndice a ser utilizado
na pesquisa e a digitao das informaes que compe a chave de busca.
Sintaxe: AXPESQUI()
Parmetros
Nenhum .
- 398 -
Guia de Referncia Rpida
ADVPL Intermedirio
AXVISUAL()
Parmetros
AXINCLUI()
Parmetros
- 399 -
Guia de Referncia Rpida
ADVPL Intermedirio
Funo de validao de confirmao da tela. No deve ser passada
como Bloco de Cdigo, mas pode ser passada como uma lista de
expresses, desde que a ltima ao efetue um retorno lgico:
cTudoOk
(Func1(), Func2(), ...,FuncX(), .T. )
AXALTERA()
Parmetros
- 400 -
Guia de Referncia Rpida
ADVPL Intermedirio
AXDELETA()
Parmetros
aCpos Vetor com nome dos campos que podero ser editados
Botes adicionais para a EnchoiceBar, no formato:
aArray[n][1] -> Imagem do boto
aButtons
aArray[n][2] -> bloco de cdigo contendo a ao do boto
aArray[n][3] -> ttulo do boto
Funes para execuo em pontos pr-definidos da AxFunction(),
conforme abaixo:
aParam[1] := Bloco de cdigo que ser processado antes da exibio
da interface.
aParam[2] := Bloco de cdigo para processamento na validao da
aParam
confirmao.
aParam[3] := Bloco de cdigo que ser executado dentro da transao
da AxFunction().
aParam[4] := Bloco de cdigo que ser executado fora da transao da
AxFunction().
Array no formato utilizado pela funcionalidade MsExecAuto(). Caso seja
informado este array, no ser exibida a tela de interface, e ser
executada a funo EnchAuto().
aAuto aAuto[n][1] := Nome do campo
aAuto[n][2] := Contedo do campo
aAuto[n][3] := Validao que ser utilizada em substituio as
validaes do SX3
lMaximized Indica se a janela dever ser ou no maximizada
- 401 -
Guia de Referncia Rpida
ADVPL Intermedirio
Interfaces visuais para aplicaes
ALERT()
Sintaxe: AVISO(cTexto)
Parmetros
AVISO()
Parmetros
- 402 -
Guia de Referncia Rpida
ADVPL Intermedirio
FORMBACTH()
- 403 -
Guia de Referncia Rpida
ADVPL Intermedirio
MSGFUNCTIONS()
Parmetros
MSGALERT
MSGINFO
MSGSTOP
MSGYESNO
- 404 -
Guia de Referncia Rpida
ADVPL Intermedirio
Recursos das interfaces visuais
GDFIELDGET()
Parmetros:
Retorno:
GDFIELDPOS()
Sintaxe: GDFIELDPOS(cCampo)
Parmetros:
Retorno:
Numrico Posio que o campo ocupada na grid. Caso o mesmo no exista ser
retornado 0.
GDFIELDPUT()
A funo GDFIELDPUT() atualiza o contedo de uma grid formada por um objeto do tipo
MsNewGetDados() de acordo com o campo e linha da grid especificados.
Parmetros:
Retorno:
Nenhum .
- 405 -
Guia de Referncia Rpida
ADVPL Intermedirio
GETMARK()
Parmetros:
Retorno:
String
Conjunto de caracteres que definem a marca que dever ser utilizada pela
MarkBrowse durante o processamento corrente.
Exemplo:
Function <nome-da-funo>( )
Return
- 406 -
Guia de Referncia Rpida
ADVPL Intermedirio
MARKBREFRESH()
Sintaxe: MARKBREFRESH()
Parmetros:
Nenhum .
Retorno:
Nenhum .
READVAR()
A funo READVAR() retorna o nome da varivel ou campo associoado ao objeto do tipo GET()
atualmente selecionado ou em edio.
Sintaxe: READVAR()
Parmetros:
Nenhum .
Retorno:
- 407 -
Guia de Referncia Rpida
ADVPL Intermedirio