Prezados,
Exemplo de um relatório manual
CREATE TABLE "Clientes" (
"Codigo" INTEGER ,
"Nome" VARCHAR(50) ,
"Endereco" VARCHAR(50) ,
"Telefone" VARCHAR(20) ,
"Cidade" VARCHAR(20) ,
"UF" VARCHAR(2) );
Crie essas Variáveis Globais:
GLOBAL
gnRelNumPagina is int
gnRelContaLinhas is int
gnRelLimiteLinhas is int
gnRelLimiteColunas is int
garrRelCabecalho is array of strings
garrRelCabecalhoComp is array of string
gsRelTitulo is string
gsRelSubTitulo is string
gnRelID is int
gsRelVersao is string
gbRelPrimeiraPagina is boolean
gsPastaReport is string = "C:\Temp"
gbSQLError is boolean = False
Procedures Globais - uso genérico:
Procedure CenterString(spTexto,npTamanho = 0)
IF npTamanho = 0 THEN
npTamanho = gnRelLimiteColunas
END
nEspaco_ is int = (npTamanho - Length(NoSpace(spTexto))) / 2
sTexto_ is string = QtdeX(nEspaco_) + spTexto
RESULT sTexto_
Procedure ProgBarra(psBarra,pnMaximo)
sNome_ is string = psBarra..Name
{sNome_}..Visible = True
{sNome_}..Value = 0
{sNome_}..MinValue = 0
{sNome_}..MaxValue = pnMaximo
Procedure QtdeX(npQtde)
RESULT RepeatString(" ",npQtde)
Procedure ReportBegin(npDestino,npImpressora,npOrientation,npLinhas = 116,npColunas = 149)
sPastaPDF_ is string
sTitulo is string = Replace(gsRelTitulo,"/","_",IgnoreCase)
sTitulo = Replace(sTitulo,"\","_",IgnoreCase)
sJobName_ is string = sTitulo + "_" + DateToString(DateSys(),"AAAAMMDD") + "_" + TimeToString(Now(),"HHMMSS")
iReset()
SWITCH npDestino
CASE 1
iPreview(1)
CASE 2
sNomeImpressora is string = npImpressora[npImpressora]
iConfigure(sNomeImpressora)
iDestination(iPrinter,sJobName_)
CASE 3
sPastaPDF_ = gsPastaReport
iDestination(iPDF,gsPastaReport + ["\"] + sJobName_)
END
iParameter(iPaperSize, iPaperSize_A4)
iParameter(iOrientation, npOrientation)
iMargin(10, 0, 10, 10)
iCreateFont(1, 8, iNormal, "Courier new", iBlack, 0)
iCreateFont(2, 6, iBold, “Courier new”, iBlack, 0)
iCreateFont(3, 6, iNormal, “Courier new”, iBlack, 0)
iCreateFont(4, 7, iBold, “Courier new”, iBlack, 0)
iCreateFont(5, 7, iNormal, “Courier new”, iBlack, 0)
iCreateFont(60, 8, iItalic, “Courier new”, iBlack, 0)
iCreateFont(6, 8, iBold, “Courier new”, iBlack, 0)
iCreateFont(7, 8, iNormal, “Courier new”, iBlack, 0)
iCreateFont(8, 9, iBold, “Courier new”, iBlack, 0)
iCreateFont(9, 9, iNormal, “Courier new”, iBlack, 0)
iCreateFont(10, 14, iBold, “Courier new”, iBlack, 0)
iCreateFont(11, 14, iNormal, “Courier new”, iBlack, 0)
iCreateFont(12, 12, iBold, “Courier new”, iBlack, 0)
iCreateFont(13, 12, iNormal, “Courier new”, iBlack, 0)
iCreateFont(14, 16, iBold, “Courier new”, iBlack, 0)
iCreateFont(15, 16, iNormal, “Courier new”, iBlack, 0)
iCreateFont(16, 10, iBold, “Courier new”, iBlack, 0)
iCreateFont(17, 10, iNormal, “Courier new”, iBlack, 0)
iCreateFont(18, 5, iBold, “Courier new”, iBlack, 0)
iCreateFont(19, 5, iNormal, “Courier new”, iBlack, 0)
IF npOrientation = iOrientation_Portrait THEN
gnRelLimiteLinhas = npLinhas
gnRelLimiteColunas = npColunas
ELSE
IF npLinhas <> 116 THEN
gnRelLimiteLinhas = npLinhas
ELSE
gnRelLimiteLinhas = 77
END
IF npColunas <> 149 THEN
gnRelLimiteColunas = npColunas
ELSE
gnRelLimiteColunas = 218
END
END
gbRelPrimeiraPagina = True
gbSQLError = False
gsRelSubTitulo = ""
gnRelContaLinhas = 999
gnRelNumPagina = 0
ArrayDeleteAll(garrRelCabecalho)
ArrayDeleteAll(garrRelCabecalhoComp)
Procedure ReportEnd(bpRodape = True)
IF bpRodape THEN
ReportFooter()
END
iEndPrinting
Procedure ReportFooter()
sTexto_ is string
sSite_ is string = "www.seusite.com.br"
nLarguraTexto_, nLarguraCab_ are int
IF iParameter(iOrientation) = iOrientation_Portrait THEN
nLarguraCab_ = 108
ELSE
nLarguraCab_ = 160
END
iBorder(0, iPageHeight()-10, iPageWidth(), iPageHeight()-6, 1, 20, LightGray, iContinuous, iSolid)
sTexto_ = "Identificação do seu aplicativo"
nLarguraTexto_ = nLarguraCab_ - Length(sTexto_) - Length(sSite_)
iYPos(iPageHeight()-9)
iPrint(iFont(1) + QtdeX(2) + sTexto_ + QtdeX(nLarguraTexto_) + sSite_)
Procedure ReportHeader(npFont)
sTexto_ is string
sEmpresa_ is string = "SUA EMPRESA LTDA"
nLarguraTexto_, nLarguraCab_ are int
IF iParameter(iOrientation) = iOrientation_Portrait THEN
nLarguraCab_ = 108
ELSE
nLarguraCab_ = 160
END
gnRelNumPagina ++
gnRelContaLinhas = 0
IF gsRelTitulo > "" THEN
IF gbRelPrimeiraPagina = False THEN
ReportFooter()
iSkipPage()
END
gbRelPrimeiraPagina = False
iBorder(0, 0, iPageWidth(), 11, 1, 20, LightGray, iContinuous, iSolid)
sTexto_ = "Folha: " + NumToString(gnRelNumPagina,"03d")
nLarguraTexto_ = nLarguraCab_ - Length(sTexto_) - Length(sEmpresa_)
iPrint(iFont(1) + iYPos(1) + QtdeX(2) + sEmpresa_ + QtdeX(nLarguraTexto_) + sTexto_)
sTexto_ = DateToString(DateSys(),"DD/MM/YYYY") + " " + TimeToString(Now(),"HH:MM")
nLarguraTexto_ = nLarguraCab_ - Length(gsRelTitulo) - Length(sTexto_)
iPrint(iFont(1) + QtdeX(2) + gsRelTitulo + QtdeX(nLarguraTexto_) + sTexto_)
sTexto_ = DateToString(Today(),"Mmmm/YYYY")
nLarguraTexto_ = nLarguraCab_ - Length(gsRelSubTitulo) - Length(sTexto_)
iPrint(iFont(1) + QtdeX(2) + gsRelSubTitulo + QtdeX(nLarguraTexto_) + sTexto_)
iSkipLine()
IF ArrayCount(garrRelCabecalhoComp) > 0 THEN
nLarguraLin is int
FOR EACH iLinha OF garrRelCabecalhoComp
nLarguraLin = Max(nLarguraLin,Length(iLinha))
END
nDistanciaMargem is int = ((gnRelLimiteColunas - nLarguraLin) / 2)
FOR EACH iLinha OF garrRelCabecalhoComp
iPrint(iFont(npFont) + QtdeX(nDistanciaMargem) + iLinha)
gnRelContaLinhas ++
END
iSkipLine()
gnRelContaLinhas ++
ArrayDeleteAll(garrRelCabecalhoComp)
END
IF ArrayCount(garrRelCabecalho) > 0 THEN
FOR EACH iLinha OF garrRelCabecalho
IF iLinha > "" THEN
iPrint(iFont(npFont) + QtdeX(1) + iLinha)
gnRelContaLinhas ++
END
END
END
iSkipLine()
gnRelContaLinhas += 4
END
Procedure ReportPrint(npFont,spLinhaTexto,npLinhaEmBrancoDepois = 0, npLinhaEmBrancoAntes = 0, bpBorda = False)
npFontCabecalho_ is int
IF IsOdd(npFont) THEN
npFontCabecalho_ = npFont - 1
ELSE
npFontCabecalho_ = npFont
END
IF npLinhaEmBrancoAntes > 0 THEN
FOR i = 1 _TO_ npLinhaEmBrancoAntes
iSkipLine()
gnRelContaLinhas ++
IF gnRelContaLinhas >= gnRelLimiteLinhas THEN
ReportHeader(npFontCabecalho_)
BREAK
END
END
END
IF gnRelContaLinhas >= gnRelLimiteLinhas THEN
ReportHeader(npFontCabecalho_)
END
IF bpBorda THEN
iBorder(iXPos(),iYPos()-1,iPageWidth(),iYPos()+3,1,20,LightGray,iContinuous,iSolid)
END
iPrint(iFont(npFont) + spLinhaTexto)
gnRelContaLinhas ++
IF gnRelContaLinhas < gnRelLimiteLinhas THEN
IF npLinhaEmBrancoDepois > 0 THEN
FOR i = 1 _TO_ npLinhaEmBrancoDepois
iSkipLine()
gnRelContaLinhas ++
IF gnRelContaLinhas >= gnRelLimiteLinhas THEN
ReportHeader(npFontCabecalho_)
BREAK
END
END
END
END
CODE
Botão Cadastro de Clientes, Carga inicial:
FOR ALL Clientes
HDelete(Clientes)
END
HReset(Clientes)
Clientes.Codigo = 1
Clientes.Nome = "JOAO"
Clientes.Endereco = "RUA X, numero 10"
Clientes.Telefone = "(51) 1111-2222"
Clientes.Cidade = "PORTO ALEGRE"
Clientes.UF = "RS"
HAdd(Clientes)
HReset(Clientes)
Clientes.Codigo = 2
Clientes.Nome = "PEDRO"
Clientes.Endereco = "RUA Y, numero 10"
Clientes.Telefone = "(51) 333-2222"
Clientes.Cidade = "PORTO ALEGRE"
Clientes.UF = "RS"
HAdd(Clientes)
HReset(Clientes)
Clientes.Codigo = 3
Clientes.Nome = "CARLOS"
Clientes.Endereco = "RUA Z, numero 12"
Clientes.Telefone = "(51) 1111-4444"
Clientes.Cidade = "CAXIAS DO SUL"
Clientes.UF = "RS"
HAdd(Clientes)
HReset(Clientes)
Clientes.Codigo = 4
Clientes.Nome = "ANTONIO"
Clientes.Endereco = "RUA W, numero 14"
Clientes.Telefone = "(51) 5555-2222"
Clientes.Cidade = "CAXIAS DO SUL"
Clientes.UF = "RS"
HAdd(Clientes)
HReset(Clientes)
Clientes.Codigo = 5
Clientes.Nome = "LUIS"
Clientes.Endereco = "RUA W, numero 14"
Clientes.Telefone = "(51) 1111-4444"
Clientes.Cidade = "PORTO ALEGRE"
Clientes.UF = "RS"
HAdd(Clientes)
CODE
Botão Imprimir Clientes
Open(WIN_RPT_0001_Cadastro_clientes)
Seleção: Visualizar ou Imprimir
Open da JANELA (GLOBAL)
Procedure WIN_RPT_0001_Cadastro_clientes()
gsJanela is string = MySelf..Name
gsRelTitulo = MyWindow..NoteTitle
gsProcesso is string = ExtractString(gsJanela,2,"_") + ExtractString(gsJanela,3,"_")
gbImprimiu is boolean
COMBO_DESTINO
OPÇÕES:
Visualização
Impressão
PDF
//SELECTION ROW
IF MySelf = 2 THEN
COMBO_Impressora..Grayed = False
ELSE
COMBO_Impressora..Grayed = True
END
COMBO_IMPRESSORAS
ListAdd(MySelf, iListPrinter())
ListSelectPlus(MySelf, ListSeek(MySelf, iInfoPrinter(False, iPrinterName)))
BOTAO IMPRIMIR
CODE:
IF COMBO_Destino = 1 THEN
LocalImpressao()
ELSE
ThreadExecute("Impressao",threadNormal,LocalImpressao)
END
BOTAO CANCELAR
CODE:
IF BTN_ok..State = Grayed THEN
ThreadStop("Impressao",Infinite)
Info("Processo interrompido pelo usuário.")
PROGBAR_Barra..Value = 0
BTN_ok..Grayed = False
HourGlass(False)
RETURN
END
Close()
LOCAL PROCEDURE
CODE
Procedure LocalEndReport(npDestino)
IF NOT gbSQLError THEN
IF gbRelPrimeiraPagina THEN
Info("Não há registros para imprimir.")
ELSE
ReportEnd()
IF npDestino = 3 THEN
ShellExecute(iLastFile())
END
END
ELSE
iCloseReport()
Info("Documente a mensagem de erro para a JB Sistemas.",1)
END
LOCAL PROCEDURE
CODE
Procedure LocalImpressao()
IF gbImprimiu THEN
IF NOT YesNo("Você deseja reimprimir este relatório?") THEN
RETURN
END
END
gbImprimiu = True
BTN_ok..Grayed = True
HourGlass()
ReportBegin(COMBO_Destino,COMBO_Impressora,iOrientation_Landscape)
ArrayAdd(garrRelCabecalho," Código Nome Endereço Cidade UF Fone")
sCidadeAnt is string
dsQry is Data Source
sSql is string = [
SELECT
CLIENTES.CODIGO,
CLIENTES.NOME,
CLIENTES.ENDERECO,
CLIENTES.CIDADE,
CLIENTES.UF,
CLIENTES.TELEFONE
FROM CLIENTES
ORDER BY CLIENTES.CIDADE,CLIENTES.NOME
]
IF HExecuteSQLQuery(dsQry, hQueryDefault, sSql) THEN
ProgBarra(PROGBAR_Barra,HNbRec(dsQry))
FOR ALL dsQry
IF dsQry.Cidade > sCidadeAnt THEN
ReportPrint(2,CenterString("Cidade " + dsQry.Cidade),1,1,True)
END
ReportPrint(3,...
QtdeX(1) + NumToString(dsQry.Codigo,"7d") + ...
QtdeX(2) + Complete(dsQry.Nome,50) + ...
QtdeX(2) + Complete(dsQry.Endereco,50) + ...
QtdeX(2) + Complete(dsQry.Cidade,30) + ...
QtdeX(2) + dsQry.UF + ...
QtdeX(2) + dsQry.Telefone)
sCidadeAnt = dsQry.Cidade
PROGBAR_Barra..Value ++
END
PROGBAR_Barra..Visible = False
ELSE
Info(HErrorInfo() + CR + sSql)
END
LocalEndReport(COMBO_Destino)
HFreeQuery(dsQry)
BTN_ok..Grayed = False
HourGlass(False)
BONS ESTUDOS
NOVOS EXEMPLOS ME ENCAMINHEM!
--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 9949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.blogspot.com.br/