[b][size="3"]Amigos,
Estou tendo uma grande dor de cabeça em relação a gerar relatórios, alguém poderia me informar qual seria o método mais fácil e eficaz.
Agradeço a toddos.
Adriano Silva[/size][/b]
[b][size="3"]Amigos,
Estou tendo uma grande dor de cabeça em relação a gerar relatórios, alguém poderia me informar qual seria o método mais fácil e eficaz.
Agradeço a toddos.
Adriano Silva[/size][/b]
[b]Alguém consegue me informar como posso utilizar o IREPORT neste framework. Pois é uma ferramenta muito prática e eficaz na realização de relatórios, o que não consigo é juntar uma coisa com a outra, ou seja, o IREPORT com o YII.
Sds,
Adriano Silva[/b]
Bom dia galera, sou novo por aqui, também tenho duvidas sobre geração de relatório usando o Ireport.
Gostaria de uma ajuda, ou se alguem conhece outra forma…
vlw…
Yii não tem suporte específico pra nenhuma integração com o iReport, então tudo tem que ser feito da maneira tradicional.
Existem várias formas de integração, recomendo dar uma olhada no link abaixo pra ter uma idéia das opções.
http://groups.google.com/group/listaphp/browse_thread/thread/44b57093522e258b?pli=1
Adriano,
Só serve se for o iReport?
Tem o TCPDF (www.tcpdf.org) que é open source e é muito bom. Inclusive, tem um vídeo demonstrativo de como usá-lo junto com o Yii. O vídeo é em espanhol, mas dá pra entender bem.
Até mais!
Claro que não amigo,serve qualquer um. O importante é que consiga gerar relatórios, dependente qual for. Vou dá uma olhada nesse link.
Muito obrigado,
Adriano Silva
Gustavo,
Tens algum exemplo na pratica desta extensão?
Abços,
Adriano Silva
Use igual vc usa o CGridView, mas ao invés de mostrar o grid ele vai enviar para downlaod o arquivo excel/pdf
para mudar o formato, adicione o ao array de parametros
'exportType'=>'tipo'
tipo pode ser um desses Excel5, Excel2007,PDF, HTML, CSV
Tudo é feito nos CONTROLLERS e no ADMIN?
Adriano Silva
Olá amigos,
Alguem pode me dá um exemplo de utilização desta extensão, pois estou tendo dificuldades em implementá-la em minha aplicação.
Agradeço a todos,
Adriano Silva
da uma olhada neste post
http://www.yiiframework.com/forum/index.php?/topic/18119-extensioneexcelview/
ae tem vários exemplos
Amigo é o seguinte,
No meu projeto tá assim:
//No view tenho um _filter assim
<div class="form">
<?php echo CHtml::beginForm(); ?>
<div class="row">
<?php echo CHtml::label('Status da Requisição:','req_status'); ?>
<?php echo CHtml::dropDownList('req_status',$req_status, requisicao::listStatus()); ?>
</div>
<div class="row">
<?php echo CHtml::label('Período de: ','req_saidaprev'); ?>
<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(
'name'=>'req_saidaprev',
'options'=>array(
'showAnim'=>'fold',
),
'theme'=>'redmond',
'value'=>date('Y/m/d',$req_saidaprev),
'language'=>'pt-BR',
'htmlOptions'=>array(
'size'=>10,
),
));
?>
a
<?php $this->widget('zii.widgets.jui.CJuiDatePicker', array(
'name'=>'ate_datasaida',
'options'=>array(
'showAnim'=>'fold',
),
'theme'=>'redmond',
'value'=>date('Y/m/d',$ate_datasaida),
'language'=>'pt-BR',
'htmlOptions'=>array(
'size'=>10,
),
));
?>
</div>
<div class="row buttons">
<?php echo CHtml::submitButton('Filtrar'); ?>
</div>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->
//No Controller tenho
private function getFilter() {
return array(
'req_status' => isset($_POST['req_status']) ? $_POST['req_status'] : requisicao::CATEGORIA_ABERTO,
'req_saidaprev' => isset($_POST['req_saidaprev']) ? CDateTimeParser::parse($_POST['req_saidaprev'], 'dd/MM/yyyy') : strtotime('now - 3 day'),
'ate_datasaida' => isset($_POST['ate_datasaida']) ? CDateTimeParser::parse($_POST['ate_datasaida'], 'dd/MM/yyyy') : strtotime('now + 1 day'),
);
}
//Função que filtra os dados
private function defaultDataProviders() {
$filter = $this->getFilter();
$criteria = new CDbCriteria(array(
'distinct' => true,
'alias' => 'req',
'select' => 'req.*',
'order' => 'req.req_saidaprev DESC',
));
$criteria->condition = '(req.req_status = :status) AND (req.req_saidaprev BETWEEN :inicio AND :fim)';
$criteria->params = array(':status' => $filter['req_status'],
':inicio' => $filter['req_saidaprev'],
':fim' => $filter['ate_datasaida']);
$dataProvider = new CActiveDataProvider('requisicao',
array(
'pagination' => array(
'pageSize' => self::PAGE_SIZE,
),
'criteria' => $criteria,
)
);
return $dataProvider;
}
//No admin está assim
<?php echo "<meta HTTP-EQUIV='refresh' CONTENT='60'>"; ?>
<?php
$this->pageTitle = Yii::app()->name . 'SCV - Requisições Cadastrada';
$this->breadcrumbs = array(
'Veículos' => array('/veiculo/admin'),
'Requisições' => array('admin'),
'Cadastradas',
);
?>
<div class="example_title">
<img src="<?php echo Yii::app()->request->baseUrl; ?>/images/requicao.png" alt="logo" />
<?php echo "Requisições"; ?>
</div>
<ul class="actions">
<li><Font color="#00008B"><b>Menu Interno >> </b></Font></li>
<li><?php echo CHtml::link('Adicionar Requisição', array('create')); ?></li>
<li><?php echo CHtml::link('Visualizar Veículos Cadastrados', array('/veiculo/admin')); ?></li>
</ul><!-- actions -->
<div class="demo_box">
<div class="demo_box">
<Font color="black"><b>Filtro de Requisições: </b></Font>
<?php $this->renderPartial('_filter',$filter);?>
</div>
<Font color="black"><b>Visualizar Requisições: </b></Font>
<?php echo CHtml::link('Abertas',array('','type'=> requisicao::CATEGORIA_ABERTO),array('class'=>'showHideButtons')); ?> |
<?php echo CHtml::link('Em Andamento',array('','type'=>requisicao::CATEGORIA_EMANDAMENTO),array('class'=>'showHideButtons')); ?> |
<?php echo CHtml::link('Concluídas',array('','type'=>requisicao::CATEGORIA_CONCLUIDO),array('class'=>'showHideButtons')); ?>
<?php
$this->widget('zii.widgets.grid.CGridView', array(
'dataProvider' => $dataProvider,
'rowCssClass' => array('odd', 'even', 'redodd', 'redeven'),
'rowCssClassExpression' => '$this->dataProvider->data[$row]->req_status==requisicao::CATEGORIA_CONCLUIDO?$this->rowCssClass[$row%2+2]:$this->rowCssClass[$row%2]',
'columns' => array(
array(
'name' => 'Numero',
'value' => '$data->req_id."/".$data->ano',
),
/* array(
'name' => 'data_inclusao',
'header' => 'Data/Hora Inclusao',
'value' => 'date("d/m/Y H:i",$data->data_inclusao)',
), */
array(
'name' => 'Requisitante',
'value' => '$data->usuario0 -> colaborador0 -> col_nome',
),
array(
'name' => 'Setor',
'value' => '$data->usuario0->colaborador0->setor0->set_nome',
),
array(
'name' => 'Ramal',
'value' => '$data->usuario0 -> colaborador0 -> ramal',
),
array(
'name' => 'Tipo Requisicao',
'value' => '$data->tprequisicao0 -> tr_descricao',
),
array(
'name' => 'Saida Prevista',
'value' => 'date("d/m/Y",$data->req_saidaprev)." " .$data->req_horaprev',
),
'req_status',
'ate_kmrodado',
array(
'header' => 'Ações Req',
'class' => 'CButtonColumn',
'template' => '{view}{update}{delete}',
'updateButtonLabel' => 'Editar Requisição',
'viewButtonLabel' => 'Detalhes da Requisição',
'deleteConfirmation' => 'Você tem certeza que deseja excluir este item?',
),
array(
'header' => 'Ações Atend',
'class' => 'CButtonColumn',
'template' => '{update}{finalize}{updatestart}{updatfinalize}',
'updateButtonLabel' => 'Alterar Status',
'viewButtonLabel' => 'Detalhes ou Efetuar Atendimento',
'buttons' => array(
'update' => array(
'label' => 'Iniciar Atendimento',
'imageUrl' => 'images/iniciar.png',
'url' => 'Yii::app()->createUrl("/requisicao/start", array("id" => $data->req_id))',
),
'finalize' => array(
'label' => 'Finalizar Atendimento',
'imageUrl' => 'images/finaliza.png',
'url' => 'Yii::app()->createUrl("/requisicao/finalize", array("id" => $data->req_id))',
),
'updatestart' => array(
'label' => 'Editar Inicio',
'imageUrl' => 'images/Editar.gif',
'url' => 'Yii::app()->createUrl("/requisicao/updatestart", array("id" => $data->req_id))',
),
'updatfinalize' => array(
'label' => 'Editar Final',
'imageUrl' => 'images/Edita.png',
'url' => 'Yii::app()->createUrl("/requisicao/updatfinalize", array("id" => $data->req_id))',
),
),
),
)
)
); ?>
</div>
Com isso consigo filtrar os dados da gridview, o que gostaria era que quando clicar em Filtrar. O sistema não me mostrasse os valores na grid, e sim abrisse no excel. Com esses exemplos que você me enviou, não consegui emplementá-lo. Me desculpas por tantas perguntas, estou começando a pouco tempo no yii. Por isso tenho muitas dúvidas, mas com a ajuda dos amigos conseguirei chegar lá.
Justamente pra esse sistema que estou desenvolvendo já apliquei várias funcionalidades, como envio de email automático, permissões etc, mais infelismente só falta esses reportes.
Abços,
Adriano Silva
Amigo,
É possivel expotar nesta extensão dados de uma query?
Sds,
Adriano Silva
da uma olhada no que fiz num projeto antigo
controller
public function actionDot()
{
$columns=array(
'OC',
'Nombre_Usuario',
array('name'=>'Cargo','filter'=>Dotacion::getAllCargo()),
array('name'=>'Sede','filter'=>Dotacion::getAllSede()),
array('name'=>'Instalacion','filter'=>Dotacion::getAllInstalacion()),
'Fecha_Requerimiento',
array('name'=>'Estado','filter'=>Dotacion::getAllEstado()),
);
$this->actionName='Dotacion';
$model=new Dotacion ('search');
$model->unsetAttributes(); // clear any default values
if(isset($_GET['Dotacion']))
$model->attributes=$_GET['Dotacion'];
if(isset($_GET['export'])){
switch($_GET['export']){
case 'email':
return $this->pmail($model,$columns);
default:
return $this->ppdf($_GET['export'],$model,$columns);
}
}
$this->render('busqueda',array(
'model'=>$model,
'columns'=>$columns
));
}
function pmail($model,$columns){
$body=$this->renderPartial('_busqueda',array(
'model'=>$model,
'hide'=>true,
'columns'=>$columns,
),true,false);
$mail=new YiiMailMessage;
$mail->addTo(Yii::app()->getUser()->email,Yii::app()->getUser()->getName());
$mail->addFrom(Yii::app()->params['adminEmail']);
$mail->setSubject('Busqueda');
$mail->setBody($body,'text/html');
if(Yii::app()->mail->send($mail))
echo '<div class="success">Email enviado</div>';
else
echo '<div class="error">Error al enviar</div>';
}
function ppdf($type,$model,$columns){
foreach(Yii::app()->log->routes as $route)
if($route instanceof CWebLogRoute)
$route->enabled = false;
$this->renderPartial('_busqueda',array(
'model'=>$model,
'hide'=>true,
'pdf'=>array(
'exportType'=>$type,
'title'=>$this->actionName,
'subject'=>'Busqueda',
'description'=>'Busqueda guardada en '.date("d/m/Y"),
),
'columns'=>$columns
));
}
views
busqueda.php
<?php $this->setPageTitle("Busqueda");?>
<h1>Busqueda</h1>
<p>
Si lo desea, puede ingresar un operador de comparación (<b><</b>, <b><=</b>, <b>></b>, <b>>=</b>, <b><></b>
o <b>=</b>) al comienzo de cada uno de los valores de búsqueda para especificar la comparación que se debe hacer.
</p>
<?php
echo CHtml::ajaxLink(
'Recibir en mi email esa consulta',
'js:$("#busqueda-grid .keys").attr("title")',
array('replace'=>'#emailform','type'=>'get','data'=>array('export'=>'email')),
array('onclick'=>'$("#emailform").replaceWith("<p id=emailform>Espere mientras lo email es enviado.</p>");','id'=>'emailform')
);
echo CHtml::tag('span',array('style'=>'margin:20px'));
echo CHtml::link("Descargar en PDF","#",array('class'=>'export','title'=>'PDF'));
echo CHtml::tag('span',array('style'=>'margin:20px'));
echo CHtml::link("Descargar en excel","#",array('class'=>'export','title'=>'Excel5'));
$this->renderPartial('_busqueda',array('columns'=>$columns,'model'=>$model,'hide'=>false));
echo CHtml::script('
$(".export").click(function(){
url=$("#busqueda-grid .keys").attr("title");
type=$(this).attr("title");
window.location=url+(url.indexOf("?")>0 ? "&" : "?")+"export="+type;
})');
_busqueda.php
<?php
$this->widget(isset($pdf) ? 'EExcelView' : 'zii.widgets.grid.CGridView',array_merge(array(
'hideHeader'=>$hide,
'filter'=>$hide ? null : $model,
'enablePagination'=>!$hide,
'id'=>'busqueda-grid',
'dataProvider'=>$model->search(),
'columns'=>$columns,
),(isset($pdf) ? $pdf : array())));
Esse exemplo está exelente amigo, mas como interagí-lo com o que preciso. Pois estou tendo alguns problemas, veja só:
Tem alguma forma de eu pegar esse relatório apenas desta consulta abaixo, por exemplo:
public function getPrint() {
$datainclusao = $this->datainclusao;
$data = $this->data;
$sql = "SELECT FROM_UNIXTIME (a.data, '%d/%m/%Y') as Data_Abastecimento, v.ve_placa, v.ve_descricao,
tipocombustivel, SUM(totallitros) AS TotalLitros, SUM(valortotal) AS TotalGeral,
AVG(consumokml) as Média_Consumo, AVG(custokm) as Custo_Medio
FROM abastecimento a, veiculo v
WHERE v.ve_id = a.veiculo AND v.ve_tipo =! 'ALUGADO' AND consumokml != 0 AND custokm != 0
AND FROM_UNIXTIME (a.data, '%d/%m/%Y') BETWEEN {$datainclusao} AND {$data}
GROUP BY v.ve_placa
ORDER BY a.data ASC";
$command = Yii::app()->getDb()->createCommand($sql);
return $command->queryScalar();
}
Gostaria de apenas com um clique ele importasse essa query para excel. Isso é possível? Desculpas por insitir neste assunto, mais estou precisando fazer isto com urgência e não estou conseguindo colocar as idéias no lugar.
Agradeço pela sua boa vontade,
Adriano Silva
Vou postar toda parte do relatório que fiz, ai você analisa e debuga a forma correta para você implantar.
Fiz de forma estrutural, porém precisava com urgência e não me atentei muito em corrigir depois, usei a class TCPDF, mais para futuros relatórios, irei usar o mPDF.
<?php
require_once dirname(__FILE__) . '/../../../extensions/tcpdf/tcpdf/tcpdf.php';
$tituloRelatorio = "Relatório de atendimento (Agenda profissional)";
// Extend the TCPDF class to create custom Header and Footer
class MYPDF extends TCPDF {
// Page footer
public function Footer() {
// Position at 15 mm from bottom
$this->SetY(-15);
// Set font
$this->SetFont('helvetica', '', <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />;
// Page number
// $endereco = 'BR 31 KM 472 - Bairro Jardim Piermont Dois, Betim/MG - CEP: 32550-000 (próximo ao Hotel Ibis)<br />(11) 2212-5151 / (11) 7714-1006 / (11) 55*1*26553';
//
// $this->writeHTMLCell($w=0, $h=0, $x='', $y='', '<hr>', $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);
// $this->writeHTMLCell($w=0, $h=0, $x='', $y='', $endereco, $border=0, $ln=1, $fill=0, $reseth=true, $align='C', $autopadding=true);
}
}
$pdf = new MYPDF('P', 'mm', 'A4', false, 'iso-8859-1');
// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor(configuracao('titulosite'));
$pdf->SetTitle($tituloRelatorio);
// remove default header/footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(true);
// set default header data
//$pdf->SetHeaderData('tcpdf_logo.jpg', 183, 'TCPDF Example'.' 061', 'by Nicola Asuni - Tecnick.com\nwww.tcpdf.org');
// set header and footer fonts
//$pdf->setHeaderFont(Array('helvetica', '', 10));
$pdf->setFooterFont(Array('helvetica', '', <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />);
// set default monospaced font
$pdf->SetDefaultMonospacedFont('courier');
//set margins
$pdf->SetMargins(15, 27, 15);
$pdf->SetHeaderMargin(5);
$pdf->SetFooterMargin(10);
//set auto page breaks
$pdf->SetAutoPageBreak(TRUE, 25);
//set image scale factor
$pdf->setImageScale(1.25);
//set some language-dependent strings
// PAGE META DESCRIPTORS --------------------------------------
$pdf->setLanguageArray($l);
// ---------------------------------------------------------
// set font
$pdf->SetFont('arial', '', <img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' />;
// add a page
$pdf->AddPage();
$logomarca = CHtml::image(Yii::app()->baseUrl . '/images/logoPdf-agenciamento-cargas.jpg', 'logomarca', array('width' => '220'));
if ($_GET["codprofissional"] == '') {
$sql = "SELECT
at.dataatendimento,
at.codatendimentotipo,
at.codpaciente,
pro.codprofissional,
pro.nome as nomeProfissional
FROM atendimento at
INNER JOIN profissional pro ON at.codprofissional = pro.codprofissional
WHERE at.dataatendimento BETWEEN '{$_GET["datainicial"]} 00:00:00' AND '{$_GET["datafinal"]} 23:59:59'
AND at.codatendimentolocal = '{$_GET["codatendimentolocal"]}'
ORDER BY at.dataatendimento ASC";
} else {
$sql = "SELECT
at.dataatendimento,
at.codatendimentotipo,
at.codpaciente,
pro.codprofissional,
pro.nome as nomeProfissional
FROM atendimento at
INNER JOIN profissional pro ON at.codprofissional = pro.codprofissional
WHERE at.dataatendimento BETWEEN '{$_GET["datainicial"]} 00:00:00' AND '{$_GET["datafinal"]} 23:59:59'
AND at.codprofissional = '{$_GET["codprofissional"]}' AND at.codatendimentolocal = '{$_GET["codatendimentolocal"]}'
ORDER BY at.dataatendimento ASC";
}
$sql = Yii::app()->db->createCommand($sql)->query();
$count = $sql->getRowCount();
if ($count > 0) {
$titulo = configuracao('titulorelatorio');
$profissional = Profissional::model()->findByPk($_GET["codprofissional"])->nome;
$periodo = formatarData($_GET["datainicial"], '/') . " até " . formatarData($_GET["datafinal"], '/');
$totalAtendimento = 0;
$td = '';
while (( $d = $sql->read() ) !== false) {
if ($_POST["codprofissional"] == '') {
if ($codprofissional <> $d["codprofissional"]) {
$td .= '<tr>';
$td .= '<td width="100%" colspan="4">';
$td .= '<b>PROFISSIONAL: ' . Profissional::model()->findByPk($d["codprofissional"])->nome . '</b>';
$td .= '</td>';
$td .= '</tr>';
}
$codprofissional = $d["codprofissional"];
}
$paciente = Paciente::model()->findByPk($d["codpaciente"]);
if ($_POST["datainicial"] <> $_POST["datafinal"]) {
$dia = formatarData(substr($d["dataatendimento"], 0, -9), '/') . ' às ';
}
$td .= '<tr>';
$td .= '<td nowrap>';
$td .= $dia . substr($d["dataatendimento"], 11, -3);
$td .= '</td>';
$td .= '<td nowrap>';
$td .= Atendimentotipo::model()->findByPk($d["codatendimentotipo"])->titulo;
$td .= '</td>';
$td .= '<td nowrap>';
$td .= $paciente->codpaciente . ' ' . $paciente->nome;
$td .= '</td>';
$td .= '<td nowrap="nowrap">';
$td .= '____________________________';
$td .= '</td>';
$td .= '</tr>';
$totalAtendimento++;
}
$tbl = <<<EOD
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td align="center" valign="middle"><h2>$titulo</h2></td>
</tr>
</table>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td><h2>$tituloRelatorio</h2></td>
</tr>
</table>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td align="left" valign="middle" nowrap><strong>Profissional</strong><br/>$profissional</td>
<td align="right" valign="middle" nowrap><strong>Período</strong><br/>$periodo</td>
</tr>
</table>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<th width="10%" align="left" nowrap><strong>Horário</strong></th>
<th width="20%" align="left" nowrap><strong>Tipo</strong></th>
<th width="45%" align="left" nowrap><strong>Paciente</strong></th>
<th width="25%" align="left" nowrap="nowrap"><strong>Procedimento</strong></th>
</tr>
$td
<tr>
<td colspan="4">Total de atendimento: $totalAtendimento</td>
</tr>
</table>
EOD;
// output the HTML content
$pdf->writeHTML($tbl, true, false, false, false, '');
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// reset pointer to the last page
$pdf->lastPage();
// ---------------------------------------------------------
//Close and output PDF document
$file = $_GET["datainicial"].'_'.$_GET["datafinal"]."_".$_GET["id"];
$pdf->Output("{$file}.pdf", 'I');
//============================================================+
// END OF FILE
//============================================================+
//echo $tbl;
} else {
echo '<div class="flash-error">Nenhum resultado.</div>';
}
?>
Obrigado pelas dicas dos dois amigos, o Newerton e o Gustavo. Vou usar os dois exemplos para criar meus relatórios. Foram de grande ajuda.
Abços,
Adriano Silva
Agora eu acho que, com esses exemplos tu consiga.