Gerar Relatórios

[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

recomendo usar esse aqui

http://www.yiiframework.com/extension/eexcelview

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>&lt;</b>, <b>&lt;=</b>, <b>&gt;</b>, <b>&gt;=</b>, <b>&lt;&gt;</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.