Você está na página 1de 273

ADVPL II

Versão 1.0 24/08/2012 – Todos direitos reservados

Apostila de ADVPL II

NFT – Núcleo de Formação


tpai Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 1
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

ÍÍN
NDDIIC
CEE

ÍNDICE ............................................................................................................................. 2

SIMBOLOGIA.................................................................................................................... 9

SOBRE O AUTOR ............................................................................................................ 10

INTRODUÇÃO ................................................................................................................ 12

SOBRE A NFT ........................................................................................................................ 12

NOSSAS OFERTAS & SOLUÇÕES ...................................................................................... 13

TREINAMENTOS ................................................................................................................... 13
CONSULTORIA EM TREINAMENTOS ..................................................................................... 14

OBJETIVO....................................................................................................................... 15

MERCADO DE TRABALHO ............................................................................................... 16

HISTÓRIA DO ADVPL ...................................................................................................... 17

CAPÍTULO 1 - OBJETOS. .................................................................................................. 18

DEFINIÇÃO .............................................................................................................................. 18
DESVANTAGENS ....................................................................................................................... 20
Exercício 1......................................................................................................................... 22

CAPÍTULO 2 - OBJETOS DE CONTROLES VISUAIS .............................................................. 23

Atributos comuns as classes de componentes visuais...................................................... 23


Eventos comuns as classes de componentes visuais ........................................................ 23
TBUTTON ................................................................................................................................ 24
NEW - método construtor da classe. ................................................................................ 24
TSAY ...................................................................................................................................... 26
New - método construtor da classe.................................................................................. 26
Settext .............................................................................................................................. 27
TGET ...................................................................................................................................... 28
New - método construtor da classe.................................................................................. 28

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 2
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TPANEL ................................................................................................................................... 30
New - método construtor da classe.................................................................................. 30
TRADMENU ............................................................................................................................. 32
New - método construtor da classe.................................................................................. 32
Enableitem ....................................................................................................................... 33
TGROUP.................................................................................................................................. 35
New - método construtor da classe.................................................................................. 35
TCHECKBOX ............................................................................................................................ 36
New - método construtor da classe.................................................................................. 37
TCOMBOBOX .......................................................................................................................... 39
New - método construtor da classe.................................................................................. 39
Select ................................................................................................................................ 41
TLISTBOX ................................................................................................................................ 42
New - método construtor da classe.................................................................................. 42
Select ................................................................................................................................ 44
Add ................................................................................................................................... 44
Modify .............................................................................................................................. 44
Del .................................................................................................................................... 44
Len .................................................................................................................................... 45
Reset ................................................................................................................................. 45
TFOLDER ................................................................................................................................. 46

New - método construtor da classe.................................................................................. 47


SetOption.......................................................................................................................... 47
AddItem ............................................................................................................................ 47
AEnable ............................................................................................................................ 48
Exercício 1......................................................................................................................... 50

CAPÍTULO 3 - OBJETOS DE CONTROLE DE IMPRESSÃO ..................................................... 54

MPREPORT ............................................................................................................................. 54
TMSPRINTER ............................................................................................................................ 56
New - método construtor da classe.................................................................................. 56
Box .................................................................................................................................... 56
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 3
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Cancel ............................................................................................................................... 57
Canceled ........................................................................................................................... 57
Cmtr2Pix ........................................................................................................................... 57
End.................................................................................................................................... 58
EndPage............................................................................................................................ 58
FillRect ............................................................................................................................. 58
GetOrientation ................................................................................................................. 59
GetTextHeight .................................................................................................................. 59
GetTextWidth ................................................................................................................... 59
IsPrinterActive .................................................................................................................. 60
Line ................................................................................................................................... 60
Preview ............................................................................................................................. 60
Print .................................................................................................................................. 61
PrinterName ..................................................................................................................... 61
Refresh.............................................................................................................................. 61
ResetPrinter ...................................................................................................................... 61
SaveAllAsJpeg ................................................................................................................... 62
Detalhes sobre as definições de tamanho e zoom ........................................................... 62
SaveAsHTML ..................................................................................................................... 63
Say .................................................................................................................................... 63
SayBitmap ........................................................................................................................ 64
SetCurrentPrinterInUse .................................................................................................... 65
SetFont ............................................................................................................................. 65
SetLandscape.................................................................................................................... 65
SetPage............................................................................................................................. 66
SetPaperSize ..................................................................................................................... 66
Tamanho de folhas possíveis para o método tmsprinter:setPaperSize() ......................... 66
SetPortrait ........................................................................................................................ 72
Setup................................................................................................................................. 73
StartPage .......................................................................................................................... 73
nHorzRes........................................................................................................................... 73

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 4
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
nLogPixelX ........................................................................................................................ 74
nLogPixelY ........................................................................................................................ 74
nVertRes ........................................................................................................................... 74
A seguir, observe as fontes que são homologadas para TMSPrinter: .............................. 75
FillRect .............................................................................................................................. 75
TPageView ........................................................................................................................ 77
PageSize ........................................................................................................................... 78
PrintPage .......................................................................................................................... 78
TREPORT ................................................................................................................................. 80
Estrutura da TReport: ....................................................................................................... 80
New .................................................................................................................................. 81
SetTitle.............................................................................................................................. 81
Setparam ......................................................................................................................... 81
Preview ............................................................................................................................. 81
SetAction .......................................................................................................................... 82
Print .................................................................................................................................. 82
Printdialog ........................................................................................................................ 82
Cancel ............................................................................................................................... 83
SetMeter ........................................................................................................................... 83
IncMeter ........................................................................................................................... 83
SetDescription .................................................................................................................. 83
Classname ........................................................................................................................ 83
ReportName ..................................................................................................................... 84
Title ................................................................................................................................... 84
TotalText........................................................................................................................... 84
GetParam ......................................................................................................................... 84
GetAction.......................................................................................................................... 85
FooterAtEnd ..................................................................................................................... 85
TotalInLine ........................................................................................................................ 85
PageWidth ........................................................................................................................ 85
Row................................................................................................................................... 86

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 5
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Col..................................................................................................................................... 86
Page.................................................................................................................................. 86
GetOrientation ................................................................................................................. 86
Printing ............................................................................................................................. 86
Init .................................................................................................................................... 87
Finish ................................................................................................................................ 87
PrintText ........................................................................................................................... 87
EndPage............................................................................................................................ 88
IncRow .............................................................................................................................. 88
SkipLine............................................................................................................................. 88
SetTotalText ..................................................................................................................... 88
SetTotalInLine ................................................................................................................... 89
SetPortrait ........................................................................................................................ 89
SetLandScape ................................................................................................................... 89
SetPreview ........................................................................................................................ 89
GetFunction ...................................................................................................................... 90
Section .............................................................................................................................. 90
Say .................................................................................................................................... 90
SayBitmap ........................................................................................................................ 91
Line ................................................................................................................................... 91
Box .................................................................................................................................... 92
FillRect .............................................................................................................................. 92
ThinLine ............................................................................................................................ 92
FatLine .............................................................................................................................. 92
TRFunction........................................................................................................................ 93
TrPosition ......................................................................................................................... 95
TrSection ........................................................................................................................... 96
Exercício 1....................................................................................................................... 123
Exercício 2....................................................................................................................... 128
Exercício 3....................................................................................................................... 130

CAPÍTULO 4 - SQL – COMANDOS ................................................................................... 134


NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 6
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
COMCEITOS ........................................................................................................................... 134
CONTROLE TRANSACIONAL ....................................................................................................... 135
SEGURANÇA E BACKUP ............................................................................................................ 135
COMANDOS........................................................................................................................... 136
Select .............................................................................................................................. 136
TCQuery .......................................................................................................................... 137
ORDER BY ....................................................................................................................... 137
AND e OR - operadores................................................................................................... 138
RetSQLName .................................................................................................................. 138
LIKE ................................................................................................................................. 138
Insert .............................................................................................................................. 140
Update ............................................................................................................................ 142
Delete ............................................................................................................................. 143
Exercício 1....................................................................................................................... 147

CAPÍTULO 5 - EMBEDDED SQL – FACILITADOR DE QUERY’S ............................................ 148

Exercício 1....................................................................................................................... 156

CAPÍTULO 6 - MANIPULAÇÃO DE ARQUIVOS ................................................................. 160

ARQUIVOS TEXTO................................................................................................................... 160


FCreate(), FWrite(), FClose(), FSeek(), FOpen() e FRead()............................................... 160
Exercício 1....................................................................................................................... 170

CAPÍTULO 7 - ROTINA AUTOMÁTICA ............................................................................. 172

CONCEITO ............................................................................................................................. 172


POR QUE USAR ROTINA AUTOMÁTICA......................................................................................... 172
QUANDO UTILIZAR A FUNCIONALIDADE MSEXECAUTO ? ............................................................... 172
QUANDO NÃO UTILIZAR A FUNCIONALIDADE MSEXECAUTO ........................................................... 174
DESENVOLVENDO COM MSEXECAUTO ....................................................................................... 175
Estrutura de uma rotina com execução de MsExecAuto ................................................ 175
Variáveis de controle ...................................................................................................... 175
Montagem dos arrays de parâmetros ........................................................................... 175

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 7
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Estrutura dos arrays de parâmetros: ............................................................................. 176
Método de atribuição de conteúdo Direto: .................................................................... 178
Método de atribuição de conteúdo pela estrutura: ....................................................... 178
Definição dos parâmetros específicos da rotina que será executada ............................ 180
Atualização das variavéis de memória do ALIAS “M->” para o SN1: ............................. 180
Controle de transação .................................................................................................... 181
BeginTran() ... DisarmTransaction() ... EndTran() .......................................................... 182
Tratamento de mensagens de erro ................................................................................ 183
Exercício 1....................................................................................................................... 204

GABARITO ................................................................................................................... 206

CAPÍTULO 1 ........................................................................................................................ 206


CAPÍTULO 2 ........................................................................................................................ 206
CAPÍTULO 3 ........................................................................................................................ 210
CAPÍTULO 4 ........................................................................................................................ 247
CAPÍTULO 5 ........................................................................................................................ 251
CAPÍTULO 6 ........................................................................................................................... 264
CAPÍTULO 7 ........................................................................................................................... 270

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 8
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

S
SIIM
MBBO
OLLO
OGGIIA
A

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 9
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

S
SOOB
BRREE O
OAAU
UTTO
ORR

Claudia Cabral da Silva

Qualificações Mais de 15 anos de experiência em T.I. em diversos ramos de


atividades das empresas, tais como,
Empresas de T.I., indústrias, comércio exterior etc.Mais de 10 anos
de experiência como analista Totvs no
levantamento das necessidades junto ao usuário buscando sempre a
melhor alternativa para o melhor uso do sistema, analisando toda a
necessidade de melhorias para agregar valor ao negócio da
empresa, aumentar a usabilidade, eficiência e eficácia do mesmo,
sempre visando a diminuição dos custos operacionais.
Gerenciamento de departamento de T.I. na área de suporte aos
usuários Microsiga, Dimep, controle da
segurança em T.I., desenvolvimento de documentações e processos
de T.I. .
Histórico Profissional
De Junho/2010 -  HF Consulting - de junho/2010 - atual
Atual (Empresa de pequeno porte no segmento tecnologia e informática)
Consultora em T.I.
Responsável pelo levantamento das necessidades dos clientes, customização do
Sistema e suporte.

De Setembro/2008 a BGH do Brasil Telecomunicações e Serviços Ltda


Fevereiro/2010 (Multinacional no segmento de telecomunicações)

Analista de Sistemas Senior


Responsável pelo ERP Microsiga, analisando toda a
necessidade de melhorias para agregar valor ao negócio da
empresa, aumentar a usabilidade, eficiência e eficácia do
mesmo, sempre visando a diminuição dos custos
operacionais. Desenvolvimento de customizações
necessárias ao ERP e documentação das customizações.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 10
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Coordenação de equipe de suporte em Microsiga e infra-
estrutura.

De Abril/2000 a Microsiga Software Ltda


outubro/2007 (Empresa de grande porte no segmento de T.I.)

Analista de Sistemas Pleno


Atuou com as parcerias da Microsiga dando todo apoio
tecnológico no desenvolvimento dos softwares
nas áreas de Comércio Exterior, Gestão de Concessionárias,
Manutenção de Ativos, Medicina e Segurança do Trabalho,
Gestão Hospitalar, para poder fazer toda integração com o
ERP Microsiga. Implantação da ferramenta de automação de
testes Rational Robot para a validação dos softwares
desenvolvidos pela Microsiga, criando toda a integração do
banco de dados Protheus.
Certificações

Experiência 2004 - Workshop Team Test Fundamentals of Functional Testing


Educacional (Rational Robot)
2004 - Sistema de Gestão Ambiental
2005 - Data Warehouse
2006 - Organização Pessoal, Gestão do Tempo e Técnicas de
Priorização
2009 - 2071/2318 - Quering MS SQL Server 2000 with Transact –
SQL
2779/5132 : Implementing a Microsoft SQL Server 2005 Database
2780/5133 - Maintaining a Microsoft SQL Server 2005 Database
ITILF - Fundamentos ITIL v3
2011 - 6231/10142 - Maintaining a Microsoft SQL Server 2008
Database

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 11
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

IIN
NTTR
ROOD
DUUÇ
ÇÃÃO
O
SOBRE A NFT

Fundada por três irmãos dedicados em suas áreas de negócios - computação


gráfica, ERP SAP e ERP Protheus –, a NFT inicia a sua história de sucesso em
2011, com a visão de ser muito mais do que uma escola. Nossa proposta é ser um
núcleo de formação e troca de informações sobre audiovisual e tecnologia de
negócios em São Paulo, com excelência em ensino, e a meta de se tornar referência
no mercado de cursos tecnológicos até 2014.

Nossa missão é preparar os profissionais de audiovisual e tecnologia que vão


representar o futuro dos negócios, atraindo os olhares do mundo para o Brasil – país
com muito potencial nessas áreas. Acreditamos que cabe à NFT atender a essa
demanda por qualificação profissional.

Representando empresas como Autodesk, Apple, Adobe, SAP e sistema Protheus


nosso foco é direcionado para a qualidade e não para a quantidade. Aqui, pensamos
nos mínimos detalhes, que vão desde os melhores professores até a facilidade de
acesso para os alunos e parceiros de negócios.
Mas, o que significa NFT? É a sigla de Núcleo de Formação Tecnológica. Mais que
uma escola, temos a missão de ser um núcleo: de relacionamento; de futuros
trabalhos; de novidades; de formação e de educação. Enfim, um núcleo que será o
seu o trampolim para uma carreira de sucesso, com trabalhos inovadores.
Trataremos do que há de melhor no mercado e do que esteja na vanguarda da
tecnologia.
Mais do que uma simples escola de computação gráfica e tecnologia de negócios,
somos um núcleo de encontro da arte com os negócios, cuja responsabilidade
envolve a preparação dos profissionais que o século 21 exige.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 12
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

N
NOOS
SSSA
ASSO
OFFEER
RTTA
ASS&
&SSO
OLLU
UÇÇÕ
ÕEES
S

TREINAMENTOS

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 13
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CONSULTORIA EM TREINAMENTOS

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 14
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

O
OBBJJEETTIIV
VOO

O objetivo deste curso é ensinar aos alunos sobre como desenvolver na linguagem
ADVPL utilizada no ERP Protheus com recursos mais intermediarios. Com este
curso intermediário você será capaz de efetuar customizações no ERP Protheus de
maneira mais rápida e prática, mas para isso é importante que pratique bastante
após o curso.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 15
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

M
MEER
RCCA
ADDO
ODDEE TTR
RAAB
BAALLH
HOO
A quem se destina: A todos que desejam desenvolver e efetuar manutenção em
software que utiliza linguagem de programação ADVPL.

Mercado de trabalho: O mercado de trabalho é vasto, uma fez que a linguagem


ADVPL é utilizada no ERP Protheus/Totvs, o qual é utilizado por mais de 10.000
clientes.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 16
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

H
HIISSTTÓ
ÓRRIIA
ADDO
OAAD
DVVP
PLL
O ADVPL - Advanced Protheus Language surgiu em 1994 devido à necessidade de
se criar uma linguagem que suportasse o padrão xbase para a manutenção de todo
o código existente do sistema ERP Siga Advanced. A ADVPL é uma evolução da
linguagem padrão xbase criada pela Microsiga Software S.A.

O ADVPL além de conter os padrões de comandos, funções, operadores, estruturas


de controle de fluxo e palavras reservadas, conta também com uma infinidade de
comandos, funções, operadores, estruturas de controle de fluxo e palavras
reservadas disponibilizadas pela Microsiga, que a torna uma linguagem completa
para a criação das aplicações ERP prontas para a Internet.
Também é uma linguagem orientada a objetos e eventos permitindo desenvolver
aplicações visuais e criar classes de objetos.
Após compilados, todos os programas tornam-se unidades de inteligência básica,
chamadas APO´s (Advanced Protheus Objects). Os APO´s são mantidos em um
repositório e carregados dinamicamente pelo Protheus server para a
execução.Através do ADVPL pode-se desenvolver programas com interface com o
usuário, sem interface com usuário (job´s), servidor web, RPC (remote procedure
call), Telnet.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 17
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C
CAAP
PÍÍTTU
ULLO
O11 -- O OSS..
OBBJJEETTO
DEFINIÇÃO
Objetos são uma unidade dinâmica, composta por um estado interno privativo
(estrutura de dados) e um comportamento (conjunto de operações).

Classe - conjunto de objetos com caracteristicas afins. Define o comportamento do


objeto através de seus métodos e quais estados ele é capaz de manter através de
seus atributos. Ex. Mamíferos

Subclasse - é uma nova classe que herda as características de sua classe


ancestral. Ex: Homem, cão e gato.

Objeto / instância de uma classe. Um objeto é capaz de armazenar estados através


de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e
enviar mensagens a outros objetos. Exemplo de objetos da classe Mamíferos: Bidú,
Pricila.
Atributo - são características de um objeto. Basicamente a estrutura de dados que
vai representar a classe. Exemplos: Cachorro: raça, cor,tamanho. Por sua vez, os
atributos possuem valores. Por exemplo, o atributo cor pode conter o valor branco. O
conjunto de valores dos atributos de um determinado objeto é chamado de estado.
Método - definem as habilidades dos objetos. Bidu é uma instância da classe
Cachorro, portanto tem habilidade para latir, implementada através do método
"Morder". Um método em uma classe é apenas uma definição. A ação só ocorre
quando o método é invocado através do objeto, no caso Bidu. Dentro do programa,
a utilização de um método deve afetar apenas um objeto em particular; Todos os
cachorros podem latir, mas você quer que apenas Bidu dê o latido. Normalmente,
uma classe possui diversos métodos, que no caso da classe Cachorro poderiam ser
sente, coma e morda
Mensagem - é uma chamada a um objeto para invocar um de seus métodos,
ativando um comportamento descrito por sua classe. Também pode ser direcionada
diretamente a uma classe (através de uma invocação a um método estático)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 18
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Herança (ou generalização) - é o mecanismo pelo qual uma classe (sub-classe)
pode estender outra classe (super-classe), aproveitando seus comportamentos
(métodos) e variáveis possíveis (atributos). Um exemplo de herança: Mamífero é
super-classe de Humano. Ou seja, um Humano é um mamífero. Há herança múltipla
quando uma sub-classe possui mais de uma super-classe. Essa relação é
normalmente chamada de relação "é um"
Associação - é o mecanismo pelo qual um objeto utiliza os recursos de outro. Pode
tratar-se de uma associação simples "usa um" ou de um acoplamento "parte de".
Por exemplo: Um humano usa um telefone. A tecla "1" é parte de um telefone
Encapsulamento - consiste na separação de aspectos internos e externos de um
objeto. Este mecanismo é utilizado amplamente para impedir o acesso direto ao
estado de um objeto (seus atributos), disponibilizando externamente apenas os
métodos que alteram estes estados. Exemplo: você não precisa conhecer os
detalhes dos circuitos de um telefone para utilizá-lo. A carcaça do telefone
encapsula esses detalhes, provendo a você uma interface mais amigável (os botões,
o monofone e os sinais de tom)
Abstração - é a habilidade de concentrar nos aspectos essenciais de um contexto
qualquer, ignorando características menos importantes ou acidentais. Em
modelagem orientada a objetos, uma classe é uma abstração de entidades
existentes no domínio do sistema de software
Polimorfismo - consiste em quatro propriedades que a linguagem pode ter (atente
para o fato de que nem toda linguagem orientada a objeto tem implementado todos
os tipos de polimorfismo):
Universal:
Inclusão: um ponteiro para classe mãe pode apontar para uma instância de
uma classe filha.
Paramétrico: se restringe ao uso de templates (C++, por exemplo) e
generics (Java/C♯)
Ad-Hoc:
Sobrecarga: duas funções/métodos com o mesmo nome mas assinaturas diferentes
Coerção: a linguagem que faz as conversões implicitamente (como por exemplo
atribuir um int a um float em C++, isto é aceito mesmo sendo tipos diferentes pois a
conversão é feita implicitamente)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 19
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Interface - é um contrato entre a classe e o mundo externo. Quando uma classe
implementa uma interface, ela está comprometida a fornecer o comportamento
publicado pela interface.

Mamíferos
Nome
Idade
Tamanho
Cor
Cor dos Olhos
Amamentar()
Comunicar()

Homem Cão Gato


EstadoCivil Raça Raça
Altura Tamanho Tamanho
Falar() Cor Cor
Trabalhar() Latir() Miar()
Rir() Morder() Arranhar()

DESVANTAGENS
Uma linguagem orientada a objetos é muito mais difícil de aprender do que uma
linguagem procedural, pois para começar a programar é necessário ter em mente
uma série de conceitos complexos. Em linguagem procedural basta aprender a
sintaxe de programação e consegue-se programar.
Dificilmente uma linguagem orientada a objetos terá a mesma performance que uma
linguagem procedural.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 20
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 21
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

EXERCÍCIO 1

Defina :
Objetos
Classe
Atributo
Método
Mensagem

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 22
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C O2
CAAPPÍÍTTUULLO 2 -- O
OBBJJEETTO DEE C
OSS D COON
NTTR
ROOLLEESS V
VIISSU
UAAIISS
Abaixo demonstraremos controles visuais utilizados na montagem de telas :
ATRIBUTOS COMUNS AS CLASSES DE COMPONENTES VISUAIS
cCaption -Título ou conteúdo do objeto.
cF3- Consulta F3 ao qual o objeto está vinculado, quando o mesmo é do tipo get.
cMsg - Mensagem exibida na barra de status da janela principal quando o objeto
ganha foco.
cName - Nome do objeto
cTooltip - Mensagem exibida quando objeto exibe seu tooltip.
cVariable - Variável que receberá o conteúdo selecionado ou digitado no
objeto, quando o mesmo for to tipo get ou similar.
lPassword - Indica se o texto digitado no objeto será exibido no formato de
password, com asterisco, quando o mesmo é do tipo get.
lReadOnly - Flag que indica se o objeto pode ou não ser editado.
lShowHint - Flag que ativa .T. ou desativa .F. a exibição do tooltip do objeto.
lVisibleControl - Se .T. o objeto é visível, se .F. o objeto é invisível.
nHeight - Altura em pixels.
nLeft - Coordenada horizontal em pixels.
nTop - Coordenada vertical em pixels.
nWidth - Largura em pixels.
Picture -Picture de digitação do objeto, quando o mesmo é do tipo get.

EVENTOS COMUNS AS CLASSES DE COMPONENTES VISUAIS


bAction - bloco de código executado quando o objeto é utilizado, quando o mesmo
é do tipo botão ou similar.
bChange - Bloco de código executado quando ocorre uma mundança na seleção de
itens que compõe o objeto, como por exemplo em listas ou grids.
bF3 - Bloco de código executado quando utilizado o recurso de consulta F3
vinculado ao objeto.
bGotFocus Executado quando objeto ganha foco.
blClicked - Executado quando acionado click do botão esquerdo do mouse sobre o
objeto.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 23
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
blDblClick - Executado quando acionado duplo click do botão esquerdo do mouse
sobre o objeto.
bLostFocus Executado quando objeto perde foco.
brClicked - Executado quando acionado click do botão direito do mouse sobre o
objeto.
bValid - Executado quando o conteúdo do objeto é modificado e deverá ser
validado. Deve retornar .T. se o conteúdo é válido e .F. se conteúdo inválido.
bWhen - Executado quando há movimentação de foco na janela.Se retornar .T. o
objeto continua habilitado, se retornar .F. o objeto será desabilitado.

TBUTTON
Classe de botão. São botões pré-definidos que podem ser utilizados para operações
de confirmação de dados, cancelamentos, parâmetros etc.

Propriedades:
lprocessa - Tipo lógico (.T. ou .F.) - indica se o botão está executando uma ação.
bAção - bloco de código. Bloco de código contendo a ação a ser executada quando
o botão for acionado.

Métodos:
NEW - MÉTODO CONSTRUTOR DA CLASSE.
New([anRow], [anCol], [acCaption], [aoWnd], [abAction], [anWidth], [anHeight],
[nPar8], [aoFont], [lPar10], [alPixel],[lPar12],[cPar13], [lPar14], [abWhen], [bPar16],
[lPar17])

anRow - Numérico, opcional. Coordenada vertical em pixels ou carateres.


anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
acCaption - Caractere, opcional. Titulo do botão.
aoWnd - Objeto, opcional. Janela ou controle onde o botão deverá ser criado.
abAction - Bloco de código, opcional. Bloco que deverá ser acionado quando o
botão for
pressionado.
anWidth - Numérico, opcional. Largura do botão em pixels.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 24
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
anHeight - Numérico, opcional. Altura do botão em pixels.
nPar8 - Reservado.
aoFont - Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada
para o
título do botão.
lPar10 Reservado.
alPixel - Lógico, opcional. Se .T. considera as coordenadas passadas em pixels, se
.F. (padrão) considera em caracteres.
lPar12 Reservado.
cPar13 Reservado.
lPar14 Reservado.
abWhen - Bloco de código, opcional. Executado quando mudança de foco de
entrada de
dados está sendo efetuada na janela onde o controle foi criado. O bloco deve
retornar .T. se o controle deve permanecer habilitado ou .F. se não.
bPar16 Reservado.
lPar17 Reservado.

Ex.: Botão para fechar a tela


#include 'protheus.ch'
User Function xTbutton()
Local oDlg, oButton
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Teste TButton'
oButton:=tButton():New(30,10,'Fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 25
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TSAY
Classe de label. Exibe um texto estático sobre uma janela ou controle.

Propriedades
lWordWar - lógico (.T. ou . F.). .T. - Indica se deve fazer a quebra automatica de
linhas e alinhamento de terxdo. Padrão .F.
lTransparent - lógico (.T. ou .F.). .T. - indica que o fundo deve ser transparente, ou
seja, assume a cor de controle da janela de fundo.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

TSay(): TSay():New([anRow], [anCol], [abText], [aoWnd],


[acPicture], [aoFont], [lPar7], [lPar8], [lPar9], [alPixels],
[anClrText], [anClrBack], [anWidth], [anHeight], [lPar15], [lPar16],
[lPar17], [lPar18], [lPar19])

anRow - Numérico, opcional. Coordenada vertical em pixels ou caracteres.


anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 26
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
abText - Code-Block, opcional. Quando executado deve retornar uma cadeia de
caracteres a ser exibida.
aoWnd Objeto - opcional. Janela ou diálogo onde o controle será criado.
acPicture - Caractere, opcional. Picture de formatação do conteúdo a ser exibido.
aoFont - Objeto, opcional. Objeto tipo tFont para configuração do tipo de fonte que
será utilizado para exibir o conteúdo.
lPar7 - Reservado.
lPar8 - Reservado.
lPar9 - Reservado.
alPixels - Lógico, opcional. Se .T. considera coordenadas passadas em pixels se
.F., padrão, considera as coordenadas passadas em caracteres.
anClrText - Numérico, opcional. Cor do conteúdo do controle.
anClrBack - Numérico, opcional. Cor do fundo do controle.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
lPar15 - Reservado.
lPar16 - Reservado.
lPar17 - Reservado.
lPar18 - Reservado.
lPar19 - Reservado.

SETTEXT
Modifica o conteúdo a ser exibido pelo controle.
SetText( [xVal] )
xVal - Caracter / Numérico / Data, Opcional. Valor a ser exibido.
Retorno NIL

Ex. Utilização da funçao Tsay()

#include 'protheus.ch'
User Function XTsay()
Local oDlg, oSay
Local bSay := { || "Mensagem" }

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 27
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,200 TITLE 'Teste da funcao TSay()'
PIXEL
oSay := TSay():New(10, 10, bSay ,oDlg,,,,,, .T.,, )
oSay:lTransparent:= .F.
ACTIVATE MSDIALOG oDlg CENTERED
Return

TGET
Classe de controle para entrada de dados.Controle para armazenar o conteúdo de
uma variável digitada pelo usuário.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

TGet():New([anRow], [anCol], [abSetGet], [aoWnd], [anWidth], [anHeight], [acPict],


[abValid], [anClrFore], [anClrBack], [aoFont], [lPar12], [oPar13], [alPixel], [cPar15],

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 28
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
[lPar16], [abWhen], [lPar18], [lPar19], [abChange], [alReadOnly], [alPassword],
[cPar23], [acReadVar], [cPar25], [lPar26], [nPar27], [lPar28])

anRow - Numérico, opcional. Coordenada vertical em pixels ou caracteres.


anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet - Bloco de código, opcional. Bloco de código no formato {|u| IF( Pcount(
)>0, <var>:= u, <var> ) } que o controle utiliza para atualizar a variável <var>. <var>
deve ser tipo caracter, numérico ou data.
aoWnd Objeto - opcional. Janela ou controle onde o controle será criado.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
acPict - Caractere, opcional. Máscara de formatação do conteúdo a ser exibido.
abValid - Bloco de código, opcional. Executado quando o conteúdo do controle deve
ser validado, deve retornar .T. se o conteúdo for válido e .F. quando o conteúdo for
inválido.
anClrFore - Numérico, opcional. Cor de fundo do controle.
anClrBack - Numérico, opcional. Cor do texto do controle.
aoFont - Objeto, opcional. Objeto tipo tFont utilizado para definir as características
da fonte utilizada para exibir o conteúdo do controle.
lPar12 - Reservado.
oPar13 - Reservado.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são em caracteres.
cPar15 - Reservado.
lPar16 - Reservado.
abWhen - Bloco de código, opcional. Executado quando mudança de foco de
entrada de dados está sendo efetuada na janela onde o controle foi criado. O bloco
deve retornar .T. se o controle deve permanecer habilitado ou .F. se não.
lPar18 Reservado.

Ex. : Utilização da Tget()

#include 'protheus.ch'

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 29
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
User Function XTGet()
Local oDlg, oSay,oGet
Local cVar := space(30)
Local bSay := { || "Mensagem" }
Local bGet := { |u| IIF(PCount()>0,cVar:=u,cVar )}
DEFINE MSDIALOG oDlg FROM 0,0 TO 200,500 TITLE 'Teste da funcao TGet()'
PIXEL
oSay := TSay():New(10, 10, bSay ,oDlg,,,,,, .T.,, )
oSay:lTransparent:= .F.
oGet:=TGet():New(10,40,bGet,,,7,"@!",,,,,,,.T.,,,,,.T.,)
ACTIVATE MSDIALOG oDlg CENTERED
Return

TPANEL
Classe de painel estático, onde podem ser criados outros controles com o objetivo
de organizar as informações.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
TPanel():New([anRow], [anCol], [acText], [aoWnd], [aoFont],[alCentered], [lPar6],
[anClrText], [anClrBack],[anWidth], [anHeight], [alLowered], [alRaised])

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 30
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
anRow - Numérico, opcional. Coordenadavertical em pixels.
anCol - Numérico, opcional. Coordenada horizontal em pixels.
acText - Caractere, opcional. Texto a ser exibido ao fundo.
aoWnd - Objeto, opcional. Janela ou controle onde será criado o objeto.
alCentered - Lógico, opcional. Se .T. exibe o texto de título ao centro do controle.
lPar6 - Reservado.
anClrText - Numérico, opcional. Cor do texto do controle.
anClrBack - Numérico, opcional. Cor do fundo do controle.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
alLowered - Lógico, opcional. Se .T. exibe o painel rebaixado em relação ao
controle de fundo.
alRaised - Lógico, opcional. Se .T. exibe a borda do controle rebaixada em relação
ao controle de fundo.

Ex: Teste do Tpanel

#include 'protheus.ch'
User Function xtpanel()
Local oDlg, oButton, oCombo, cCombo, cGet1:='Teste Tpanel'
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Tpanel'
oPanel:= tPanel():New(10,10,"",oDlg,,,,,CLR_BLUE,100,50) // cria o painel
ACTIVATE MSDIALOG oDlg CENTERED
Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 31
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TRADMENU
Classe de radio group, utilizada para seleção de itens através de uma lista

Propriedades
nOption - numérico. Item selecionado.
aItens - array. Lista contendo os itens selecionáveis.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
Tradmenu: New([anRow], [anCol], [aacItems], [abSetGet],[aoWnd], [aPar6],
[abChange], [anClrText], [anClrPan],[cPar10], [lPar11], [abWhen], [anWidth],
[anHeight],[abValid], [lPar16], [lPar17], [alPixel])

anRow
Numérico, opcional. Coordenada vertical em pixels ou caracteres.
anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
aacItems - Array de caracteres, opcional. Lista de opções.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 32
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
abSetGet - Bloco de código, opcional. Bloco de código no formato {|u| if( Pcount(
)>0,
<var>:= u, <var> ) } que o controle utiliza para atualizar a variável <var>. <var> deve
ser tipo numérico.
aoWnd - Objeto, opcional. Janela ou controle onde o controle será criado.
aPar6 - Reservado.
abChange - Bloco de código, opcional. Executado quando o item selecionado é
alterado.
anClrText - Numérico, opcional. Cor do texto do controle
anClrPan - Numérico, opcional. Cor de fundo do controle.
cPar10 - Reservado.
lPar11 - Reservado.
abWhen - Bloco de código, opcional. Executado quando mudança
de foco de entrada de dados está sendo efetuada na janela onde o controle foi
criado. O bloco deve retornar .T. para que o controle permaneça habilitado, ou .F. se
não.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
abValid - Bloco de código, opcional. Executado quando o conteúdo do controle deva
ser validado, retornando .T. se o conteúdo for válido, e .F. quando inválido.
lPar16 - Reservado.
Lpar17 - Reservado.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são em caracteres.

ENABLEITEM
Habilita ou desabilita item.

EnableItem( [nItem], [lEnable])

nItem - Numérico, opcional. Item selecionado.


lEnable - Lógico, opcional. Se .T. habilita o item se .F. desabilita o item.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 33
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Ex.: Teste Tradmenu

#include "protheus.ch"
User Function xTradmenu()
Local oDlg, oButton, oRadio, nRadio:=1
Local aOptions:={"Feminino","Masculino"}
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE "Teste Tradmenu"
oRadio:=
tRadMenu():New(10,10,aOptions,{|u|if(PCount()>0,nRadio:=u,nRadio)},oDlg,,,,,,,,100
,20,,,,.T.)
@ 40,10 BUTTON oButton PROMPT "Sair" OF oDlg PIXEL ACTION oDlg:End()
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop("Item escolhido " + aOptions[nRadio] )
Return NIL

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 34
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TGROUP
Classe de painel de grupo de controles. Utilizado para criar um painel onde controles
visuais podem agrupados ou classificados. É criada uma borda com título em volta
dos controles agrupados.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
Tgroup():New([anTop], [anLeft], [anBottom], [anRight],[acCaption], [aoWnd],
[anClrText], [anClrPane],[alPixel], [lPar10])

anTop - Numérico, opcional. Coordenada vertical superior em pixels ou caracteres.


anLeft - Numérico, opcional. Coordenada horizontal esquerda em pixels ou
caracteres.
anBottom - Numérico, opcional. Coordenada vertical inferior em pixels ou
caracteres.
anRight - Numérico, opcional. Coordenada horizontal direita em pixels ou
caracteres.
acCaption Caractere, opcional. Título do grupo.
aoWnd - Objeto, opcional. Janela ou controle onde o controle será criado.
anClrText - Numérico, opcional. Cor do texto.
anClrPane - Numérico, opcional. Cor do fundo.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são
em caracteres.
lPar10 Reservado.

Ex.: Teste do Tgroup


#include "protheus.ch"
User function xTgroup()
Local oDlg, oGroup, oGet1, oGet2, cGet1:=Space(10),cGet2:= Space(10)
Local oGroup2, oGet3, oGet4, cGet3:=Space(10),cGet4:= Space(10)
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 TITLE "Teste Tgroup" PIXEL
oGroup:= tGroup():New(10,10,100,200,"Grupo 1",oDlg,,,.T.)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 35
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
@ 30,30 MSGET oGet1 VAR cGet1 SIZE 100,10 OF oGroup PIXEL
@ 50,30 MSGET oGet2 VAR cGet2 SIZE 100,10 OF oGroup PIXEL

oGroup2:= tGroup():New(110,10,200,200,"Grupo 2",oDlg,,,.T.)


@ 130,30 MSGET oGet3 VAR cGet3 SIZE 100,10 OF oGroup2 PIXEL
@ 150,30 MSGET oGet4 VAR cGet4 SIZE 100,10 OF oGroup2 PIXEL
ACTIVATE MSDIALOG oDlg CENTERED
Return NIL

TCHECKBOX
Classe de caixa de marcação (checkbox). Aceita os valores .T. ou .F.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 36
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Tcheckbox():New([anRow], [anCol], [acCaption], [abSetGet],[aoWnd], [anWidth],
[anHeight], [nPar8], [abClick],[aoFont], [abValid], [anClrFore], [anClrBack], [lPar14],
[alPixel], [cPar16], [lPar17], [abWhen])

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

anRow - Numérico, opcional. Coordenada vertical em pixels ou carateres.


anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
acCaption - Caractere, opcional. Texto exibido pelocontrole.
abSetGet - Bloco de código, opcional. Bloco de código no formato {|u| if( Pcount(
)>0,
<var>:= u, <var> ) } que o controle utiliza para atualizar a variável <var>. <var> deve
ser tipo lógico, se <var> = .T. então o controle aparecerá checado.
aoWnd - Objeto, opcional. Janela ou controle onde o controle deverá ser criado.
anWidth - Numérico, opcional. Largura do controle em pixels
anHeight - Numérico, opcional. Altura do controle em pixels.
nPar8 Reservado.
abClick - Bloco de código, opcional. Executado quando o controle click do botão
esquerdo do mouse é acionado sobre o controle.
aoFont - Objeto, opcional. Objeto tipo tFont com propriedades da fonte utilizada
para o texto do controle.
abValid - Bloco de código, opcional. Executado quando o conteúdo do controle deve
ser validado, deve retornar .T. se o conteúdo for válido e .F. quando o conteúdo for
inválido.
anClrFore - Numérico, opcional. Cor de fundo do controle.
anClrBack - Numérico, opcional. Cor do texto do controle.
lPar14 - Reservado.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são em caracteres.
cPar16 - Reservado.
lPar17 - Reservado.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 37
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
abWhen -Bloco de código, opcional. Executado quando mudança de foco de
entrada de dados está sendo efetuada na janela onde o controle foi criado. O bloco
deve retornar .T. se o controle deve permanecer habilitado ou .F. se não.

Ex. Teste de Tcheckbox


#include 'protheus.ch'
user function xTCheckBox()
DEFINE MSDIALOG oDlg FROM 0,0 TO 270,400 PIXEL TITLE 'Teste Checkbox'
lCheck1 := .T.
lCheck2 := .F.
oCheck1 := TCheckBox():New(01,01,'CheckBox 1',,oDlg,100,210,,,,,,,,.T.,,,)
oCheck2 := TCheckBox():New(11,01,'CheckBox 2',,oDlg,100,210,,,,,,,,.T.,,,)
// Seta Eventos dos checkboxs
oCheck1:bSetGet := {|| lCheck1 }
oCheck1:bLClicked := {|| lCheck1:=!lCheck1 }
oCheck1:bWhen := {|| .T. }
oCheck1:bChange:= {|| Alert("Checkbox 1 mudou de valor")}

oCheck2:bSetGet := {|| lCheck2 }


oCheck2:bLClicked := {|| lCheck2:=!lCheck2 }
oCheck2:bWhen := {|| .T. }
oCheck2:bValid := {|| Alert(IIF(lCheck1,"Duas opcoes selecionadas","Somente
segunda opcao selecionada")) }

oBtn := TButton():New( 060, 001, 'Ver CheckBox',oDlg,{|| Alert(iif(lcheck1 .and.


!lCheck2 ,"Checkbox 1 clicado",IIF(lcheck2 .and. !lcheck1 ,"Checkbox 2
clicado","Outras selecoes"))) }, 120,010,,,.F.,.T.,.F.,,.F.,,,.F. )
ACTIVATE MSDIALOG oDlg CENTERED
return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 38
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TCOMBOBOX
Classe de multipla escolha em uma lista vertical (combobox).
Propriedades
aItems - Array. Lista de itens, caracteres, a serem exibidos. Pode ter os seguintes
formatos: 1) Seqüencial, exemplo: {“item1”,”item2”,...,”itemN”} ou
2) Indexada, exemplo: {“a=item1”,”b=item2”, ..., “n=itemN”}.
nAt - Numérico. Posição do item selecionado.
Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
TcomboBox():New([anRow], [anCol], [abSetGet], [anItems],[anWidth], [anHeight],
[aoWnd], [nPar8], [abChange],[abValid], [anClrText], [anClrBack], [alPixel],
[aoFont],[cPar15], [lPar16], [abWhen], [lPar18], [aPar19],
[bPar20], [cPar21], [acReadVar])

anRow - Numérico, opcional. Coordenada vertical em pixels ou caracteres.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 39
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet - Bloco de código, opcional. Bloco de código no formato {|u| if( Pcount(
)>0,
<var>:= u, <var> ) } que o controle utiliza para atualizar a variável <var>. <var> deve
ser tipo caracter. Se a lista for seqüencial, o controle atualizará <var> com o
conteúdo do item
selecionado, se a lista for indexada, <var> será atualizada com o valor do índice do
item selecionado.
anItems - Array, opcional. Lista de items, caracteres, a serem exibidos. Pode ter os
seguintes formatos: a) Seqüencial, exemplo: {“item1”,”item2”,...,”itemN”} ou b)
Indexada, exemplo: {“a=item1”,”b=item2”, ..., “n=itemN”}.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
aoWnd - Objeto, opcional. Janela ou controle onde o controle será criado.
nPar8 - Reservado.
abChange - Bloco de código, opcional. Executado quando o controle modifica o item
selecionado.
abValid - Bloco de código, opcional. Executado quando o conteúdo do controle deve
ser validado, deve retornar .T. se o conteúdo for válido e .F. quando o conteúdo for
inválido.
anClrBack - Numérico, opcional. Cor de fundo do controle.
anClrText - Numérico, opcional. Cor do texto do controle.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são em caracteres.
aoFont - Objeto, opcional. Objeto tipo tFont utilizado para definir as características
da fonte utilizada para exibir o conteúdo do controle.
cPar15 - Reservado.
lPar16 - Reservado.
abWhen - Bloco de código, opcional. Executado quando mudança de foco de
entrada de
dados está sendo efetuada na janela onde o controle foi criado. O bloco deve
retornar .T. se o controle deve permanecer habilitado ou .F. se não.
lPar18 - Reservado.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 40
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
aPar19 - Reservado.
bPar20 - Reservado.
cPar21 - Reservado.
acReadVar - Caractere, opcional. Nome da variável que o controle deverá
manipular, deverá ser a mesma variável informada no parâmetro abSetGet, e será o
retorno da função ReadVar( ).

SELECT
Muda o item selecionado no combobox.

Select( [anItem] )
anItem - Numérico, opcional. Posição do item a ser selecionado.

Ex.: Teste do combobox

#include 'protheus.ch'
User Function xTcombobox()
Local oDlg, oButton, oCombo, cCombo
aItems:= {'Solteiro','Casado','Divorciado', 'Outros'}
cCombo:= aItems[2]
DEFINE MSDIALOG oDlg FROM 0,0 TO 300,300 PIXEL TITLE 'Teste Combobox'
oCombo:=
tComboBox():New(10,10,{|u|if(PCount()>0,cCombo:=u,cCombo)},aItems,100,20,oDlg
,,{||MsgStop('Mudou para o item ' + cCombo )},,,,.T.,,,,,,,,,'cCombo')

oButton:=tButton():New(30,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'Valor da selecao '+cCombo )
Return NIL

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 41
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TLISTBOX
Classe de lista de itens selecionáveis, contendo barra de rolagem.

Propriedades
nAt - numérico. Posição do item selecionado.
aItens - array de itens selecionáveis.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

Tlistbox():New([anRow], [anCol], [abSetGet], [aaItems],[anWidth], [anHeigth],


[abChange], [aoWnd],[abValid], [anClrFore], [anClrBack], [alPixel],
[lPar13],[abLDBLClick], [aoFont], [cPar16], [lPar17], [abWhen],[aPar19], [bPar20],
[lPar21], [lPar22], [abRightClick] )
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 42
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
anRow - Numérico, opcional. Coordenada vertical em pixels ou caracteres.
anCol - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
abSetGet - Bloco de código, opcional. Bloco de código no formato {|u| if( Pcount( )
>0, <var>:= u, <var> )} que o controle utiliza para atualizar a variável <var>. <var>
deve ser tipo caracter ou numérica.
aaItems - Array de items caracteres, opcional. Lista de items selecionáveis.
anWidth - Numérico, opcional. Largura do controle em pixels.
anHeight - Numérico, opcional. Altura do controle em pixels.
abChange - Bloco de código, opcional. Executado quando o item selecionado é
alterado.
aoWnd - Objeto, opcional. Janela ou controle onde o controle será criado.
abValid - Bloco de código, opcional. Executado quando o conteúdo do controle deve
ser validado, deve retornar .T. se o conteúdo for válido e .F. quando o conteúdo for
inválido.
anClrFore - Numérico, opcional. Cor de fundo do controle.
anClrBack - Numérico, opcional. Cor do texto do controle.
alPixel - Lógico, opcional. Se .T. as coordenadas informadas são em pixels, se .F.
são em caracteres.
lPar13 Reservado.
abLDBLClick - Bloco de código, opcional. Executado quando acionado duplo click
do botão
esquerdo do mouse sobre o controle.
aoFont - Objeto, opcional. Objeto tipo tFont utilizado para definir as características
da fonte utilizada para exibir o conteúdo do controle.
cPar16 Reservado.
lPar17 Reservado.
abWhen - Bloco de código, opcional. Executado quando mudança de foco de
entrada de dados está sendo efetuada na janela onde o controle foi criado. O bloco
deve retornar .T. se o controle deve permanecer habilitado ou .F. se não.
aPar19 Reservado.
bPar20 Reservado.
lPar21 Reservado.
lPar22 Reservado.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 43
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Bloco de código, opcional. Executado
abRightClick - quando acionado click do botão direito do mouse sobre o controle.

SELECT
Muda o item selecionado no Tlistbox

Select( [anItem] )
anItem - Numérico, opcional. Posição do item a ser selecionado.

ADD
Insere um novo item

Add( cText, nPos )


cText - Caractere, obrigatório. Texto do item.
nPos - Numérico, obrigatório. Se 0 ou maior que o número de itens, insere o item no
final da lista. Se valor entre 1 e número de itens, insere o item na posição informada,
empurrando o item anterior para baixo.

MODIFY
Modifica o texto de um item

Modify( cText, nPos )


cText - Caractere, obrigatório. Novo texto do item.
nPos - Numérico, obrigatório. Deve ser maior que 0 e menor ou igual ao número de
itens.

DEL
Apaga um item

Del( nPos )
nPos - Numérico, obrigatório. Número do item que deseja deletar. Deve ser maior
que 0 e menor ou igual ao número de itens.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 44
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

LEN
Retorna o número total de itens

Len()
Retorno - Numérico. Número total de itens.

RESET
Apaga todos os itens

Reset()

Ex. Teste do Tlistbox

#Include "Protheus.ch"
User Function xTlistbox()
Local oDlg, oList, nList:= 1, aItems:={}
Aadd(aItems,"ITEM 1")
Aadd(aItems,"ITEM 2")
Aadd(aItems,"ITEM 3")
DEFINE MSDIALOG oDlg FROM 0,0 TO 400,400 PIXEL TITLE "Teste Tlistbox"
oList:=
tListBox():New(10,10,{|u|if(Pcount()>0,nList:=u,nList)},aItems,100,100,,oDlg,,,,.T.)
oButton:=tButton():New(120,10,'fechar',oDlg,{||oDlg:End()},100,20,,,,.T.)
ACTIVATE MSDIALOG oDlg CENTERED
MsgStop( 'Valor da selecao '+aitems[nList])
Return NIL

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 45
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TFOLDER
Classe de objetos visuais do tipo controle - Folder.

Propriedades:
aPrompts - Array, Titulo dos folders
aDialogs - Array, Nome dos diálogos
nOption - Numérico, Folder selecionado
bSetOption - Bloco de código, Executado na seleção do folder

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 46
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

Tfolder():New([anTop], [anLeft], [aPrompts], [aDialogs], [aoWnd],


[anOption], [anClrFore], [anClrBack], [alPixel], [alDesign], [anWidth],
[anHeight], [acMsg], [alAllWidth])

Parâmetros:
anTop - Numérico, opcional. Coordenada vertical em pixels ou carateres.
anLeft - Numérico, opcional. Coordenada horizontal em pixels ou caracteres.
aPrompts - Array, Titulo dos folders
aDialogs - Array, Nome dos diálogos
aoWnd - Objeto, opcional. Janela ou controle onde a botão deverá ser criado
anOption - Numérico, opcional. Folder selecionado
anClrFore - Numérico, opcional. Cor de frente
anClrBack - Numérico, opcional. Cor de fundo
alPixel - Lógico, opcional. Utiliza coordenadas em pixel
alDesign - Lógico, opcional. NÃO USADO
anWidth - Numérico, opcional. Largura em pixels.
anHeight - Numérico, opcional. Altura em pixels.
acMsg - Caractere, Mensagem de Hint
alAllWidth- Lógico, opcional. NÃO USADO

Métodos auxiliares:
SETOPTION
Seleciona o folder a ser utilizado

SetOption(noption)
noption - numérico. Número do folder a ser selecionado.

ADDITEM
Insere um folder

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 47
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

AddItem (citem,lVisible)
cItem - Caractere. Título do Folder
lVisible - Lógico. Visível

AENABLE
Habilita ou desabilita um item

AEnable(nItem,lEnable)
nItem -Numérico. Folder para habilitar/desabilitar
lEnable - Lógico. Habilita/Desabilita

Ex. Teste de TFolder()


Local oFolder
Local aFolder := { 'Folder 1', 'Folder 2', 'Folder 3' }
oFolder := TFolder():New( 0, 0, aFolder, aFolder, oDlg,,,, .T., , 200,;
200 )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 48
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 49
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 1

Monte a tela abaixo:

Somente fechar a janela no botão fechar quando o aluno estiver preenchido.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 50
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Exibir mensagem de escolha de item a cada troca de item

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 51
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Exibir mensagem quando trocar a seleção no Checkbox

Exibir mensagem para cada troca se seleção no Combobox

Exibir mensagem para cada troca se seleção no Listbox

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 52
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 53
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C
CAAP
PÍÍTTU
ULLO
O33 -- O
OBBJJEETTO
OSS D
DEE C
COON
NTTR
ROOLLEE D
DEE IIM
MPPR
REESSSSÃ
ÃOO
Segue abaixo os objetos de controle de impressão.

MPREPORT
Função para impressão de cadastros. Essa função substitui a antiga ImpCadast() e
tem vários recursos de personalização do relatório.

MPReport(p1,p2,p3,p4,p5)

p1 - nome do relatório
p2 - tabela
p3 - titulo
p4 - descrição
p5 - vetor com ordens que pode ser:
{"<texto1>","<texto2>",...} : a ordem do índice será a posição do vetor
{{2,"Alfabetica"},{1,"Por codigo"}} := a ordem será a primeira posição do vetor

Ex: Impressão do Cadastro de Clientes

#Include "PROTHEUS.CH"

User Function xMPReport()

MPReport("MATR020","SA1", "Relacao de clientes", "Emissao do Cadastro de


Clientes"+ "Ira imprimir os dados dos clientes "+ "de acordo com a configuracao
do usuario.", { " Por Codigo ", " Alfabetica ", " Por
"+RTrim(RetTitle("A1_CGC"))})

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 54
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 55
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TMSPRINTER
Cria um objeto que permite visualizar e imprimir relatórios.

Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.

TMSPrinter(): New ( [ cDocument], [ uParam2], [ uParam3], [ uParam4], [ uParam5], [


uParam6], [ uParam7], [ uParam8] )

cDocument Caracter Indica o nome descritivo do relatório.


uParam2 Lógico Compatibilidade.
uParam3 Lógico Compatibilidade.
uParam4 Caracter Compatibilidade.
uParam5 Caracter Compatibilidade.
uParam6 Caracter Compatibilidade.
uParam7 Lógico Compatibilidade.
uParam8 Caracter Compatibilidade.

Ex: oPrint := TMSPrinter():New("Teste TMSPrinter")

BOX
Cria um objeto do tipo retângulo.

TMSPrinter(): Box ( [ nRow], [ nCol], [ nBottom], [ nRight], [ uParam5] )

nRow Numérico Indica a coordenada vertical em pixels.


nCol Numérico Indica a coordenada horizontal em pixels.
nBottom Numérico Indica a posição do objeto em relação ao rodapé.
nRight Numérico Indica a posição do objeto à direita.
uParam5 Qualquer Compatibilidade.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 56
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Ex: oPrint:Box( 130,10,600,900 )

CANCEL
Cancela a impressão do relatório

TMSPrinter(): Cancel ( )

Ex:oPrint:Cancel()

CANCELED
Retorna se o relatório foi cancelado

TMSPrinter(): Canceled ( )

Ex: oPrint:Canceled()

CMTR2PIX
Devolve por referência o valor convertido em pixels de uma coluna e uma linha.

TMSPrinter(): Cmtr2Pix ( [ nLinha], [ nColuna], [ uParam3] )

nLinha Numérico Indica a linha que será calculada.


nColuna Numérico Indica a coluna que será calculada.
uParam3 Array of Record Compatibilidade.

Ex:
nCol1 := 10
nRow1 := 10
oPrint:Cmtr2Pix( nCol1,nRow1 )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 57
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Resultados:
nCol1 := 1107.08955224
nRow1 := 1107.26600985

END
Indica o término do relatório

TMSPrinter(): End ( )

Ex: oPrint:End()

ENDPAGE
Indica o fim da página.

TMSPrinter(): EndPage ( )

Ex: oPrint:EndPage()

FILLRECT
Cria um objeto do tipo retângulo que pode ser preenchido de uma determinada cor.

TMSPrinter(): FillRect ( [ aCoords], [ oBrush] )

Indica um array, do tipo numérico, que contêm as coordenadas do


aCoords Vetor
retângulo que será construído.
Indica o objeto do tipo TBrush utilizado para definir a cor de
oBrush Objeto preenchimento do shape e responsável pelo preenchimento do
retângulo.

Ex: oBrush1 := TBrush():New( , CLR_YELLOW )


oPrint:FillRect( {100, 10, 200, 200}, oBrush1 )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 58
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
GETORIENTATION
Retorna a orientação (Retrato ou Paisagem) do objeto.

TMSPrinter(): GetOrientation ( )
Retorno
nOrint()
Retorna a orientação do objeto, sendo: 1=Portrait (retrato) ou 2=Landscape
paisagem).

Exemplos
oPrint:GetOrientation() // Resultado: 1=Portrait(retrato)
2=Landscape(paisagem)
GETTEXTHEIGHT
Retorna a altura do texto conforme as características da fonte definida.

Sintaxe
TMSPrinter(): GetTextHeight ( < cTexto>, < oFont> ) --> nHeight

Parâmetros
Retorno
nHeight()
Retorna a altura do texto.

Exemplos
oFont1 := TFont():New('Courier new',,-18,.T.)
nHeight := oPrint:GetTextHeight( "Teste", oFont1) // Result: 180

GETTEXTWIDTH
Retorna a largura do texto conforme as características da fonte definida.

TMSPrinter(): GetTextWidth ( < cTexto>, < oFonte> ) --> nWidth

cTexto Caracter Indica o texto que será calculado.


NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 59
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Indica o objeto do tipo TFont, utilizado para definir as
oFont Objeto
características da fonte, para realizar o cálculo.
Retorno
nWidth()
Retorna a largura do texto.

ISPRINTERACTIVE
Retorna se a impressora está ativa.

TMSPrinter(): IsPrinterActive ( )

Ex:oPrint:IsPrinterActive()

LINE
Cria um objeto do tipo linha.

TMSPrinter(): Line ( [ nTop], [ nLeft], [ nBottom], [ nRight], [ uParam5] ) -->

nTop Numérico Indica a coordenada vertical em pixels.


nLeft Numérico Indica a coordenada horizontal em pixels.
nBottom Numérico Indica a posição do objeto ao rodapé.
nRight Numérico Indica a posição do objeto à direita.
uParam5 Objeto Compatibilidade.

Ex: oPrint:Line( 130,10,130,900 )

PREVIEW
Abre a janela de visualização do relatório.

TMSPrinter(): Preview ( )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 60
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Ex: oPrint:Preview()

PRINT
Envia o relatório para impressora.

TMSPrinter(): Print ( [ aPags], [ nCopias] ) -->

Indica o array, do tipo numérico, que contêm as páginas que


aPags Numérico
serão impressas.
nCopias Numérico Indica o número de cópias que serão impressas.

Ex: oPrint:Print( {1,2}, 2 )


// Imprime duas cópias da página 1 e 2

PRINTERNAME
Retorna o nome da impressora.

TMSPrinter(): PrinterName ( ) --> cImpressora


Retorno
cImpressora(caracter)
Retorna o nome da impressora.
Ex: oPrint:PrinterName() // Result: "\\192.168.0.25\Lex "

REFRESH
Atualiza a visualização do relatório.

TMSPrinter(): Refresh ( )

Ex: oPrint:Refresh()

RESETPRINTER
Exclui o objeto e reinicia suas propriedades.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 61
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TMSPrinter(): ResetPrinter ( )

Ex: oPrinter:ResetPrinter()

SAVEALLASJPEG
Salva o relatório, no formato JPG (Joint Photographic Group), e gera um arquivo
separado para cada página.

TMSPrinter(): SaveAllAsJpeg ( [ cFilePath], [ nWidthPage], [ nHeightPage], [ nZoom]


) --> lOk

cFilePath Caracter Indica o nome do arquivo.


nWidthPage Numérico Indica a largura da imagem.
nHeightPage Numérico Indica a altura da imagem.
nZoom Numérico Indica o zoom que a imagem será salva.

Retorno
lOk(logico)
Retorna verdadeiro (.T.), se a imagem for salva com sucesso; caso contrário, retornará
falso (.F.).

O método SaveAllAsJpeg() não foi implementado para ser executado em


Jobs.

DETALHES SOBRE AS DEFINIÇÕES DE TAMANHO E ZOOM


Os valores default(padrão) do método são:
nWidthPage: 700
nHeightPage: 1000
nZoom:100%

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 62
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Limites aceitos:
nWidthPage: 1800
nHeightPage: 1800
nZoom: Minimo 10% e Máximo 300%

Ex: oPrint:SaveAllAsJpeg( cStartPath+'relatorio', 1120, 840, 140 )

SAVEASHTML
Salva o relatório no formato HTML (HyperText Markup Language).

TMSPrinter(): SaveAsHTML ( < cFile>, [ aRange] ) --> lOk

cFile Caracter Indica o nome do arquivo.


Indica o array, do tipo caracter, que contêm as páginas que serão
aRange Vetor
salvas.
Retorno
lOk(logico)
Retorna verdadeiro (.T.), se o relatório for salvo com sucesso; caso contrário,
retornará falso (.F.).

O método SaveAsHTML() não foi implementado para ser executado em


Jobs.

Exemplos
cFileHtml := "\Teste\TESTE.HTM"
lSend := oPrint:SaveAsHTML( cFileHtml, {1,2} ) // Result : .T.

SAY
Cria um objeto do tipo texto.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 63
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TMSPrinter(): Say ( [ nRow], [ nCol], [ cText], [ oFont], [ nWidth], [ nClrText], [
uParam7], [ nAlign] )

nRow Numérico Indica a coordenada vertical em pixels ou caracteres.


nCol Numérico Indica a coordenada horizontal em pixels ou caracteres.
cText Caracter Indica o texto que será impresso.
Indica o objeto do tipo TFont utilizado para definir as
oFont Objeto características da fonte aplicada na exibição do conteúdo do
controle visual.
nWidth Numérico Indica a largura em pixels do objeto.
nClrText Numérico Indica a cor do texto do objeto.

uParam7 Nulo Mantido por compatibilidade, caso informado deve ser NIL.
Indica o alinhamento do texto : 0 - (Padrão) Alinhado à
nAlign Numérico
esquerda. 1 - Alinhado à direita. 2 - Centraliza o texto.

Ex: oFont1 := TFont():New('Courier new',,-18,.T.)


oPrint:Say( 10,10,"Teste de visulização",oFont1,1400,CLR_HRED )

SAYBITMAP
Cria um objeto do tipo imagem.

TMSPrinter(): SayBitmap ( [ nRow], [ nCol], [ cBitmap], [ nWidth], [ nHeight], [


uParam6], [ uParam7] )

nRow Numérico Indica a coordenada vertical em pixels ou caracteres.


nCol Numérico Indica a coordenada horizontal em pixels ou caracteres.
Indica o diretório e o nome, com extensão BMP (Bitmap), da
cBitmap Caracter
imagem.
nWidth Numérico Indica a largura em pixels do objeto.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 64
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
nHeight Numérico Indica a altura em pixels do objeto.
uParam6 Numérico Compatibilidade.
uParam7 Lógico Compatibilidade.

A imagem é ajustada para preencher todo o espaço definido entre a altura e


largura do objeto.

Ex: oPrint:SayBitmap( 100,200,"C:\Dir\Totvs.bmp",800,800 )

SETCURRENTPRINTERINUSE
Compatibilidade.

TMSPrinter(): SetCurrentPrinterInUse ( )

SETFONT
Define a fonte padrão do relatório.

TMSPrinter(): SetFont ( < oFont> )

Indica o objeto do tipo TFont utilizado para definir as características


oFont Objeto
da fonte aplicada na exibição do conteúdo do controle visual.

Ex: oFont1 := TFont():New('Courier new',,-18,.T.)


oPrint:SetFont( oFont1 )

SETLANDSCAPE
Define a orientação do relatório como paisagem (Landscape).

TMSPrinter(): SetLandscape ( )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 65
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Ex: oPrint:SetLandscape()

SETPAGE
Define a página que será apresentada.

TMSPrinter(): SetPage ( < nPage> )

nPage Numérico Indica o número da página que será apresentada.

Ex: oPrint:SetPage( 10 )

SETPAPERSIZE
Define o tamanho que será adotado pela página que será impressa.

TMSPrinter(): SetPaperSize ( [ nTamanho] )

Indica o tamanho que será utilizado no papel. Para mais


nTamanho Numérico informações dos tipos de tamanho disponíveis, consulte a
área Observações.

TAMANHO DE FOLHAS POSSÍVEIS PARA O MÉTODO TMSPRINTER:SETPAPERSIZE()

#define DMPAPER_LETTER 1
Letter 8 1/2 x 11 in
#define DMPAPER_LETTERSMALL 2
// Letter Small 8 1/2 x 11 in

#define DMPAPER_TABLOID 3
// Tabloid 11 x 17 in

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 66
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
#define DMPAPER_LEDGER 4
// Ledger 17 x 11 in

#define DMPAPER_LEGAL 5
// Legal 8 1/2 x 14 in

#define DMPAPER_STATEMENT 6
// Statement 5 1/2 x 8 1/2 in

#define DMPAPER_EXECUTIVE 7
// Executive 7 1/4 x 10 1/2 in

#define DMPAPER_A3 8
// A3 297 x 420 mm

#define DMPAPER_A4 9
// A4 210 x 297 mm

#define DMPAPER_A4SMALL 10
// A4 Small 210 x 297 mm

#define DMPAPER_A5 11
// A5 148 x 210 mm

#define DMPAPER_B4 12
// B4 250 x 354
#define DMPAPER_B5 13
// B5 182 x 257 mm

#define DMPAPER_FOLIO 14
// Folio 8 1/2 x 13 in

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 67
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
#define DMPAPER_QUARTO 15
// Quarto 215 x 275 mm

#define DMPAPER_10X14 16
// 10x14 in

#define DMPAPER_11X17 17
// 11x17 in

#define DMPAPER_NOTE 18
// Note 8 1/2 x 11 in

#define DMPAPER_ENV_9 19
// Envelope #9 3 7/8 x 8 7/8

#define DMPAPER_ENV_10 20
// Envelope #10 4 1/8 x 9 1/2

#define DMPAPER_ENV_11 21
// Envelope #11 4 1/2 x 10 3/8

#define DMPAPER_ENV_12 22
// Envelope #12 4 \276 x 11

#define DMPAPER_ENV_14 23
// Envelope #14 5 x 11 1/2

#define DMPAPER_CSHEET 24
// C size sheet

#define DMPAPER_DSHEET 25
// D size sheet

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 68
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
#define DMPAPER_ESHEET 26
// E size sheet

#define DMPAPER_ENV_DL 27
// Envelope DL 110 x 220mm

#define DMPAPER_ENV_C5 28
// Envelope C5 162 x 229 mm

#define DMPAPER_ENV_C3 29
// Envelope C3 324 x 458 mm

#define DMPAPER_ENV_C4 30
// Envelope C4 229 x 324 mm

#define DMPAPER_ENV_C6 31
// Envelope C6 114 x 162 mm

#define DMPAPER_ENV_C65 32
// Envelope C65 114 x 229 mm

#define DMPAPER_ENV_B4 33
// Envelope B4 250 x 353 mm

#define DMPAPER_ENV_B5 34
// Envelope B5 176 x 250 mm

#define DMPAPER_ENV_B6 35
// Envelope B6 176 x 125 mm

#define DMPAPER_ENV_ITALY 36
// Envelope 110 x 230 mm

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 69
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
#define DMPAPER_ENV_MONARCH 37
// Envelope Monarch 3.875 x 7.5 in

#define DMPAPER_ENV_PERSONAL 38
// 6 3/4 Envelope 3 5/8 x 6 1/2 in

#define DMPAPER_FANFOLD_US 39
// US Std Fanfold 14 7/8 x 11 in

#define DMPAPER_FANFOLD_STD_GERMAN 40
// German Std Fanfold 8 1/2 x 12 in

#define DMPAPER_FANFOLD_LGL_GERMAN 41
// German Legal Fanfold 8 1/2 x 13 in

Exemplos
#INCLUDE "TOTVS.CH"

#DEFINE DMPAPER_LETTER 1 // Letter 8 1/2 x 11 in

user function tstMsPrint

Local aCoords1 := { 1400, 220, 2000, 1000 }


Local cStartPath:= GetSrvProfString( "Startpath", "" )
Local x := 0

Local oFont1 := TFont():New( "Times New Roman",,8,,.f.,,,,, .f. )//Times New Roman
Local oFont2 := TFont():New( "Times New Roman",,10,,.f.,,,,, .f. )
Local oFont3 := TFont():New( "Times New Roman",,7,,.f.,,,,, .f. )
Local oFont4 := TFont():New( "Times New Roman",,9,,.f.,,,,, .f. )
Local oFont5 := TFont():New( "Times New Roman",,16,,.f.,,,,, .f. )
Local oFont6 := TFont():New( "Times New Roman",,18,,.f.,,,,, .f. )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 70
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Local oFont7 := TFont():New( "Times New Roman",,20,,.f.,,,,, .f. )
Local oFont8 := TFont():New( "Times New Roman",,22,,.f.,,,,, .f. )

Local oPrn := TMSPrinter():New( "tMsPrinter - Teste" )


Local oBrush := TBrush():New( "", CLR_HBLUE )

Local lPreview:= .T.

Private oMainWnd:= Nil


Private cAcesso := ""

lPreview := msgYesNO( "Visualizar antes?" )

If !oPrn:IsPrinterActive()
Alert( "Selecione a impressora padrao" )
oPrn:setUp()
Else
oPrn:setUp()
Endif

If Right(cStartPath,1) <> "\"


cStartPath += Iif( GetRemoteType() == 2, "/", "\" )
Endif

@ 000,000 To 768, 1024 Dialog oMainWnd Title "Teste tMsPrinter"

oPrn:startPage()
oPrn:setPortrait()
oPrn:setPaperSize( DMPAPER_LETTER )
oPrn:Say( 0, 0, " ", oFont1, 100 )
oPrn:Say ( 0280, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_8",
oFont1 )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 71
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrn:Say ( 0480, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_10",
oFont2 )
oPrn:Say ( 0680, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_7",
oFont3 )
oPrn:Say ( 0880, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_9",
oFont4 )
oPrn:Say ( 1080, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_16",
oFont5 )
oPrn:Say ( 1280, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_18",
oFont6 )
oPrn:Say ( 1480, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_20",
oFont7 )
oPrn:Say ( 1680, 220, "TESTE DE IMPRESSAO ***fonte 04 Courier_New_de_22",
oFont8 )

oPrn:EndPage()
oPrn:End()

If lPreview
oPrn:Preview()
Else
oPrn:Print()
Endif

Activate Dialog oMainWnd Centered

Return Nil

SETPORTRAIT
Define a orientação do relatório como retrato (Portrait).

Sintaxe
TMSPrinter(): SetPortrait ( ) -->

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 72
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Exemplos
oPrint:SetPortrait()

SETUP
Apresenta a janela de configuração de impressoras.

Sintaxe
TMSPrinter(): Setup ( )

Exemplos
oPrint:Setup()

STARTPAGE
Indica o início da página.

Sintaxe
TMSPrinter(): StartPage ( )

Exemplos
oPrint:StartPage()

NHORZRES

Retorna a resolução horizontal da impressora configurada.

Sintaxe
TMSPrinter(): nHorzRes ( ) --> nResolução
Retorno
nResolução()
Retorna a resolução horizontal da impressora configurada.

Exemplos

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 73
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:nHorzRes() // Result: 2400

NLOGPIXELX

Retorna a resolução vertical em pixels da impressora configurada.

Sintaxe
TMSPrinter(): nLogPixelX ( ) --> nResolução
Retorno
nResolução()
Retorna a resolução vertical em pixels da impressora configurada.

Exemplos
oPrint:nLogPixelX() // Result: 300

NLOGPIXELY

Retorna a resolução horizontal em pixels da impressora configurada.

TMSPrinter(): nLogPixelY ( ) --> nResolução


Retorno
nResolução()
Retorna a resolução horizontal em pixels da impressora configurada.

Exemplos
oPrint:nLogPixelY() // Result: 300

NVERTRES

Retorna a resolução vertical da impressora configurada.

TMSPrinter(): nVertRes ( ) --> nResolução


Retorno
nResolução()
Retorna a resolução vertical da impressora configurada.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 74
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Exemplos
oPrint:nVertRes() // Result: 3168

cDocument Indica o texto descritivo do relatório. Caracter


Indica se, verdadeiro (.T.), o relatório será excluído após
lDelete Lógico
exibição; caso contrário, falso (.F.).
nPage Indica o número da página em exibição. Numérico
nPageHeight Indica a altura da página. Numérico
nPageWidth Indica a largura da página. Numérico

Para utilizar imagem nesta classe, através do método SayBitmap, é necessário


que o formato seja BMP (Bitmap). A classe não suporta outro tipo de formato para
impressão de imagem.

A classe TMSPrinter utiliza a classe TFont para definir a fonte que será
utilizada, porém, a classe TMSPrinter tem uma limitação de fontes que podem ser
utilizadas.
A SEGUIR, OBSERVE AS FONTES QUE SÃO HOMOLOGADAS PARA TMSPRINTER:
Courier New
Arial
Times New Roman
Helvetica
Microsoft Sans Serif
Verdana
Tahoma
Andalus
Century
Cordia New

FILLRECT
Constrói um retângulo, o qual pode ser preenchido com uma cor.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 75
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Indica um array, do tipo numérico, que contêm as coordenadas do


aCoords Vetor
retângulo que será construído.

Indica o objeto do tipo TBrush utilizado para definir a cor de


oBrush Objeto preenchimento do shape e responsável pelo preenchimento do
retângulo.

Ex:
#include "PROTHEUS.CH"
User Function xTMSPrinter()
Private cAcesso := Repl(" ",10)

DEFINE DIALOG oMainWnd TITLE "Teste TMSPrinter" FROM 180,180 TO 550,700


PIXEL

oPrint := TMSPrinter():New("Exemplo TMSPrinter")


oPrint:SetPortrait()
oPrint:Setup()

oPrint:StartPage()

oFont1 := TFont():New('Courier new',,-18,.T.)


oPrint:Say( 10,10,"Texto que sera mostrado",oFont1,1400,CLR_HRED )

oPrint:SayBitmap( 100,200,"nft.bmp",400,400 )

oPrint:Box( 100,10,600,900 )

oPrint:Line( 620,10,620,900 )

oBrush1 := TBrush():New( , CLR_BLUE )


oPrint:FillRect( {650, 10, 850, 850}, oBrush1 )
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 76
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oBrush1:End()

// Visualiza a impressão
oPrint:EndPage()
oPrint:Preview()

ACTIVATE DIALOG oMainWnd CENTERED


Return

TPAGEVIEW
Cria um objeto que permite visualizar um arquivo no formato gerado pelo spool de
impressão.

Hierarquia
TSrvObject -> TControl -> TPageView

nCol Numérico Indica a coordenada vertical em pixels ou caracteres.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 77
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
nRow Numérico Indica a coordenada horizontal em pixels ou caracteres.
nWidth Numérico Indica a largura em pixels do objeto.
nHeigth Numérico Indica a altura em pixels do objeto.
Indica o objeto do tipo TMsPrinter utilizado para imprimir e
oPrinter Objeto
visualizar relatórios.
Indica a janela ou controle visual onde o objeto será
oWnd Objeto
criado.
nPageWidth Numérico Indica a largura em pixels da página.

nPageHeight Numérico Indica a altura em pixels da página.

PAGESIZE
Define o tamanho da página

TPageView(): PageSize ( [ nLargura], [ nAltura] )

nLargura Numérico Indica a largura da página.


nAltura Numérico Indica a altura da página.

Ex: oTPageView:PageSize(1000,1000)

PRINTPAGE
Imprime uma determinada página

TPageView(): PrintPage ( [ nNrPagina] )

nNrPagina Numérico Indica a página que será impressa.

Ex oTPageView:PrintPage(1)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 78
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Indica o bloco de código que será executado quando clicar, com o


bScrollClick
botão esquerdo do mouse, sobre a barra de rolagem lateral.
Indica o zoom que será configurado para aumentar ou diminuir a
nZoom
visualização.

Ex:
#include "PROTHEUS.CH"
User Function xTPageView()
Local cAcesso := Repl(" ",10)

DEFINE DIALOG oDlg TITLE "Teste TPageView" FROM 180,180 TO 550,700


PIXEL

oPrinter := TMsPrinter():New()
oPrinter:SetFile( '\SPOOL\matr020.prt', .F.)

oTPageView := TPageView():New( 0,0,510,354,oPrinter,oDlg,550,550 )


oTPageView:Show()
oTPageView:nZoom := 150

ACTIVATE DIALOG oDlg CENTERED


Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 79
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TREPORT
Classe de impressão que substitui as funções SetPrint, SetDefault, RptStatus e
Cabec.
A classe TReport permite que o usuário personalize as informações que serão
apresentadas no relatório, alterando fonte (tipo, tamanho, etc), cor, tipo de linhas,
cabeçalho, rodapé, etc.

ESTRUTURA DA TREPORT:
 O relatório (TReport) contém 1 ou mais seções (TRSection);
 Uma seção (TRSection) pode conter 1 ou mais seções;
 A seção (TRSection) contém células pré-definidas e células selecionadas
pelo usuário;
 A seção (TRSection) também contém as quebras (TRBreak) para impressão
de totalizadores (TRFunction);

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 80
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
 Os totalizadores são incluídos pela seção que automaticamente inclui no
relatório (TReport).

NEW
Método constutor da classe

oReport := TReport():New("TTREPORT","Teste da
TReport","TTREPORT",{|oReport| PrintReport(oReport)},"Este relatorio ira imprimir
os dados financeiros conforme os parametros solicitados.")

SETTITLE
Define o título do componente.

oObj:SetTitle ( < cTitle > )

cTitle Caracter Título do componente

SETPARAM
Define os parâmetros que serão utilizados pelo usuário para configurar o relatório.

oObj:SetParam ( < uParam > )

Tipo Caracter: Parametros do relatório cadastrado no


Dicionário de Perguntas (SX1)
uParam (Qualquer)
Tipo Bloco de código: bloco que será utilizado como
parametro
PREVIEW
Apresenta preview do relatório.

oObj:Preview ( )
(NULO) Retorno nulo.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 81
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
SETACTION
Define o bloco de código que será executado quando o usuário confirmar a
impressão

oObj:SetAction ( < bAction > )

Bloco de código que será executado quando usuário


bAction Code-Block
confirmar a impressão do relatório

PRINT
Inicia impressão do relatório executando o parametro bAction informado nos
métodos New, SetAction ou PrintDialog.
Esse método é executado pelo método PrintDialog quando o usuário confirma a
impressão do relatório.

oObj:Print ( [ lDlg ] )

Verdadeiro para apresentar a tela de processamento


lDlg Lógico
do relatório

PRINTDIALOG
Apresenta a tela de impressão para o usuário configurar o relatório.
O método PrintDialog executa o método Print quando o usuário confirma a
impressão, executando o bloco de código informado pelo parametro bAction nos
métodos New ou SetAction.

oObj:PrintDialog ( [ bAction ] ) --> lPrinted

Bloco de código que será executado quando usuário


bAction Code-Block
confirmar a impressão do relatório

Retorno: lPrinted - lógico - verdadeiro se o usuário confirmou o relatório

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 82
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
CANCEL
Retorna se o usuário cancelou o relatório

oObj:Cancel ( ) --> lCanceled

Retorno: lCanceled - verdadeiro se o usuário cancelou o relatório.

SETMETER
Define o total da regua da tela de processamento do relatório.

oObj:SetMeter ( < nTotal > ) --> NIL

nTotal Numérico Total da regua de processamento

INCMETER
Incrementa a régua da tela de processamento do relatório

oObj:IncMeter ( [ nInc ] ) --> NIL

Quantidade a incrementar na régua.


nInc Numérico
Valor padrão: 1

SETDESCRIPTION
Define a descrição do componente.

oObj:SetDescription ( < cDesc > ) --> NIL

cDesc Caracter Descrição do componente

CLASSNAME
Retorna o nome da classe do componente. (Ex: Apresenta na tela 'TREPORT'
)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 83
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

oObj:ClassName ( ) --> cClassName

Caracter Nome da classe

Ex::
oReport := TReport():New('TESTERE')
MsgStop(oReport:ClassName())

REPORTNAME
Retorna o nome do relatório (exemplo: TESTE)

oObj:ReportName ( ) --> cReport

Caracter Nome do relatório

TITLE
Retorna o título do componente

oObj:Title ( ) --> NIL

TOTALTEXT
Retorna o texto que será impresso antes da impressão dos totalizadores

oObj:TotalText ( ) --> NIL

GETPARAM
Retorna a pergunta/bloco de código utilizada como parametro do relatório.

oObj:GetParam ( ) --> uParam

(Qualquer) Pergunta (SX1) ou bloco de código utilizado como parametro

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 84
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
GETACTION
Retorna bloco de código que será executado pelos métodos Print e PrintDialog
quando usuário confirmar impressão.

oObj:GetAction ( ) --> NIL

FOOTERATEND
Retorna se será impresso rodapé no final da impressão

oObj:FooterAtEnd ( ) --> NIL

TOTALINLINE
Retorna se a impressão dos totalizadores será em linha

oObj:TotalInLine ( ) --> NIL

PAGEHEIGHT
Retorna a altura da página baseado no tamanho da folha (A4, Carta, etc) informado
pelo usuário

oObj:PageHeight ( ) --> nPageHeight

Numérico Altura da página

PAGEWIDTH
Retorna a largura da página baseado no tamanho da folha (A4, Carta, etc) informado
pelo usuário

oObj:PageWidth ( ) --> nPageWidth

Numérico Largura da página

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 85
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
ROW
Retorna a linha posicionada na impressão

oObj:Row ( ) --> nRow

Retorno - numérico - nRow - retorna a linha posicionada

COL
Retorna a coluna posicionada na impressão

oObj:Col ( ) --> nCol

Retorno - numérico - nCol - retorna a coluna posicionada

PAGE
Retorna o número da página atual na impressão

oObj:Page ( ) --> nPage

Retorno - numérico - nPage - retorna a página atual da impressão.

GETORIENTATION
Retorna a orientação de página (Retrato ou Paisagem) selecionada pelo usuário.

oObj:GetOrientation ( ) --> nOrientation

Retorno - numérico - nOrientation - retorna a orientação da página: 1 - retrato ou 2 -


paisagem

PRINTING
Retorna se relatório esta em processo de impressão.
O status de impressão é definido pelos métodos Init (que indica o início da
impressão) e o método Finish (que indica a finalização).

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 86
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oObj:Printing ( ) --> lPrinting

Retorno - lógico - lPrinting - veradadeiro se o relatório está no processo de


impressão

INIT
Incializa impressão.
Não é necessário executar o método Init se for utilizar o método Print ou PrintDialog,
já que estes fazem o controle de inicialização e finalização da impressão.
Caso não esteja utilizando os método citados acima, sempre execute o método
Init no inídio do relatório para verificar as configurações informadas pelo usuário e
inicializar corretamente a primeira página do relatório.

oObj:Init ( ) --> NIL

FINISH
Finaliza impressão inicializada pelo método Init.
Não é necessário executar o método Finish se for utilizar o método Print ou
PrintDialog, já que estes fazem o controle de inicialização e finalização da
impressão.
Caso não esteja utilizando os método citados acima, sempre execute o método
Finish no final do relatório para impressão dos totalizadores que estão habilitados
para o final do relatório, para fechar as querys e/ou indíces temporários criados
pelas seções e para outros tratamentos internos do componente.

oObj:Finish ( ) --> NIL

PRINTTEXT
Imprime o texto nas coordenadas informadas pelos parametros

oObj:PrintText ( < cText > , [ nRow ] , [ nCol ] ) --> NIL

cText Caracter Texto que será impresso

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 87
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Linha que o texto será impresso.
nRow Numérico
Valor padrão: linha posicionada da impressão
Coluna que o texto será impresso.
nCol Numérico
Valor padrão: coluna posicionada da impressão

ENDPAGE
Finaliza uma página de impressão

oObj:EndPage ( [ lFooter ] ) --> NIL

l Imprime rodapé.
Lógico
Footer Valor padrão: Falso

INCROW
Incrementa a linha de impressão baseado no parametro ou no valor definido pelo
usuário para a altura das linhas do relatório.

oObj:IncRow ( [ nInc ] ) --> NIL

Quantidade a incrementar.
nInc Numérico Valor padrão definida pelo usuário para a altura da
linha

SKIPLINE
Salta uma linha baseado na altura da linha informada pelo usuário

oObj:SkipLine ( ) --> NIL

SETTOTALTEXT
Define o texto que será impresso antes da impressão dos totalizadores

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 88
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oObj:SetTotalText ( < cTexto > ) --> NIL

cTexto Caracter Texto para impressão antes dos totalizadores

SETTOTALINLINE
Define se os totalizadores serão impressos em linha ou coluna

oObj:SetTotalInLine ( [ lTotalInLine ] ) --> NIL

Verdadeiro se totalizadores serão impressos em linha


lTotalInLine Lógico
Valor padrão: Verdadeiro

SETPORTRAIT
Define orientação de página do relatório como retrato

oObj:SetPortrait ( ) --> NIL

SETLANDSCAPE
Define orientação de página do relatório como paisagem

oObj:SetLandScape ( ) --> NIL

SETPREVIEW
Define se será apresentado o preview o relatório no final da impressão

oObj:SetPreview ( [ lPreview ] ) --> NIL

Verdadeiro para apresentar preview no final da


lPreview Lógico impressão
Valor padrão: Verdadeiro

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 89
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

GETFUNCTION
Retorna objeto da classe TRFunction (totalizadores) baseado no parametro
informado.

oObj:GetFunction ( < uFunction > ) --> oFunction

Tipo Caracter: ID do objeto


uFunction (Qualquer) Tipo Numérico: Índice do objeto segundo a ordem de
criação dos componentes TRFunction

SECTION
Retorna objeto da classe TRSection (seção) baseado no parametro informado.

oObj:Section ( < uSection > ) --> oSection

Tipo Caracter: Título do objeto


uSection (Qualquer) Tipo Numérico: Índice do objeto segundo a ordem de
criação dos componentes TRSection

Retorno - Objeto da classe TRFunction. Se não for encontrado o objeto segundo o


parametro informado será retornado Nulo

SAY
Imprime texto nas coordenadas informadas pelos parametros, utilizando as
especificações do objeto TFont, cor da fonte e cor de fundo

oObj:Say ( < nRow > , < nCol > , < cText > , [ oFont ] , [ nWidth ] , [ nClrText ] , [
nBkMode ] ) --> NIL

nRow Numérico Linha para impressão do texto


nCol Numérico Coluna para impressão do texto

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 90
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cText Caracter Texto que será impresso
oFont Objeto Objeto da classe TFont
nWidth Numérico Tamanho em pixel do texto para impressão
nClrText Numérico Cor da fonte
nBkMode Numérico Cor de fundo

SAYBITMAP
Imprime uma imagem nas coordenadas informadas pelos parametros

oObj:SayBitmap ( < nLinha > , < nCol > , < cBitmap > , [ nWidth ] , [ nHeight ] ) -->
NIL

nLinha Numérico Linha para impressão da imagem


nCol Numérico Coluna para impressão da imagem
Nome da imagem (arquivo ou resource compilado no
cBitmap Numérico
repositório)
nWidth Numérico Largura da imagem
nHeight Numérico Altura da imagem

LINE
Desenha uma linha baseado nas coordenadas informadas pelos parametros,
utilizando as especificações do objeto TPen.

oObj:Line ( < nTop > , < nCol > , < nBottom > , < nRight > , [ oPen ] ) --> NIL

nTop Numérico Linha inicial


nCol Numérico Coluna inicial
nBottom Numérico Linha final
nRight Numérico Coluna final
oPen Objeto Objeto da classe TPen

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 91
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
BOX
Desenha uma caixa baseado nas coordenadas informadas pelos parametros,
utilizando as especificações do objeto TPen.

oObj:Box ( < nRow > , < nCol > , < nBottom > , < nRight > , [ oPen ] ) --> NIL

nRow Numérico Linha inicial


nCol Numérico Coluna inicial
nBottom Numérico Linha final
nRight Numérico Coluna final
oPen Objeto Objeto da classe TPen

FILLRECT
Preenche um retangulo na impressão utilizando as especificações do objeto TBrush.

oObj:FillRect ( < aRect > , [ oBrush ] ) --> NIL

Vetor com coordenadas no formato:


aRect Array
{linha inicial, coluna inicial, linha final, coluna final}
oBrush Objeto Objeto da classe TBrush

THINLINE
Desenha uma linha simples iniciando na linha atual de impressão com a largura da
página

oObj:ThinLine ( ) --> NIL

FATLINE
Desenha uma linha com altura maior que a do método ThinLine, iniciando na linha
atual de impressão com a largura da página

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 92
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oObj:FatLine ( ) --> NIL

TRFUNCTION
Totalizador de uma quebra, seção ou relatório que utiliza a classe TReport.
Um totalizador pode executar uma das seguintes funções abaixo, utilizando como
referencia uma célula da seção ou o retorno de uma fórmula definida para ele:
SUM (somar)
CONT (contar)
MAX (valor máximo)
MIN (valor mínimo)
AVERAGE (valor médio)
Na criação do totalizador sempre é informado uma seção (TRSection) a qual ele
pertence, e automaticamente o totalizador será incluido no relatório (TReport) que a
seção pertence.

NEW
Método construtor da classe
O parametro que indica qual célula o totalizador se refere ,será utilizado para
posicionamento de impressão do totalizador quando estiver definido que a
impressão será por coluna e como conteúdo para a função definida caso não seja
informada uma fórmula para o totalizador

Ex.: TRFunction():New(oSection:Cell("A1_COD"),NIL,"COUNT",oBreak)

Formula
Retorna a fórmula do totalizador

SectionValue
Retorna o valor atual do totalizador para a seção

PageValue

Retorna o valor atual do totalizador para a página

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 93
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
ReportValue
Retorna o valor atual do totalizador para o relatório

GetFunction
Retorna a função (SUM, COUNT, MAX, MIN, AVERAGE) utilizada pelo totalizador.

EndSection
Retorna se o totalizador será impresso na quebra de seção

EndPage
Retorna se totalizador será impresso no final da página

EndReport

Retorna se totalizador será impresso no final do relatório

Execute
Executa a função do totalizador, utilizando a fórmula definida pelo método New ou
pelo método SetFormula.
O método Execute é executado para cada linha impressa pelo método PrintLine da
seção que o totalizador pertence.

Reset
Reinicia valor do totalizador

ResetSection
Reinicia valor do totalizador para a seção

ResetPage
Reinicia valor do totalizador para a página

ResetReport
Reinicia valor do totalizador para o relatório

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 94
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

SetFormula
Define a fórmula utilizada pelo totalizador ao invés do conteúdo da célula que ele se
refere

SetBreak
Define a quebra (TRBreak) que o totalizador será impresso

SetFunction
Define a função (SUM, COUNT, MAX, MIN, AVERAGE, HOUR) que será utilizada
pelo totalizador

SetEndSection
Define se o totalizador será impresso na quebra de seção

SetEndPage
Define se o totalizador será impresso no final da página

SetEndReport
Define se o totalizador será impresso no final do relatório

TRPOSITION
New
Método construtor da classe TRPosition

SetTable
Define a tabela que será utitliza pela fórmula para o posicionamento

SetOrder
Define a ordem do índice para o posicionamento

SetNickName
Define a ordem do índice pelo seu nickname

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 95
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Execute
Executa a fórmula de posicionamento definida no parametro do método New ou pelo
método SetFormula

Enable
Habilita execução da célula de posicionamento

Disable
Desabilita execução da célula de posicionamento

SetFormula
Define a fórmula de posicionamento da tabela informada por parametro pelo método
New ou pelo método SetTable

TRSECTION
New
Método construtor da classe TRSection
No parâmetro onde é informado as tabelas utilizadas pela seção, a primeira será a
principal, sendo utilizada para o processamento pelo método Print. As outras tabelas
serão utilizadas para que o usuário possa incluir os campos como célula.
O relacionamento entre as tabelas poderá ser feito pela query ou então pelo uso dos
objetos da classe TRPosition.
Dos elementos do parâmetro onde são informadas as ordens utilizada pela seção
serão criados os objetos da classe TROrder automaticamente, utilizando como
índice da tabela principal a ordem do elemento no vetor.

Parent
Retorna o objeto pai da classe TRSection

Report
Retorna o objeto da classe TReport que a classe TRSection pertence

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 96
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
PageBreak
Retorna se salta a página na quebra de seção

HeaderBreak
Retorna se cabeçalho das células será impresso após uma quebra (TRBreak)

HeaderSection
Retorna se cabeçalho das células será impresso na quebra de seção

Visible
Retorna se o componente esta habilitada para impressão

Alias
Retorna o alias utilizado pela query da seção, que foi definida pelo Embedded SQL
com os métodos BeginQuery e EndQuery

Show
Habilita a impressão do componente

Hide
Desabilita a impressão da seção, porém todas as linhas serão processadas,
somente não aparecerão no relatório.

lReadOnly
Retorna se o usuário pode alterar o layout da seção

Init
Inicializa seção.
Não é necessário executar o método Init se for utilizar o método Print, já que este faz
o controle de inicialização e finalização das seções.
Caso não esteja utilizando o método Print, sempre execute o método Init para
inicializar a seção, para controle de quebra de página entre seções, impressão do
cabeçalho das células e para outros tratamentos internos do componente.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 97
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Finish
Finaliza seção inicializada pelo método Init.
Não é necessário executar o método Finish se for utilizar o método Print, já que este
faz o controle de inicialização e finalização das seções.
Caso não esteja utilizando o método Print, sempre execute o método Finish ao
finalizar uma seção, para controle da impressão dos totalizadores das quebras e dos
que estão habilitados para o final da seção, para controle de quebra de página entre
seções e para outros tratamentos internos do componente.

PrintLine
Imprime a linha baseado nas células selecionadas pelo usuário

Print
Processa as informações da tabela principal ou da query definida pelo Embedded
SQL com os métodos BeginQuery e EndQuery
O método Print faz o loop na tabela ou na query, executando o método PrintLine
para cada linha e o método Print de todas as seções filhas. Nas seções filhas, o
posicionamento inicial pode ser baseado na query da seção pai (através do método
SetParentQuery) ou através da regra informada pelo método SetRelation, junto com
a regra informada pelo método SetParentFilter que controla a saída do loop.

Cell
Retorna objeto da classe TRCell (célula) baseado no parâmetro informado.

Order
Retorna objeto da classe TROrder (ordem) basead no parâmetro informado

LoadCells
Carrega campos do Dicionário de Campos (SX3) como células da seção,
respeitando nível, uso e contexto do campo

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 98
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
LoadOrder
Carrega índices do Dicionário de Índices (SIX) como ordem da seção

SetPageBreak
Define se salta a página na quebra de seção

SetHeaderBreak
Define se imprime cabeçalho das células após uma quebra (TRBreak)

SetHeaderSection
Define de imprime cabeçalho das células na quebra de seção

SetReadOnly
Define se o usuário não poderá alterar o layout da seção, ou seja, não poderá
remover as células pré-definidas.
As células que forem adicionadas na seção serão impressas na próxima página,
após ter impresso as células pré-definidas.

GetQuery
Retorna a query que foi definida pelo Embedded SQL com os métodos BeginQuery
e EndQuery, já com as células selecionadas e filtro criado pelo usuário e as
perguntas tipo Range incluidas.

BeginQuery
Indica que será utilizado o Embedded SQL para criação de uma nova query que
será utilizada pela seção

EndQuery
Indica a query criada utilizando o Embedded SQL para a seção.
O método EndQuery ira juntar na query as células selecionadas e o filtro criado pelo
usuário, mais a expressão das perguntas do tipo Range, que foram convertidas
anteriormente pela função MakeSQLExpr.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros 99
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Após sua execução a query esta pronta para ser utilizada tanto pela classe
TRSection como para o fonte que esta criando os componentes, sem a necessidade
de utilizar TCGenQuery, ChangeQuery e TCSetField.

SetParentQuery
Define se a seção filha utilizara a query da seção pai no processamento do método
Print

SetParentFilter
Define a regra de saída do loop de processamento do método Print das seções
filhas

SetFilter
Define um filtro ou um índice com filtro (IndRegua) para a tabela princiapal da seção.
Se não informado o parametro com a chave de índice, será executado SET FILTER
TO com o primeiro parametro, senão será criado um índice com filtro (IndRegua) e
sua ordem será retornada pelo método GetIdxOrder

SetOrder
Define a ordem (TROrder) que será utilizada pela seção

SetIdxOrder
Define uma ordem de índice para a tabela principal

GetOrder
Retorna a ordem selecionada pelo usuário

GetIdxOrder
Retorna o índice utilizado pela tabela principal da seção para processamento pelo
método Print.
Se o retorno for zero, então a seção esta utilizando uma ordem selecionada pelo
usuário (TROrder)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
100
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

SetRelation
Descrição:
Define a fórmula de relacionamento de uma seção filha com sua seção pai, caso não
utilize a query da seção pai (SetParentQuery)
O método SetRelation irá criar o componente TRRelation apresentado no
documento 'Estrutura do componente TReport', que faz o controle do relacionamento
entre as seções.

Ex.: Treport sem usar o método TRSection:Print

#include "protheus.ch"
/*
Exemplo
de uso da TReport sem usar metodo TRSection:Print
*/
User Function xTreport1()
Local oReport
Private cPerg:= "xTrpt1"
ValidPerg()
If TRepInUse() //verifica se relatorios personalizaveis esta disponivel
Pergunte(cPerg,.F.)

oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return

Static Function ReportDef()


Local oReport
Local oSection

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
101
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oReport := TReport():New("XTREPORT1","Relacao das Solicitacoes de
Compras","xTrpt1",{|oReport| PrintReport(oReport)},"Este relatorio imprimira a
relacao das Solicitacoes de compras conforme os parametros solicitados.")

oSection := TRSection():New(oReport,OemToAnsi("Solicitacoes de
Comprasw"),{"SC1","SB1"})

TRCell():New(oSection,"C1_NUM" ,"SC1")
TRCell():New(oSection,"C1_SOLICIT","SC1")
TRCell():New(oSection,"C1_EMISSAO","SC1")
TRCell():New(oSection,"C1_ITEM","SC1")
TRCell():New(oSection,"C1_PRODUTO","SC1")
TRCell():New(oSection,"C1_DESCRI","SB1")
TRCell():New(oSection,"C1_UM","SC1")
TRCell():New(oSection,"C1_QUANT","SC1")
TRCell():New(oSection,"C1_PRECO","SC1")
TRCell():New(oSection,"C1_TOTAL","SC1")
TRCell():New(oSection,"C1_DTPRF","SC1")

Return oReport

Static Function PrintReport(oReport)


Local oSection := oReport:Section(1)

DbSelectArea("SC1")
DbSetOrder(1)
If !Empty(mv_par01)
DbSeek(xFilial()+MV_PAR01)
Else
DbGoTop()
Endif

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
102
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oReport:SetMeter(RecCount())

While ( !Eof() .And. xFilial("SC1") == SC1->C1_FILIAL .And. SC1->C1_NUM <=


MV_PAR02 )
cNum := SC1->C1_NUM
IF SC1->C1_EMISSAO < MV_PAR03 .or. SC1->C1_EMISSAO >
MV_PAR04
SC1->(DbSkip())
Loop
Endif
If oReport:Cancel()
Exit
EndIf

DbSelectArea("SB1")
DbSetOrder(1)
DbSeek(xFilial("SB1")+SC1->C1_PRODUTO)

oSection:Init()

oSection:Cell("C1_DESCRI"):SetValue(SB1->B1_DESC)

oSection:Cell("C1_NUM"):Show()
oSection:Cell("C1_SOLICIT"):Show()
oSection:Cell("C1_EMISSAO"):Show()
oSection:Cell("C1_ITEM"):Show()
oSection:Cell("C1_PRODUTO"):Show()
oSection:Cell("C1_UM"):Show()
oSection:Cell("C1_QUANT"):Show()
oSection:Cell("C1_PRECO"):Show()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
103
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oSection:Cell("C1_TOTAL"):Show()
oSection:Cell("C1_DTPRF"):Show()

While ( !Eof() .And. SC1->C1_FILIAL == xFilial("SC1") .And. SC1->C1_NUM


== cNum)

dbSelectArea("SB1")
dbSetOrder(1)
dbSeek(xFilial("SB1")+SC1->C1_PRODUTO)

oSection:PrintLine()

oSection:Cell("C1_NUM"):HIDE()
oSection:Cell("C1_SOLICIT"):HIDE()
oSection:Cell("C1_EMISSAO"):HIDE()
oSection:Cell("C1_PRODUTO"):Show()
oSection:Cell("C1_UM"):Show()
oSection:Cell("C1_QUANT"):Show()
oSection:Cell("C1_PRECO"):Show()
oSection:Cell("C1_TOTAL"):Show()
oSection:Cell("C1_DTPRF"):Show()

dbSelectArea("SC1")
dbSkip()
End

oSection:Finish()

oReport:SkipLine()
oReport:IncMeter()
End
Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
104
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Static Function ValidPerg()


cPerg := PADR(cPerg,6)

PutSx1( cPerg,"01","S.C. de ?","S.C. de ?","S.C. de


?","mv_ch1","C", 6,0,0,"G","","SC1","","","mv_par01"," ","","","
","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"02","S.C. ate ?","S.C. ate ?","S.C. ate
?","mv_ch2","C", 6,0,0,"G","","SC1","","","mv_par02"," ","","","
","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"03","Emissao de ?","Emissao de ?","Emissao de
?","mv_ch3","D", 8,0,0,"G","","" ,"","","mv_par03"," ","","","
","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"04","Emissao ate ?","Emissao ate ?","Emissao ate
?","mv_ch4","D", 8,0,0,"G","","" ,"","","mv_par04"," ","","","
","","","","","","","","","","","","","","","","","" )
return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
105
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
106
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Ex.: Treport sem usar o método TRSection:Print, com seções

#include "protheus.ch"
#include "report.ch"
/*
TReport sem usar o metodo TRSection:Print com series
*/

User Function xReport2()


Local oReport
Private cPerc
If TRepInUse()
Pergunte("xTrpt1",.F.)

oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return

Static Function ReportDef()


Local oReport
Local oSection1
Local oSection2

oReport := TReport():New("xTReport","Relacao das Solicitaçcoes de


Compra","xTrpt1",{|oReport| PrintReport(oReport)},"Este relatorio ira imprimir a
relacao das Solicitacoes de Compras conforme os parametros solicitados.")

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
107
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oSection1 := TRSection():New(oReport,"SOLICITACOES",{"SC1","SB1"})
oSection2 := TRSection():New(oSection1,"ITENS SOLICITACOES",{"SC1","SB1"})

TRCell():New(oSection1,"C1_NUM" ,"SC1")
TRCell():New(oSection1,"C1_SOLICIT","SC1")
TRCell():New(oSection1,"C1_EMISSAO","SC1")

TRCell():New(oSection2,"C1_ITEM","SC1")
TRCell():New(oSection2,"C1_PRODUTO","SC1")
TRCell():New(oSection2,"B1_DESCRI","SB1")
TRCell():New(oSection2,"C1_UM","SC1")
TRCell():New(oSection2,"C1_QUANT","SC1")
TRCell():New(oSection2,"C1_PRECO","SC1")
TRCell():New(oSection2,"C1_TOTAL","SC1")
TRCell():New(oSection2,"C1_DTPRF","SC1")

TRPosition():New(oSection2,"SB1",1,{|| xFilial("SC1") + SC1->C1_PRODUTO})

Return oReport

Static Function PrintReport(oReport)


Local oSection1 := oReport:Section(1)
Local oSection2 := oReport:Section(1):Section(1)

DbSelectArea("SC1")
DbSetOrder(1)
If !Empty(mv_par01)
DbSeek(xFilial()+MV_PAR01)
Else
DbGoTop()
Endif

oReport:SetMeter(RecCount())

While ( !Eof() .And. xFilial("SC1") == SC1->C1_FILIAL .And. SC1->C1_NUM <=


MV_PAR02 )
cNum := SC1->C1_NUM

If oReport:Cancel()
Exit
EndIf

oSection1:Init()
oSection1:PrintLine()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
108
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

oSection2:Init()

While ( !Eof() .And. SC1->C1_FILIAL == xFilial("SC1") .And. SC1->C1_NUM


== cNum)

dbSelectArea("SB1")
dbSetOrder(1)
dbSeek(xFilial("SB1")+SC1->C1_PRODUTO)

oSection2:PrintLine()

dbSelectArea("SC1")
dbSkip()
End

oSection2:Finish()

oSection1:Finish()

oReport:IncMeter()
End
Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
109
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
110
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Ex: TReport usando método TRSection:Print com uma seção


#include "protheus.ch"

/*
TReport usando metodo TRSection:Print com um secao
*/

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
111
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

User Function xReport3()


Local oReport

If TRepInUse()
Pergunte("xTrpt1",.F.)

oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return

Static Function ReportDef()


Local oReport
Local oSection
Local oBreak

oReport := TReport():New("XTREPORT3","Solicitacoes de
Compras","xTrpt1",{|oReport| PrintReport(oReport)},"Solicitacoes de compras")

oSection := TRSection():New(oReport,"Solicitacoes",{"SC1","SB1"})

TRCell():New(oSection,"C1_NUM" ,"SC1")
TRCell():New(oSection,"C1_SOLICIT","SC1")
TRCell():New(oSection,"C1_EMISSAO","SC1")
TRCell():New(oSection,"C1_ITEM","SC1")
TRCell():New(oSection,"C1_PRODUTO","SC1")
TRCell():New(oSection,"B1_DESCRI","SB1")
TRCell():New(oSection,"C1_UM","SC1")
TRCell():New(oSection,"C1_QUANT","SC1")
TRCell():New(oSection,"C1_PRECO","SC1")
TRCell():New(oSection,"C1_TOTAL","SC1")

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
112
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TRCell():New(oSection,"C1_DATPRF","SC1")

oBreak := TRBreak():New(oSection,oSection:Cell("C1_NUM"),"Sub Total


solicitacao")

TRFunction():New(oSection:Cell("C1_NUM"),NIL,"COUNT",oBreak)
TRFunction():New(oSection:Cell("C1_TOTAL"),NIL,"SUM",oBreak)

Return oReport

Static Function PrintReport(oReport)


Local oSection := oReport:Section(1)
Local cPart
Local cFiltro := ""

//Transforma parametros do tipo Range em expressao SQL para ser utilizada


na query
MakeSqlExpr("TRPT3")

oSection:BeginQuery()

BeginSql alias "QRYSC1"


SELECT
C1_NUM,C1_ITEM,C1_PRODUTO,C1_QUANT,C1_EMISSAO,C1_DATPRF,C1_SO
LICIT,C1_PRECO,C1_TOTAL
FROM %table:SC1% SC1,%table:SB1% SB1
WHERE B1_COD= C1_PRODUTO AND C1_FILIAL = %xfilial:SC1%
AND SC1.%notDel%
AND C1_NUM >= %exp:(MV_PAR01)%
AND C1_NUM <= %exp:(MV_PAR02)%

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
113
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
AND C1_EMISSAO >= %exp:dtos(MV_PAR03)%
AND C1_EMISSAO <= %exp:dtos(MV_PAR04)%
ORDER BY C1_NUM,C1_ITEM
EndSql

oSection:EndQuery(mv_par01,MV_PAR02)

oSection:Print()

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
114
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
115
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Ex.: Treport usando o método Setparentquery

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
116
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
#include "protheus.ch"
/*
TReport usando metodo TRSection:SetParentQuery
*/
User Function XReport4()
Local oReport

If TRepInUse()
Pergunte("xTrpt1",.F.)

oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return

Static Function ReportDef()


Local oReport
Local oSection1
Local oSection2

oReport := TReport():New("XTREPORT4","Relatorio de solicitacoes


","xTrpt1",{|oReport| PrintReport(oReport)},"Relatorio de Solicitacoes")

oSection1 := TRSection():New(oReport,"Solicitacoes","SC1")

TRCell():New(oSection1,"C1_NUM" ,"SC1")
TRCell():New(oSection1,"C1_SOLICIT","SC1")
TRCell():New(oSection1,"C1_EMISSAO","SC1")

TRFunction():New(oSection1:Cell("C1_NUM"),NIL,"COUNT",NIL,NIL,NIL,NIL,.F.)

oSection2 := TRSection():New(oSection1,"ITENS","SC1")

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
117
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

TRCell():New(oSection2,"C1_ITEM","SC1")
TRCell():New(oSection2,"C1_PRODUTO","SC1")
TRCell():New(oSection2,"B1_DESCRI","SB1")
TRCell():New(oSection2,"C1_UM","SC1")
TRCell():New(oSection2,"C1_QUANT","SC1")
TRCell():New(oSection2,"C1_PRECO","SC1")
TRCell():New(oSection2,"C1_TOTAL","SC1")
TRCell():New(oSection2,"C1_DATPRF","SC1")

TRFunction():New(oSection2:Cell("C1_PRODUTO"),NIL,"COUNT")
TRFunction():New(oSection2:Cell("C1_TOTAL"),NIL,"SUM")

Return oReport

Static Function PrintReport(oReport)


Local oSection1 := oReport:Section(1)
Local oSection2 := oReport:Section(1):Section(1)
Local cFiltro := ""

oSection1:BeginQuery()

BeginSql alias "QRYSA3"


SELECT
C1_NUM,C1_ITEM,C1_PRODUTO,C1_QUANT,C1_EMISSAO,C1_DATPRF,C1_SO
LICIT,C1_PRECO,C1_TOTAL
FROM %table:SC1% SC1,%table:SB1% SB1
WHERE B1_COD= C1_PRODUTO AND C1_FILIAL = %xfilial:SC1%
AND SC1.%notDel%
AND C1_NUM >= %exp:(MV_PAR01)%

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
118
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
AND C1_NUM <= %exp:(MV_PAR02)%
AND C1_EMISSAO >= %exp:dtos(MV_PAR03)%
AND C1_EMISSAO <= %exp:dtos(MV_PAR04)%
ORDER BY C1_NUM,C1_ITEM
EndSql

oSection1:EndQuery(mv_par01,MV_PAR02)

oSection2:SetParentQuery()
oSection2:SetParentFilter({|cParam| QRYSA3->C1_NUM >= cParam .and.
QRYSA3->C1_NUM <= cParam},{|| QRYSA3->C1_NUM})

oSection1:Print()

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
119
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
120
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
121
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
122
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 1

Monte um relatório para imprimir Boletos do Itaú, sendo que o usuário poderá
selecionar os boletos que deseja imprimir.
Siga o modelo abaixo:

Parâmetros:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
123
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Tela para seleção dos títulos:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
124
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Modelo do documento:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
125
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
126
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
127
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 2
Faça um relatório para imprimir o cadastro de Bancos e que o mesmo possa ser
personalizado.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
128
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
129
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 3
Faça um relatório para emitir a quitação de débitos anuais (Lei 12007), conforme
leioute abaixo:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
130
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Relação Simplificada:

Relação Completa:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
131
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
132
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
133
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C O4
CAAPPÍÍTTUULLO 4 -- S
SQQLL –
–CCO
OMMA
ANND
DOOSS

COMCEITOS
SQL - Structured Query Language , que foi desenvolvido inicialmente pela IBM
Corporation.

Um banco de dados não trabalha em função de registros, ou Arquivos como nós


estamos acostumados a ver e fazer em linguagem ADVPL. O SQL utiliza a teoria de
conjuntos conhecida pôr todos, que tem o objetivo de resolver os problemas dos
usuários com comandos simples, chamados de query´s ( Requisição e Alteração de
dados ), que utilizam basicamente 4 comandos : SELECT, INSERT, UPDATE,
DELETE.

A primeira diferença entre o ambiente SQL e o DBF é o fato de criarmos uma área
no disco (DATABASE) que o próprio banco se encarregara de administrar, no
sentido de criar tabelas, índices, e todos os objetos envolvidos no sistema. A
nomenclatura muda um pouco: ao invés de CAMPOS temos COLUNAS e ao invés
de REGISTROS temos LINHAS.

Os índices trabalham de forma semelhante ao DBF, e são utilizados com duas


finalidades : a de termos uma chave de acesso extremamente rápida, e de
garantirmos uma chave única em uma tabela. A partir do momento que indicamos
uma chave única em uma tabela, o próprio banco de dados garante que não existirá
dados duplicados, sem a necessidade de programação para tal.

Também estarão ligados à uma tabela específica os Triggers, e as Foreign Keys (


Chaves Estrangeiras ). Em cada DataBase também estarão armazenadas as Stored
Procedures, que são programas ou funções escritas como qualquer linguagem
conhecida ( Clipper, Pascal etc.), só que no padrão ANSI / SQL.

Uma Trigger funciona como um gatilho, só que este é disparado não a cada campo
alterado, e sim a cada Inclusão, Alteração ou Exclusão de uma linha da tabela. Os
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
134
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Triggers também são escritos como as Stored Procedures, ou seja, como um
programa qualquer, que pode efetuar qualquer tipo de validação, atualização em
outras tabelas, etc...

CONTROLE TRANSACIONAL

Toda e qualquer operação de inclusão, alteração ou exclusão de registro é


armazenada primeiramente na área de LOG. Se você faz uma inclusão no banco de
dados de uma simples linha o mesmo garante a inclusão completa da linha (inserção
de todas as colunas). Este fato é garantido pela definição no seu banco de dados de
uma transação implicita. Agora vamos supor que você tenha uma operação que
necessite que várias inclusões, alterações e exclusões realizadas só sejam
efetuadas quando todas as operações tenham sido efetuadas com sucesso, caso
contrário todas as operações devem ser canceladas.

Para definição de transação pelo usuário, normalmente se utilizam os comandos


BEGIN e COMMIT , para definir início e fim de uma transação respectivamente.
Para o cancelamento de um transação sem sucesso normalmente chamamos de
ROLLBACK.

SEGURANÇA E BACKUP

Depois que uma transação é concluída com sucesso, não indica que a mesma
estará sendo transferida para a área real dos dados. Este tramite de transferência é
chamado de CheckPoint , este ponto é configuravél de acordo o SGDB utilizado.
Para bancos de dados de maior escala, o processo de check point só é realizado
após o Backup da área de LOG.

O LOG também é utilizado para fazer o backup do bancos de dados, guardando


somente as alterações efetuados em um determinado intervalo de tempo. Em
clientes com base de dados pequenas, não utilizamos este tipo de recurso.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
135
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

COMANDOS
SELECT
Seleciona dados de uma tabela. O resultado é armazenado em uma tabela (result-
set)

Select * FROM TABELA - retorna todos os campos da tabela


Select campo1, campo2 FROM TABELA - retorna somente os campos
selecionados

WHERE - a cláusula WHERE especifica as condições de busca dos registros.

Ex. Select na tabela de clientes e tabelas de Unidades da Federação, retornando o


Código do Cliente, nome do cliente e descrição da unidade federativa do cliente

# INCLUDE "PROTHEUS.CH"
# INCLUDE "TOPCONN.CH"
User Function xSelect()
cQuery := "SELECT A1_COD , A1_NOME, X5_DESCRI"
cQuery += " FROM " + RetSqlName("SA1") + " SA1, " +
RetSqlName("SX5") + " SX5 "
cQuery += " WHERE SA1.A1_FILIAL = SX5.X5_FILIAL AND"
cQuery += " SX5.X5_TABELA = '12' AND"
cQuery += " SA1.A1_EST = SX5.X5_CHAVE AND"
cQuery += " (SA1.A1_EST = 'SP' OR SA1.A1_EST = 'RJ') "
cQuery += " SA1.D_E_L_E_T_ = '' "
cQuery += " ORDER BY X5_DESCRI "

//TCQuery Abre uma workarea com o resultado da query com o


nome TRB
TCQUERY cQuery NEW ALIAS "TRB"

DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo(TRB->A1_COD + " " + TRB->A1_NOME + " " + TRB->X5_DESCRI,
"Teste Select")
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
136
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TRB->(DbSkip())
EndDo
return

TCQUERY
Abre uma workarea com o resultado da query com o nome dado no
parâmetro "alias"

TCQUERY cQuery NEW ALIAS "alias"

Ex.: Visto no exemplo do Select

ORDER BY
Classifica o resultado da query pelo(s) campo(s) escolhido em ordem ascendente ou
descendente.

ORDE BY CAMPO1, CAMPO2 ASC|DESC


Ex.: Visto no exemplo do Select

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
137
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
AND E OR - OPERADORES
AND - exibe o registro se tanto a primeira condição quanto a segunda condição
forem verdadeiras.
OR - exibe o registro se a primeira ou segunda condição forem verdadeiras.

Ex.: Visto no exemplo do Select


RETSQLNAME
Retorna o nome da tabela de acordo com a Empresa selecionada, onde "XXX" é o
nome da tabela que deseja selecionar.

RetSqlName("XXX")

Ex.: Visto no exemplo do Select

LIKE
Usado com a cláusula WHERE para especificar um campo com determinadas
características.

Ex.
//Retorna todos os clientes cujo campo nome começa com "J"
cQuery := "SELECT A1_COD , A1_NOME "
cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.D_E_L_E_T_ = '' "
cQuery += " AND SA1.A1_NOME LIKE 'J%'"

//TCQuery Abre uma workarea com o resultado da query com o


nome TRB
TCQUERY cQuery NEW ALIAS "TRB"

DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo(TRB->A1_COD + " " + TRB->A1_NOME ,"Teste LIKE")
TRB->(DbSkip())
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
138
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EndDo
If Select("TRB" ) >0
TRB->(DbClosearea())
Endif
//Retorna todos os clientes cujo campo nome que contenham "BON" no nome
cQuery := "SELECT A1_COD , A1_NOME "
cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.D_E_L_E_T_ = '' "
cQuery += " AND SA1.A1_NOME LIKE '%BON%' "
DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo(TRB->A1_COD + " " + TRB->A1_NOME ,"Teste LIKE")
TRB->(DbSkip())
EndDo
If Select("TRB" ) >0
TRB->(DbClosearea())
Endif

return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
139
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

INSERT
Insere registros em uma tabela

INSERT INTO <Nome da Tabela> | <Nome da Visão>


[ ( Coluna 1,Coluna n,... ) VALUES ]
( Conteúdo_coluna1, Conteúdo_coluna n,...)

Não recomendamos a inserção de registros diretamente na base dados, pois


os mesmos devem ser incluídos diretamente pelas respectivas rotinas.
No exemplo incluiremos um registro em uma tabela padrão apenas a título de
aprendizado.

Utilize a inserção direta em tabelas que não sejam padrões do sistema, tabelas
de outros sistemas etc.
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"

User Function xInsert()


NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
140
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Local aCampos:={}
Local cQuery:= {}

AADD(aCampos, {"'A1_FILIAL'" , "'"+ XfILIAL("SA1") +"'" ,Nil})


AADD(aCampos, {"'A1_COD'" , "'999999'" ,Nil})
AADD(aCampos, {"'A1_NOME'" , "'NOME TESTE DE INCLUSAO
INSERT'" ,Nil})
AADD(aCampos, {"'A1_NREDUZ'" , "'TESTE INSERT'" ,Nil})

CQuery:= " INSERT INTO " + RETSQLNAME("SA1") + " ("


For i := 1 To Len(aCampos)
For i := 1 To Len(aCampos)
cQuery+= (aCampos[i][1])+","
Next i
Next i
cQuery = Strtran(cquery,"'","")
cQuery:= SubStr(cQuery,1,Len(cQuery)-1) + ") VALUES ("
For i := 1 To Len(aCampos)
For i := 1 To Len(aCampos)
cQuery+="'"+ &(aCampos[i][2])+"'"+","
Next i
Next i
cQuery:= SubStr(cQuery,1,Len(cQuery)-1) + ") "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT A1_COD , A1_NOME "


cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.D_E_L_E_T_ = '' "

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
141
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TCQUERY cQuery NEW ALIAS "TRB"
DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo(TRB->A1_COD + " " + TRB->A1_NOME ,"Teste Insert")
TRB->(DbSkip())
EndDo
If Select("TRB" ) >0
TRB->(DbClosearea())
Endif

Return

UPDATE
Altera um registro na tabela, de acordo com uma condição especificada.

UPDATE tabela
SET campo1=valuor, campo2=valor,...
WHERE campo3=valor

EX.
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"

User Function xUpdate()


Local cQuery:= {}

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
142
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cQuery:= " UPDATE " + RETSQLNAME("SA1")
cQuery:= " SET A1_NREDUZ = 'ALTEROU NOME FANTASIA'"
cQuery:= " WHERE A1_COD = '000003'"
cQuery:= " AND SA1.D_E_L_E_T_ = '' "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT A1_COD , A1_NOME, A1_NREDUZ "


cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.D_E_L_E_T_ = '' "
cQuery += " AND A1_COD = '000003'"

TCQUERY cQuery NEW ALIAS "TRB"


DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo( ALLTRIM(TRB->A1_NOME) + ' ' + TRB->A1_NREDUZ,"Teste
Update")
TRB->(DbSkip())
EndDo
If Select("TRB" ) > 0
TRB->(DbClosearea())
Endif

Return

DELETE
Deleta linhas de uma tabela

DELETE FROM tabela


WHERE coluna=valor

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
143
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

Ex.:
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"

User Function xDelete()


Local cQuery:= {}

cQuery:= " DELETE FROM " + RETSQLNAME("SA1")


cQuery:= " WHERE A1_COD = '999999'"
cQuery:= " AND SA1.D_E_L_E_T_ = '' "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT A1_COD , A1_NOME, A1_NREDUZ "


cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.D_E_L_E_T_ = '' "

TCQUERY cQuery NEW ALIAS "TRB"


DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo( ALLTRIM(TRB->A1_NOME) + ' ' + TRB->A1_NREDUZ,"Teste
Delete")
TRB->(DbSkip())
EndDo
If Select("TRB" ) > 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
144
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TRB->(DbClosearea())
Endif

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
145
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
146
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 1

Monte uma rotina que inclua, altere e exclua registros da tabela

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
147
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C O5
CAAPPÍÍTTUULLO 5 -- EEM
MBBEED
DD DS
DEED SQ
QLL –
– FFAACCIILLIITTAADDO
OR DEE Q
RD QUUEERRYY’’SS
O Embedded SQL foi criado para que se possa escrever a query diretamente no
código ADVPL, sem a necessidade de ficar concatenando pedaços de string para
compor a string final.
Disponibilidade do Recurso
Este recurso está disponível a partir do Protheus 8 com Build igual ou
superior a 7.00.050721p, em um ambiente com repositório para TopConnect (
RPODB=TOP ).
A utiliação deste recurso também depende da atualização da LIB 811, superior a 'Lib
20050902 - 811'.

Exemplo básico - Fonte atual


cQuery : 'SELECT SE2.E2_PREFIXO,SE2.E2_NUM '
cQuery += 'FROM '+RetSqlTable('SE2')+' SE2,'+RetSqlTable('QEK')+' QEK '
cQuery += 'WHERE SE2.E2_FILIAL= '+xfilial('SE2')+' AND '
cQuery += 'SE2.E2_PREFIXO<> ''+cPrefixo+'' AND '
cQuery += 'SE2.D_E_L_E_T_ = ' ' '
cQuery += 'ORDER BY '+RetSqlOrder('SE2')
dbUseArea(.T.,'TOPCONN',TcGenQry(,,cQuery),'E2TEMP',.T.,.T.)
TCSetField('E2TEMP','E2_EMISSAO','D',8,0)

Exemplo básico - Utilizando Embedded SQL


BeginSql alias 'E2TEMP'
column E2_EMISSAO as Date
%noparser%
SELECT SE2.E2_PREFIXO,SE2.E2_NUM
FROM %table:SE2% SE2,%table:QEK% QEK
WHERE SE2.E2_FILIAL= %xfilial:SE2% AND
SE2.E2_PREFIXO<> %exp:cPrefixo% AND
SE2.%notDel%

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
148
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
ORDER BY %Order:SE2%
EndSql

Sintaxe
O bloco onde será escrito o Select deve sempre ser iniciado com 'BeginSql alias' e
finalizado com 'EndSql'.
Partes do código que devem ser substituídas aparecem entre os sinais de %. Estas
expressões possuem tratamento especial em momento de execução.
Qualquer instrução colocada entre BEGINSQL... ENDSQL, que não seja uma
expressão %...% , será inserida na query a ser enviada para o banco, de forma
literal.
Variáveis, expressões, funções aparecem iniciando com %exp: %.
Em column, especificar campos da query que são do tipo data, lógico ou numérico.
Esta linha é trocada por chamadas à função TCSetField.
%noparser% indica que a query não deve passar pela função 'ChangeQuery' antes
de ser enviada ao banco de dados. Caso não especificado, o default é a string da
query ser passada automaticamente pela função ChangeQuery.
%table:<alias>% é substituída por RetSqlName(<alias>)
%notDel% é substituída por D_E_L_E_T_= ' '
%Order:<alias>% é substituída por SqlOrder(<alias>->(IndexKey()))
Há 3 opções para o %Order:
1. %Order: <cAlias> % traduzido para SqlOrder(<cAlias>->(IndexKey()))
2. %Order: <cAlias>, <nIndice>% traduzido paraSqlOrder(<cAlias>-
>(IndexKey(<nIndice>)))
3. %Order: <cAlias>, <cNick>% traduzido para SqlOrder(<alias>-
>(DBNickIndexKey(<cNick>)))

Não é permitido incluir funções no meio do código 'embedded'. Se precisar, o valor


deve ser guardado em uma variável antes do início do BeginSql.
tam_cp := GetE2ValorSize()
BeginSql alias 'E2TEMP'
column E2_EMISSAO as Date, E2_VALOR as Numeric(tam_cp,2)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
149
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
. . .
EndSql

Erros de Compilação
Caso seja utilizado algum argumento inválido para especificar as colunas, ou erros
de sintaxe nas expressões a serem transformadas para a montagem da query, a
compilação do fonte é interrompida com a ocorrência 'Syntax Error', informando a
linha onde a primeira ocorrência foi encontrada.

ENDSQL (Error C2001 Syntax error:)


Caso a ocorrência de compilação aponte diretamente para a linha do código-fonte,
onde está escrita a instrução EndSql, verifique se existe algum espaço em branco ou
tabulação, a partir do início da linha, antes da instrução EndSql. A versão atual deste
ambiente não suporta esta declaração, exigindo que a instrução EndSql seja
alinhada à esquerda do fonte, sem espaços ou tabulações.

Erros de Execução
'Query Argument Error : Alias [XXX] already in use.'
Caso a instrução BeginSQL especifique um alias que já esteja aberto (em uso), a
aplicação é abortada com a ocorrência de erro fatal acima, informando em XXX o
alias utilizado.

'Query Argument Error : Invalid Value Type [X]'


Caso alguma expressão informada na Query, através da tag %exp: ... %, retorne um
valor de tipo diferente de 'C' Catacter, 'D' Data, 'N' Numérico, ou 'L' Lógico, a
aplicação é abortada com a ocorrência do erro acima, onde o tipo do argumento
inesperado é mostrado em [X].

'Type Mismach on +'


Esta ocorrência, se reproduzida, informará na pilha de chamadas o número da linha
do códigofonte correspondente à instrução EndSQL. Ocorre caso alguma função

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
150
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
intermediária do engine do Embedded SQL, excluindo-se as funções especificadas
na query com a sintaxe %exp: ... % , retornar um conteúdo não-caractere a ser
acrescentado na Query. Esta ocorrência é de mais difícil localização, sendo útil
nestes casos a análise do arquivo temporário gerado pelo Protheus IDE, no
momento da compilação.

Help NOFUNCW - Função __EXECSQL


Caso um fonte com o Embedded SQL seja executado em um repositório que não
tenha sido atualizado, OU que não seja um Repositório para o ambiente
TOPConnect ( RPODB=TOP), a aplicação exibirá a ocorrência acima, indicando que
a função interna de execução da Query não está presente no ambiente. Verifique se
a lib está atualizada, e se o RPO em uso é de um ambiente TOPConnect.

Características operacionais - depuração


Dada a montagem da Query, não é possível depurar o bloco do código-fonte
compreendido entre as instruções BeginSql e EndSql, não sendo considerados
pontos de parada de depuração ( BreakPoints ), caso colocados neste intervalo do
código. A colocação de pontos de parada deve ser realizada antes ou depois deste
bloco.

Função auxiliar - GETLastQuery()


Após a abertura do cursor, no alias especificado, a função GetLastQuery() retorna
um array, com 5 elementos, onde estão disponíveis as seguintes informações sobre
a Query executada :
[1] cAlias - Alias usado para abrir o Cursor.
[2] cQuery - Query executada.
[3] aCampos - Array de campos com critério de conversão especificados.
[4] lNoParser - Caso .T., não foi utilizada ChangeQuery() na String original.
[5] nTimeSpend - Tempo, em segundos, utilizado para a abertura do Cursor.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
151
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Ex:
BeginSql alias 'E2TEMP'
column E2_EMISSAO as Date, E2_VALOR as Numeric(tam_cp,2)
column QEK_SKLDOC As Logical
%noparser%
SELECT SE2.E2_PREFIXO,SE2.E2_NUM, SE2.E2_FORNECE,
SE2.E2_LOJA,SE2.E2_VALOR,
SE2.D_E_L_E_T_ DEL1, QEK.D_E_L_E_T_ DEL2 , QEK.QEK_SKLDOC,
SE2.R_E_C_N_O_
SE2RECNO
FROM %table:SE2% SE2,%table:qeK% QEK
WHERE SE2.E2_FILIAL= %xfilial:SE2% AND
qek.%notDel% and
SE2.E2_PREFIXO<> %exp:cPrefixo% AND
SE2.E2_NUM<> %exp:(cAlias)->M0_CODIGO% AND
SE2.E2_NUM<>45 AND
SE2.E2_FORNECE=%exp:Space(Len(SE2->E2_FORNECE))% AND
SE2.E2_EMISSAO<>%exp:MV_PAR06% AND
SE2.E2_LOJA<>%exp:MV_PAR05% AND
SE2.E2_VALOR<>%exp:MV_PAR04% AND
qek.QEK_SKLDOC<>%exp:MV_PAR03% And
SE2.%notDel%
ORDER BY %Order:SE2,1%
EndSql

Ex.: Fonte gerado pelo pré-compilador (PPO)


__execSql(
'E2TEMP',
' SELECT SE2.E2_PREFIXO,SE2.E2_NUM, SE2.E2_FORNECE,
SE2.E2_LOJA,SE2.E2_VALOR,
SE2.D_E_L_E_T_ DEL1, QEK.D_E_L_E_T_ DEL2 , QEK.QEK_SKLDOC,
SE2.R_E_C_N_O_
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
152
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
SE2RECNO FROM '+RetSqlName('SE2')+' SE2, '+RetSqlName('QEK')+' QEK
WHERE
SE2.E2_FILIAL= '' +xFilial('SE2')+'' AND qek.D_E_L_E_T_= ' ' AND
SE2.E2_PREFIXO<> '+___SQLGetValue(CPREFIXO)+' AND SE2.E2_NUM <> '+
___SQLGetValue((CALIAS)->M0_CODIGO)+' AND SE2.E2_NUM<>45 AND
SE2.E2_FORNECE= '+
___SQLGetValue(SPACE(LEN(SE2->E2_FORNECE)))+' AND
SE2.E2_EMISSAO<> '+
___SQLGetValue(MV_PAR06)+' AND SE2.E2_LOJA<>
'+___SQLGetValue(MV_PAR05) +' AND
SE2.E2_VALOR<> '+___SQLGetValue(MV_PAR04)+' AND qek.QEK_SKLDOC<> '+
___SQLGetValue(MV_PAR03)+' And SE2.D_E_L_E_T_= ' ' ORDER BY '+
SqlOrder(SE2->(IndexKey(1))), {{'E2_EMISSAO','D',8,0}, {'E2_VALOR','N',tam_cp,2},
{'QEK_SKLDOC','L',1,0}},.T.)
)

Ex.: Relatório de cheques cancelados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
153
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
154
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
155
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

EXERCÍCIO 1
Faça um relatório para emitir a Relação de Faturas, conforme leioute abaixo:

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
156
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

O relatório deverá imprimir os dados do título e os detalhes da fatura.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
157
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
158
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
159
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C O6
CAAPPÍÍTTUULLO 6 -- M
MAAN
NIIP
PUULLA
AÇÇÃ
ÃOOD
DEE A
ARRQ
QUUIIV
VOOSS

ARQUIVOS TEXTO
Arquivos do tipo texto são arquivos com registros de tamanho variável. A indicação
do final de cada registro é representada por dois bytes, “0D0A” em hexadecimal ou
“13 10” em decimal ou, ainda, “CR LF” para padrão ASCII.
Apesar do tamanho dos registros ser variável, a maioria dos sistemas gera este tipo
de arquivo com registros de tamanho fixo, de acordo com um layout específico que
indica quais são os dados gravados.
Ilustraremos a geração de textos, com duas famílias de funções:
1. FCreate(), FWrite(), FClose(), FSeek(), FOpen() e FRead().
2. FT_FUse(), FT_FGoTop(), FT_FLastRec(), FT_FEof(), FT_FReadLn(),
FT_FSkip(), FT_FGoto(), FT_FRecno().
A diferença entre as duas famílias, está na leitura do arquivo texto.
Para arquivos com tamanho fixo das linhas poderão ser utilizadas as duas famílias
para leitura do arquivo
Para arquivo texto com tamanho variável das linhas, somente poderá ser utiliza a
segunda família, representada pelas funções:
FT_FUse(), FT_FGoTo(), FT_FRecno(), FT_FGoTop(), FT_FLastRec(),
FT_FEof(), FT_FReadLn() e FT_FSkip().

FCREATE(), FWRITE(), FCLOSE(), FSEEK(), FOPEN() E FREAD().


Ex: Gera o arquivo TXT, a partir do Cadastro de Clientes

#include "protheus.ch"
User Function xGrvTXT()
Local oGrvTXT
Private cAlias := "SA1"
Private cPerg:= "EXPSA1"
dbSelectArea(cAlias)
dbSetOrder(1)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
160
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
DEFINE MSDIALOG oGrvTXT TITLE OemToAnsi("Gera Arquivo Texto") FROM
000,000 TO 200,400 PIXEL
@ 005,005 TO 095,195 OF oGrvTXT PIXEL
@ 010,020 Say " Este programa gerara um arquivo texto, conforme os parame- ";
OF oGrvTXT PIXEL
@ 018,020 Say " tros definidos pelo usuário, com os registros do arquivo de ";
OF oGrvTXT PIXEL
@ 026,020 Say " SA1 " OF oGrvTXT PIXEL
DEFINE SBUTTON FROM 070, 030 TYPE 1 ACTION (GravaTXT(),oGrvTXT:End())
ENABLE OF oGrvTXT
DEFINE SBUTTON FROM 070, 070 TYPE 2 ACTION (oGrvTXT:End()) ENABLE OF
oGrvTXT

ACTIVATE DIALOG oGrvTXT CENTERED


Return Nil

Static Function GravaTXT


//+-----------------------------------------------------------------------------
//| Cria o arquivo texto
//+-----------------------------------------------------------------------------
Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl := fCreate(cArqTxt)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" não pode ser gerado! Verifique
osparâmetros.","Atenção!")
Return
Endif

Processa({|| RunCont() },"Processando...")


Return Nil

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
161
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Static Function RunCont
Local cLin
dbSelectArea(cAlias)
dbGoTop()
ProcRegua(RecCount())
While (cAlias)->(!EOF())
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

If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin)
If !MsgAlert("Ocorreu um erro na gravação do arquivo."+;
"Continua?","Atenção!")
Exit
Endif
Endif
(cAlias)->(dbSkip())
EndDo
fClose(nHdl)
Return Nil

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
162
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

FCreate - gera o arquivo


FWrite - adiciona dados
FClose - fecha o arquivo.
No exemplo, o formato é estabelecido pela concatenação dos dados na variável cLin
a qual é utilizada na gravação dos dados.

Para a leitura de dados TXT serão utilizada as funções FOpen e FRead.


Exemplo: Leitura de arquivo TXT, utilizando FOpen e FRead.

#Include "protheus.ch"
User Function xLeTXT()
Local cPerg := "IMPSA1"
Local oLeTxt
Private cAlias := "SA1"
dbSelectArea(cAlias)
dbSetOrder(1)

DEFINE MSDIALOG oLeTxt TITLE OemToAnsi("Leitura de Arquivo Texto") FROM


000,000 TO 200,400 PIXEL
@ 005,005 TO 095,195 OF oLeTxt PIXEL
@ 10,020 Say " Este programa lera um arquivo texto, conforme" OF oLeTxt PIXEL

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
163
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
@ 18,020 Say " os parâmetros definidos pelo usuário, com os registros do arquivo"
OF oLeTxt PIXEL
@ 26,020 Say " SA1" OF oLeTxt PIXEL
DEFINE SBUTTON FROM 070, 030 TYPE 1 ACTION (LerTXT(),oLeTxt:End())
ENABLE OF oLeTxt
DEFINE SBUTTON FROM 070, 070 TYPE 2 ACTION (oLeTxt:End()) ENABLE OF
oLeTxt

ACTIVATE DIALOG oLeTxt CENTERED


Return Nil

Static Function LerTXT()


Private cArqTxt := "\SYSTEM\EXPSA1.TXT"
Private nHdl := fOpen(cArqTxt,68)
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" não pode ser aberto! Verifique os
parâmetros.","Atenção!")
Return
Endif

Processa({|| RunCont() },"Processando...")


Return Nil

Static Function RunCont


Local nTamFile := 0
Local nTamLin := 56
Local cBuffer := ""
Local nBtLidos := 0
Local cFilSA1 := ""
Local cCodSA1 := ""
Local cLojaSA1 := ""

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
164
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
//123456789012345678901234567890123456789012345678901234567890123456
7890
//000000000100000000020000000003000000000400000000050000000006000000
00070
//FFCCCCCCLLNNNNNNNNNNNNNNNNNNNNVVVVVVVVVVVVVVVVDDDDDDD
D
//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)
ProcRegua(nTamFile)
While nBtLidos < nTamFile
IncProc()
nBtLidos += fRead(nHdl,@cBuffer,nTamLin)
cFilSA1 := Substr(cBuffer,01,02) //- 01, 02 - TAM: 02
cCodSA1 := Substr(cBuffer,03,06) //- 03, 08 - TAM: 06
cLojaSA1 := Substr(cBuffer,09,02) //- 09, 10 - TAM: 02
While .T.
IF dbSeek(cFilSA1+cCodSA1+cLojaSA1)
cCodSA1 := SOMA1(cCodSA1)
Loop
Else
Exit
Endif
Enddo
RecLock(cAlias,.T.)
(cAlias)->A1_FILIAL := cFilSA1

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
165
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
(cAlias)->A1_COD := cCodSA1
(cAlias)->A1_LOJA := cLojaSA1
(cAlias)->A1_NREDUZ := Substr(cBuffer,11,20)
(cAlias)->A1_MCOMPRA := Val(Substr(cBuffer,31,16))/100
(cAlias)->A1_ULTCOM := STOD(Substr(cBuffer,47,08))
MSUnLock()
EndDo
fClose(nHdl)
Return Nil

Exemplo: Leitura de arquivo TXT, utilizando as funções FT_FUse(), FT_FGoTop(),


FT_FLastRec(), FT_FEof(), FT_FReadLn(), FT_FSkip(), FT_FGoto(), FT_FRecno().

#Include "Protheus.ch"
User Function xLeArTx()
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" )
AADD( aButton, { 1,.T.,{|| nOpc := 1,FechaBatch()}})
AADD( aButton, { 2,.T.,{|| FechaBatch() }} )
FormBatch( cCadastro, aSay, aButton )
If nOpc == 1
Processa( {|| LerTxt() }, "Processando..." )
Endif
Return Nil

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
166
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Static Function LerTxt()
Local cBuffer := ""
Local cFileOpen := ""
Local cTitulo1 := "Selecione o arquivo"
Local cExtens := "Arquivo TXT | *.txt"
/***
* _________________________________________________________
* cGetFile(<ExpC1>,<ExpC2>,<ExpN1>,<ExpC3>,<ExpL1>,<ExpN2>)
* ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
* <ExpC1> - Expressão de filtro
* <ExpC2> - Titulo da janela
* <ExpN1> - Numero de mascara default 1 para *.Exe
* <ExpC3> - Diretório inicial se necessário
* <ExpL1> - .F. botão salvar - .T. botão abrir
* <ExpN2> - Mascara de bits para escolher as opções de visualização do objeto
* (prconst.ch)
*/
cFileOpen := cGetFile(cExtens,cTitulo1,,"\SYSTEM\",.T.)
If !File(cFileOpen)
MsgAlert("Arquivo texto: "+cFileOpen+" não localizado",cCadastro)
Return
Endif
FT_FUSE(cFileOpen)
FT_FGOTOP()
ProcRegua(FT_FLASTREC())
While !FT_FEOF()
IncProc()
cBuffer := FT_FREADLN()
cMsg := "Filial: " +SubStr(cBuffer,01,02) + Chr(13)+Chr(10)
cMsg += "Código: " +SubStr(cBuffer,03,06) + Chr(13)+Chr(10)
cMsg += "Loja: " +SubStr(cBuffer,09,02) + Chr(13)+Chr(10)
cMsg += "Nome fantasia: " +SubStr(cBuffer,11,15) + Chr(13)+Chr(10)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
167
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cMsg += "Valor: " +SubStr(cBuffer,26,14) + Chr(13)+Chr(10)
cMsg += "Data: " +SubStr(cBuffer,40,08) + Chr(13)+Chr(10)
MsgInfo(cMsg)
FT_FSKIP()
EndDo
FT_FUSE()
MsgInfo("Processo finalizada")
Return Nil

FT_FUse() - abre o arquivo


FT_FGoTop() - move o ponteiro para o início do arquivo
FT_FLastRec() - retorna o número total de linhas do arquivo
FT_FEof()-indica se o ponteiro está posicionado nofinal do arquivo
FT_FReadLn()- retorna a linha do arquivo texto aberto
FT_FSkip()-move o ponteiro do arquivo para a próxima linha
FT_FGoto()-move o ponteiro de acordo com o número de posições escolhida
(default 1)
FT_FRecno() - retorna a posição do ponteiro no arquivo

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
168
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
169
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 1
Faça a exportação do arquivo de Bancos e importação do mesmo.
Leioute:
Campo Tipo Tamanho Decimal
A6_FILIAL C 2 0
A6_COD C 3 0
A6_AGENCIA C 5 0
A6_NUMCON C 10 0
A6_NOME C 40 0
A6_NREDUZ C 15 0
A6_END C 40 0
A6_BAIRRO C 20 0
A6_MUN C 15 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
170
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
171
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

C O7
CAAPPÍÍTTUULLO 7 -- R
ROOTTIIN
NAAA
AUUTTO
OMMÁ
ÁTTIIC
CAA

CONCEITO
A funcionalidade MsExecAuto, ou também conhecida como Rotina Automática,
permite a execução de rotinas do ambiente ERP Protheus por funções específicas, o
que confere ao desenvolvedor a possibilidade de efetuar tratamentos específicos
antes da execução da rotina padrão, e mais importante, não perder nenhuma
funcionalidade que a rotina padrão oferece.

POR QUE USAR ROTINA AUTOMÁTICA


A aplicação ERP está em constante evolução:
A aplicação ERP pode ser personalidada através de pontos de entrada e do
dicionário de dados:
A partir do momento que uma aplicação padrão é desenvolvida e disponibilizada a
mesma pode sofrer diversas personalizações em campo, as quais podem ser
implementadas em paralelo ou após o desenvolvimento da rotina específica
disponibilizada pelo desenvolvedor.
Se esta situação não for prevista, a inclusão de informações utilizando a rotina
padrão do sistema poderá sofrer diversas validações ou até mesmo efetuar a
gravação de informações adicionais, as quais não estão visíveis na rotina específica,
gerando graves inconistências na base de dados.

QUANDO UTILIZAR A FUNCIONALIDADE MSEXECAUTO ?


Deve-se utilizar a Execauto sempre que a rotina assim o permitir.
O quadro abaixo ilustra um dos últimos cenários de tratamento de MsExecAuto
pelas rotinas da aplicação ERP Protheus.
ATFA010 (xAutoCab, xAutoItens, nOpcAuto)
ATFA030 (xAutoCab, nOpc)
ATFA035 (xAutoCab, nOpc)
CFGX016 (xAutoCab, xAutoItens)
CTBA015 (nOpcAuto, aAuto)
CTBA016 (nOpcAuto, aAuto)
CTBA020 (aRotAuto, nOpcAuto, aRotItem)
CTBA102 (xAutoCab, xAutoItens, nOpcAuto)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
172
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
CTBA270 (xAutoCab, xAutoItens, nOpcAuto)
FATA140 (nOpcAuto, aAuto)
FATA220 (nOpcAuto, aAutoCab)
FATA300 (nOpcAuto, xAutoCab, xAutoAD2, xAutoAD3, xAutoAD4, xAutoAD9)
FATA310 (xAutoCab, xAutoItens, nOpcAuto)
FATA320 (xAutoVend, xAutoTask, xAutoCalend)
FINA010 (aRotAuto, nOpcAuto)
FINA040 (aRotAuto, nOpcAuto)
FINA050 (aRotAuto, nOpcion, nOpcAuto)
FINA070 (xAutoCab, nOpc)
FINA080 (xAutoCab, nOpc)
FINA390 (nPosArotina, xAutoCab, nOpcAuto)
MATA040 (aAuto, nOpcAuto)
MATA080 (aRotauto, nOpcAuto)
MATA103 (xAutoCab, xAutoItens, nOpcAuto, lWhenGet, xAutoImp)
MATA105 (xReservCab, xReservItens, nOpcAuto)
MATA110 (xAutoCab, xAutoItens, nOpcAuto)
MATA116A (xAutoCab, xAutoItens, lInclui)
MATA120 (nFuncao, xAutoCab, xAutoItens, nOpcAuto, )
MATA125 (xAutoCab, xAutoItens, nOpcAuto)
MATA140 (xAutoCab, xAutoItens, nOpcAuto)
MATA145 (xAutoCab, xAutoIt, xAutoIt2, nOpcAuto)
MATA150 (xAutoCab, xAutoItens, nOpcAuto)
MATA175 (xRotAuto, xOpcAuto)
MATA185 (xAutoSCP, xAutoSD3, nOpcAuto, xPerg)
MATA200 (xAutoCab, xAutoItens, nOpcAuto)
MATA230 (aAuto, nOpcAuto)
MATA241 (xAutoCab, xAutoItens, nCallOpcx)
MATA242 (xAutoCab, xAutoItens, nOpcAuto)
MATA261 (aAutoItens, nOpcAuto)
MATA265 (xAutoCab, xAutoItens, nOpcAuto)
MATA266 (aAutoItens)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
173
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
MATA267 (aAutoItens)
MATA360 (xAutoCab, xAutoItens, nOpcAuto)
MATA410 (xAutoCab, xAutoItens, nOpcAuto)
MATA415 (xAutoCab, xAutoItens, nOpcAuto)
MATA416 (xAutoCab, xAutoItens)
MATA490 (xAuto, nOpcAuto)
MATA685 (xAutoCab, xAutoItens, nOpcAuto)
MATA700 (xAuto, nOpcAuto)
MATA920 (xAutoCab, xAutoItens, nOpcAuto)
TMKA061 (xAutoCab, xAutoItens, nOpcAuto)
TMKA062 (xAutoCab, xAutoItens, nOpcAuto)
TMKA271 (xAutoCab, xAutoItens, nOpcAuto)
TMSA040 (xAutoCab, xAutoItens, nOpcAuto)
TMSA050 (xAutoCab, xAutoItens, xItensPesM3, xItensEnder, nOpcAuto)
TMSA170 (xAutoCab, nOpcAuto)
TMSA360 (xAutoCab, xAutoItens, xAutoNFAva, nOpcAuto)
TMSA430 (cAlias, xAutoCab, xAutoVei, xAutoMot, nOpcAuto)
TMSA440 (xAutoCab, xAutoItens, nOpcAuto)

QUANDO NÃO UTILIZAR A FUNCIONALIDADE MSEXECAUTO


Existem rotinas padrões da aplicação ERP para processamentos de integrações e
atualizações que possuem tratamento para execução direta ou execução via Job.
Para estes casos a rotina já está pré-disposta a execução direta, não havendo a
necessidade de tratamento via MsExecAuto, ou o tratamento realizado pela rotina é
o mais adequado para aquele volume de dados.
Para importações de saldos e lançamentos deve-se optar pela utilização da rotina de
“Contabilização TXT”, devido aos tratamentos que a mesma permite através das
configurações da própria rotina em conjunto com as parametrizações do módulo. O
uso da CTBA102 – Laçamentos Contábeis via MsExecAuto é recomendado para
rotinas de manutenção ou funcionalidades específicas / melhorias, com por exemplo
o estorno de lançamentos contábeis sem a necessidade de avaliar regras de
contabilização.
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
174
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

DESENVOLVENDO COM MSEXECAUTO


ESTRUTURA DE UMA ROTINA COM EXECUÇÃO DE MSEXECAUTO
 Definição das variáveis de controle da MsExecAuto
 Montagem dos arrays de parâmetros
 Definição dos parâmetros específicos da rotina que será executada
 Controle de transação
 Tratamento do sucesso ou não da operação
VARIÁVEIS DE CONTROLE
Private lMsErroAuto
Indica de se houve erro não fatal durante a execução.
Private lMsHelpAuto
Habilita a captura das mensagens de erro.
Private lAutoErrNoFile
Desabilita a geração do arquivo de log padrão do sistema.
MONTAGEM DOS ARRAYS DE PARÂMETROS

_ Tipos de arrays de parâmetros:

Basicamente uma MsExecAuto possui dois tipos de arrays de parâmetros: Array de


Dados de Cabeçalho e Array de Dados de Itens.
Os exemplos a seguir visam ilustrar a utilização de cada uma dos tipos de arrays:
 Cadastro de clientes (MATA030): Esta rotina atualiza apenas os dados da
tabela SA1 – Cadastro de Clientes, portanto será necessário apenas um
array de dados contendo as informações que deverão ser gravadas na tabela
SA1.
 Documentos de entrada (MATA103): Esta rotina atualiza basicamente os
dados das tabelas SF1 – Cabeçalho do Documento de Entrada e SD1 – Itens
do Documento de entrada, portanto serão necessários dois arrays de dados
contendo as informações do cabeçalho do documento de entrada e dos itens
do documento de entrada, sendo que este último terá sua estrutura de
conteúdo repetida para cada item do documento.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
175
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
 Aviso de Recebimento de Carga (MATA145): Esta rotina atualiza
basicamente os dados das tabelas DB1 – Aviso de Recebimento de Carga,
DB2 – Cabeçalho do documento recebido e DB3 – Itens do documento
recebido, portanto são necessários três array de dados contendo as
respectivas informações para as tabelas DB1, DB2 e DB3, sendo que as
duas últimas terão suas estruturas de conteúdo repetidas para cada
documento recebido.

ESTRUTURA DOS ARRAYS DE PARÂMETROS:


Array de dados do cabeçalho (xAutoCab):
O array contendo os dados do cabeçalho é composto por: Campo, Conteúdo e
Validação.
Cada item deste array é um dos campos da tabela de cabeçalho das informações
que serão processadas pela MsExecAuto. Com base nos exemplos anteriores, a
MsExecAuto da MATA030 possui apenas um array de parâmetros no formato
xAutoCab, sendo que a MATA103 utilizará o xAutoCab para a tabela SF1 e a
MATA145 para a tabela DB1.
Sintaxe:
AADD(xAutoCab,{“Campo”, xConteúdo, “Validação”})
Exemplo:
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
Array de dados dos itens (xAutoItens):
O array contendo os dados dos itens também é composto por: Campo, Conteúdo
e Validação; sendo que a diferença está no fato de que para cada item a ser
tratado pela MsExecAuto deverá ser repetida e preenchida a estrutura do array
com as informações do mesmo.
Com base nos exemplos anteriores, a MsExecAuto da MATA030 não possui um
array de parâmetros no formato xAutoItens, já a MATA103 utilizará o xAutoItens

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
176
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
para a tabela SD1 e a MATA145 utilizará dois xAutoItens, sendo o primeiro para
a tabela DB2 e o segundo para a tabela DB3.
Sintaxe:
<Estrutura de controle e repetição>
xAutoItem := {}
AADD(xAutoItem,{“Campo”, xConteúdo, “Validação”})
AADD(xAutoItens, xAutoItem)
</Estrutura>
Exemplo:
AADD(xAutoCab,{“F1_FILIAL” , xFilial(“SF1”) , Nil})
AADD(xAutoCab,{“F1_DOC” , “000001” , Nil})
AADD(xAutoCab,{“F1_SERIE” , “1” , Nil})
AADD(xAutoCab,{“F1_FORNECE” , “000001” , Nil})
AADD(xAutoCab,{“F1_LOJA” , “01” , Nil})
For nX := 1 to 2
xAutoItem := {}
AADD(xAutoItem,{“D1_FILIAL” , xFilial(“SD1”) , Nil})
AADD(xAutoItem,{“D1_DOC” , “000001” , Nil})
AADD(xAutoItem,{“D1_SERIE” , “1” , Nil})
AADD(xAutoItem,{“D1_FORNECE” , “000001” , Nil})
AADD(xAutoItem,{“D1_LOJA” , “01” , Nil})
AADD(xAutoItem,{“D1_ITEM” , STRZERO(nx,04) , Nil})
AADD(xAutoItem,{“D1_COD” , STRZERO(nx,15) , Nil})
AADD(xAutoItem,{“D1_QUANT” , 100*nX , Nil})
AADD(xAutoItem,{“D1_VUNIT” , 5*nX , Nil})
AADD(xAutoItem,{“D1_TOTAL” , (100*nX)*(5*nX) , Nil})
AADD(xAutoItem,{“D1_TES” , “001” , Nil})
AADD(xAutoItens, xAutoItem)
Next nX
MsExecAuto({|x,y,z| MATA103(x,y,z)}, xAutoCab, xAutoItens, 3)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
177
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
MÉTODO DE ATRIBUIÇÃO DE CONTEÚDO DIRETO:
O método direto consiste em atribuir diretamente na montagem do array de
parâmetros o conteúdo de cada campo que será tratado pela MsExecAuto.
Este método é o mais comum de ser utilizado dado sua praticidade, e pela
possibilidade do desenvolvedor especificar somente os campos obrigatórios para a
tabela e aqueles que conterão as informações geradas por sua aplicação.
Exemplo:
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)

MÉTODO DE ATRIBUIÇÃO DE CONTEÚDO PELA ESTRUTURA:


O método de atribuição pela estrutura é recomendável em rotinas que efetuam a
importação das informações através da leitura de arquivos de dados, sejam eles
CODEBASE ou via banco de dados.
Este método consiste em comparar a estrutura do arquivo de origem (a ser
importado)
contra a do arquivo de destino (tratado pela MsExecAuto). Desta forma os campos
que forem coincidentes entre o arquivo de origem e o arquivo de destino serão
preenchidos com as informações do arquivo importado, caso contrário os mesmos
poderão ser desconsiderados ou serem preenchidos com um conteúdo padrão.
Exemplo:
// Captura a estrutura da tabela padrão do sistema
DbSelectArea("SN1")
DbSetOrder(1)
aStruSN1 := SN1->(DbStruct())
// Efetua a abertura do arquivo SN1 que será importado
cArqSN1:= cDirArq+"SN1IMP"
IF File(cArqSN1+cFileExt)
dbUseArea(.T.,,cArqSN1+cFileExt,"SN1IMP",.F.,.F.)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
178
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
IndRegua("SN1IMP",cArqSN1+OrdBagExt(),"N1_FILIAL+N1_CBASE+N1_ITEM",;
,,"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN1IMP não existe."+;
CRLF+"Verifique caminho informado.",1,0)
RETURN
ENDIF
// Efetua a leitura do arquivo a ser importado
DbSelectArea("SN1IMP")
DbGotop()
WHILE SN1IMP->(!Eof())
// Efetua a montagem do xAutoCab com base nas estruturas dos
// arquivos
FOR nX := 1 TO LEN(aStruSN1)
IF SN1IMP->(FieldPos(aStruSN1[nX][1]))>0
DO CASE
CASE EMPTY(SN1IMP->&(aStruSN1[nX][1]))
AADD(xAutoCab,{aStruSN1[nX][1],;
CRIAVAR(aStruSN1[nX][1]), NIL})
CASE aStruSN1[nX][2] == "C"
AADD(xAutoCab,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]),;
"",aStruSN1[nX][3]), NIL})
CASE aStruSN1[nX][2] == "N"
AADD(xAutoCab,{aStruSN1[nX][1],;
ABS(SN1IMP->&(aStruSN1[nX][1])), NIL})
OTHERWISE
AADD(xAutoCab,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]), NIL})
ENDCASE
ELSE
AADD(xAutoCab,{aStruSN1[nX][1],;

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
179
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
CRIAVAR(aStruSN1[nX][1]), NIL})
ENDIF
NEXT nX
...
MsExecAuto({|x,y,z| ATFA010(x,y,z)}, xAutoCab, xAutoItens, 3)
END

DEFINIÇÃO DOS PARÂMETROS ESPECÍFICOS DA ROTINA QUE SERÁ EXECUTADA


Este é ponto no qual o desenvolvedor inclui os tratamentos necessários a correta
execução da
rotina, além de seus tratamentos específicos, os quais justificaram o
desenvolvimento.
Utilizando o mesmo exemplo anterior da ATFA010 – Cadastro de Ativos podemos
citar dois
tratamentos específicos necessários para a correta execução da MsExecAuto:
Chamada das perguntas da ATFA010:
A execução da função Pergunte(“ATFA010”,.F.) permite que seja definidos os
conteúdos desejados para os parâmetros da rotina de cadastro conforme a
necessidade da aplicação, como por exemplo permitir a inclusão de uma chapa de
bem em branco ou não efetuar a contabilização da inclusão.

ATUALIZAÇÃO DAS VARIAVÉIS DE MEMÓRIA DO ALIAS “M->” PARA O SN1:


A execução da função RegToMemory(“SN1”,.T.) é necessária para a utilização da
função CRIAVAR() no método de atribuição pela estrutura.
Muitas vezes uma estrutura que funciona para um MsExecAuto pode não
funcionar para outro do mesmo tipo, devido as características individuais de
cada rotina. Podemos citar os seguintes exemplos:
MATA103 (Documento de Entrada): Para tratamento do título financeiro a ser gerado
pela nota fiscal quando o parâmetro deatualização de financeiro da TES está
ativado, deve ser incluído o seguinte item no array xAutoCab:
{" E2_NATUREZ " ,"NAT01" ,NIL})

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
180
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
MATA650 (Abertura de ordem de produção): Para que sejam geradas as ordens de
produção intermediárias na abertura de uma ordem de produção principal deve ser
incluído o seguinte item no array xAutoCab:
{"AUTEXPLODE" ,"S" ,NIL})

CONTROLE DE TRANSAÇÃO
A utilização do controle de transação permite garantir a integridade das informações
gravadas
pelo processamento.
Para utilização do controle de transação na aplicação podem ser utilizados os
seguintes blocos
de controle:
Begin Transaction ... DisarmTransaction() ... End Transaction

Um bloco de código determinado pelos comandos Begin Transaction ... End


Transaction
terá suas informações atualizadas somente se antes do execução do comando End
Transaction não for executada a função DisarmTransaction().
Desta forma pode-se implementar um controle de transação por item processado,
sendo
executado o DisarmTransaction() para aquele elemento em que houve algum
problema
de processamento.
Seguindo este mesmo raciocínio, caso ocorra um erro fatal na aplicação, somente o
item
que está em processamento será desconsiderado, pois a aplicação ERP efetua um
DisarTransaction() automaticamente, fechamento as transações pendentes e
restaurando as situações anteriores, mas apenas para aqueles processamento
protegidos pelo bloco de controle de transação.
O comando END TRANSACTION não pode ter sua interpretação vinculada a
uma condição. Nestes casos ocorrerá um erro de compilação indicando que o
bloco aberto pelo comando BEGIN TRANSACTION não foi corretamente

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
181
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
fechado.
Exemplo:
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ENDIF
END TRANSACTION

BEGINTRAN() ... DISARMTRANSACTION() ... ENDTRAN()


As funções BeginTran() e EndTran() visam permitir que o término da transação seja
condicional, eliminando a limitação da estrutura BEGIN TRANSACTION ... END
TRANSACTION.
Exemplo:
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
BeginTran()
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
DisarmTransaction()
ELSE
EndTran()
ENDIF
MsUnlockAll()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
182
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Neste modelo de controle de transação é recomendável a utilização da função
MsUnlockAll() para destravar todos os registros que estejam eventualmente
travados.
TRATAMENTO DE MENSAGENS DE ERRO
Com a utilização da funcionalidade MsExecAuto a aplicação ERP disponibiliza
diversos métodos para visualização e tratamento das mensagens de erro ocorridas
durante a execução da rotina, sendo estes:
 Visualização do evento de erro;
 Gravação do evento de erro em arquivo texto;
 Personalização da gravação do evento de erro.
 Visualização do evento de erro
Visualização do erro em tela
Para visualização em tela do evento de erro ocorrido durante o processamento da
rotina via MsExecAuto deve-se utilizar a função MostraErro(), conforme o exemplo:
Private lMsHelpAuto := .T.
Private lAutoErrNoFile := .F.
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro()
DisarmTransaction()
ENDIF
END TRANSACTION
O conteúdo das variáveis PRIVATE de controle da MsExecAuto deve ser
configurado conforme abaixo:
Private lMsHelpAuto := .T.
Private lAutoErrNoFile := .F.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
183
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Gravação do evento de erro em arquivo texto
Para gravação em arquivo no formato texto do evento de erro ocorrido durante o
processamento da rotina via MsExecAuto deve-se utilizar a função MostraErro(),
conforme o exemplo:
Private lMsHelpAuto := .T.
Private lAutoErrNoFile := .F.
AADD(xAutoCab,{“A1_FILIAL” , xFilial(“SA1”) , Nil})
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
MostraErro(“\system\”)
DisarmTransaction()
ENDIF
END TRANSACTION
A função MostraErro() possui o parâmetro cPath o qual pode ser informado de
duas formas:
Apenas o diretório: Se for informado apenas o diretório será ge rado um arquivo
com denominação no formato SCxxxxxx.log, aonde xxxxxx será um número
sequencial gerado internamente pelo sistema.
Informando o diretório e o nome do arquivo: A função irá respeitar o nome do
arquivo informado, sobrescrendo o conteúdo anterior.
Caso seja necessário gerar um único arquivo texto contendo todos os
eventos de erro gerados pelos sucessivos processamentos da MsExecAuto,
a função MostraErro(cPath) deverá ser chamada apenas uma vez, ao
término do processamento da rotina.
Isto ocorre pois a função MostraErro() limpa o cache de eventos de erros
controlado pela MsExecAuto.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
184
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Personalização da gravação do evento de erro
Para processamentos mais volumosos, a geração de diversos arquivos de textos ou
até mesmo a geração de um único arquivo texto contendo todos os eventos de erro
pode dificultar a análise e correção dos problemas encontrados durante o
processamento.
Desta forma é possível personalizar a gravação do evento de erro, de forma que o
mesmo seja gerado em um arquivo no formato .DBF, permitindo o vínculo do
registro processado com a mensagem de erro gerada.
Private lMSHelpAuto := .F.
Private lAutoErrNoFile := .T.
AADD(xAutoCab,{“A1_COD” , “000001” , Nil})
AADD(xAutoCab,{“A1_LOJA” , “01” , Nil})
AADD(xAutoCab,{“A1_NOME” , “TESTE-000001” , Nil})
// Função específica que cria o arquivo no formato DBF que conterá as
// mensagens de erro.
XDBFLOG()
BEGIN TRANSACTION
lMsErroAuto := .F.
MsExecAuto({|x,y| MATA030(x,y)}, xAutoCab, 3)
IF lMsErroAuto
// Função que retorna o evento de erro na forma de um array
aAutoErro := GETAUTOGRLOG()
// Função especifica que converte o array aAutoErro em texto
// contínuo, com a quantidade de caracteres desejada por linha
// Função específica que efetua a gravação do evento de erro no
// arquivo previamente crado.
XGRVLOG(XCONVERRLOG(aAutoErro))
DisarmTransaction()
ENDIF
END TRANSACTION
As funções específicas XDBFLOG(), XCONVERRLOG() e XGRVLOG() serão
detalhadas no exemplo completo de utilzação da função MsExecAuto().

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
185
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Aplicação completa de importação utilizando MsExecAuto: Carga de
imobilizado
#INCLUDE "PROTHEUS.CH"
USER FUNCTION IATF001()
LOCAL oProcess
PRIVATE oMainWnd
//Perguntas para parametrizacao da rotina (PARAMBOX)
//MVParBox01 - Tipo de informação (.DBF/.TXT)
//MVParBox02 - LayOut do arquivo (Padrão / Especifico)
//MVParBox03 - Arquivo de dados (Consulta)
//MVParBox04 - Arquivo de layout (Consulta)
//MVParBox05 - Operacao (Incluir, Alterar, Excluir)
//MVParBox06 - Diretorio de Log (Consulta)
//MVParBox07 - Importa CIAP (SIM/NAO)
PRIVATE aTiposFile := {".DBF",".DTC",".TXT"}
PRIVATE MvParBox01 := 0
PRIVATE MvParBox02 := 0
PRIVATE MvParBox03 := ""
PRIVATE MvParBox04 := ""
PRIVATE MvParBox05 := 0
PRIVATE MvParBox06 := ""
PRIVATE MVParBox07 := 0
PRIVATE _cDirectory := ""
RpcSetType(3)
RpcSetEnv("99", "01",,,,,
{"CT1","SF9","SN1","SN2","SN3","SN4","SN5","SNG","SM2"})
SET DATE FORMAT "dd/mm/yyyy"
oMainWnd := TWindow():New( 000, 000, 001, 001, "Importação: Fichas do
imobilizado",,,,,,,,,,,,,,,,.T.)
oMainWnd:bInit := {|| IIF(IC001PARBX(),(oProcess:= MsNewProcess():New({|lEnd|
PROCATIVO(.F.,oProcess)}),oProcess:Activate(),oMainWnd:End()),oMainWnd:End()
)}

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
186
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oMainWnd:Activate("ICONIZED")
RpcClearEnv()
RETURN

STATIC FUNCTION PROCATIVO(lEnd,oProcess)


Local aArea := GetArea()
Local aDadosSN1 := {}
Local aDadosSN3 := {}
Local aDadosSF9 := {}
Local aDadosTN1 := {}
Local aDadosTN2 := {}
Local aDadosTN3 := {}
Local aItemSN3 := {}
Local cArqSN1 := ""
Local cArqSN2 := ""
Local cArqSN3 := ""
Local cArqSA2 := ""
Local aStruSN1 := {}
Local aStruSN2 := {}
Local aStruSN3 := {}
Local aStruSF9 := {}
Local nX := 0
Local nTotRegs := 0
Local nProcRegs := 0
Local nPosDados := 0
Local cCodFor := ""
Local cLojaFor := ""
Local cDescFor := ""
Local cFilAtu := cFilAnt
Local cDirArq := Alltrim(MVParBox03)
Local cHistorico := ""
Local nX := 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
187
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Local cFileExt := aTiposFile[MvParBox01]
Local lImpSF9 := MvParBox07==1
Local lImpSNG := .F. // Ainda nao implementado
Local cKeyImp := ""
Local aAutoErro := {}
// Tratamentos adicionais - arquivos especificos do cliente
Local cArqCTA := ""
Local cArqSM2 := ""
Local cIndSNG
Local nIndex := 0
Local cGrupo := ""
Local cContab := ""
Local aEntSNG := {}
Local cChapa := "000000"
Private lMsErroAuto := .F.
Private lMSHelpAuto := .F.
Private lAutoErrNoFile := .T.
// Garante a abertura dos arquivos padrões do sistema
DbSelectArea("CT1")
DbSetOrder(2) // FILIAL + COD.REDUZIDO
DbSelectArea("SM2")
DbSetOrder(1)
DbSelectArea("SN1")
DbSetOrder(1)
aStruSN1 := SN1->(DbStruct())
DbSelectArea("SN2")
DbSetOrder(1)
aStruSN2 := SN2->(DbStruct())
DbSelectArea("SN3")
DbSetOrder(1)
aStruSN3 := SN3->(DbStruct())
DbSelectArea("SF9")

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
188
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
DbSetOrder(1)
aStruSF9 := SF9->(DbStruct())
// Prepara o arquivo no formato .DBF para gravação dos eventos de erro
XDBFLOG()
DbSelectArea("SNG")
cIndSNG := CRIATRAB(Nil,.F.)
IndRegua("SNG",cIndSNG,"NG_FILIAL+NG_CCONTAB",,,"Selecionando
Registros...")
nIndex := RetIndex()
#IFNDEF TOP
DbSetIndex(cIndSNG+OrdBagExt())
#ENDIF
DbSetOrder(nIndex)
PERGUNTE("ATF010",.F.)
MV_PAR02 := 1 // Permite repetir chapa definido como sim
IF Select("SN1IMP") > 0
DbSelectArea("SN1IMP")
DbCloseArea()
ENDIF
IF Select("SN2IMP") > 0
DbSelectArea("SN2IMP")
DbCloseArea()
ENDIF
IF Select("SN3IMP") > 0
DbSelectArea("SN3IMP")
DbCloseArea()
ENDIF
IF Select("SF9IMP") > 0
DbSelectArea("SF9IMP")
DbCloseArea()
ENDIF
IF Select("CTAIMP") > 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
189
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
DbSelectArea("CTAIMP")
DbCloseArea()
ENDIF
cArqSN1:= cDirArq+"SN1IMP"
IF File(cArqSN1+cFileExt)
dbUseArea(.T.,,cArqSN1+cFileExt,"SN1IMP",.F.,.F.)
IndRegua("SN1IMP",cArqSN1+OrdBagExt(),"N1_FILIAL+N1_CBASE+N1_ITEM",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN1IMP não existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSN2:= cDirArq+"SN2IMP"
IF File(cArqSN2+cFileExt )
dbUseArea(.T.,,cArqSN2+cFileExt,"SN2IMP",.F.,.F.)
IndRegua("SN2IMP",cArqSN2+OrdBagExt(),;
"N2_FILIAL+N2_CBASE+N2_ITEM+N2_TIPO+N2_SEQ",,,"Selecionando
Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN2IMP não existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSN3:= cDirArq+"SN3IMP"
IF File(cArqSN3+cFileExt)
dbUseArea(.T.,,cArqSN3+cFileExt,"SN3IMP",.F.,.F.)
IndRegua("SN3IMP",cArqSN3+OrdBagExt(),"N3_FILIAL+N3_CBASE+N3_ITEM",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SN3IMP não existe."+CRLF+;
"Verifique caminho informado.",1,0)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
190
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
RETURN
ENDIF
IF lImpSF9
cArqSF9:= cDirArq+"SF9IMP"
IF File(cArqSF9+cFileExt )
dbUseArea(.T.,,cArqSF9+cFileExt,"SF9IMP",.F.,.F.)
IndRegua("SF9IMP",cArqSF9+OrdBagExt(),"F9_FILIAL+F9_CODIGO",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SF9IMP não existe."+;
CRLF+"Verifique caminho informado.",1,0)
RETURN
ENDIF
ENDIF
cArqCTA:= cDirArq+"CTAIMP"
IF File(cArqCTA+cFileExt)
dbUseArea(.T.,,cArqCTA+cFileExt,"CTAIMP",.F.,.F.)
IndRegua("CTAIMP",cArqCTA+OrdBagExt(),"CODIGO_CON",,,;
"Selecionando Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO CTAIMP não existe."+CRLF+;
"Verifique caminho informado.",1,0)
RETURN
ENDIF
cArqSM2:= cDirArq+"SM2IMP"
IF File(cArqSM2+cFileExt)
dbUseArea(.T.,,cArqSM2+cFileExt,"SM2IMP",.F.,.F.)
IndRegua("SM2IMP",cArqSM2+OrdBagExt(),"DTOS(BTN_DATA)",,,"Selecionando
Registros...")
ELSE
HELP("IATF001",1,"HELP","NO_FILE","ARQUIVO SM2IMP não existe."+CRLF+;
"Verifique caminho informado.",1,0)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
191
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
RETURN
ENDIF
lMSHelpAuto := .T.
DbSelectArea("SN1IMP")
DbGotop()
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Preparação para inicio do processamento ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
cKeyImp := DTOS(dDatabase)+StrZero(HoraToInt(Time()),6)
// Identidficador dos registros do log de erros
ConOut("Processando importação:")
ConOut("Inicio: "+Time())
ConOut("Registros SN1IMP: "+CValToChar(SN1IMP->(RecCount())))
ConOut("Registros SN2IMP: "+CValToChar(SN2IMP->(RecCount())))
ConOut("Registros SN3IMP: "+CValToChar(SN3IMP->(RecCount())))
dbEval( {|x| nTotRegs++ },,{||SN1IMP->(!EOF())})
oProcess:SetRegua1(nTotRegs+2)
oProcess:IncRegua1("Iniciando processamento...")
oProcess:SetRegua2(nTotRegs+1)
oProcess:IncRegua2("Ficha de Ativo:")
DbSelectArea("SN1IMP")
DbGotop()
While SN1IMP->(!Eof())
nProcRegs++
oProcess:IncRegua1("Processando item: "+CValToChar(nProcRegs)+" / "+;
CValToChar(nTotRegs))
oProcess:IncRegua2("Ficha de Ativo: ")
aDadosSN1 := {}
aDadosSN3 := {}
// Compatibilização para utilização do CRIAVAR()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
192
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
REGTOMEMORY("SN1",.T.)
//Monstagem do array com dados sem tratamento e com as informação da IMP
FOR nX := 1 TO LEN(aStruSN1)
IF SN1IMP->(FieldPos(aStruSN1[nX][1]))>0
DO CASE
CASE EMPTY(SN1IMP->&(aStruSN1[nX][1]))
AADD(aDadosSN1,{aStruSN1[nX][1],;
CRIAVAR(aStruSN1[nX][1]), NIL})
CASE aStruSN1[nX][2] == "C"
AADD(aDadosSN1,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]),;
"",aStruSN1[nX][3]), NIL})
CASE aStruSN1[nX][2] == "N"
AADD(aDadosSN1,{aStruSN1[nX][1],;
ABS(SN1IMP->&(aStruSN1[nX][1])), NIL})
OTHERWISE
AADD(aDadosSN1,{aStruSN1[nX][1],;
SN1IMP->&(aStruSN1[nX][1]), NIL})
ENDCASE
ELSE
AADD(aDadosSN1,{aStruSN1[nX][1], CRIAVAR(aStruSN1[nX][1]),;
NIL})
ENDIF
NEXT nX
// Alteração das informações do array de acordo com a necessidade
// AADD(aDadosTN1,{"CAMPO",CONTEUDO,"VALIDACAO"})
aDadosTN1 := {}
// ALTERACAO DO ARRAY ADADOSSN1 COM AS INFORMACOES
TRABALHADAS E
// ARMAZENADAS EM ADADOSTN1
// AADD(aDadosTN1,{"N1_XXXXXX" ,xConteudo ,Nil})
For nX := 1 TO LEN(aDadosTN1)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
193
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
IF (nPosField := aScan(aDadosSN1,{|aDadoSN1| aDadosSN1[1] ==;
aDadosTN1[nX][1]})) > 0
aDadosSN1[nPosField][2] := aDadosTN1[nX][2]
aDadosSN1[nPosField][3] := aDadosTN1[nX][3]
ENDIF
Next nX
IF SN1->(DbSeek(aDadosSN1[1][2]+aDadosSN1[2][2]+aDadosSN1[3][2]))
ConOut("Registro já importado: "+;
aDadosSN1[1][2]+"/"+aDadosSN1[2][2]+"/"+aDadosSN1[3][2])
ConOut("Registros importados com sucesso: "+CValToChar(nProcRegs))
SN1IMP->(dbSkip())
Loop
ENDIF
SN3IMP->(DbSeek(SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM)))
While SN3IMP->(!Eof()) .AND. SN3IMP->(N3_FILIAL+N3_CBASE+N3_ITEM) ==;
SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM)
aItensSN3 := {}
//³ Monstagem do array com dados sem tratamento e com as informações
FOR nX := 1 TO LEN(aStruSN3)
IF SN3IMP->(FieldPos(aStruSN3[nX][1]))>0
DO CASE
CASE EMPTY(SN3IMP->&(aStruSN3[nX][1]))
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), NIL})
CASE aStruSN3[nX][2] == "C"
AADD(aItensSN3,{aStruSN3[nX][1],;
SN3IMP->&(aStruSN3[nX][1]),;
aStruSN3[nX][3]), NIL})
CASE aStruSN3[nX][2] == "N"
AADD(aItensSN3,{aStruSN3[nX][1],;
ABS(SN3IMP->&(aStruSN3[nX][1])),;
".T."})

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
194
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
OTHERWISE
AADD(aItensSN3,{aStruSN3[nX][1],;
SN3IMP->&(aStruSN3[nX][1]), NIL})
ENDCASE
ELSEIF aStruSN3[nX][2] == "N"
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), ".T."})
ELSE
AADD(aItensSN3,{aStruSN3[nX][1],;
CRIAVAR(aStruSN3[nX][1]), NIL})
ENDIF
NEXT nX
// Alteração das informações do array de acordo com a necessidade
// AADD(aDadosTN3,{"CAMPO" ,CONTEUDO,"VALIDACAO"})
aDadosTN3 := {}
// ALTERACAO DO ARRAY aItenSN3 COM AS INFORMACOES TRABALHADAS E
// ARMAZENADAS EM aDadosTN3
For nX := 1 TO LEN(aDadosTN3)
IF (nPosField := aScan(aItensSN3,{|aItenSN3| aItenSN3[1] ==;
aDadosTN3[nX][1]})) > 0
aItensSN3[nPosField][2] := aDadosTN3[nX][2]
aItensSN3[nPosField][3] := aDadosTN3[nX][3]
ENDIF
Next nX
AADD(aDadosSN3,aItensSN3)
SN3IMP->(DbSkip())
Enddo
IF Len(aDadosSN1) > 0 .AND. Len(aDadosSN3) > 0
ConOut("Iniciando MsExecAuto - ATFA010: "+Time())
Begin Transaction
cFilAnt := SN1IMP->N1_FILIAL
lMsErroAuto := .F.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
195
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
MSExecAuto({|x,y,z| Atfa010(x,y,z)},aDadosSN1,aDadosSN3,3)
// Cabeçalho, Itens e Opção
ConOut("Finalizada MsExecAuto - ATFA010: "+Time())
IF lMsErroAuto
aAutoErro := GETAUTOGRLOG()
XGRVLOG(cKeyImp,;
SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM),;
SN1IMP->N1_DESCRIC, XCONVERRLOG(aAutoErro))
DisarmTransaction()
MostraErro(Alltrim(MVParBox06))
ELSE
// TRATAMENTO DA DESCRIÇÃO ESTENDIDA (SN2)
SN2IMP->(DbSeek(SN1IMP->(N1_FILIAL+N1_CBASE+N1_ITEM)))
cHistorico := ALLTRIM(SN2IMP->N2_HISTOR1) +;
ALLTRIM(SN2IMP->N2_HISTOR2)
For nX := 1 to Len(cHistorico) STEP 40
RECLOCK("SN2",.T.)
SN2->N2_FILIAL := SN1->N1_FILIAL
SN2->N2_CBASE := SN1->N1_CBASE
SN2->N2_ITEM := SN1->N1_ITEM
SN2->N2_TIPO := "01"
SN2->N2_SEQ := "001"
SN2->N2_SEQUENC := STRZERO(nX,2)
SN2->N2_HISTOR := SUBSTR(cHistorico,nX,40)
MSUNLOCK()
NEXT nX
// TRATAMENTO DA CARGA DO CIAP
IF lImpSF9
IATFCIAP(aStruSF9,aDadosSF9)
ENDIF

ConOut("Registros importados com sucesso: "+;

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
196
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
CValToChar(nProcRegs))
ENDIF
End Transaction
ENDIF
SN1IMP->(DbSkip())
Enddo
oProcess:IncRegua1("Processamento finalizado")
DbSelectArea("SN1IMP")
DbCloseArea()
IF File(cArqSN1+OrdBagExt())
FErase(cArqSN1+OrdBagExt())
ENDIF
DbSelectArea("SN2IMP")
DbCloseArea()
IF File(cArqSN2+OrdBagExt())
FErase(cArqSN2+OrdBagExt())
ENDIF
DbSelectArea("SN3IMP")
DbCloseArea()
IF File(cArqSN3+OrdBagExt())
FErase(cArqSN3+OrdBagExt())
ENDIF
IF lImpSF9
DbSelectArea("SF9IMP")
DbCloseArea()
IF File(cArqSF9+OrdBagExt())
FErase(cArqSF9+OrdBagExt())
ENDIF
ENDIF
IF lImpSNG
DbSelectArea("SNGIMP")
DbCloseArea()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
197
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
IF File(cIndSNG+OrdBagExt())
FErase(cIndSNG+OrdBagExt())
ENDIF
ENDIF
DbSelectArea("CTAIMP")
DbCloseArea()
IF File(cArqCTA+OrdBagExt())
FErase(cArqCTA+OrdBagExt())
ENDIF
DbSelectArea("SM2IMP")
DbCloseArea()
IF File(cArqSM2+OrdBagExt())
FErase(cArqSM2+OrdBagExt())
ENDIF
DbSelectArea("LOGIMP")
DbCloseArea()
ConOut("Total de registros importados: "+CValToChar(nProcRegs))
ConOut("Término da importação: "+Time())
cFilAnt := cFilAtu
RestArea(aArea)
RETURN

STATIC FUNCTION IC001PARBX()


LOCAL aParamBox := {}
LOCAL cTitulo := "Importacao de cadastros"
LOCAL aRet := {}
LOCAL bOk := {|| .T.}
LOCAL aButtons := {}
LOCAL lCentered := .T.
LOCAL nPosx
LOCAL nPosy
LOCAL cLoad := ""

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
198
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
LOCAL lCanSave := .T.
LOCAL lUserSave := .T.
LOCAL nX := 0
LOCAL lRet := .F.
AADD(aParamBox,{2,"Tipo de informação" ,1 ,aTiposFile ,060,;
"AllwaysTrue()", .T.})
AADD(aParamBox,{2,"LayOut do arquivo " ,1 ,;
{"Padrão","Especifico"},060, "AllwaysTrue()", .T.})
AADD(aParamBox,{1,"Diretorio de dados" ,Space(60) ,;
"@!","AllwaysTrue()","HSSDIR" ,".T.",120,.T.})
AADD(aParamBox,{1,"Arquivo de layout " ,Space(60) ,;
"@!","AllwaysTrue()","" ,".T.",120,.F.})
AADD(aParamBox,{2,"Operacao " ,1 ,;
{"Incluir","Alterar","Excluir"},060, "AllwaysTrue()", .T.})
AADD(aParamBox,{1,"Diretorio de Log " ,Space(60) ,;
"@!","AllwaysTrue()","HSSDIR" ,".T.",120,.F.})
AADD(aParamBox,{2,"Importa CIAP " ,1 ,;
{"Sim","Não"} ,060, "AllwaysTrue()", .T.})
lRet := ParamBox(aParamBox, cTitulo, aRet, bOk, aButtons, lCentered, nPosx,;
nPosy, /*oMainDlg*/ , cLoad, lCanSave, lUserSave)
IF ValType(aRet) == "A" .AND. Len(aRet) == Len(aParamBox)
For nX := 1 to Len(aParamBox)
If aParamBox[nX][1] == 1
&("MvParBox"+StrZero(nX,2)) := aRet[nX]
ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "C"
&("MvParBox"+StrZero(nX,2)) := aScan(aParamBox[nX][4],;
{|x| Alltrim(x) == aRet[nX]})
ElseIf aParamBox[nX][1] == 2 .AND. ValType(aRet[nX]) == "N"
&("MvParBox"+StrZero(nX,2)) := aRet[nX]
Endif
Next nX
ENDIF

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
199
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
RETURN lRet

STATIC FUNCTION IATFCIAP(aStruSF9,aDadosSF9)


Local aDadosCIAP := {}
Local nX := 0
Local nPosSF9 := 0
// Monta array com dados padrões do SF9 de acordo com o SX3
FOR nX := 1 to Len(aStruSF9)
AADD(aDadosCIAP,{aStruSF9[nX][1],CRIAVAR(aStruSF9[nX][1]),NIL})
NEXT nX
// Atualiza dados do array com as informações presentes no SN1
FOR nX := 1 to Len(aDadosSF9)
IF (nPosSF9 := aScan(aDadosCIAP,{|aLinhaCIAP| aLinhaCIAP[1] ==
aDadosSF9[nX][1]})) > 0
aDadosCIAP[nPosSF9][2] := aDadosSF9[nX][2]
ENDIF
NEXT nX
ConOut("Iniciando MsExecAuto - ATFCIAP: "+Time())
lMsErroAuto := .F.
MSExecAuto({|x,y| U_ATFCIAP(x,y)},aDadosCIAP,3) // Dados e Opção
ConOut("Finalizada MsExecAuto - ATFCIAP: "+Time())
RETURN lMsErroAuto

STATIC FUNCTION XDBFLOG()


LOCAL aCampos := {}
LOCAL cArqLog := MVParBox06+"LOGIMP"+GetDbExtension()
IF !File(cArqLog)
AADD(aCampos,{"CKEYIMP" ,"C",014,0})
AADD(aCampos,{"CKEYREG" ,"C",020,0})
AADD(aCampos,{"CDESCR" ,"C",040,0})
AADD(aCampos,{"CSEQMSG" ,"C",003,0})
AADD(aCampos,{"CMSGERR" ,"C",254,0})

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
200
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
dbCreate(cArqLog,aCampos,__LocalDriver)
ENDIF
dbUseArea(.T., __LocalDriver, cArqLog, "LOGIMP", .T., .F.)
RETURN

STATIC FUNCTION XGRVLOG(cKeyImp, cKeyReg, cDescReg, cMsgErr)


LOCAL cSeqLog := "000"
FOR nX := 1 TO Len(cMsgErr) STEP 254
cSeqLog := SOMA1(cSeqLog)
RECLOCK("LOGIMP",.T.)
LOGIMP->CKEYIMP := cKeyImp
LOGIMP->CKEYREG := cKeyReg
LOGIMP->CDESCR := cDescReg
LOGIMP->CSEQMSG := cSeqLog
LOGIMP->CMSGERR := SUBSTR(cMsgErr,nX,254)
MSUNLOCK()
NEXT nX
RETURN

STATIC FUNCTION XCONVERRLOG(aAutoErro)


LOCAL cRet := ""
LOCAL nX := 1
FOR nX := 1 to Len(aAutoErro)
cRet += aAutoErro[nX]+CHR(13)+CHR(10)
NEXT nX
RETURN cRet

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
201
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
202
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
203
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
EXERCÍCIO 1
Faça uma rotina automática para gerar Pedidos de Venda, 10 pedidos com 30 itens
cada e que simule a inclusão, alteração e exclusão.
Os dados serão fixos:
Produto : PA001
Produto: PA002
Cliente : CL0001
Loja : 01
TES = 501.
Condição de pagamento = 001

Caso os cadastros não existam, mostrar mensagem no console.

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
204
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
205
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

G
GAABBAARRIITTO
O

CAPÍTULO 1
Exercício 1:
Respostas:
Objetos são uma unidade dinâmica, composta por um estado interno privativo
(estrutura de dados) e um comportamento (conjunto de operações).

Classe - conjunto de objetos com caracteristicas afins. Define o comportamento do


objeto através de seus métodos e quais estados ele é capaz de manter através de
seus atributos.

Objeto / instância de uma classe. Um objeto é capaz de armazenar estados através


de seus atributos e reagir a mensagens enviadas a ele, assim como se relacionar e
enviar mensagens a outros objetos

Atributo - são características de um objeto. Basicamente a estrutura de dados que


vai representar a classe.

Método - definem as habilidades dos objetos.

Mensagem - é uma chamada a um objeto para invocar um de seus métodos,


ativando um comportamento descrito por sua classe

CAPÍTULO 2
Exercício 1:
Respostas:
#INCLUDE 'PROTHEUS.CH'
#INCLUDE 'RWMAKE.CH'
#INCLUDE 'FONT.CH'
#INCLUDE 'COLORS.CH'
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
206
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

User Function XExe1Cap2()


Private cAluno := Space(50)
Private nCBox3
SetPrvt("oDlg1","oFld1","oPanel3","oGrp2","oCBox1","oCBox2","oGrp3","oCB
ox3","oGrp4","oLBox1","oPanel1")
SetPrvt("oRMenu1","oPanel2","oSay1","oAluno","oSBtn1")
Private aItem := {"Item 1","Item 2","Item 3","Item 4"}
Private aList := {"Item 1","Item 2 ","Item 3 ","Item 4"}
Private nList := 1
Private aRaditem := {"Item 1","Item 2","Item 3"}
Private nRadio := 1
Private lCheck1 := .T.
Private lCheck2 := .F.
Private lCheck3 := .F.

oDlg1 := MSDialog():New( 114,322,622,1017,"Exercício 1 - Capítulo


2",,,.F.,,,,,,.T.,,,.T. )
oFld1 := TFolder():New(
000,000,{"Botoes","Panel","Box"},{},oDlg1,,,,.T.,.F.,340,244,)
oPanel3 := TPanel():New(
000,000,"",oFld1:aDialogs[3],,.F.,.F.,,,336,228,.T.,.F. )
oGrp2 := TGroup():New(
004,004,056,332,"Checkbox",oPanel3,CLR_BLACK,CLR_WHITE,.T.,.F. )
oCBox1 := TCheckBox():New( 016,012,"Opcao 1",,oGrp2,048,008,,{||
U_xCheckbox()},,,CLR_BLACK,CLR_WHITE,,.T.,"",, )
oCBox2 := TCheckBox():New( 036,012,"Opcao 2",,oGrp2,048,008,,{||
U_xCheckbox()},,,CLR_BLACK,CLR_WHITE,,.T.,"",, )
oGrp3 := TGroup():New(
060,004,112,332,"Combobox",oPanel3,CLR_BLACK,CLR_WHITE,.T.,.F. )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
207
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oCBox3 := TComboBox():New( 072,012,{|u|
If(PCount()>0,nCBox3:=u,nCBox3)},aItem,072,010,oGrp3,,{||
U_xCOMBOBOX()},,CLR_BLACK,CLR_WHITE,.T.,,"",,,,,,,nCBox3 )
oGrp4 := TGroup():New(
116,004,224,332,"Listbox",oPanel3,CLR_BLACK,CLR_WHITE,.T.,.F. )
oLBox1 := TListBox():New( 132,016,{|u| if( Pcount( ) >0, nList:= u, nList
)},aList,060,048,{ ||
U_xlistbox()},oPanel3,,CLR_BLACK,CLR_WHITE,.T.,,,,"",,,,,,, )
oPanel1 := TPanel():New( 000,000,"PAINEL
1",oFld1:aDialogs[2],,.F.,.F.,,,152,228,.T.,.F. )
oGrp1 := TGroup():New( 004,004,108,148,"Tgroup -
Ex.Radmenu",oPanel1,CLR_BLACK,CLR_WHITE,.T.,.F. )
GoRMenu1 := TGroup():New( 016,008,100,140,"Selecione o
item",oGrp1,CLR_BLACK,CLR_WHITE,.T.,.F. )
oRMenu1 := TRadMenu():New(
020,014,ARADITEM,{|u|if(PCount()>0,nRadio:=u,nRadio)},oGrp1,,{||
U_xRAMENU()},CLR_BLACK,CLR_WHITE,"",,,112,28,,.F.,.F.,.T. )
oPanel2 := TPanel():New( 000,152,"PAINEL
2",oFld1:aDialogs[2],,.F.,.F.,,,184,228,.T.,.F. )
oSay1 := TSay():New(
020,008,{||"Aluno"},oFld1:aDialogs[1],,,.F.,.F.,.F.,.T.,CLR_BLACK,CLR_WHIT
E,016,008)
oAluno := TGet():New( 020,028,{|u|
If(PCount()>0,cAluno:=u,cAluno)},oFld1:aDialogs[1],292,008,'',{|U| !EMPTY
(cAluno)},CLR_BLACK,CLR_WHITE,,,,.T.,"",,,.F.,.F.,,.F.,.F.,"","cAluno",,)
oSBtn1 :=
tButton():New(40,28,'Fechar',oFld1:aDialogs[1],{||oDlg1:End()},100,20,,,,.T.)

oCBox1:bSetGet := {|| lCheck1 }


oCBox1:bLClicked := {|| lCheck1:=!lCheck1 }
oCBox2:bSetGet := {|| lCheck2 }
oCBox2:bLClicked := {|| lCheck2:=!lCheck2 }

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
208
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oCBox1:bChange:= {|| Alert("Checkbox 1 mudou de valor")}
oCBox2:bChange:= {|| Alert("Checkbox 2 mudou de valor")}

oCBox2:bWhen := {|| .T. }


oCBox2:bValid := {|| Alert(IIF(lCheck1 ,"Duas opcoes
selecionadas","Somente segunda opcao selecionada")) }

oDlg1:Activate(,,,.T.)

Return

User Function xComboBox()


Local lRet := .t.
cCbox3 := aItem[2]
MsgStop('Mudou para o item ' + ncbox3 )
Return lRet

User Function xListbox()


Local lRet := .t.
MsgStop( 'Valor da selecao '+aList[nList])
Return lRet

User Function xRAMENU()


Local lRet := .t.
MsgStop("Item escolhido " + aRadItem[nRadio] )
Return lRet

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
209
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CAPÍTULO 3
Exercício 1:
#INCLUDE "PROTHEUS.CH"
#INCLUDE "RWMAKE.CH"

User Function xEx1Cap3()

LOCAL aCampos := {
{"E1_NOMCLI","Cliente","@!"},{"E1_PREFIXO","Prefixo","@!"},{"E1_NUM","Titulo","
@!"},;

{"E1_PARCELA","Parcela","@!"},{"E1_VALOR","Valor","@E
9,999,999.99"},{"E1_VENCTO","Vencimento"}}
LOCAL nOpc := 0
LOCAL aMarked := {}
LOCAL aDesc := {"Este programa imprime os boletos de","cobranca bancaria de
acordo com","os parametros informados pelo usuario"}
PRIVATE Exec := .F.
PRIVATE cIndexName := ''
PRIVATE cIndexKey := ''
PRIVATE cFilter := ''
PRIVATE _cParcela:="ABCDEFGHIJKLMNOPQRSTVXYWZ"
Private aBitmap := {"itau.bmp",; // Banner Publicitario
"LGRL.bmp"} // Logo da
Empresa

Tamanho := "M"
titulo := "Boleto Itau"
cDesc1 := "Este programa imprime o Boleto Itau."
cDesc2 := ""
cDesc3 := ""
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
210
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cString := "SE1"
wnrel := "BOLITA"
lEnd := .F.

aReturn := {"Zebrado", 1,"Administracao", 2, 2, 1, "",1 }


//"Zebrado"###"Administracao"
nLastKey := 0

dbSelectArea("SE1")

cPerg :="BOLITA"

ValidPerg()

Pergunte (cPerg,.F.)

Wnrel :=
SetPrint(cString,Wnrel,cPerg,@Titulo,cDesc1,cDesc2,cDesc3,.F.,,,Tamanho,,)

If nLastKey == 27
Set Filter to
Return
Endif

SetDefault(aReturn,cString)

If nLastKey == 27
Set Filter to
Return
Endif

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
211
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
nOpc := 1

If nOpc == 1
cIndexName := Criatrab(Nil,.F.)
cIndexKey :=
"E1_PORTADO+E1_CLIENTE+E1_PREFIXO+E1_NUM+E1_PARCELA+E1_
TIPO+DTOS(E1_EMISSAO)"
cFilter := "E1_PREFIXO >= '"+MV_PAR04+"' .And. E1_PREFIXO <=
'"+MV_PAR05+"' .And. " + ;
"E1_NUM >= '"+MV_PAR06+"' .And. E1_NUM <= '"+MV_PAR07+"'
.And. " + ;
"E1_PARCELA >= '"+MV_PAR08+"' .And. E1_PARCELA <=
'"+MV_PAR09+"' .And. " + ;
"E1_PORTADO >= '"+MV_PAR10+"' .And. E1_PORTADO <=
'"+MV_PAR11+"' .And. " + ;
"E1_CLIENTE >= '"+MV_PAR12+"' .And. E1_CLIENTE <= '"+MV_PAR13+"'
.And. " + ;
"E1_EMISSAO >= CTOD('" + DTOC(MV_PAR18) + "') .And. E1_EMISSAO
<= CTOD('" + DTOC(MV_PAR19) + "') .And. " + ;
"E1_VENCTO >= CTOD('" + DTOC(MV_PAR16) + "') .And. E1_VENCTO <=
CTOD('" + DTOC(MV_PAR17) + "') .And. "+ ;
"E1_LOJA >= '"+MV_PAR14+"' .And. E1_LOJA <= '"+MV_PAR15+"'
.And. " + ;
"E1_FILIAL = '"+xFilial()+"' .And. E1_SALDO > 0 .And. " + ;
"SubsTring(E1_TIPO,3,1) != '-' .And. " +;
"Empty(E1_BAIXA) "
IndRegua("SE1", cIndexName, cIndexKey,, cFilter, "Aguarde selecionando
registros....")
DbSelectArea("SE1")

dbGoTop()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
212
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
@ 001,001 TO 400,700 DIALOG oDlg TITLE "Selecao de Titulos"
@ 001,001 TO 170,350 BROWSE "SE1" MARK "E1_OK"
@ 180,310 BMPBUTTON TYPE 01 ACTION (Exec := .T.,Close(oDlg))
@ 180,280 BMPBUTTON TYPE 02 ACTION (Exec := .F.,Close(oDlg))
ACTIVATE DIALOG oDlg CENTERED

dbGoTop()
Do While !Eof()
If Marked("E1_OK")
AADD(aMarked,.T.)
Else
AADD(aMarked,.F.)
EndIf
SE1->( dbSkip() )
EndDo
dbGoTop()
If Exec
Processa({|lEnd|GERAREL(aMarked)})
Endif
RetIndex("SE1")
fErase(cIndexName+OrdBagExt())

EndIf

Return Nil

Static Function GERAREL(aMarked)


LOCAL oPrint
LOCAL n := 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
213
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
LOCAL aDadosEmp := { SM0->M0_NOMECOM ,;
//[1]Nome da Empresa
SM0->M0_ENDCOB
,; //[2]Endereço
AllTrim(SM0->M0_BAIRCOB)+",
"+AllTrim(SM0->M0_CIDCOB)+", "+SM0->M0_ESTCOB ,; //[3]Complemento
"CEP: "+Subs(SM0-
>M0_CEPCOB,1,5)+"-"+Subs(SM0->M0_CEPCOB,6,3) ,; //[4]CEP
"PABX/FAX: "+SM0->M0_TEL
,; //[5]Telefones
"C.N.P.J.: "+Subs(SM0-
>M0_CGC,1,2)+"."+Subs(SM0->M0_CGC,3,3)+"."+ ; //[6]
Subs(SM0-
>M0_CGC,6,3)+"/"+Subs(SM0->M0_CGC,9,4)+"-"+ ; //[6]
Subs(SM0->M0_CGC,13,2)
,; //[6]CGC
"I.E.: "+Subs(SM0-
>M0_INSC,1,3)+"."+Subs(SM0->M0_INSC,4,3)+"."+ ; //[7]
Subs(SM0-
>M0_INSC,7,3)+"."+Subs(SM0->M0_INSC,10,3) } //[7]I.E

LOCAL aDadosEmX := { SM0->M0_NOMECOM ,;


//[1]Nome da Empresa
alltrim(SM0->M0_ENDENT)+" -
"+AllTrim(SM0->M0_CIDENT)+"/"+SM0->M0_ESTENT ,; //[2]Endereço
AllTrim(SM0->M0_BAIRENT)+",
"+AllTrim(SM0->M0_CIDENT)+", "+SM0->M0_ESTENT ,; //[3]Complemento
"CEP: "+Subs(SM0-
>M0_CEPCOB,1,5)+"-"+Subs(SM0->M0_CEPCOB,6,3) ,; //[4]CEP
"PABX/FAX: "+SM0->M0_TEL
,; //[5]Telefones

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
214
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
"C.N.P.J.: "+Subs(SM0-
>M0_CGC,1,2)+"."+Subs(SM0->M0_CGC,3,3)+"."+ ; //[6]
Subs(SM0-
>M0_CGC,6,3)+"/"+Subs(SM0->M0_CGC,9,4)+"-"+ ; //[6]
Subs(SM0->M0_CGC,13,2)
,; //[6]CGC
"I.E.: "+Subs(SM0-
>M0_INSC,1,3)+"."+Subs(SM0->M0_INSC,4,3)+"."+ ; //[7]
Subs(SM0-
>M0_INSC,7,3)+"."+Subs(SM0->M0_INSC,10,3) } //[7]I.E

LOCAL nPercMora := IIF(EMPTY(MV_PAR20) .OR. MV_PAR20 < 0, (2/100) ,


(MV_PAR20 / 100))
LOCAL aDadosTit
LOCAL aDadosBanco
LOCAL aDatSacado
LOCAL aBolText := {" " ,;
"Mora Diaria de R$ " ,;
"" }

LOCAL aBMP := aBitMap


LOCAL i := 1
LOCAL Xcb := {}
LOCAL nRec := 0
LOCAL _nVlrAbat := 0

oPrint:= TMSPrinter():New( "Boleto Itau" )


oPrint:SetPortrait() // ou SetLandscape()
oPrint:StartPage() // Inicia uma nova página
SE1->(dbGoTop())
nRec := SE1->(Reccount())
SE1->(dbGoTop())

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
215
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
ProcRegua(nRec)
DBSelectArea("SE1")
Do While !EOF()

IF EMPTY(SE1->E1_PORTADO) .AND. EMPTY(MV_PAR01)


DBSelectArea("SE1")
dbSkip()
IncProc()
i := i + 1
ENDIF

DbSelectArea("SA6")
DbSetOrder(1)
IF EMPTY(SE1->E1_PORTADO) .AND. !EMPTY(mv_par01)

DBSeek( xFilial("SA6") + mv_par01 + mv_par02 + mv_par03 )


ELSE
DbSeek(xFilial("SA6")+SE1-
>(E1_PORTADO+E1_AGEDEP+E1_CONTA),.T.)
ENDIF

//Posiciona o SA1 (Cliente)


DbSelectArea("SA1")
DbSetOrder(1)
If ! DbSeek(xFilial()+SE1->E1_CLIENTE+SE1->E1_LOJA,.T.)
DBSelectArea("SE1")
dbSkip()
IncProc()
i := i + 1
Endif

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
216
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

DbSelectArea("SE1")

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Alimenta as variaveis de banco e dados do cedente ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
nNossoNum := "23344442/2"
cNumCon := stuff(MV_PAR03 , AT("-",MV_PAR03) ,1 , "")

aDadosBanco := {MV_PAR01 ,; // [1]Numero do


Banco
SA6->A6_NOME
,; // [2]Nome do Banco
SUBSTR(MV_PAR02, 1, 4)
,; // [3]Agência
Subs(cNumCon, 1 ,
Len(AllTrim(cNumCon))-1),; // [4]Conta Corrente
Subs(cNumCon,
Len(AllTrim(cNumCon)),1) ,; // [5]Dígito da conta corrente
""
}// [6]Codigo da Carteira

If Empty(SA1->A1_ENDCOB)
aDatSacado := {AllTrim(SA1->A1_NOME) ,; //
[1]Razão Social
AllTrim(SA1->A1_COD )+"-"+SA1->A1_LOJA ,; // [2]Código
AllTrim(SA1->A1_END )+"-"+AllTrim(SA1->A1_BAIRRO),; //
[3]Endereço
AllTrim(SA1->A1_MUN ) ,; // [4]Cidade
SA1->A1_EST ,; // [5]Estado

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
217
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
SA1->A1_CEP ,; // [6]CEP
SA1->A1_CGC
} // [7]CGC
Else
aDatSacado := {AllTrim(SA1->A1_NOME) ,;
// [1]Razão Social
AllTrim(SA1->A1_COD )+"-"+SA1->A1_LOJA ,; // [2]Código
AllTrim(SA1->A1_ENDCOB)+"-"+AllTrim(SA1->A1_BAICOB),; //
[3]Endereço
AllTrim(SA1->A1_MUNCOB) ,; // [4]Cidade
SA1->A1_ESTCOB ,; // [5]Estado
SA1->A1_CEPCOB ,; // [6]CEP
SA1->A1_CGC
} // [7]CGC
Endif

_nVlrAbat := SomaAbat(SE1->E1_PREFIXO,SE1->E1_NUM,SE1-
>E1_PARCELA,"R",1,,SE1->E1_CLIENTE,SE1->E1_LOJA)

If !Empty(SE1->E1_PARCELA)
nNroParc:=0
If SE1->E1_PARCELA $ "ABCDEFGHIJKLMNOPQRSTVXYWZ"
For a:=1 to Len(_cParcela)
IF SE1->E1_PARCELA == Substr(_cParcela,a,1)
nNroParc:=A+10
EXIT
ENDIF
Next a
_cParc:=Str(nNroParc,2)
Else

if SE1->E1_PARCELA == "U"

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
218
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
_cParc:="00"
ELSE
_cParc:=StrZero(SE1->E1_PARCELA,2)
endif
EndIf
ELSE
_cParc:="00"
EndIf
//Fim da Rotina

aDadosTit := { AllTrim(E1_NUM) + AllTrim(E1_PARCELA) ,; //


[1] Número do título
E1_EMISSAO ,; //
[2] Data da emissão do título
Date() ,; // [3]
Data da emissão do boleto
E1_VENCTO ,; //
[4] Data do vencimento
(E1_SALDO - _nVlrAbat) ,; //
[5] Valor do título
nNossonum ,; //
[6] Nosso número (Ver fórmula para calculo)
E1_PREFIXO ,; //
[7] Prefixo da NF
IIF(AllTrim(E1_TIPO)="NF","DM",E1_TIPO) ,; // [8] Tipo do
Titulo
E1_DECRESC ,;// [9] Decrescimo
E1_ACRESC ,; // [10] Acrescimo
}

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
219
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

If aMarked[i]

Impress(oPrint,aBMP,aDadosEmp,aDadosEmX,aDadosTit,aDadosBanco,aD
atSacado,aBolText,nNossonum)
n := n + 1
EndIf

DBSelectArea("SE1")
dbSkip()
IncProc()
i := i + 1
EndDo

oPrint:EndPage() // Finaliza a página


oPrint:Preview() // Visualiza antes de imprimir

Return nil

Static Function
Impress(oPrint,aBitmap,aDadosEmp,aDadosEmX,aDadosTit,aDadosBanco,aDatSac
ado,aBolText,nNossonum)

LOCAL oFont8
LOCAL oFont10
LOCAL oFont16
LOCAL oFont16n
LOCAL oFont14n
LOCAL oFont24
LOCAL i := 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
220
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
LOCAL aCoords1 := {0150,1900,0550,2300}
LOCAL aCoords2 := {0450,1050,0550,1900}
LOCAL aCoords3 := {0710,1900,0810,2300}
LOCAL aCoords4 := {0980,1900,1050,2300}
LOCAL aCoords5 := {1330,1900,1400,2300}
LOCAL aCoords6 := {2000,1900,2100,2300}
LOCAL aCoords7 := {2270,1900,2340,2300}
LOCAL aCoords8 := {2620,1900,2690,2300}
LOCAL oBrush

LOCAL nPercMora := IIF(EMPTY(MV_PAR23) .OR. MV_PAR23 < 0, (2/100) ,


(MV_PAR23 / 100))

//Parâmetros de TFont.New()
//1.Nome da Fonte (Windows)
//3.Tamanho em Pixels
//5.Bold (T/F)

oFont8 := TFont():New("Arial",9,8 ,.T.,.F.,5,.T.,5,.T.,.F.)


oFont10 := TFont():New("Arial",9,10,.T.,.T.,5,.T.,5,.T.,.F.)
oFont16 := TFont():New("Arial",9,16,.T.,.T.,5,.T.,5,.T.,.F.)
oFont16n:= TFont():New("Arial",9,16,.T.,.F.,5,.T.,5,.T.,.F.)
oFont14n:= TFont():New("Arial",9,14,.T.,.F.,5,.T.,5,.T.,.F.)
oFont24 := TFont():New("Arial",9,24,.T.,.T.,5,.T.,5,.T.,.F.)

oBrush := TBrush():New("",4)

oPrint:StartPage() // Inicia uma nova página

// Inicia layout
oPrint:Line (0150,550,0050, 550)
oPrint:Line (0150,800,0050, 800)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
221
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

// Imprime o Logo, nome e numero do banco


oPrint:SayBitmap(0078,100,"\SYSTEM\ITAU.BMP" ,075,075) //
LOGOTIPO DA EMPRESA
oPrint:Say (0084,185,"Banco Itáu S.A." ,oFont10 ) // [2]Nome do
Banco
oPrint:Say (0062,567,"341-7" ,oFont24 ) //
[1]Numero do Banco

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do comprovante de entrega. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

oPrint:Say (0084,1900,"Comprovante de Entrega",oFont10)


oPrint:Line (0150,100,0150,2300)
oPrint:Say (0150,100 ,"Cedente" ,oFont8)
oPrint:Say (0200,100 ,aDadosEmp[1] ,oFont10) //Nome + CNPJ
oPrint:Say (0150,1060,"Agência/Código Cedente" ,oFont8)
oPrint:Say (0200,1060,aDadosBanco[3]+"/"+aDadosBanco[4]+"-
"+aDadosBanco[5],oFont10)
oPrint:Say (0150,1510,"Nro.Documento" ,oFont8)
oPrint:Say (0200,1510,aDadosTit[7]+aDadosTit[1]
,oFont10) //Prefixo +Numero+Parcela
oPrint:Say (0250,100 ,"Sacado" ,oFont8)
oPrint:Say (0300,100 ,aDatSacado[1] ,oFont10) //Nome
oPrint:Say (0250,1060,"Vencimento" ,oFont8)
oPrint:Say (0300,1060,DTOC(aDadosTit[4]) ,oFont10)
oPrint:Say (0250,1510,"Valor do Documento" ,oFont8)
oPrint:Say (0300,1550,AllTrim(Transform(aDadosTit[5],"@E 999,999,999.99"))
,oFont10)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
222
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (0400,0100,"Recebi(emos) o bloqueto/título" ,oFont10)
oPrint:Say (0450,0100,"com as características acima." ,oFont10)
oPrint:Say (0350,1060,"Data" ,oFont8)
oPrint:Say (0350,1410,"Assinatura" ,oFont8)
oPrint:Say (0450,1060,"Data" ,oFont8)
oPrint:Say (0450,1410,"Entregador" ,oFont8)

oPrint:Line (0250, 100,0250,1900 )


oPrint:Line (0350, 100,0350,1900 )
oPrint:Line (0450,1050,0450,1900 )
oPrint:Line (0550, 100,0550,2300 )

oPrint:Line (0550,1050,0150,1050 )
oPrint:Line (0550,1400,0350,1400 )
oPrint:Line (0350,1500,0150,1500 )
oPrint:Line (0550,1900,0150,1900 )

oPrint:Say (0150,1910,"( )Mudou-se" ,oFont8)


oPrint:Say (0190,1910,"( )Ausente" ,oFont8)
oPrint:Say (0230,1910,"( )Não existe nº indicado" ,oFont8)
oPrint:Say (0270,1910,"( )Recusado" ,oFont8)
oPrint:Say (0310,1910,"( )Não procurado" ,oFont8)
oPrint:Say (0350,1910,"( )Endereço insuficiente" ,oFont8)
oPrint:Say (0390,1910,"( )Desconhecido" ,oFont8)
oPrint:Say (0430,1910,"( )Falecido" ,oFont8)
oPrint:Say (0470,1910,"( )Outros(anotar no verso)" ,oFont8)

For i := 100 to 2300 step 50


oPrint:Line( 0600, i, 0600, i+30)
Next i

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
223
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Recibo do sacado ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

oPrint:Line (0710,100,0710,2300)
oPrint:Line (0710,550,0610, 550)
oPrint:Line (0710,800,0610, 800)

// Imprime o Logo, nome e numero do banco


oPrint:SayBitmap(0638,100,"\SYSTEM\ITAU.BMP" ,075,075) //
LOGOTIPO DA EMPRESA
oPrint:Say (0644,185,"Banco Itáu S.A." ,oFont10 ) // [2]Nome do
Banco
oPrint:Say (0622,567,"341-7" ,oFont24 ) //
[1]Numero do Banco

oPrint:Say (0644,1900,"Recibo do Sacado",oFont10)

oPrint:Line (0810,100,0810,2300 )
oPrint:Line (0910,100,0910,2300 )
oPrint:Line (0980,100,0980,2300 )
oPrint:Line (1050,100,1050,2300 )

oPrint:Line (0910,500,1050,500)
oPrint:Line (0980,750,1050,750)
oPrint:Line (0910,1000,1050,1000)
oPrint:Line (0910,1350,0980,1350)
oPrint:Line (0910,1550,1050,1550)

oPrint:Say (0710,100 ,"Local de Pagamento" ,oFont8)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
224
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (0750,100 ,"QUALQUER BANCO ATÉ A DATA DO VENCIMENTO"
,oFont10)

oPrint:Say (0710,1910,"Vencimento" ,oFont8)


oPrint:Say (0750,2010,DTOC(aDadosTit[4]) ,oFont10)

oPrint:Say (0810,100 ,"Cedente" ,oFont8)

oPrint:Say (0835,100 ,aDadosEmp[1]+" - "+aDadosEmp[6] ,oFont10)


//Nome + CNPJ
oPrint:Say (0870,100 ,ALLTRIM(aDadosEmX[2]),oFont10) //endereco

oPrint:Say (0810,1910,"Agência/Código Cedente" ,oFont8)


oPrint:Say (0850,2010,aDadosBanco[3]+"/"+aDadosBanco[4]+"-
"+aDadosBanco[5],oFont10)

oPrint:Say (0910,100 ,"Data do Documento" ,oFont8)


oPrint:Say (0940,100 ,DTOC(aDadosTit[2]) ,oFont10) // Emissao
do Titulo (E1_EMISSAO)

oPrint:Say (0910,505 ,"Nro.Documento" ,oFont8)


oPrint:Say (0940,605 ,aDadosTit[7]+aDadosTit[1]
,oFont10) //Prefixo +Numero+Parcela

oPrint:Say (0910,1005,"Espécie Doc." ,oFont8)


oPrint:Say (0940,1050,aDadosTit[8]
,oFont10) //Tipo do Titulo

oPrint:Say (0910,1355,"Aceite" ,oFont8)


oPrint:Say (0940,1455,"N" ,oFont10)

oPrint:Say (0910,1555,"Data do Processamento" ,oFont8)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
225
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (0940,1655,DTOC(aDadosTit[3]) ,oFont10) // Data
impressao

oPrint:Say (0910,1910,"Nosso Número" ,oFont8)


oPrint:Say
(0940,2010,Substr(aDadosTit[6],1,3)+"/"+Substr(aDadosTit[6],4),oFont10)

oPrint:Say (0980,100 ,"Uso do Banco" ,oFont8)

oPrint:Say (0980,505 ,"Carteira" ,oFont8)


oPrint:Say (1010,555 ,aDadosBanco[6] ,oFont10)

oPrint:Say (0980,755 ,"Espécie" ,oFont8)


oPrint:Say (1010,805 ,"R$" ,oFont10)

oPrint:Say (0980,1005,"Quantidade" ,oFont8)


oPrint:Say (0980,1555,"Valor" ,oFont8)

oPrint:Say (0980,1910,"Valor do Documento" ,oFont8)


oPrint:Say (1010,2010,AllTrim(Transform(aDadosTit[5],"@E
999,999,999.99")),oFont10)

oPrint:Say (1050,100 ,"Instruções (Todas informações deste bloqueto são de


exclusiva responsabilidade do cedente)",oFont8)
oPrint:Say (1150,100 ,aBolText[1] ,oFont10)
oPrint:Say (1200,100 ,aBolText[2]+"
"+AllTrim(Transform(((aDadosTit[5]*nPercMora)/30),"@E 99,999.99")) ,oFont10)

oPrint:Say (1250,100 ,aBolText[3] ,oFont10)

oPrint:Say (1050,1910,"(-)Desconto/Abatimento" ,oFont8)


oPrint:Say (1080,2010,AllTrim(Transform(aDadosTit[9],"@E 99,999.99")),oFont10)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
226
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (1120,1910,"(-)Outras Deduções" ,oFont8)
oPrint:Say (1190,1910,"(+)Mora/Multa" ,oFont8)
oPrint:Say (1260,1910,"(+)Outros Acréscimos" ,oFont8)
oPrint:Say (1290,2010,AllTrim(Transform(aDadosTit[10],"@E 99,999.99")) ,oFont10)
oPrint:Say (1330,1910,"(=)Valor Cobrado" ,oFont8)

oPrint:Say (1400,100 ,"Sacado" ,oFont8)


oPrint:Say (1430,400 ,aDatSacado[1]+" ("+aDatSacado[2]+")" ,oFont10)
oPrint:Say (1483,400 ,aDatSacado[3] ,oFont10)
oPrint:Say (1536,400 ,aDatSacado[6]+" "+aDatSacado[4]+" -
"+aDatSacado[5],oFont10) // CEP+Cidade+Estado
oPrint:Say (1589,400 ,"CGC: "+TRANSFORM(aDatSacado[7],"@R
99.999.999/9999-99"),oFont10) // CGC
oPrint:Say (1589,1850,Substr(aDadosTit[6],1,3)+"/00"+Substr(aDadosTit[6],4,8)
,oFont10)

oPrint:Say (1605,100 ,"Sacador/Avalista" ,oFont8)


oPrint:Say (1645,1500,"Autenticação Mecânica -" ,oFont8)

oPrint:Line (0710,1900,1400,1900 )
oPrint:Line (1120,1900,1120,2300 )
oPrint:Line (1190,1900,1190,2300 )
oPrint:Line (1260,1900,1260,2300 )
oPrint:Line (1330,1900,1330,2300 )
oPrint:Line (1400,100 ,1400,2300 )
oPrint:Line (1640,100 ,1640,2300 )

For i := 100 to 2300 step 50


oPrint:Line( 1850, i, 1850, i+30)
Next i

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
227
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Ficha de Compensacao ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

oPrint:Line (2000,100,2000,2300)
oPrint:Line (2000,550,1900, 550)
oPrint:Line (2000,800,1900, 800)

// Imprime o Logo, nome e numero do banco


oPrint:SayBitmap(1928,100,"\SYSTEM\ITAUREL.BMP" ,075,075) //
LOGOTIPO DA EMPRESA
oPrint:Say (1934,180,"Banco Itáu S.A." ,oFont10 ) // [2]Nome do
Banco
oPrint:Say (1912,567,"341-7" ,oFont24 ) //
[1]Numero do Banco

oPrint:Say (1934,820,"34184938333434343308",oFont14n) //Linha


Digitavel do Codigo de Barras

oPrint:Line (2100,100,2100,2300 )
oPrint:Line (2200,100,2200,2300 )
oPrint:Line (2270,100,2270,2300 )
oPrint:Line (2340,100,2340,2300 )

oPrint:Line (2200,500,2340,500)
oPrint:Line (2270,750,2340,750)
oPrint:Line (2200,1000,2340,1000)
oPrint:Line (2200,1350,2270,1350)
oPrint:Line (2200,1550,2340,1550)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
228
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (2000,100 ,"Local de Pagamento" ,oFont8)
oPrint:Say (2040,100 ,"QUALQUER BANCO ATÉ A DATA DO VENCIMENTO"
,oFont10)

oPrint:Say (2000,1910,"Vencimento" ,oFont8)


oPrint:Say (2040,2010,DTOC(aDadosTit[4]) ,oFont10)

oPrint:Say (2100,100 ,"Cedente" ,oFont8)


//oPrint:Say (2140,100 ,aDadosEmp[1]+" - "+aDadosEmp[6] ,oFont10)
//Nome + CNPJ
// endereço cedente
oPrint:Say (2125,100 ,aDadosEmp[1]+" - "+aDadosEmp[6] ,oFont10)
//Nome + CNPJ
oPrint:Say (2160,100 ,ALLTRIM(aDadosEmX[2]),oFont10) //endereco

oPrint:Say (2100,1910,"Agência/Código Cedente" ,oFont8)


oPrint:Say (2140,2010,aDadosBanco[3]+"/"+aDadosBanco[4]+"-
"+aDadosBanco[5],oFont10)

oPrint:Say (2200,100 ,"Data do Documento" ,oFont8)


oPrint:Say (2230,100 ,DTOC(aDadosTit[2]) ,oFont10) // Emissao
do Titulo (E1_EMISSAO)

oPrint:Say (2200,505 ,"Nro.Documento" ,oFont8)


oPrint:Say (2230,605 ,aDadosTit[7]+aDadosTit[1]
,oFont10) //Prefixo +Numero+Parcela

oPrint:Say (2200,1005,"Espécie Doc." ,oFont8)


oPrint:Say (2230,1050,aDadosTit[8]
,oFont10) //Tipo do Titulo

oPrint:Say (2200,1355,"Aceite" ,oFont8)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
229
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oPrint:Say (2230,1455,"N" ,oFont10)

oPrint:Say (2200,1555,"Data do Processamento" ,oFont8)


oPrint:Say (2230,1655,DTOC(aDadosTit[3]) ,oFont10) // Data
impressao

oPrint:Say (2200,1910,"Nosso Número" ,oFont8)


oPrint:Say
(2230,2010,Substr(aDadosTit[6],1,3)+"/"+Substr(aDadosTit[6],4),oFont10)

oPrint:Say (2270,100 ,"Uso do Banco" ,oFont8)

oPrint:Say (2270,505 ,"Carteira" ,oFont8)


oPrint:Say (2300,555 ,aDadosBanco[6] ,oFont10)

oPrint:Say (2270,755 ,"Espécie" ,oFont8)


oPrint:Say (2300,805 ,"R$" ,oFont10)

oPrint:Say (2270,1005,"Quantidade" ,oFont8)


oPrint:Say (2270,1555,"Valor" ,oFont8)

oPrint:Say (2270,1910,"Valor do Documento" ,oFont8)


oPrint:Say (2300,2010,AllTrim(Transform(aDadosTit[5],"@E
999,999,999.99")),oFont10)

oPrint:Say (2340,100 ,"Instruções (Todas informações deste bloqueto são de


exclusiva responsabilidade do cedente)",oFont8)
oPrint:Say (2440,100 ,aBolText[1] ,oFont10)
oPrint:Say (2490,100 ,aBolText[2]+"
"+AllTrim(Transform(((aDadosTit[5]*nPercMora)/30),"@E 99,999.99")) ,oFont10)

oPrint:Say (2540,100 ,aBolText[3] ,oFont10)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
230
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

oPrint:Say (2340,1910,"(-)Desconto/Abatimento" ,oFont8)


oPrint:Say (2370,2010,AllTrim(Transform(aDadosTit[9],"@E 99,999.99")),oFont10)
oPrint:Say (2410,1910,"(-)Outras Deduções" ,oFont8)
oPrint:Say (2480,1910,"(+)Mora/Multa" ,oFont8)
oPrint:Say (2550,1910,"(+)Outros Acréscimos" ,oFont8)
oPrint:Say (2580,2010,AllTrim(Transform(aDadosTit[10],"@E 99,999.99")) ,oFont10)
oPrint:Say (2620,1910,"(=)Valor Cobrado" ,oFont8)

oPrint:Say (2690,100 ,"Sacado" ,oFont8)


oPrint:Say (2720,400 ,aDatSacado[1]+" ("+aDatSacado[2]+")" ,oFont10)
oPrint:Say (2773,400 ,aDatSacado[3] ,oFont10)
oPrint:Say (2826,400 ,aDatSacado[6]+" "+aDatSacado[4]+" -
"+aDatSacado[5],oFont10) // CEP+Cidade+Estado
oPrint:Say (2879,400 ,"CGC: "+TRANSFORM(aDatSacado[7],"@R
99.999.999/9999-99"),oFont10) // CGC
oPrint:Say (2879,1850,Substr(aDadosTit[6],1,3)+"/00"+Substr(aDadosTit[6],4,8)
,oFont10)

oPrint:Say (2895,100 ,"Sacador/Avalista" ,oFont8)


oPrint:Say (2935,1500,"Autenticação Mecânica -" ,oFont8)
oPrint:Say (2935,1850,"Ficha de Compensação" ,oFont10)

oPrint:Line (2000,1900,2690,1900 )
oPrint:Line (2410,1900,2410,2300 )
oPrint:Line (2480,1900,2480,2300 )
oPrint:Line (2550,1900,2550,2300 )
oPrint:Line (2620,1900,2620,2300 )
oPrint:Line (2690,100 ,2690,2300 )

oPrint:Line (2930,100,2930,2300 )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
231
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

oPrint:EndPage() // Finaliza a página

Return Nil

Static Function Modulo10(cData)


LOCAL L,D,P := 0
LOCAL B := .F.
L := Len(cData)
B := .T.
D := 0
// MsgBox("Veio os Dados ("+cData+") Boleto Itau. Deseja Imprimir o Boleto Itaú?",
"Impressão de Boleto ITAÚ", "YESNO")
While L > 0
P := Val(SubStr(cData, L, 1))
If (B)
P := P * 2
If P > 9
P := P - 9
End
End
D := D + P
L := L - 1
B := !B
End
D := 10 - (Mod(D,10))
If D = 10
D := 0
End
Return(D)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
232
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Static Function Modulo11(cData)
LOCAL L, D, P := 0
L := Len(cdata)
D := 0
P := 1
While L > 0
P := P + 1
D := D + (Val(SubStr(cData, L, 1)) * P)
If P = 9
P := 1
End
L := L - 1
End
D := 11 - (mod(D,11))
If (D == 0 .Or. D == 1 .Or. D == 10 .Or. D == 11)
D := 1
End
Return(D)

Static Function ValidPerg()


_sAlias := Alias()
DBSelectArea("SX1")
DBSetOrder(1)
cPerg := PADR(cPerg,6)
aRegs:={}

PutSx1( cPerg,"01","Banco ?"," "," ","mv_ch1","C",


3,0,0,"G","","SA6","","","mv_par01"," ","",""," ","","","","","","","","","","","","","","","","",""
)
PutSx1( cPerg,"02","Agencia ?"," "," ","mv_ch2","C",
5,0,0,"G","","","","","mv_par02"," ","",""," ","","","","","","","","","","","","","","","","","" )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
233
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
PutSx1( cPerg,"03","Conta ?"," "," ","mv_ch3","C",
10,0,0,"G","","","","","mv_par03"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"04","Do Prefixo ?"," "," ","mv_ch4","C",
3,0,0,"G","","","","","mv_par04"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"05","Ate o Prefixo ?"," "," ","mv_ch5","C",
3,0,0,"G","","","","","mv_par05"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"06","Do Titulo ?"," "," ","mv_ch6","C",
6,0,0,"G","","SE1","","","mv_par06"," ","",""," ","","","","","","","","","","","","","","","","",""
)
PutSx1( cPerg,"07","Ate o Titulo ?"," "," ","mv_ch7","C",
6,0,0,"G","","SE1","","","mv_par07"," ","",""," ","","","","","","","","","","","","","","","","",""
)
PutSx1( cPerg,"08","Da Parcela ?"," "," ","mv_ch8","C",
1,0,0,"G","","","","","mv_par08"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"09","Ate a Parcela ?"," "," ","mv_ch9","C",
1,0,0,"G","","","","","mv_par09"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"10","Do Portador ?"," "," ","mv_chA","C",
3,0,0,"G","","","","","mv_par10"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"11","Ate o Portador ?"," "," ","mv_chB","C",
3,0,0,"G","","","","","mv_par11"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"12","Do Cliente ?"," "," ","mv_chC","C",
6,0,0,"G","","SA1","","","mv_par12"," ","",""," ","","","","","","","","","","","","","","","","",""
)
PutSx1( cPerg,"13","Ate o Cliente ?"," "," ","mv_chD","C",
6,0,0,"G","","SA1","","","mv_par13"," ","",""," ","","","","","","","","","","","","","","","","",""
)
PutSx1( cPerg,"14","Da Loja ?"," "," ","mv_chE","C",
2,0,0,"G","","","","","mv_par14"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"15","Ate a Loja ?"," "," ","mv_chF","C",
2,0,0,"G","","","","","mv_par15"," ","",""," ","","","","","","","","","","","","","","","","","" )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
234
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
PutSx1( cPerg,"16","Do Vencimento ?"," ","
","mv_chG","D", 8,0,0,"G","","","","","mv_par16"," ","","","
","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"17","Ate o Vencimento ?"," ","
","mv_chH","D", 8,0,0,"G","","","","","mv_par17"," ","","","
","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"18","Da Emissao ?"," "," ","mv_chI","D",
8,0,0,"G","","","","","mv_par18"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"19","Ate a Emissao ?"," "," ","mv_chJ","D",
8,0,0,"G","","","","","mv_par19"," ","",""," ","","","","","","","","","","","","","","","","","" )
PutSx1( cPerg,"20","Percent Mora ?"," ","
","mv_chN","N",05,2,0,"C","","","","","mv_par20"," ","","","
","","","","","","","","","","","","","","","","","" )

Exercício 2:
Respostas:
#Include "PROTHEUS.CH"

User Function xEx2Cap3()

MPReport("xEx2Cap3","SA6", "Relacao de Bancos", "Emissao do Cadastro de


Bancos"+ "Ira imprimir os dados dos bancos "+ "de acordo com a configuracao do
usuario.",;
{ " Por Codigo ", " Alfabetica ", " Por "+RTrim(RetTitle("A6_CGC"))})

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
235
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
236
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Exercício 3:
Respostas:
#include "protheus.ch"

User Function xEx3Cap3()

Local oReport
Private cPerg := "XEx3Cap3"

oReport := ReportDef()
oReport:PrintDialog()

Return

// Impressao
Static Function ReportDef()

Local oReport
Local oSection1
Local oSection2
Local cTexto := " "
Local cAlias := " "

oReport := TReport():New("XEx3Cap3","LEI Nº 12.007",cPerg,{|oReport|


PrintReport(oReport)},"Relatório de quitação de Debitos")

AjustaSX1(cPerg)

Pergunte(cPerg,.F.)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
237
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oSection1 := TRSection():New(oReport,"DECLARAÇÃO DE QUITAÇÃO
ANUAL DE DÉBITOS "+ALLTRIM(SM0->M0_NOME),,,,,,,,,,.T.,/*25*/,,,.F.)
oSection1:oReport:nFontBody := 20
oSection2 := TRSection():New(oReport,"QUITAÇÃO ANUAL DE
DÉBITOS",cAlias,,,,,,,,,.T.,,,,.T.)
oSection2:oReport:nFontBody := 12

oReport:SetLineHeight(50)
TRCell():New(oSection1,"DECLARACAO","",,,80,,,,.T.,"LEFT",.F.,,.F.)

TRCell():New(oSection2,"E1_CLIENTE",cAlias,,PesqPict("SE1","E1_CLIENT
E"), TamSX3("E1_CLIENTE")[1],,,,,"LEFT")
TRCell():New(oSection2,"E1_LOJA",cAlias,,PesqPict("SE1","E1_LOJA"),
TamSX3("E1_LOJA")[1],,,,,"LEFT")
TRCell():New(oSection2,"A1_NOME",cAlias,,PesqPict("SA1","A1_NOME"),
TamSX3("A1_NOME")[1],,,,,"LEFT")
TRCell():New(oSection2,"MÊS",cAlias,,,10,,,,,"LEFT") // MES
TRCell():New(oSection2,"SALDO
PAGO",cAlias,,PesqPict("SE1","E1_SALDO"),
TamSX3("E1_SALDO")[1],,,,,"RIGHT")

Return oReport

Static Function PrintReport(oReport)


Local oSection1 := oReport:Section(1)
Local oSection2 := oReport:Section(2)
Local cQuery := ""
Local cTitulo := "Quitação ANUAL de Débitos"
Local lSimples := MV_PAR06 == 1 // Simplificado = 1 / Detalhado = 2
Local lModified := .F.
Local cCliLoj := ""

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
238
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Local cAno := Alltrim(MV_PAR05)
Local cEmpresa := ALLTRIM(SM0->M0_NOME)
Local lPETexto := ExistBlock("FIN127TXT")
Local lPEQry := ExistBlock("FIN127QRY")
Local lPETitulo := ExistBlock("FIN127TIT")

#IFDEF TOP

If lSimples

cAlias := GetNextAlias()

cQuery := " SELECT "


cQuery += " COUNT(SE1.E1_CLIENTE) AS QTD, SE1.E1_CLIENTE,
SE1.E1_LOJA, SA1.A1_NOME NOME, SUM(SE1.E1_SALDO) SALDO "
cQuery += " FROM " + RetSqlName('SE1') + " SE1 "
cQuery += " JOIN " + RetSqlName("SA1") + " SA1 ON (SE1.E1_LOJA
= SA1.A1_LOJA) AND (SE1.E1_CLIENTE = SA1.A1_COD) "
cQuery += " WHERE "
cQuery += " SE1.E1_CLIENTE >= '" + MV_PAR01 + "' "
cQuery += " AND SE1.E1_CLIENTE <= '" + MV_PAR02 + "' "
cQuery += " AND SE1.E1_LOJA >= '" + MV_PAR03 + "' "
cQuery += " AND SE1.E1_LOJA <= '" + MV_PAR04 + "' "
cQuery += " AND SUBSTRING(SE1.E1_VENCREA,1,4) = '" +
MV_PAR05 + "' "
cQuery += " AND SE1.E1_TIPOLIQ = ' ' "
cQuery += " AND SE1.E1_TIPOFAT = ' ' "
cQuery += " AND SE1.E1_TIPO NOT IN ('RA ', 'NCC') "
cQuery += " AND SE1.E1_TIPO NOT IN ('AB-','IR-', 'IN-','IS-','PI-','CF-
','CS-','FU-','FE-') "
cQuery += " AND SE1.D_E_L_E_T_ = ' ' "
cQuery += " AND SA1.D_E_L_E_T_ = ' ' "

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
239
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cQuery += " GROUP BY E1_CLIENTE,E1_LOJA,A1_NOME "
cQuery += " ORDER BY E1_CLIENTE,E1_LOJA,A1_NOME "

Else

cAlias := GetNextAlias()

cQuery := " SELECT "


cQuery += " SE1.E1_CLIENTE, SE1.E1_LOJA, SA1.A1_NOME
NOME, SUM(SE1.E1_SALDO) SALDO, SUM(SE1.E1_VALOR) VALOR,
SUBSTRING(SE1.E1_VENCREA,5,2) MES "
cQuery += " FROM " + RetSqlName('SE1') + " SE1 "
cQuery += " JOIN " + RetSqlName("SA1") + " SA1 ON (SE1.E1_LOJA
= SA1.A1_LOJA) AND (SE1.E1_CLIENTE = SA1.A1_COD) "
cQuery += " WHERE "
cQuery += " SE1.E1_CLIENTE >= '" + MV_PAR01 + "' "
cQuery += " AND SE1.E1_CLIENTE <= '" + MV_PAR02 + "' "
cQuery += " AND SE1.E1_LOJA >= '" + MV_PAR03 + "' "
cQuery += " AND SE1.E1_LOJA <= '" + MV_PAR04 + "' "
cQuery += " AND SUBSTRING(SE1.E1_VENCREA,1,4) = '" +
MV_PAR05 + "' "
cQuery += " AND SE1.E1_TIPOLIQ = ' ' "
cQuery += " AND SE1.E1_TIPOFAT = ' ' "
cQuery += " AND SE1.E1_TIPO NOT IN ('RA ', 'NCC') "
cQuery += " AND SE1.E1_TIPO NOT IN ('AB-','IR-', 'IN-','IS-','PI-','CF-
','CS-','FU-','FE-') "
cQuery += " AND SE1.D_E_L_E_T_ = ' ' "
cQuery += " AND SA1.D_E_L_E_T_ = ' ' "
cQuery += " AND SA1.D_E_L_E_T_ = ' ' "
cQuery += " AND SE1.E1_CLIENTE || SE1.E1_LOJA NOT IN (
cQuery += " SELECT "
cQuery += " A.E1_CLIENTE || A.E1_LOJA "

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
240
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cQuery += " FROM " + RetSqlName('SE1') + " A "
cQuery += " JOIN " + RetSqlName("SA1") + " B ON
(A.E1_LOJA = B.A1_LOJA) AND (A.E1_CLIENTE = B.A1_COD) "
cQuery += " WHERE "
cQuery += " A.E1_CLIENTE >= '" + MV_PAR01 + "' "
cQuery += " AND A.E1_CLIENTE <= '" + MV_PAR02 + "' "
cQuery += " AND A.E1_LOJA >= '" + MV_PAR03 + "' "
cQuery += " AND A.E1_LOJA <= '" + MV_PAR04 + "' "
cQuery += " AND SUBSTRING(A.E1_VENCREA,1,4) = '" +
MV_PAR05 + "' "
cQuery += " AND A.E1_SALDO > 0 "
cQuery += " AND A.E1_TIPOLIQ = ' ' "
cQuery += " AND A.E1_TIPOFAT = ' ' "
cQuery += " AND A.E1_TIPO NOT IN ('RA ', 'NCC') "
cQuery += " AND A.E1_TIPO NOT IN ('AB-','IR-', 'IN-','IS-','PI-
','CF-','CS-','FU-','FE-') "
cQuery += " AND A.D_E_L_E_T_ = ' ' "
cQuery += " AND B.D_E_L_E_T_ = ' ' "

cQuery += " ) "

cQuery += " GROUP BY


A1_NOME,E1_CLIENTE,E1_LOJA,SUBSTRING(SE1.E1_VENCREA,5,2) "
cQuery += " ORDER BY A1_NOME,E1_CLIENTE,E1_LOJA,MES "

Endif

If lPEQry
cQuery:= ExecBlock("FIN127QRY", .F.,.F.,
{cQuery,MV_PAR01,MV_PAR02,MV_PAR03,MV_PAR04,MV_PAR05,MV_P
AR06})
EndIf

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
241
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

cQuery := ChangeQuery(cQuery)

dbUseArea( .T., "TOPCONN", TcGenQry(,,cQuery),cAlias , .T., .F. )

oSection1:Cell("DECLARACAO"):SetBlock( { || cTexto } )

DbSelectArea(cAlias)
(cAlias)->(dbGoTop())

If !lSimples
oSection2:Cell("E1_CLIENTE"):SetBlock( { || (cAlias)->(E1_CLIENTE)
})
oSection2:Cell("E1_LOJA"):SetBlock( { || (cAlias)->(E1_LOJA) } )
oSection2:Cell("A1_NOME"):SetBlock( { || (cAlias)->(NOME) } )
oSection2:Cell("MÊS"):SetBlock( { || MesExtenso( Val((cAlias)-
>(MES))) } ) //"MÊS"
oSection2:Cell("SALDO PAGO"):SetBlock( { || (cAlias)->(VALOR) } )
//"SALDO PAGO"
Endif

If lPETitulo
cTitulo := ExecBlock("FIN127TIT", .F.,.F., {cTitulo})
EndIf

oReport:SetTitle(cTitulo)

If lSimples

While !(cAlias)->(eof())
If (cAlias)->(SALDO) == 0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
242
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cTexto := "Em cumprimento à Lei 12.007, de 29
de julho de 2009, o "+cEmpresa+" declara que o cliente "+Alltrim((cAlias)-
>(NOME))+" está quite quanto às faturas com vencimento no ano de
"+cAno+". Esta declaração substitui, para comprovação do cumprimento das
obrigações do cliente, "+"as quitações dos pagamentos mensais das faturas
do ano de "+cAno+", bem como dos anos anteriores."

oSection1:Init()
oSection1:Printline()
oSection1:Finish()
oReport:EndPage()
Endif

(cAlias)->(dbSkip())
EndDo

Else

oSection1:Init()
oSection2:Init()
cCliLoj := (cAlias)->(E1_CLIENTE)+(cAlias)->(E1_LOJA)

While !(cAlias)->(eof())

If (cAlias)->(SALDO) == 0
cTexto := "Em cumprimento à Lei 12.007, de 29 de
julho de 2009, o "+cEmpresa+" declara que o cliente "+Alltrim((cAlias)-
>(NOME))+" está quite quanto às faturas com vencimento no ano de
"+cAno+". Esta declaração substitui, para comprovação do cumprimento das
obrigações do cliente, "+"as quitações dos pagamentos mensais das faturas
do ano de "+cAno+ ", bem como dos anos anteriores."

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
243
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
If cCliLoj <> (cAlias)->(E1_CLIENTE)+(cAlias)->(E1_LOJA)
oSection1:Finish()
oSection2:Finish()
oReport:EndPage()
oSection1:Init()
oSection2:Init()
oSection1:Printline()
oSection2:Printline()
cCliLoj := (cAlias)->(E1_CLIENTE)+(cAlias)-
>(E1_LOJA)
lModified := .T.
Else
If !lModified
oSection1:Printline()
lModified := .T.
Endif
oSection2:Printline()
Endif

Endif

(cAlias)->(dbSkip())
EndDo

Endif

oSection1:Finish()
oSection2:Finish()

#ENDIF

If Select(cAlias)>0

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
244
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
(cAlias)->(DbClosearea())
Endif

Return NIL

Static Function AjustaSX1(cPerg)


Local aArea := GetArea()

dbSelectArea( "SX1" )
dbSetOrder( 1 )

// 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)

If !dbSeek( cPerg )
PutSx1(cPerg,"01","Cliente De?" ,"Cliente De?" ,"Cliente
De?" ,"mv_ch1","C",TamSx3('E1_CLIENTE')[1] ,0,0,"G","","SA1"
,"","" ,"MV_PAR01")
PutSx1(cPerg,"02","Cliente Ate?" ,"Cliente Ate?" ,"Cliente
Ate?" ,"mv_ch2","C",TamSx3('E1_CLIENTE')[1] ,0,0,"G","","SA1"
,"","" ,"MV_PAR02")
PutSx1(cPerg,"03","Loja De?" ,"Loja De?"
,"Loja De?" ,"mv_ch3","C",TamSx3('E1_LOJA')[1]
,0,0,"G","","" ,"","" ,"MV_PAR03")

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
245
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
PutSx1(cPerg,"04","Loja Ate?" ,"Loja Ate?" ,"Loja
Ate?" ,"mv_ch4","C",TamSx3('E1_LOJA')[1]
,0,0,"G","","" ,"","" ,"MV_PAR04")
PutSx1(cPerg,"05","Ano Base?" ,"Ano Base?" ,"Ano
Base?" ,"mv_ch5","C",4
,0,0,"G","","" ,"","" ,"MV_PAR05")
PutSx1(cPerg,"06","Estilo" ,"Estilo"
,"Estilo" ,"mv_ch6","C",1
,0,1,"C","","" ,"",""
,"MV_PAR06","Simplificado","","","","Detalhado","","","")
Endif

RestArea( aArea )

Return Nil

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
246
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CAPÍTULO 4
Exercício 1
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"

User Function XEx1Cap4()


Local aCampos:={}
Local cQuery:= {}

AADD(aCampos, {"'Z1_FILIAL'" , "'"+ XfILIAL("SZ1") +"'" ,Nil})

AADD(aCampos, {"'Z1_CODIGO'" , "'000001'" ,Nil})


AADD(aCampos, {"'Z1_DESCRI'" , "'AMARELO'" ,Nil})

CQuery:= " INSERT INTO " + RETSQLNAME("SZ1") + " ("


For i := 1 To Len(aCampos)
For i := 1 To Len(aCampos)
cQuery+= (aCampos[i][1])+","
Next i
Next i
cQuery = Strtran(cquery,"'","")
cQuery:= SubStr(cQuery,1,Len(cQuery)-1) + ") VALUES ("
For i := 1 To Len(aCampos)
For i := 1 To Len(aCampos)
cQuery+="'"+ &(aCampos[i][2])+"'"+","
Next i
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
247
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Next i
cQuery:= SubStr(cQuery,1,Len(cQuery)-1) + ") "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT Z1_CODIGO , Z1_DESCRI "


cQuery += " FROM " + RetSqlName("SZ1") + " SZ1 "
cQuery += " WHERE SZ1.D_E_L_E_T_ = '' "

TCQUERY cQuery NEW ALIAS "TRB"


DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo("INCLUIDO " + TRB->Z1_CODIGO + " " + ALLTRIM(TRB-
>Z1_DESCRI) ,"Ex.1 Cap.4")
TRB->(DbSkip())
EndDo
If Select("TRB" ) >0
TRB->(DbClosearea())
Endif

cQuery:= " UPDATE " + RETSQLNAME("SZ1")


cQuery:= " SET Z1_DESCRI = 'LARANJA'"
cQuery:= " WHERE Z1_CODIGO = '000001'"
cQuery:= " AND SZ1.D_E_L_E_T_ = '' "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT Z1_CODIGO, Z1_DESCRI "

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
248
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cQuery += " FROM " + RetSqlName("SZ1") + " SZ1 "
cQuery += " WHERE SZ1.D_E_L_E_T_ = '' "
cQuery += " AND Z1_CODIGO = '000001'"

TCQUERY cQuery NEW ALIAS "TRB"


DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()
MsgInfo( ALLTRIM(TRB->Z1_CODIGO) + ' ' + TRB-
>Z1_DESCRI,"ALTERACAO")
TRB->(DbSkip())
EndDo
If Select("TRB" ) > 0
TRB->(DbClosearea())
Endif

// EXCLUSAO
cQuery:= " DELETE FROM " + RETSQLNAME("SZ1")
cQuery:= " WHERE Z1_CODIGO = '000001'"
cQuery:= " AND SZ1.D_E_L_E_T_ = '' "

TCSQLExec(cQuery)
TCSQLExec("COMMIT")

cQuery := "SELECT Z1_CODIGO , Z1_DESCRI "


cQuery += " FROM " + RetSqlName("SZ1") + " SZ1 "
cQuery += " WHERE SZ1.D_E_L_E_T_ = '' "

TCQUERY cQuery NEW ALIAS "TRB"


DbSelectArea("TRB")
DbGoTop()
Do While ! Eof()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
249
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
MsgInfo( ALLTRIM(TRB->Z1_CODIGO) + ' ' + TRB-
>Z1_DESCRI,"Delete")
TRB->(DbSkip())
EndDo
If Select("TRB" ) > 0
TRB->(DbClosearea())
Endif
Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
250
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CAPÍTULO 5
Exercício 1
#include 'protheus.ch'
User Function xEx1Cap5()
Local oReport

oReport := ReportDef()
oReport:PrintDialog()

Return

Static Function ReportDef()


Local oReport
Local oSection1
Local cAliasQry1 := GetNextAlias()

oReport := TReport():New("xEx1Cap5","Relacao de faturas","xEx1Cap5",;


//"Relacao de faturas"
{|oReport| ReportPrint(oReport,cAliasQry1)},"Este programa emitira a Relacao das
faturas a pagar, e o detalhe dos titulos que compoem cada fatura. ")

oReport:SetPortrait(.T.)
AjustaSX1()
pergunte("xEx1Cap5",.F.)

oSection1 :=
TRSection():New(oReport,"Faturas",{"SE2","SA2","SED"},{"Fornecedor","Prefixo+Nu
m"} )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
251
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TRCell():New(oSection1,"E2_FORNECE","SE2",,,,.F.,{|| (cAliasQry1)-
>E2_FORNECE})
TRCell():New(oSection1,"E2_LOJA" ,"SE2",,,,.F.,{|| (cAliasQry1)->E2_LOJA})
TRCell():New(oSection1,"E2_NATUREZ","SE2",,,,.F.,{|| (cAliasQry1)-
>E2_NATUREZ})
TRCell():New(oSection1,"E2_NOMFOR" ,"SE2",,,,.F.,{|| (cAliasQry1)-
>E2_NOMFOR})
TRCell():New(oSection1,"E2_PREFIXO","SE2",,,,.F.,{|| (cAliasQry1)-
>E2_PREFIXO})
TRCell():New(oSection1,"E2_NUM" ,"SE2",,,,.F.,{|| (cAliasQry1)->E2_NUM})
TRCell():New(oSection1,"E2_PARCELA","SE2",,,,.F.,{|| (cAliasQry1)-
>E2_PARCELA})
TRCell():New(oSection1,"E2_TIPO" ,"SE2",,,,.F.,{|| (cAliasQry1)->E2_TIPO})
TRCell():New(oSection1,"E2_EMIS1" ,"SE2",,,,.F.,{|| (cAliasQry1)->E2_EMIS1})
TRCell():New(oSection1,"E2_VENCREA","SE2",,,,.F.,{|| (cAliasQry1)-
>E2_VENCREA})
TRCell():New(oSection1,"E2_VLCRUZ" ,"SE2",,,13,.F.,{|| (cAliasQry1)-
>E2_VLCRUZ})
TRCell():New(oSection1,"E2_MOEDA" ,"SE2",,,13,.F.,{|| (cAliasQry1)-
>E2_MOEDA})
TRCell():New(oSection1,"E2_VALOR" ,"SE2",,,13,.F.,{|| (cAliasQry1)->E2_VALOR})
TRCell():New(oSection1,"E2_SALDO" ,"SE2",,,13,.F.,{|| (cAliasQry1)->E2_SALDO})
oSection1:SetTotalInLine(.T.)

oSection2 := TRSection():New(oSection1,"Composicao da
Fatura",{"SE2","SA2","SED"})
TRCell():New(oSection2,"E2_PREFIXO","SE2",,,,.F.,)
TRCell():New(oSection2,"E2_NUM" ,"SE2",,,,.F.,)
TRCell():New(oSection2,"E2_PARCELA","SE2",,,,.F.,)
TRCell():New(oSection2,"E2_TIPO" ,"SE2",,,,.F.,)
TRCell():New(oSection2,"E2_EMIS1" ,"SE2",,,,.F.,)
TRCell():New(oSection2,"E2_VENCTO" ,"SE2",,,,.F.,)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
252
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
TRCell():New(oSection2,"E2_VENCREA","SE2",,,,.F.,)
TRCell():New(oSection2,"E2_VLCRUZ" ,"SE2",,,13,.F.,)
TRCell():New(oSection2,"E2_MOEDA" ,"SE2",,,13,.F.,)
TRCell():New(oSection2,"E2_VALOR" ,"SE2",,,13,.F.,)
oSection2:SetNoFilter({"SE2","SA2","SED"})
oSection2:LHEADERVISIBLE := .T.
oSection2:nLeftMargin := 10

Return oReport

Static Function ReportPrint(oReport,cAliasQry1)


Local oSection1 := oReport:Section(1)
Local oSection2 := oSection1:Section(1)
Local cQuery := ""
Local cKey
Local cAliasQry2 := GetNextAlias()
Local cForChave := ""
Local cLojChave := ""
Local cPref := ""
Local cNum := ""
Local cTipo := ""
Local cFornece := ""
Local cLoja := ""
Local cOrder :=
If(oSection1:GetOrder()==1,"E2_FORNECE,E2_LOJA,E2_PREFIXO,E2_NU
M,E2_PARCELA","E2_PREFIXO,E2_NUM,E2_PARCELA,E2_FORNECE,E2_LOJA"
)
Local cFilterUser := oSection1:GetSqlExp()

dbSelectArea("SE2")
dbSetorder(1)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
253
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cKey := SqlOrder(IndexKey())
oSection1:BeginQuery()

If mv_par11 == 1
cQuery += " AND E2_SALDO = 0 "
Else
cQuery += " AND E2_SALDO <> 0 "
EndIf
If !Empty(cFilterUser)
cQuery += " AND ("+cFilterUser+") "
Endif
cQuery += " ORDER BY "+cOrder

cQuery := "%" + cQuery + "%"

BeginSql Alias cAliasQry1

SELECT SE2.*
FROM %table:SA2% SA2, %table:SE2% SE2
LEFT JOIN %table:SED% SED ON
SED.ED_FILIAL = %xFilial:SED%
AND SED.ED_CODIGO = SE2.E2_NATUREZ
AND SED.%NotDel%
WHERE E2_FILIAL = %xFilial:SE2% AND
E2_FATURA = 'NOTFAT' AND
E2_FORNECE between %exp:mv_par01% AND
%exp:mv_par02% AND
E2_LOJA between %exp:mv_par03% AND
%exp:mv_par04% AND
E2_EMIS1 between %exp:mv_par05% AND
%exp:mv_par06% AND

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
254
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
E2_PREFIXO between %exp:mv_par07% AND
%exp:mv_par08% AND
E2_NATUREZ between %exp:mv_par09% AND
%exp:mv_par10% AND
A2_FILIAL = %xFilial:SA2% AND

A2_COD = E2_FORNECE AND


A2_LOJA = E2_LOJA AND
SA2.%NotDel% AND
SE2.%NotDel%
%Exp:cQuery%
EndSql

oSection1:EndQuery()

oReport:SetMeter((cAliasQry1)->(LastRec()))
DbSelectArea(cAliasQry1)
dbGoTop()
cForChave := (cAliasQry1)->E2_FORNECE
cLojChave := (cAliasQry1)->E2_LOJA
cPref := (cAliasQry1)->E2_PREFIXO
cNum := (cAliasQry1)->E2_NUM
cTipo := (cAliasQry1)->E2_TIPO
cFornece := (cAliasQry1)->E2_FORNECE
cLoja := (cAliasQry1)->E2_LOJA

lImp := .F.
While !Eof()
lImp := .T.
If oReport:Cancel()
Exit
EndIf

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
255
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

If cForChave+cLojChave+cPref+cNum+cTipo <> (cAliasQry1)-


>(E2_FORNECE+E2_LOJA+E2_PREFIXO+E2_NUM+E2_TIPO)

PrintSec2(oReport,oSection1,oSection2,cNum,cPref,cTipo,cFornece,cLoja,cA
liasQry2)
oReport:SkipLine()
Endif

oSection1:Init()
oReport:IncMeter((cAliasQry1)->(LastRec()))
oSection1:PRINTLINE()
cForChave := (cAliasQry1)->E2_FORNECE
cLojChave := (cAliasQry1)->E2_LOJA
cPref := (cAliasQry1)->E2_PREFIXO
cNum := (cAliasQry1)->E2_NUM
cTipo := (cAliasQry1)->E2_TIPO
cFornece := (cAliasQry1)->E2_FORNECE
cLoja := (cAliasQry1)->E2_LOJA

DbSelectArea(cAliasQry1)
DbSkip()
Enddo
If lImp
PrintSec2(oReport,oSection1,oSection2,cNum,cPref,cTipo,cFornece,cLoja,cA
liasQry2)
Endif
oSection1:Finish()

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
256
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Static Function
PrintSec2(oReport,oSection1,oSection2,cNum,cPref,cTipo,cFornece,cLoja,cAliasQry
2)
Local lDuplFat := SE2->(FieldPos("E2_FATFOR")) > 0 .And. SE2-
>(FieldPos("E2_FATLOJ")) > 0
Local cWhere := ""

If lDuplFat
cWhere := "((E2_FATFOR ='" + cFornece + "' AND "
cWhere += " E2_FATLOJ ='" + cLoja + "') OR "
cWhere += "(E2_FORNECE ='" + cFornece + "'AND "
cWhere += "E2_LOJA ='"+ cLoja +"')) "
Else
cWhere := "E2_FORNECE ='" + cFornece + "' AND "
cWhere += "E2_LOJA ='"+ cLoja +"' "
EndIf

cWhere := "%" + cWhere + "%"

BeginSql Alias cAliasQry2


SELECT SE2.R_E_C_N_O_ SE2REC, SA2.R_E_C_N_O_ SA2REC,
SED.R_E_C_N_O_ SEDREC
FROM %table:SA2% SA2, %table:SE2% SE2
LEFT JOIN %table:SED% SED ON
SED.ED_FILIAL = %xFilial:SED%
AND SED.ED_CODIGO = SE2.E2_NATUREZ
AND SED.%NotDel%
WHERE E2_FILIAL = %xFilial:SE2% AND
E2_FATURA = %exp:cNum% AND
E2_FATPREF= %exp:cPref% AND
E2_TIPOFAT= %exp:cTipo% AND
E2_FLAGFAT= 'S' AND

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
257
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
%Exp:cWhere% AND
SE2.%NotDel% AND
A2_FILIAL = %xFilial:SA2% AND

A2_COD = E2_FORNECE AND


A2_LOJA = E2_LOJA AND
SA2.%NotDel%
EndSql
SA2->(dBsETORDER(1))
SED->(dBsETORDER(1))
DbSelectArea(cAliasQry2)
DbGoTop()
oSection2:Init()
If EOF()
oReport:PrintText('Nao foi possivel achar o detalhe desta fatura')

Else
While !Eof()
SE2->(MsGoTo((cAliasQry2)->(SE2REC)))
SA2->(MsGoTo((cAliasQry2)->(SA2REC)))
If (cAliasQry2)->SEDREC <> Nil .And.(cAliasQry2)->SEDREC
>0
SED->(MsGoTo((cAliasQry2)->SEDREC))
Endif
oSection2:PRINTLINE()
DbSelectArea(cAliasQry2)
DbSkip()
Enddo
Endif
DbSelectArea(cAliasQry2)
DbCloseArea()
oSection2:Finish()

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
258
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
oSection1:Finish()
Return

Static Function AjustaSX1()

Local aHelpPor := {}
Local aHelpEng := {}
Local aHelpSpa := {}

Aadd( aHelpPor, "Indique o fornecedor inicial para filtrar" )


Aadd( aHelpSpa, "Indique el proveedor inicial para filtrar" )
Aadd( aHelpEng, "Inform the initial supplier to filter " )

PutSx1( "xEx1Cap5", "01","De fornecedor?","¿De proveedor?","From


Supplier?","mv_ch1",;
"C",TamSx3('E2_FORNECE')[1],0,1,"G","",;
"SA2","001","","mv_par01",;
"","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSpa)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique o fornecedor final para filtrar" )
Aadd( aHelpSpa, "Indique el proveedor final para filtrar" )
Aadd( aHelpEng, "Inform the final supplier to filter " )

PutSx1( "xEx1Cap5", "02","Até fornecedor?","¿A proveedor?","To


Supplier?","mv_ch2","C",tamSx3('E2_FORNECE')[1],0,1,"G","","SA2","001","",;
"mv_par02","","","","","","","","","","","","SA2","001","","","",aHelpPor,aHelpEng,a
HelpSpa)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
259
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a loja inicial para filtrar" )
Aadd( aHelpSpa, "Indique la sucursal inicial para filtrar" )
Aadd( aHelpEng, "Inform the initial branch to filter " )
PutSx1( "xEx1Cap5", "03","De loja?","¿De sucursal?","From
branch","mv_ch3","C",tamSx3('E2_LOJA')[1],0,1,"G","","","002","",;
"mv_par03",
"","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSpa)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a loja final para filtrar" )
Aadd( aHelpSpa, "Indique la sucursal final para filtrar" )
Aadd( aHelpEng, "Inform the final branch to filter " )
PutSx1( "xEx1Cap5", "04","Até loja?","¿A sucursal?","To
branch?","mv_ch4","C",tamSx3('E2_LOJA')[1],0,1,"G","","","002","",;

"mv_par04","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a data de emissao inicial para" )
Aadd( aHelpPor, "filtrar" )
Aadd( aHelpSpa, "Indique la fecha de emision inicial" )
Aadd( aHelpSpa, "para filtrar" )
Aadd( aHelpEng, "Informe the initial issue date to " )
Aadd( aHelpEng, "filter " )
PutSx1( "xEx1Cap5", "05","De emissao?","¿De emision?","From issue
date","mv_ch5","D",8,0,1,"G","","","","",;

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
260
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

"mv_par05","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a data de emissao final para" )
Aadd( aHelpPor, "filtrar" )
Aadd( aHelpSpa, "Indique la fecha de emision final")
Aadd( aHelpSpa, "para filtrar" )
Aadd( aHelpEng, "Inform the final issue date to " )
Aadd( aHelpEng, "filter " )
PutSx1( "xEx1Cap5", "06","Até emissao?","¿A emision?","To issue
date?","mv_ch6","D",8,0,1,"G","","","","",;

"mv_par06","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)

aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique o prefixo inicial para filtrar" )
Aadd( aHelpSpa, "Indique el prefijo inicial para filtrar" )
Aadd( aHelpEng, "Inform the initial prefix to filter " )
PutSx1( "xEx1Cap5", "07","De prefixo?","¿De prefijo?","From
prefix","mv_ch7","C",3,0,1,"G","","","","",;

"mv_par07","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
261
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Aadd( aHelpPor, "Indique o prefixo final para filtrar" )
Aadd( aHelpSpa, "Indique el prefijo final para filtrar" )
Aadd( aHelpEng, "Inform the final prefix to filter " )
PutSx1( "xEx1Cap5", "08","Até prefixo?","¿A prefijo?","To
prefix?","mv_ch8","C",3,0,1,"G","","","","",;

"mv_par08","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)

aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a natureza inicial para filtrar" )
Aadd( aHelpSpa, "Indique la modalidad inicial para filtrar" )
Aadd( aHelpEng, "Inform the initial class to filter " )
PutSx1( "xEx1Cap5", "09","De natureza?","¿De modadalidad?","From
class","mv_ch9","C",10,0,1,"G","","SED","","",;

"mv_par09","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique a natureza final para filtrar" )
Aadd( aHelpSpa, "Indique la modalidad final para filtrar" )
Aadd( aHelpEng, "Inform the final class to filter " )
PutSx1( "xEx1Cap5", "10","Até natureza?","¿A modalidad?","To
class?","mv_cha","C",10,0,1,"G","","SED","","",;

"mv_par10","","","","","","","","","","","","","","","","",aHelpPor,aHelpEng,aHelpSp
a)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
262
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
aHelpPor := {}
aHelpEng := {}
aHelpSpa := {}
Aadd( aHelpPor, "Indique se devem ser filtradas as " )
Aadd( aHelpPor, "faturas com saldo zerado." )
Aadd( aHelpSpa, "Indique si deben ser filtradas las " )
Aadd( aHelpSpa, "facturas com saldo cero." )
Aadd( aHelpEng, "Inform whether the invoices(faturas) " )
Aadd( aHelpEng, "whithout balance should be printed or not." )
PutSx1( "xEx1Cap5", "11","Imprime baixadas?","¿Imprime canceladas?","Print
zeroed?","mv_chb","N",1,0,1,"C","","","","",;

"mv_par11","Sim","Si","Yes","","Nao","No","No","","","","","","","","","",aHelpPor,
aHelpEng,aHelpSpa)

Return

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
263
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CAPÍTULO 6

Exercício 1

#include "protheus.ch"
User Function xEx1Cap6()
Local oGrvTXT
Private cAlias := "SA6"
dbSelectArea(cAlias)
dbSetOrder(1)

DEFINE MSDIALOG oGrvTXT TITLE OemToAnsi("Gera Arquivo Texto") FROM


000,000 TO 200,400 PIXEL
@ 005,005 TO 095,195 OF oGrvTXT PIXEL
@ 010,020 Say " Este programa gerara um arquivo texto, conforme os parame- ";
OF oGrvTXT PIXEL
@ 018,020 Say " tros definidos pelo usuário, com os registros do arquivo de ";
OF oGrvTXT PIXEL
@ 026,020 Say " SA6 " OF oGrvTXT PIXEL
DEFINE SBUTTON FROM 070, 030 TYPE 1 ACTION (GravaTXT(),oGrvTXT:End())
ENABLE OF oGrvTXT
DEFINE SBUTTON FROM 070, 070 TYPE 2 ACTION (oGrvTXT:End()) ENABLE OF
oGrvTXT

ACTIVATE DIALOG oGrvTXT CENTERED


Return Nil

Static Function GravaTXT


//+-----------------------------------------------------------------------------
//| Cria o arquivo texto
//+-----------------------------------------------------------------------------
Private cArqTxt := "\SYSTEM\EXPSA6.TXT"
Private nHdl := fCreate(cArqTxt)
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
264
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
If nHdl == -1
MsgAlert("O arquivo de nome "+cArqTxt+" não pode ser gerado! Verifique
osparâmetros.","Atenção!")
Return
Endif

Processa({|| RunCont() },"Processando...")


Return Nil
/* CAMPOS A EXPORTAR
A6_FILIAL
A6_COD
A6_AGENCIA
A6_NUMCON
A6_NOME
A6_NREDUZ
A6_END
A6_BAIRRO
A6_MUN
*/

Static Function RunCont


Local cLin
dbSelectArea(cAlias)
dbGoTop()
ProcRegua(RecCount())
While (cAlias)->(!EOF())
IncProc()
cLin := (cAlias)->A6_FILIAL
cLin += (cAlias)->A6_COD
cLin += (cAlias)->A6_AGENCIA
cLin += (cAlias)->A6_NUMCON
cLin += (cAlias)->A6_NOME

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
265
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
cLin += (cAlias)->A6_NREDUZ
cLin += (cAlias)->A6_END
cLin += (cAlias)->A6_BAIRRO
cLin += (cAlias)->A6_MUN
cLin += CRLF

If fWrite(nHdl,cLin,Len(cLin)) != Len(cLin)
If !MsgAlert("Ocorreu um erro na gravação do arquivo."+;
"Continua?","Atenção!")
Exit
Endif
Endif
(cAlias)->(dbSkip())
EndDo
fClose(nHdl)

// lEITURA DO TXT
LerBanco()

Static Function LerBanco()


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" )
AADD( aButton, { 1,.T.,{|| nOpc := 1,FechaBatch()}})
AADD( aButton, { 2,.T.,{|| FechaBatch() }} )
FormBatch( cCadastro, aSay, aButton )
If nOpc == 1
Processa( {|| LerTxt() }, "Processando..." )

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
266
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
Endif
Return Nil

Static Function LerTxt()


Local cBuffer := ""
Local cFileOpen := ""
Local cTitulo1 := "Selecione o arquivo"
Local cExtens := "Arquivo TXT | *.txt"

cFileOpen := cGetFile(cExtens,cTitulo1,,"\SYSTEM\",.T.)
If !File(cFileOpen)
MsgAlert("Arquivo texto: "+cFileOpen+" não localizado",cCadastro)
Return
Endif
FT_FUSE(cFileOpen)
FT_FGOTOP()
ProcRegua(FT_FLASTREC())
While !FT_FEOF()
IncProc()
cBuffer := FT_FREADLN()
/*
Campo Tipo Tamanho Decimal
A6_FILIAL C 2 0
A6_COD C 3 O
A6_AGENCIA C 5 0
A6_NUMCON C 10 0
A6_NOME C 40 0
A6_NREDUZ C 15 0
A6_END C 40 0
A6_BAIRRO C 20 0
A6_MUN C 15 0
*/

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
267
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
/*
1 2 3 4 5 6 7 8 9 10 11
12 13 14

1234567890123456789012345678901234567890123456789012345678901234567
8901234567890123456789012345678901234567890123456789012345678901234
5678901234567890

00XXX12345123456789012345678901234567890123456789012345678901234567
8901234512345678901234567890123456789012345678901234567890123456789
0123456789012345
*/
cMsg := "Filial: " +SubStr(cBuffer,01,02) + Chr(13)+Chr(10)
cMsg += "Código: " +SubStr(cBuffer,03,03) + Chr(13)+Chr(10)
cMsg += "Agencia: " +SubStr(cBuffer,06,05) + Chr(13)+Chr(10)
cMsg += "Conta: " +SubStr(cBuffer,11,10) + Chr(13)+Chr(10)
cMsg += "Nome: " +SubStr(cBuffer,21,40) + Chr(13)+Chr(10)
cMsg += "Nome red.:" +SubStr(cBuffer,61,15) + Chr(13)+Chr(10)
cMsg += "Endereco: " +SubStr(cBuffer,76,40) + Chr(13)+Chr(10)
cMsg += "Bairro: " +SubStr(cBuffer,126,20) + Chr(13)+Chr(10)
cMsg += "Municipio:" +SubStr(cBuffer,136,15) + Chr(13)+Chr(10)
MsgInfo(cMsg)
FT_FSKIP()
EndDo
FT_FUSE()
MsgInfo("Processo finalizada")
Return .t.
Return Nil

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
268
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
269
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados

CAPÍTULO 7
Exercício 1

#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"

User Function xEx1Cap7()


Local aCabec := {}
Local aItens := {}
Local aLinha := {}
Local nX := 0
Local nY := 0
Local cDoc := ""
Local lOk := .T.
PRIVATE lMsErroAuto := .F.
ConOut(Repl("-",80))
ConOut(PadC("Teste de Inclusao de 10 pedidos de venda com 30 itens cada",80))
//PREPARE ENVIRONMENT EMPRESA "99" FILIAL "01" MODULO "FAT" TABLES
"SC5","SC6","SA1","SA2","SB1","SB2","SF4"
dbSelectArea("SB1")
dbSetOrder(1)
If !SB1->(MsSeek(xFilial("SB1")+"PA001"))
lOk := .F.
ConOut("Cadastrar produto: PA001")
EndIf
dbSelectArea("SF4")
dbSetOrder(1)
If !SF4->(MsSeek(xFilial("SF4")+"501"))
lOk := .F.
ConOut("Cadastrar TES: 501")
EndIf
dbSelectArea("SE4")
NFT – Núcleo de Formação Tecnológica
Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
270
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
dbSetOrder(1)
If !SE4->(MsSeek(xFilial("SE4")+"001"))
lOk := .F.
ConOut("Cadastrar condicao de pagamento: 001")
EndIf
If !SB1->(MsSeek(xFilial("SB1")+"PA002"))
lOk := .F.
ConOut("Cadastrar produto: PA002")
EndIf
dbSelectArea("SA1")
dbSetOrder(1)
If !SA1->(MsSeek(xFilial("SA1")+"CL000101"))
lOk := .F.
ConOut("Cadastrar cliente: CL000101")
EndIf
If lOk
ConOut("Inicio: "+Time())
For nY := 1 To 10
cDoc := GetSxeNum("SC5","C5_NUM")
RollBAckSx8()
aCabec := {}
aItens := {}
aadd(aCabec,{"C5_NUM" ,cDoc,Nil})
aadd(aCabec,{"C5_TIPO" ,"N",Nil})
aadd(aCabec,{"C5_CLIENTE",SA1->A1_COD,Nil})
aadd(aCabec,{"C5_LOJACLI",SA1->A1_LOJA,Nil})
aadd(aCabec,{"C5_LOJAENT",SA1->A1_LOJA,Nil})
aadd(aCabec,{"C5_CONDPAG",SE4->E4_CODIGO,Nil})
For nX := 1 To 30
aLinha := {}
aadd(aLinha,{"C6_ITEM",StrZero(nX,2),Nil})

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
271
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
aadd(aLinha,{"C6_PRODUTO",SB1->B1_COD,Nil})

aadd(aLinha,{"C6_QTDVEN",1,Nil})
aadd(aLinha,{"C6_PRCVEN",100,Nil})
aadd(aLinha,{"C6_PRUNIT",100,Nil})
aadd(aLinha,{"C6_VALOR",100,Nil})
aadd(aLinha,{"C6_TES","501",Nil})
aadd(aItens,aLinha)
Next nX
ConOut(PadC("Teste de inclusao",80))
ConOut("Inicio: "+Time())
MATA410(aCabec,aItens,3)
ConOut("Fim : "+Time())
ConOut(Repl("-",80))
aCabec := {}
aItens := {}
aadd(aCabec,{"C5_NUM",cDoc,Nil})
aadd(aCabec,{"C5_TIPO","N",Nil})
aadd(aCabec,{"C5_CLIENTE",SA1->A1_COD,Nil})
aadd(aCabec,{"C5_LOJACLI",SA1->A1_LOJA,Nil})
add(aCabec,{"C5_LOJAENT",SA1->A1_LOJA,Nil})
aadd(aCabec,{"C5_CONDPAG",SE4->E4_CODIGO,Nil})
For nX := 1 To 30
aLinha := {}
aadd(aLinha,{"LINPOS","C6_ITEM",StrZero(nX,2)})
aadd(aLinha,{"AUTDELETA","N",Nil})
aadd(aLinha,{"C6_PRODUTO",SB1->B1_COD,Nil})

aadd(aLinha,{"C6_QTDVEN",2,Nil})
aadd(aLinha,{"C6_PRCVEN",100,Nil})
aadd(aLinha,{"C6_PRUNIT",100,Nil})
aadd(aLinha,{"C6_VALOR",200,Nil})

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
272
ADVPL II
Versão 1.0 24/08/2012 – Todos direitos reservados
aadd(aLinha,{"C6_TES","501",Nil})
aadd(aItens,aLinha)
Next nX
ConOut(PadC("Teste de alteracao",80))
ConOut("Inicio: "+Time())
MATA410(aCabec,aItens,4)
ConOut("Fim : "+Time())
ConOut(Repl("-",80))
ConOut(PadC("Teste de exclusao",80))
ConOut("Inicio: "+Time())
MATA410(aCabec,aItens,5)
If !lMsErroAuto
ConOut("Exclusao com sucesso! "+cDoc)
Else
ConOut("Erro na exclusao!")
EndIf
Next ny
ConOut("Fim : "+Time())
ConOut(Repl("-",80))
EndIf
//RESET ENVIRONMENT
Return(.T.)

NFT – Núcleo de Formação Tecnológica


Rua Teodoro Sampaio, 417 conjunto 94, Pinheiros
273

Você também pode gostar