Академический Документы
Профессиональный Документы
Культура Документы
Apostila de ADVPL II
ÍÍN
NDDIIC
CEE
ÍNDICE ............................................................................................................................. 2
SIMBOLOGIA.................................................................................................................... 9
INTRODUÇÃO ................................................................................................................ 12
TREINAMENTOS ................................................................................................................... 13
CONSULTORIA EM TREINAMENTOS ..................................................................................... 14
OBJETIVO....................................................................................................................... 15
DEFINIÇÃO .............................................................................................................................. 18
DESVANTAGENS ....................................................................................................................... 20
Exercício 1......................................................................................................................... 22
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
S
SIIM
MBBO
OLLO
OGGIIA
A
S
SOOB
BRREE O
OAAU
UTTO
ORR
IIN
NTTR
ROOD
DUUÇ
ÇÃÃO
O
SOBRE A NFT
N
NOOS
SSSA
ASSO
OFFEER
RTTA
ASS&
&SSO
OLLU
UÇÇÕ
ÕEES
S
TREINAMENTOS
CONSULTORIA EM TREINAMENTOS
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.
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.
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.
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).
Mamíferos
Nome
Idade
Tamanho
Cor
Cor dos Olhos
Amamentar()
Comunicar()
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.
EXERCÍCIO 1
Defina :
Objetos
Classe
Atributo
Método
Mensagem
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.
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])
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.
SETTEXT
Modifica o conteúdo a ser exibido pelo controle.
SetText( [xVal] )
xVal - Caracter / Numérico / Data, Opcional. Valor a ser exibido.
Retorno NIL
#include 'protheus.ch'
User Function XTsay()
Local oDlg, oSay
Local bSay := { || "Mensagem" }
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.
#include 'protheus.ch'
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])
#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
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.
ENABLEITEM
Habilita ou desabilita item.
#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
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])
TCHECKBOX
Classe de caixa de marcação (checkbox). Aceita os valores .T. ou .F.
Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
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])
SELECT
Muda o item selecionado no combobox.
Select( [anItem] )
anItem - Numérico, opcional. Posição do item a ser selecionado.
#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
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.
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
MODIFY
Modifica o texto de um item
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.
LEN
Retorna o número total de itens
Len()
Retorno - Numérico. Número total de itens.
RESET
Apaga todos os itens
Reset()
#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
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
Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
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
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
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
#Include "PROTHEUS.CH"
Return
TMSPRINTER
Cria um objeto que permite visualizar e imprimir relatórios.
Métodos
NEW - MÉTODO CONSTRUTOR DA CLASSE.
BOX
Cria um objeto do tipo retângulo.
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.
Ex:
nCol1 := 10
nRow1 := 10
oPrint:Cmtr2Pix( nCol1,nRow1 )
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(): 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.
ISPRINTERACTIVE
Retorna se a impressora está ativa.
TMSPrinter(): IsPrinterActive ( )
Ex:oPrint:IsPrinterActive()
LINE
Cria um objeto do tipo linha.
PREVIEW
Abre a janela de visualização do relatório.
TMSPrinter(): Preview ( )
PRINT
Envia o relatório para impressora.
PRINTERNAME
Retorna o nome da impressora.
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.
Retorno
lOk(logico)
Retorna verdadeiro (.T.), se a imagem for salva com sucesso; caso contrário, retornará
falso (.F.).
SAVEASHTML
Salva o relatório no formato HTML (HyperText Markup Language).
Exemplos
cFileHtml := "\Teste\TESTE.HTM"
lSend := oPrint:SaveAsHTML( cFileHtml, {1,2} ) // Result : .T.
SAY
Cria um objeto do tipo texto.
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.
SAYBITMAP
Cria um objeto do tipo imagem.
SETCURRENTPRINTERINUSE
Compatibilidade.
TMSPrinter(): SetCurrentPrinterInUse ( )
SETFONT
Define a fonte padrão do relatório.
SETLANDSCAPE
Define a orientação do relatório como paisagem (Landscape).
TMSPrinter(): SetLandscape ( )
SETPAGE
Define a página que será apresentada.
Ex: oPrint:SetPage( 10 )
SETPAPERSIZE
Define o tamanho que será adotado pela página que será impressa.
#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
#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
#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
#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
#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"
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. )
If !oPrn:IsPrinterActive()
Alert( "Selecione a impressora padrao" )
oPrn:setUp()
Else
oPrn:setUp()
Endif
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 )
oPrn:EndPage()
oPrn:End()
If lPreview
oPrn:Preview()
Else
oPrn:Print()
Endif
Return Nil
SETPORTRAIT
Define a orientação do relatório como retrato (Portrait).
Sintaxe
TMSPrinter(): SetPortrait ( ) -->
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
Sintaxe
TMSPrinter(): nHorzRes ( ) --> nResolução
Retorno
nResolução()
Retorna a resolução horizontal da impressora configurada.
Exemplos
NLOGPIXELX
Sintaxe
TMSPrinter(): nLogPixelX ( ) --> nResolução
Retorno
nResolução()
Retorna a resolução vertical em pixels da impressora configurada.
Exemplos
oPrint:nLogPixelX() // Result: 300
NLOGPIXELY
Exemplos
oPrint:nLogPixelY() // Result: 300
NVERTRES
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
Ex:
#include "PROTHEUS.CH"
User Function xTMSPrinter()
Private cAcesso := Repl(" ",10)
oPrint:StartPage()
oPrint:SayBitmap( 100,200,"nft.bmp",400,400 )
oPrint:Box( 100,10,600,900 )
oPrint:Line( 620,10,620,900 )
// Visualiza a impressão
oPrint:EndPage()
oPrint:Preview()
TPAGEVIEW
Cria um objeto que permite visualizar um arquivo no formato gerado pelo spool de
impressão.
Hierarquia
TSrvObject -> TControl -> TPageView
PAGESIZE
Define o tamanho da página
Ex: oTPageView:PageSize(1000,1000)
PRINTPAGE
Imprime uma determinada página
Ex oTPageView:PrintPage(1)
Ex:
#include "PROTHEUS.CH"
User Function xTPageView()
Local cAcesso := Repl(" ",10)
oPrinter := TMsPrinter():New()
oPrinter:SetFile( '\SPOOL\matr020.prt', .F.)
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);
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.
SETPARAM
Define os parâmetros que serão utilizados pelo usuário para configurar o relatório.
oObj:Preview ( )
(NULO) Retorno nulo.
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 ] )
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.
SETMETER
Define o total da regua da tela de processamento do relatório.
INCMETER
Incrementa a régua da tela de processamento do relatório
SETDESCRIPTION
Define a descrição do componente.
CLASSNAME
Retorna o nome da classe do componente. (Ex: Apresenta na tela 'TREPORT'
)
Ex::
oReport := TReport():New('TESTERE')
MsgStop(oReport:ClassName())
REPORTNAME
Retorna o nome do relatório (exemplo: TESTE)
TITLE
Retorna o título do componente
TOTALTEXT
Retorna o texto que será impresso antes da impressão dos totalizadores
GETPARAM
Retorna a pergunta/bloco de código utilizada como parametro do relatório.
FOOTERATEND
Retorna se será impresso rodapé no final da impressão
TOTALINLINE
Retorna se a impressão dos totalizadores será em linha
PAGEHEIGHT
Retorna a altura da página baseado no tamanho da folha (A4, Carta, etc) informado
pelo usuário
PAGEWIDTH
Retorna a largura da página baseado no tamanho da folha (A4, Carta, etc) informado
pelo usuário
COL
Retorna a coluna posicionada na impressão
PAGE
Retorna o número da página atual na impressão
GETORIENTATION
Retorna a orientação de página (Retrato ou Paisagem) selecionada pelo usuário.
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).
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.
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.
PRINTTEXT
Imprime o texto nas coordenadas informadas pelos parametros
ENDPAGE
Finaliza uma página de impressão
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.
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
SETTOTALTEXT
Define o texto que será impresso antes da impressão dos totalizadores
SETTOTALINLINE
Define se os totalizadores serão impressos em linha ou coluna
SETPORTRAIT
Define orientação de página do relatório como retrato
SETLANDSCAPE
Define orientação de página do relatório como paisagem
SETPREVIEW
Define se será apresentado o preview o relatório no final da impressão
GETFUNCTION
Retorna objeto da classe TRFunction (totalizadores) baseado no parametro
informado.
SECTION
Retorna objeto da classe TRSection (seção) baseado no parametro informado.
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
SAYBITMAP
Imprime uma imagem nas coordenadas informadas pelos parametros
oObj:SayBitmap ( < nLinha > , < nCol > , < cBitmap > , [ nWidth ] , [ nHeight ] ) -->
NIL
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
oObj:Box ( < nRow > , < nCol > , < nBottom > , < nRight > , [ oPen ] ) --> NIL
FILLRECT
Preenche um retangulo na impressão utilizando as especificações do objeto TBrush.
THINLINE
Desenha uma linha simples iniciando na linha atual de impressão com a largura da
página
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
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
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
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
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
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
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.
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
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.
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)
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.
#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
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
DbSelectArea("SC1")
DbSetOrder(1)
If !Empty(mv_par01)
DbSeek(xFilial()+MV_PAR01)
Else
DbGoTop()
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()
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
#include "protheus.ch"
#include "report.ch"
/*
TReport sem usar o metodo TRSection:Print com series
*/
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
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")
Return oReport
DbSelectArea("SC1")
DbSetOrder(1)
If !Empty(mv_par01)
DbSeek(xFilial()+MV_PAR01)
Else
DbGoTop()
Endif
oReport:SetMeter(RecCount())
If oReport:Cancel()
Exit
EndIf
oSection1:Init()
oSection1:PrintLine()
oSection2:Init()
dbSelectArea("SB1")
dbSetOrder(1)
dbSeek(xFilial("SB1")+SC1->C1_PRODUTO)
oSection2:PrintLine()
dbSelectArea("SC1")
dbSkip()
End
oSection2:Finish()
oSection1:Finish()
oReport:IncMeter()
End
Return
/*
TReport usando metodo TRSection:Print com um secao
*/
If TRepInUse()
Pergunte("xTrpt1",.F.)
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
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")
TRFunction():New(oSection:Cell("C1_NUM"),NIL,"COUNT",oBreak)
TRFunction():New(oSection:Cell("C1_TOTAL"),NIL,"SUM",oBreak)
Return oReport
oSection:BeginQuery()
oSection:EndQuery(mv_par01,MV_PAR02)
oSection:Print()
Return
If TRepInUse()
Pergunte("xTrpt1",.F.)
oReport := ReportDef()
oReport:PrintDialog()
EndIf
Return
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")
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
oSection1:BeginQuery()
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
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:
Modelo do documento:
Relação Simplificada:
Relação Completa:
C O4
CAAPPÍÍTTUULLO 4 -- S
SQQLL –
–CCO
OMMA
ANND
DOOSS
COMCEITOS
SQL - Structured Query Language , que foi desenvolvido inicialmente pela IBM
Corporation.
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.
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
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.
COMANDOS
SELECT
Seleciona dados de uma tabela. O resultado é armazenado em uma tabela (result-
set)
# 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 "
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"
ORDER BY
Classifica o resultado da query pelo(s) campo(s) escolhido em ordem ascendente ou
descendente.
RetSqlName("XXX")
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%'"
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
INSERT
Insere registros em uma tabela
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"
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
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"
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
Return
DELETE
Deleta linhas de uma tabela
Ex.:
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
Return
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'.
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>)))
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.
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.
EXERCÍCIO 1
Faça um relatório para emitir a Relação de Faturas, conforme leioute abaixo:
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().
#include "protheus.ch"
User Function xGrvTXT()
Local oGrvTXT
Private cAlias := "SA1"
Private cPerg:= "EXPSA1"
dbSelectArea(cAlias)
dbSetOrder(1)
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
#Include "protheus.ch"
User Function xLeTXT()
Local cPerg := "IMPSA1"
Local oLeTxt
Private cAlias := "SA1"
dbSelectArea(cAlias)
dbSetOrder(1)
#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
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.
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
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).
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
oDlg1:Activate(,,,.T.)
Return
CAPÍTULO 3
Exercício 1:
#INCLUDE "PROTHEUS.CH"
#INCLUDE "RWMAKE.CH"
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.
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
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()
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
DbSelectArea("SA6")
DbSetOrder(1)
IF EMPTY(SE1->E1_PORTADO) .AND. !EMPTY(mv_par01)
DbSelectArea("SE1")
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Alimenta as variaveis de banco e dados do cedente ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
nNossoNum := "23344442/2"
cNumCon := stuff(MV_PAR03 , AT("-",MV_PAR03) ,1 , "")
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
_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"
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
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
//Parâmetros de TFont.New()
//1.Nome da Fonte (Windows)
//3.Tamanho em Pixels
//5.Bold (T/F)
oBrush := TBrush():New("",4)
// Inicia layout
oPrint:Line (0150,550,0050, 550)
oPrint:Line (0150,800,0050, 800)
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Impressao do comprovante de entrega. ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
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:Line (0710,100,0710,2300)
oPrint:Line (0710,550,0610, 550)
oPrint:Line (0710,800,0610, 800)
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: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 )
oPrint:Line (2000,100,2000,2300)
oPrint:Line (2000,550,1900, 550)
oPrint:Line (2000,800,1900, 800)
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)
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 )
Return Nil
Exercício 2:
Respostas:
#Include "PROTHEUS.CH"
Return
Local oReport
Private cPerg := "XEx3Cap3"
oReport := ReportDef()
oReport:PrintDialog()
Return
// Impressao
Static Function ReportDef()
Local oReport
Local oSection1
Local oSection2
Local cTexto := " "
Local cAlias := " "
AjustaSX1(cPerg)
Pergunte(cPerg,.F.)
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
#IFDEF TOP
If lSimples
cAlias := GetNextAlias()
Else
cAlias := GetNextAlias()
Endif
If lPEQry
cQuery:= ExecBlock("FIN127QRY", .F.,.F.,
{cQuery,MV_PAR01,MV_PAR02,MV_PAR03,MV_PAR04,MV_PAR05,MV_P
AR06})
EndIf
cQuery := ChangeQuery(cQuery)
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
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."
Endif
(cAlias)->(dbSkip())
EndDo
Endif
oSection1:Finish()
oSection2:Finish()
#ENDIF
If Select(cAlias)>0
Return NIL
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")
RestArea( aArea )
Return Nil
CAPÍTULO 4
Exercício 1
#include "PROTHEUS.CH"
#include "TBICONN.CH"
#include "RWMAKE.CH"
#include 'topconn.ch'
#include "TbiCode.ch"
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
// EXCLUSAO
cQuery:= " DELETE FROM " + RETSQLNAME("SZ1")
cQuery:= " WHERE Z1_CODIGO = '000001'"
cQuery:= " AND SZ1.D_E_L_E_T_ = '' "
TCSQLExec(cQuery)
TCSQLExec("COMMIT")
CAPÍTULO 5
Exercício 1
#include 'protheus.ch'
User Function xEx1Cap5()
Local oReport
oReport := ReportDef()
oReport:PrintDialog()
Return
oReport:SetPortrait(.T.)
AjustaSX1()
pergunte("xEx1Cap5",.F.)
oSection1 :=
TRSection():New(oReport,"Faturas",{"SE2","SA2","SED"},{"Fornecedor","Prefixo+Nu
m"} )
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.,)
Return oReport
dbSelectArea("SE2")
dbSetorder(1)
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
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
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
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
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
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()
Local aHelpPor := {}
Local aHelpEng := {}
Local aHelpSpa := {}
"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","","","","",;
"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 := {}
"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)
"mv_par11","Sim","Si","Yes","","Nao","No","No","","","","","","","","","",aHelpPor,
aHelpEng,aHelpSpa)
Return
CAPÍTULO 6
Exercício 1
#include "protheus.ch"
User Function xEx1Cap6()
Local oGrvTXT
Private cAlias := "SA6"
dbSelectArea(cAlias)
dbSetOrder(1)
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()
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
*/
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
CAPÍTULO 7
Exercício 1
#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"
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})