[Resolvido] Como incluir as bibliotecas do FPDF.ORG no Scriptcase ?

Olá pessoal, estou com dúvidas de como fazer “Funções e Bibliotecas” no Scriptcase utilizando as bibliotecas do site www.fpdf.org.
Segue um exemplo simples abaixo:

http://www.fpdf.org/en/script/script85.php

Como utilizar isso no Scriptcase?

Abraço!

[code]define(“FPDF_FONTPATH”, “font/”);
require_once($this->Ini->path_third."/fpdf/fpdf.php");

class PDF_Codabar extends FPDF
{
function Codabar($xpos, $ypos, $code, $start=‘A’, $end=‘A’, $basewidth=0.35, $height=16) {
$barChar = array (
‘0’ => array (6.5, 10.4, 6.5, 10.4, 6.5, 24.3, 17.9),
‘1’ => array (6.5, 10.4, 6.5, 10.4, 17.9, 24.3, 6.5),
‘2’ => array (6.5, 10.0, 6.5, 24.4, 6.5, 10.0, 18.6),
‘3’ => array (17.9, 24.3, 6.5, 10.4, 6.5, 10.4, 6.5),
‘4’ => array (6.5, 10.4, 17.9, 10.4, 6.5, 24.3, 6.5),
‘5’ => array (17.9, 10.4, 6.5, 10.4, 6.5, 24.3, 6.5),
‘6’ => array (6.5, 24.3, 6.5, 10.4, 6.5, 10.4, 17.9),
‘7’ => array (6.5, 24.3, 6.5, 10.4, 17.9, 10.4, 6.5),
‘8’ => array (6.5, 24.3, 17.9, 10.4, 6.5, 10.4, 6.5),
‘9’ => array (18.6, 10.0, 6.5, 24.4, 6.5, 10.0, 6.5),
‘$’ => array (6.5, 10.0, 18.6, 24.4, 6.5, 10.0, 6.5),
‘-’ => array (6.5, 10.0, 6.5, 24.4, 18.6, 10.0, 6.5),
‘:’ => array (16.7, 9.3, 6.5, 9.3, 16.7, 9.3, 14.7),
‘/’ => array (14.7, 9.3, 16.7, 9.3, 6.5, 9.3, 16.7),
‘.’ => array (13.6, 10.1, 14.9, 10.1, 17.2, 10.1, 6.5),
‘+’ => array (6.5, 10.1, 17.2, 10.1, 14.9, 10.1, 13.6),
‘A’ => array (6.5, 8.0, 19.6, 19.4, 6.5, 16.1, 6.5),
‘T’ => array (6.5, 8.0, 19.6, 19.4, 6.5, 16.1, 6.5),
‘B’ => array (6.5, 16.1, 6.5, 19.4, 6.5, 8.0, 19.6),
‘N’ => array (6.5, 16.1, 6.5, 19.4, 6.5, 8.0, 19.6),
‘C’ => array (6.5, 8.0, 6.5, 19.4, 6.5, 16.1, 19.6),
'’ => array (6.5, 8.0, 6.5, 19.4, 6.5, 16.1, 19.6),
‘D’ => array (6.5, 8.0, 6.5, 19.4, 19.6, 16.1, 6.5),
‘E’ => array (6.5, 8.0, 6.5, 19.4, 19.6, 16.1, 6.5),
);
$this->SetFont(‘Arial’,’’,13);
$this->Text($xpos, $ypos + $height + 4, $code);
$this->SetFillColor(0);
$code = strtoupper($start.$code.$end);
for($i=0; $i<strlen($code); $i++){
$char = $code[$i];
if(!isset($barChar[$char])){
$this->Error('Invalid character in barcode: '.$char);
}
$seq = $barChar[$char];
for($bar=0; $bar<7; $bar++){
$lineWidth = $basewidth
$seq[$bar]/6.5;
if($bar % 2 == 0){
$this->Rect($xpos, $ypos, $lineWidth, $height, ‘F’);
}
$xpos += $lineWidth;
}
$xpos += $basewidth*10.4/6.5;
}
}
}[/code]

Cria uma biblioteca com esse código acima, e adicione-a na app, marcando na biblioteca.
Quando for chamar não precisa chamar a FPDF, apenas a PDF_Codabar, pois a mesma extende a FDPF.

$pdf = new PDF_Codabar;

Só como adicional, pode-se usar também:

sc_include_lib(“fpddf”);

no lugar de":
require_once($this->Ini->path_third."/fpdf/fpdf.php");

Fiz como exemplo citado acima mas o erro ocorre:

Fatal error: Cannot redeclare class FPDF in C:\Program Files (x86)\NetMake\v7\wwwroot\scriptcase\prod\third\fpdf\fpdf.php on line 13

Diz que não posso declarar essa classe FPDF
O que pode ser?

Por a classe já deve ter sido declara em outro lugar.

Talvez seja porque no diretório já exista a fpdf, deve ser a biblioteca que o scriptcase já utiliza de /opt/nm/v6/www/scriptcase/prod/third/fpdf

De uma olhada na sua app, se não está chamando nenhuma classe que extenda a FPDF, pois se tiver tem que extender ambas, apartir de uma só FPDF.
Criei um blank e faça o teste nessa última para ver se está ok, se der tudo certo, de uma olhada na sua APP as bibliotecas que está usando, talvez ja esteja incluindo uma FPDF.

Não se pode simplesmente usar o sc_include_lib() e depois usar o extend?

Eu tenho total certeza que não há outra declaração (chamada) de classe! Sempre que Marco a opção da biblioteca criada da esse erro! Alguém utiliza isso no SC7.1 ?

Fred eu utilizo normal…
Quando tiver on me chama no skype ai agende da uma olhada, e vê se consegue…
Abraço

Fred, é uma aplicação Blank? Não pode ser aplicação ReportPDF.

Endrigo quero distância do ReportPDF! Desenvolvendo no Blank me da mais liberdade, o ReportPDF é muito fechado! Ele é bom pra relatórios simples e criação de filtros rápidos. Mas cada um tem seu gosto! Adoro fazer Relatórios em HTML por o visual se tornar bonito, porém pra se manter em formato PDF o formato livre não é, digamos 100%. Por isso estou aderindo FPDF puro com Blank, e estou fazendo muita coisa bacana com ele.

Discordo.

Tenho toda liberdade no report pdf que tenho na blank com a vantage de usar o filtro da report pdf que no caso da blank teria que criar um controle ou filtro.

Discordo :wink:

Blank é blank rsrsr…

E vice-versa… kkkkkkkkkkkkkkkkkkk

Bem pessoal, realmente estava “redeclarando” o "sc_include_lib(“fpddf”); " só que um no onExecute da Blank e o outro na Biblioteca! O Eliezer me explicou sobre a lógica das classes, consegui entender direitinho.

Verdade Haroldo, da sim pra se fazer coisas complexas no ReportPDF, você me mostrou! Mas a complexidade na minha opinião esta no nível de experiência de cada um, humildemente falando meu nível é super baixo, ou seja, o que pode ser complexo pra mim é super fácil pra muitos aqui. Então me preocupo ao menos me esforçar bastante à aprender! Quem me conhece sabe o quanto gosto de estudar e o quanto sou esforçado. Não me adaptei ao ReportPDF, por um ponto de vista pessoal, preferi estudar FPDF puro por questão de adaptação mais rápida.
Estou adorando o FPDF. Embora que, é um trabalho braçal e cansativo.

Quero agradecer a todos vocês, que pra mim são mais que amigos! São companheiros de trabalho, irmãos e professores.

Me lembrei de um professor de ensino médio que sempre escrevia no quadro antes de iniciar a aula.
“É fazendo que se aprende a fazer aquilo que se deve aprender a fazer.”
Aristóteles

Abraço a todos!

Entendo e concordo com você na questão que gosto é gosto, e cada um realmente é diferente, mas talvez o ReportPDF não foi lhe apresentado da maneira adequada, assim como não foi apresentado para mim. rsrs
Fiz um relatório de movimento de caixa dinâmico utilizando somente o ReportPDF, porém ignorei completamente as configurações de interface em Layout PDF / Interface e utilizei somente a parte Layout PDF / Código onde tive total liberdade de montar da minha maneira e utilizando somente comandos FPDF e variáveis locais definidas em Definição (não esquecendo de usar $this->SC_conv_utf8({meu_campo})), pude fazer bordas, uma linha com fundo na célula e outra linha não, mudar o tamanho da letra em qualquer célula, imprimir outra tabela no rodapé puxando de uma matriz que criei no evento OnScriptInit para relatar a conferência de caixa.

O ReportPDF é muito poderoso, mas tem essas particularidades que temos que aprender na marra, lembrando que a parte Layout PDF / Código os códigos de Cabeçalho e Rodapé não tem acesso a dados e nem as funções do scriptcase, pois estão dentro da classe FPDF, mas nada que a declaração de variáveis globais não resolva, e no término da impressão da última página, dou um unset($GLOBALS[‘minha_var_global’]);.

Para mim, falta é documentação por parte da NetMake.

Endrigo,

Amigo, nessa tua empreitada pelo ReportPdf, tu conseguiu incluir algum gráfico dinamicamente?
Tô brigando com isso, faz tempo.

Tem como enviar um pedaço do código desse relatório de caixa, para ver como vc estruturou os comandos?

Como estou tendo problemas com a geração de pdf com gráficos nas consultas, estou estudando uma forma de gerar os pdf pelo reportpdf incluindo os gráficos. Ou seja, fazer td a mão, usando apenas o filtro do SC.
Para os gráficos estou usando a biblioteca PHPlot, moleza de usar. É simples, mas tem td que precisa.

Jorge, não trabalhei com gráficos ainda, mas vejo que talvez se estourar os limites da dimensão da página que vc definiu na configuração do seu relatório, pode travar mesmo. A imagem tem que ocupar o espaço de uma única folha no máximo, e deixar os espaços do cabeçalho e rodapé.

Claro meu amigo. Vamos lá:

Configurações:

ReportPDF => Retrato; Registro por Linha; A4; Margens 3, 20, 3, 10; Exibe Cabeçalho e Rodapé; Arial; 8
Exclui tudo que tem em Layout PDF / Interface

Layout PDF / Código / Definição:

$cab_empresa = $this->SC_conv_utf8('Fantastsoft Sistemas Ltda.');
$cab_endereco_1 = $this->SC_conv_utf8('Rua Costa Senna, 1072');
$cab_endereco_2 = $this->SC_conv_utf8('Padre Eustáquio - BHte - MG');
$cab_cnpj = $this->SC_conv_utf8('CNPJ: 00.843.106/0001-57');

if ( [lan_data_ini] == [lan_data_fin] ) {
	$cab_titulo = $this->SC_conv_utf8('Movimento do Dia ' . {lan_data});
} else {
	$cab_titulo = $this->SC_conv_utf8('Movimento do Mês ' . {lan_data_mes});
}
$cab_titulo_caixa = $this->SC_conv_utf8({coc_id});

$cab_data_impressao_lbl = $this->SC_conv_utf8('Data Impressão:');
$this->nm_data->SetaData(date("Y/m/d H:i:s"), "YYYY/MM/DD HH:II:SS");
$cab_data_impressao = html_entity_decode($this->nm_data->FormataSaida('d/m/Y H:i'));
$cab_pagina = $this->SC_conv_utf8('Página: ');

$cab_lan_dia = $this->SC_conv_utf8('D');
$cab_lan_lancamento = $this->SC_conv_utf8('LANÇAM.');
$cab_lan_historico = $this->SC_conv_utf8('HISTÓRICO');
$cab_moe_id = $this->SC_conv_utf8('MOEDA');
$cab_credito = $this->SC_conv_utf8('CRÉDITO');
$cab_debito = $this->SC_conv_utf8('DÉBITO');
$cab_lan_saldo = $this->SC_conv_utf8('SALDO');

if ( [lan_data_ini] == [lan_data_fin] ) {
	$rod_conf_titulo = $this->SC_conv_utf8('Conferência de Caixa do dia ');
} else {
	$rod_conf_titulo = $this->SC_conv_utf8('Conferência de Caixa do mês ');
}

$rod_credito = {rod_credito};
$rod_debito = {rod_debito};
$rod_saldo = {rod_saldo};

Layout PDF / Código / Cabeçalho:

$this->SetFillColor(255, 255, 255);
$this->SetDrawColor(0, 0, 0);

$this->Rect(10, 10, 190, 16, "D");


$this->SetFont('Arial', '', 8);
$this->SetTextColor(0, 0, 0);

$this->SetXY(10, 10);
$this->SetFont('Arial', 'B');
$this->Cell(50, 4, $cab_empresa, 0, 0, 'L');
$this->Ln(4);
$this->SetFont('');
$this->Cell(50, 4, $cab_endereco_1, 0, 0, 'L');
$this->Ln(4);
$this->Cell(50, 4, $cab_endereco_2, 0, 0, 'L');
$this->Ln(4);
$this->Cell(50, 4, $cab_cnpj, 0, 0, 'L');

$this->SetXY(10, 10);
$this->SetFont('Arial', 'B', 14);
$this->Cell(180, 8, $cab_titulo, 0, 0, 'C');
$this->Ln(8);
$this->Cell(180, 8, $cab_titulo_caixa, 0, 0, 'C');

$this->SetXY(170, 10);
$this->SetFont('Arial', '', 8);
$this->Cell(30, 4, $cab_data_impressao_lbl, 0, 0, 'R');
$this->Ln(4);
$this->SetFont('Arial', 'B');
$this->SetX(170);
$this->Cell(30, 4, $cab_data_impressao, 0, 0, 'R');
$this->Ln(4);
$this->SetX(170);
$this->Cell(30, 4, $cab_pagina . $this->PageNo() . ' de {nb}', 0, 0, 'R');

$this->SetXY(10, 26);
$this->SetFont('Arial', 'B');
$tam_his = 100;
if ( [lan_data_ini] <> [lan_data_fin] ) {
	$this->Cell(5, 4, $cab_lan_dia, 1, 0, 'C', true);
	$tam_his = 95;
}
$this->Cell(15, 4, $cab_lan_lancamento, 1, 0, 'L');
$this->Cell($tam_his, 4, $cab_lan_historico, 1, 0, 'L');
$this->Cell(15, 4, $cab_moe_id, 1, 0, 'L');
$this->Cell(20, 4, $cab_credito, 1, 0, 'R');
$this->Cell(20, 4, $cab_debito, 1, 0, 'R');
$this->Cell(20, 4, $cab_lan_saldo, 1, 0, 'R');

Layout PDF / Código / Corpo:

if ( ($GLOBALS['linha'] % 2) <> 0 ) {
	$this->Pdf->SetFillColor(200, 200, 200);
	$this->Pdf->SetDrawColor(0, 0, 0);
} else {
	$this->Pdf->SetFillColor(255, 255, 255);
	$this->Pdf->SetDrawColor(0, 0, 0);
}

$this->Pdf->SetFont('Arial', '', 8);
$this->Pdf->SetTextColor(0, 0, 0);

$this->Pdf->SetX(10);
$tam_his = 100;
if ( [lan_data_ini] <> [lan_data_fin] ) {
	$this->Pdf->Cell(5, 4, {lan_data_dia}, 1, 0, 'L', true);
	$tam_his = 95;
}
$this->Pdf->Cell(15, 4, {lan_lancamento}, 1, 0, 'L', true);
$this->Pdf->Cell($tam_his, 4, {lan_historico}, 1, 0, 'L', true);
$this->Pdf->Cell(15, 4, {moe_id}, 1, 0, 'L', true);
$this->Pdf->Cell(20, 4, {credito}, 1, 0, 'R', true);
$this->Pdf->Cell(20, 4, {debito}, 1, 0, 'R', true);
$this->Pdf->Cell(20, 4, {lan_saldo}, 1, 0, 'R', true);

Layout PDF / Código / Rodapé:

if ( $GLOBALS['ultimo_reg'] ) {
	$this->SetFillColor(255, 255, 255);
	$this->SetDrawColor(0, 0, 0);
	
	$this->Cell(130, 4, '', 1, 0, 'C');
	$this->Cell(20, 4, $rod_credito, 1, 0, 'R');
	$this->Cell(20, 4, $rod_debito, 1, 0, 'R');
	$this->Cell(20, 4, $rod_saldo, 1, 0, 'R');
	
	$this->Ln(4);
	$this->SetX(170);
	$this->Cell(30, 4, 'Impresso por ' . [usr_name], 0, 0, 'R');
	
	$this->SetFillColor(200, 200, 200);
	$this->SetFont('Arial', 'B', 10);
	$this->SetTextColor(0, 0, 0);
	$this->SetX(10);
	$this->Cell(100, 5, $rod_conf_titulo . $GLOBALS['conf_caixa_dia'], 1, 0, 'C', true);
	$this->Ln(5);
	
	$this->SetFillColor(255, 255, 255);
	$this->SetFont('Arial', '', 8);
	
	$conf_caixa = $GLOBALS['conf_caixa'];
	foreach( $conf_caixa as $reg => $valor ) {
		$this->Cell(80, 4, $reg, 1, 0, 'L');
		$this->Cell(20, 4, $valor, 1, 0, 'R');
		$this->Ln(4);
	}
	unset($GLOBALS['conf_caixa']);
	unset($GLOBALS['conf_caixa_dia']);
	unset($GLOBALS['linha']);
	unset($GLOBALS['ultimo_reg']);
	unset($GLOBALS['g_rod_credito']);
	unset($GLOBALS['g_rod_debito']);
}

Eventos / OnScriptInit:

global $conf_caixa_dia;
global $conf_caixa;
global $linha;
global $ultimo_reg;
global $g_rod_credito;
global $g_rod_debito;

/**
 * Inicializa a variável de contagem das linhas para fazer a zebra
 */
$linha = 0;
$ultimo_reg = false;

$g_rod_credito = 0;
$g_rod_debito = 0;

/** 
 * Se o movimento é de um único dia
 */
if ( [lan_data_ini] == [lan_data_fin] ) {
	// Seta a data do movimento impresso no formato dia/mês/ano
	$data = sc_date_conv([lan_data_ini], "aaaa-mm-dd", "dd/mm/aaaa");
	
	// Soma a movimentação da conferência do dia aberto atualmente do caixa
	sc_lookup(dataset, "select moe.moe_descricao, 
		to_char(sum(lan.lan_valor * case when lan.lan_dc = 'C' then 1 else -1 end), '999G999G990D00') 
		from mov_lancamentos as lan 
		left join cad_moedas as moe on (moe.moe_id = lan.moe_id) 
		where (coc_id = [coc_id]) and 
			(lan_estornado = false) and 
			(lan_estorno = false) and 
			(lan_valor is not null)
		group by 1
		having sum(lan.lan_valor * case when lan.lan_dc = 'C' then 1 else -1 end) > 0
		order by 1");
	
	// Preenche a matriz global com a conferência do caixa
	$conf_caixa = array();
	foreach( {dataset} as $reg ) {
		$conf_caixa[$reg[0]] = $reg[1];
	}
	
	// Localiza o dia aberto para imprimir no título da conferência
	sc_lookup(dataset, "select max(lan_data) 
		from mov_lancamentos as lan 
		where (coc_id = [coc_id])");
	$conf_caixa_dia = sc_date_conv({dataset[0][0]}, "aaaa-mm-dd", "dd/mm/aaaa");
} else {
	// Seta a data do movimento impresso no formato mês/ano
	$data = sc_date_conv([lan_data_ini], "aaaa-mm-dd", "mm/aaaa");
	
	// Soma a movimentação da conferência do mês selecionado
	sc_lookup(dataset, "select moe.moe_descricao, 
		to_char(sum(lan.lan_valor * case when lan.lan_dc = 'C' then 1 else -1 end), '999G999G990D00') 
		from mov_lancamentos as lan 
		left join cad_moedas as moe on (moe.moe_id = lan.moe_id) 
		where (coc_id = [coc_id]) and 
			(lan_estornado = false) and 
			(lan_estorno = false) and 
			(lan_valor is not null) and 
			(lan_data <= '[lan_data_fin]') 
		group by 1
		having sum(lan.lan_valor * case when lan.lan_dc = 'C' then 1 else -1 end) > 0
		order by 1");
	
	// Preenche a matriz global com a conferência do caixa
	$conf_caixa = array();
	foreach( {dataset} as $reg ) {
		//$conf_caixa[$reg[0]] = sc_format_num($reg[1], '.', ',', 2, 'S', '1', '');
		$conf_caixa[$reg[0]] = $reg[1];
	}
	
	// Seta o mês selecionado para ser impresso no título da conferência
	$conf_caixa_dia = sc_date_conv([lan_data_ini], "aaaa-mm-dd", "mm/aaaa");
}

Eventos / OnRecord:

if ( isset({lan_valor}) ) {
	/**
	 * Joga o valor do campo lan_valor para o campo credito quando lan_dc = "C", e para o campo debito quando lan_dc = "D"
	 */
	if ( {lan_dc} == "C" ) {
		{credito} = {lan_valor};
		{debito} = "";
		
		// Calcula o total de crédito
		$GLOBALS['g_rod_credito'] += {lan_valor};
	} else {
		{credito} = "";
		{debito} = {lan_valor};
		
		// Calcular o total de débito
		$GLOBALS['g_rod_debito'] += {lan_valor};
	}
}
// Joga o valor do saldo para a variável do rodapé
{rod_saldo} = {lan_saldo};
{rod_credito} = $GLOBALS['g_rod_credito'];
{rod_debito} = $GLOBALS['g_rod_debito'];
	
/**
 * Joga a data para os campos de formatação de mes e dia
 */
{lan_data_mes} = {lan_data};
{lan_data_dia} = {lan_data};

/**
 * Acrescenta o contador de Linhas
 */
$GLOBALS['linha']++;

if ( $this->rs_grid->currentrow() == ($this->rs_grid->recordcount() - 1) ) {
	$GLOBALS['ultimo_reg'] = true;
}