Fazendo um relatório FPDF

nunca usei formato livre, mas me dou muito bem com report pdf depois de algumas bibliotecas que desenvolvi para ajudar na produção, ficou mais fácil ainda, e mais, o formato pdf é amplamente usado em qualquer plataforma e facilmente transportável, além da excelência no acabamento.

Saulo, o FPDF me da mais liberdade de Layout, o PDFReport me da mais produtividade, porém estou apanhando feio para fazer o que quero! Por exemplo, fazer Bordas ao redor das Células, Fazer um totalizador de soma, cara to apanhando feio, o pior que a documentação do SC é muito simples! Infelizmente estou indo pelo método mais “sofrido” que é por tentativa e erro! Se eu conseguir dominar esse PDFReport vou fazer muita coisa bacana. Espero um dia, obter experiência suficiente no SC, farei questão de fazer um Blog com videos tutoriais pro pessoal não precisar passar por isso que estou passando.

Abraços!

Eu não consigo ver maior liberdade de criação do que é possível com html, CSS, etc… a consulta formato livre é exatamente com este intuito, depois se sua intenção é apenas gerar pdf coloque a consulta pra abrir gerando o pdf direto.

Saulo, não entendi direito! Consulta que você fala é um “Grid” no SC ?

Pois há muitos relatórios que quero fazer que não depende de Grid alguma! Um desses é esse relatório de centro de custo! Por isso estou tentando estudar o FPDF ou o PDFReport para poder fazer esses relatórios.

Então a consulta formato livre não é um grid…é um relatório que você monta de acordo com a sua necessidade… nela você pode integrar outras consultas(subconsultas) também em formato livre e ir fazendo tudo o que você faria com PDFReport, porém de uma maneira mais prática.

Veja este relatório que criei usando consultas Formato Livre https://docs.google.com/open?id=0B_pNH8G09fMvVDU4OWtiVm5qOU0.

Rapaz, você me convenceu 100% com essa demonstração de relatório! Vou estudar a fundo esse relatório de “consulta de formato livre” … Qualquer dúvida posso contar contigo?

Abração!

Opa estou a disposição, fui muito ajudado aqui neste forum e o mínimo que posso fazer é ajudar a outros.Se quiser me adicione no msn ou skype

MSN: saulobborges @ hotmail.com
SKYPE: saulobborges

Saulo,

Como você controla o salto de página? consegue forçar o salto de página em um determinado ponto do relatório?

Então até o momento não tive problemas com isso, o relatório esta quebrando as páginas normalmente, mas tem uma opção em css pra fazer as quebras onde você quiser (page-break-after: always) , mas normalmente relatórios que fogem o tamanho normal já determinado nas configurações de exportação eu crio um layout de papel personalizado na impressora do cara e oriento ele a usar aquele tipo de papel.

Por exemplo.

Na impressão de um contrato, algumas cláusulas desejo que iniciem numa página em branco, teria como?

Com essa opção <div style="page-break-after: always;"></div>, pelo menos nos meus relatórios, ele sempre quebra a impressão e joga a saída restante na próxima página.

Legal, vou fazer uns testes.

Olá Saulo,

Legal seu relatório. Estou querendo desenvolver um em modelo bem parecido. Na verdade já tenho o relatório pronto em aplicação BLANK. Problema que tenho é que a saída é em HTML e o cliente agora quer que seja PDF. Posso gera-lo em PDF sem ter que adaptar/refazer todo o código?

Obrigado desde já.

Saulo Borges, help-me.

Tenho esse HTML para o form Pai de uma Ordem de Compra

[code]

FAVOR ANEXAR UMA C%uFFFDPIA DESTA ORDEM DE COMPRA NA NOTA FISCAL
ORDEM DE COMPRA

N%uFFFD {sequencial} - ID {numeroOdc}  / RM: {idrm} - Coleta: {idcoleta} Data da Compra - {datacompra} - Comprador - {comprador}
DADOS DE FATURAMENTO / LOCAL DE COBRAN%uFFFDA
Nome: Fm Engenharia Ltda        Endere%uFFFDo: Rua J%uFFFDlio Laender     N%uFFFD: 40     Bairro: Ipiranga  Cidade: Te%uFFFDfilo Otoni - MG - CEP: 39.801-002
C.N.P.J: 25.320.870/0001-79  I.E : 686.827.353.00-50

FORNECEDOR CENTRO DE CUSTO LOCAL DE ENTREGA
Nome: {razaosocial} CNPJ: {cnpj} 
Endere%uFFFDo: {end_forn} N%uFFFD {num_forn}
Bairro: {bair_forn} Cidade: {cid_forn} Est: {est_forn}
Vendedor: {vendedor} Telefone: {tel_forn}
Nome: {obra} Rua: {end_obra}
Bairro: {bair_obra} Cidade: {cid_obra}
Estado: {est_obra}
Nome: {obra} Rua: {end_obra}
Bairro: {bair_obra} Cidade: {cid_obra} Estado: {est_obra}
MATERIAIS

Descri%uFFFD%uFFFDo Especifica%uFFFD%uFFFDo NBR Unid: Quant: R$ Unit R$ Total
{produtor}

Produtos: {valorODC} Frete: {frete} Descontos: {desconto} Valor da compra: {valorfinal}
CONDI%uFFFD%uFFFDES DE PAGAMENTO

COMPRADOR ENGENHEIRO PARCELAS ACORDADAS
{pagamento}

[/code]

E esse HTML para o form filho que são os produtos.

[code]

{descricao} {id_descricao_componente} {nbr} {abreviacao} {dtqcomprar} {preco} {total}
[/code]

Onde faço a quebra caso os produtos não caibam em apenas 1(uma) pagina ? Logo, neste caso teriam que sair 2(duas) paginas com Layout igual, estando diferente apenas os Produtos…

Help-me

Jean o seu caso é mais complicado do que os relatório que eu utilizo, é bem parecido na verdade com a necessidade de uma nfe né com muito produtos onde é necessário repetir o pai e continuar montando o filho com o restante dos produtos.
Vou estudar isso, porque nunca precisei usar mas já sei que em breve precisarei…assim que conseguir alguma coisa eu posto.

OK… obrigado.

estou trabalhando em uma solução com o report pdf com registros por linha.

percebi que lá quando uso a opção registros por linha aparece opção de cabeçalho , rodapé e corpo… dai estou montando o layout dentro do cabeçalho e neste caso esta repetindo conforme o numero de registros… só falta agora controlar a quantidade de registros dentro de cada pagina…

assim que terminar vou gravar em video tudo que fiz e vou postar no youtube… no entanto quero fazer as 2(duas) opções funcionar…

Jean você pode pegar esse código e fazer na blank, eu tenho um exemplo se vc se interessar eu te mostro.

Eu usei o recordset do SC. sc_select();

Irmao,se puder me mandar eu agradeço…

http://svconesoft.no-ip.org:8887/conehotel/

login: teste
senha: teste

Vá em check-in, clique no X de finalizar hospedagem. Na tela que aparecer clica na Lupa Detalhar.

Essa tela foi feita na app Blank.

Eu errei não foi sc_select, foi lookup mesmo.

Segue o código:

$sql_acomp = "SELECT NOME FROM HOT004 WHERE TIPO = 2"
				. " AND COD_HOSPEDAGEM = '" . [glo_reserva] . "'";
sc_lookup(cs, $sql_acomp);
$nacomp = count({cs});	
if (isset({cs[0][0]})) {
	$valor_add = $nacomp * 30.00;
}
else {
	$valor_add = 0.00;
}
	
// SQL
$check_sql = "SELECT HOT003.DATA_ENTRADA, HOT003.DATA_SAIDA, HOT003.HORA_SAIDA, HOT001.NOME, CAD001.NOME, HOT003.HORA_ENTRADA"
   . " FROM HOT003"
   . " JOIN HOT001 ON HOT001.CODIGO = HOT003.COD_SUITE"
   . " JOIN CAD001 ON CAD001.CODIGO = HOT003.COD_CLIENTE"
   . " WHERE HOT003.CODIGO = '" . [glo_reserva] . "'";
sc_lookup(rs, $check_sql);

if (isset({rs[0][0]}))     // ENCONTRADO
{
	$entrada = {rs[0][0]};
	//$saida = {rs[0][1]};
	$saida = date("Y-m-d");
		
	$data_entrada = pegaTimeStamp($entrada);
	$data_saida = pegaTimeStamp($saida);
	
	$diferenca = $data_saida - $data_entrada;	
	$dias = (int)floor($diferenca / (60 * 60 * 24));
	
	$entrada = sc_date_conv({rs[0][0]},"db_format","dd/mm/aaaa");
	$saida = sc_date_conv({rs[0][1]},"db_format","dd/mm/aaaa");
	?>
			<script>
				function imprime_form()
				{				
					if (confirm('Deseja imprimir essa pagina?')) {
						document.getElementById('imprimir').style.visibility = 'hidden';
						document.getElementById('voltar').style.visibility = 'hidden';
						window.print();	
					}
				}
				function voltar_blank() 
				{
					history.back();
					/*var iframe = document.getElementById('nmsc_iframe_consulta_checkin');
					var src = "../blank/blank.php";
					iframe.src = src;*/
				}
			</script>

		<!-- CÓDIGO DE GERAÇÃO DE DIÁRIAS E CONSUMOS -->
			<style>
				tr {
					border: 1px solid black;
				}
				#main {
					border: 1px solid black;
					font-family: Calibri, Candara, Segoe, "Segoe UI", Optima, Arial, sans-serif;
					font-size: 13px;
				}
				.title {
					font-size: 25px;
					text-align: center;
				}
				.nome {
					font-size: 14px;
				}
				#info {
					font-size: 13px;
					text-align: center;		
				}
				#endereco {
					border: 0px;
					font-size: 12px;
				}
				.total {
					color: #CC0000;
					font-size: 13px;
					vertical-align: top;
				}
				
				
			</style>
			
			<table id="main" border=0 width="680" cellspacing=0 cellpadding=0>
				<tr>
					<td height=120 rowspan=2 colspan=1 style="border-bottom: 1px solid black; border-right: 1px solid black" align="center">
						<img src="../_lib/img/logo_ext.png">
					</td>
					<td colspan=5 height=60 class="title" style="border-bottom: 1px solid black;">
						<b><i> APIDES PALACE HOTEL </i></b> <br>
						<b><span id="info">Extrato para simples conferência</span></b>
					</td>
				</tr>
				<tr>
					<td colspan=5 style="border-bottom: 1px solid black;">
						<table border=0 cellspacing=0 cellpadding=0 width="100%" id="endereco">
							<tr>
								<td><b>Endereço:</b></td>
								<td colspan=2> ROD BR 101 NORTE KM 17, 809 </td>
								<td> <b>CEP:</b> 29830-000</td>
							</tr>
							<tr>
								<td><b>Cidade:</b></td>
								<td> PEDRO CANÁRIO - ES </td>
								<td><b>Fone:</b> (27) 3764-2223</td>
								<td><b>Fax:</b> (27) 3764-0045</td>
							</tr>
							<tr>
								<td><b>CNPJ:</b></td>
								<td> 07.683.292/0001-53 </td>
								<td><b>Inscri&ccedil;&atilde;o Estadual:</b></td>
								<td> ISENTO</td>
							</tr>
						</table>
					</td>
				</tr>
				<tr>
					<td class="nome" colspan=5>
						<b>Titular:</b><b><?php echo " " . {rs[0][4]} ?></b>
					</td>
					<td>
						<?php echo date("d/m/Y"); ?>
					</td>
				</tr>
				<tr>
					<td>
						<b>Empresa:</b>
					</td>
					<td colspan=5>
						
					</td>
				</tr>
				<tr>
					<td style="border-bottom: 1px solid black;" colspan=2>
						<b>Data Chegada:</b><?php echo " ". $entrada . " " . {rs[0][5]} ?>
					</td>
					<td style="border-bottom: 1px solid black;">
						<b>Saída:</b>
					</td>
					<td style="border-bottom: 1px solid black;" colspan=2>
						<?php echo $saida . " " . {rs[0][5]}; ?>
					</td>
					<td class="nome" style="border-bottom: 1px solid black;">
						<b>Apartamento:</b>&nbsp;&nbsp;<b><?php echo {rs[0][3]} ?></b>
					</td> 
				</tr>
			<tbody bgcolor="#D0D0D0">
				<tr>
					<td style="border-bottom: 1px solid black;">
						Ponto de Venda
					</td>
					<td style="border-bottom: 1px solid black;">
						Comanda
					</td>
					<td style="border-bottom: 1px solid black;">
						Data
					</td>
					<td style="border-bottom: 1px solid black;" align="center">
						Quant.
					</td>
					<td style="border-bottom: 1px solid black;">
						Produto
					</td>
					<td style="border-bottom: 1px solid black;" align="right">
						Valor
					</td>
				</tr>
			</tbody>
				<!-- LOOP COMEÇA AQUI  -->
<?php
			$check_sql = "SELECT HOT002.VALOR FROM HOT003"
    			. " JOIN HOT001 ON HOT001.CODIGO = HOT003.COD_SUITE"
				. " JOIN HOT002 ON HOT002.TIPO_SUITE = HOT001.TIPO"
   				. " WHERE HOT003.CODIGO = '" . [glo_reserva] . "'"
				. " AND HOT002.COD_MODELO = '".[glo_modelo]."'"
				. " AND HOT002.TIPO = '".[glo_tipo]."'";
			sc_lookup(rs, $check_sql);
			
			$valor_diaria = 0.00;
			if (isset({rs[0][0]}))
			{
				$dia_acomp = $valor_add + {rs[0][0]};
				for ($i=1; $i<=$dias; $i++) {
					$valor_diaria = (float)$valor_diaria + $dia_acomp;
					if ($i == 1) {
						$titulo = "DIÁRIA";
						$borda = "border-right: 1px solid black; border-bottom: 0px";
					}
					else if ($i < $dias) {
						$titulo = "";
						$borda = "border-right: 1px solid black; border-bottom: 0px";
					}
					else {
						$titulo = "";
						$borda = "border-right: 1px solid black; border-bottom: 1px solid black;";
					}
?>
					<tr>
						<td style="<?php echo $borda; ?>">
							<?php echo $titulo; ?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							0
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							<?php 
								$explode = sc_date($entrada, "dd/mm/aaaa", "+", $i, 0, 0);
								$explode = explode("/", $explode);
								$dia = $explode[0];
								$mes = $explode[1];
								
								echo $dia ."/". $mes;
							?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;" align="center">
							1,00
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							DIÁRIA
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;" align="right">
							<?php 
								echo number_format($dia_acomp,2,",","."); // Valor da diária
							?>
						</td>
					</tr>
				<!-- FECHA TR DO LOOP -->
<?php
				}
			}
?>
				<!-- LOOP COMEÇA AQUI PRODUTOS -->
<?php
			$sql = "SELECT MES002.QTDE, EST003.NOME, MES002.TOTAL, MES002.CODIGO, HOT001.CODIGO FROM HOT003"
					. " JOIN HOT001 ON HOT001.CODIGO = HOT003.COD_SUITE"
					. " JOIN mes002 ON MES002.cod_mesa = hot001.nome"
					. " JOIN est003 ON est003.codigo = mes002.COD_PRODUTO"
					. " JOIN mes001 ON mes001.cod_hospedagem = hot003.CODIGO"
   					. " WHERE HOT003.CODIGO = '" . [glo_reserva] . "'"
					. " AND MES001.SITUACAO <> 0";
			sc_lookup(bs, $sql);
			$valor_frigobar = 0.00;
			$count = count({bs});
			if (isset({bs[0][0]})) {
				for ($j=0; $j<$count; $j++) {
					$valor_frigobar = $valor_frigobar + {bs[$j][2]};
					if ($j == 0) {
						$titulo = "PRODUTOS";
						$borda = "border-right: 1px solid black; border-bottom: 0px";
					}
					else if ($j < ($count-1)) {
						$titulo = "";
						$borda = "border-right: 1px solid black; border-bottom: 0px";
					}
					else {
						$titulo = "";
						$borda = "border-right: 1px solid black; border-bottom: 1px solid black;";						
					}
?>
					<tr>
						<td style="<?php echo $borda; ?>">
							<?php echo $titulo; ?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							<?php echo {bs[0][3]} ?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							DATA
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;" align="center">
							<?php 
								echo number_format({bs[$j][0]},2,",",".");  
								// Quantidade
							?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;">
							<?php 
								echo {bs[$j][1]};
								// Descrição
							?>
						</td>
						<td style="border-right: 1px solid black; border-bottom: 1px solid black;" align="right">
							<?php 
								echo number_format({bs[$j][2]},2,",","."); 
								// Valor
							?>
						</td>
					</tr>
					<!-- FECHA TR DO LOOP -->
<?php
				}
			}
?>
				
				<tr>
					<td rowspan=7 colspan=4 style="border-right: 1px solid black;" valign="top">
						<br>OBS: Detalhes são insuficientes.
					</td>
					<td colspan=1>
						DIÁRIAS
					</td>
					<td align="right">
						<? 
							echo number_format($valor_diaria,2,",","."); 
							// Total das diárias
						?>
					</td>
				</tr>	
				<tr>
					<td colspan=1>
						FRIGOBAR
					</td>
					<td align="right">
						<?php 
							echo number_format($valor_frigobar,2,",","."); 
							// Total Frigobar  
						?>
					</td>
				</tr>	
				<tr>
					<td colspan=1 style="border-bottom: 1px solid black;">
						LAVANDERIA
					</td>
					<td style="border-bottom: 1px solid black;" align="right">
						0,00
					</td>
				</tr>	
				<tr>
					<td colspan=1>
						TOTAL DA CONTA
					</td>
					<td align="right">
						<?php 
							$total_parcial = $valor_frigobar + $valor_diaria;
							echo number_format($total_parcial,2,",",".");  // Total parcial						
						?>
					</td>
				</tr>	
				<tr>
					<td colspan=1>
						DESCONTO
					</td>
					<td align="right">
						<?php //Falta criar campo desconto
							$desconto = 0.00;
							echo number_format($desconto,2,",",".");
						?>
					</td>
				</tr>	
				<tr>
					<td colspan=1 style="border-bottom: 1px solid black;">
						ADIANTAMENTO
					</td>
					<td style="border-bottom: 1px solid black;" align="right">
						<?php //Falta criar campo adiantamento
							$adiantamento = 0.00;
							number_format($adiantamento,2,",",".");
						?>
					</td>
				</tr>	
				<tr>
					<td colspan=1 height="70" class="total">
						<b>TOTAL GERAL</b>
					</td>
					<td class="total" align="right">
						<?php 
							$total_geral = ($valor_frigobar + $valor_diaria) - $desconto - $adiantamento;
							echo number_format($total_geral,2,",","."); // Total Geral
						?>
					</td>
				</tr>
			</table>
			<table id="botoes" border=0 width="680" cellspacing=0 cellpadding=0>
				<tr>
					<td width="50%" align="right">
						<a href="../blank/blank.php">VOLTAR</a>
						<input id="voltar" name="voltar" value="Voltar" type="button" onClick="voltar_blank()">
					</td>
					<td align="left">
						<input id="imprimir" name="imprimir" value="Imprimir" type="button" onClick="imprime_form()">
					</td>
				</tr>
			</table>
	<!-- FIM DO CÓDIGO --> 
	<?php
	
	/*$inicio = '08-10-2008 10:00:00';
	$tolerancia = "02:00:00";
	
	$resultado = somaHoras($inicio, 1, $tolerancia);
	echo "<br>". $resultado;*/
}
else     // NÃO ENCONTRADO
{
	sc_error_message("ERRO DE PROCURA!");
}

Obrigado. vou estudar esse código.
parece que é isso mesmo que preciso.