Hello, i´ve using EExcelview sor quite sometime and it has always worked fine. However, i´ve allways used a CActiveDataProvider and this time i needed a CSqlDataProvider because of SQL UNION.
I am using the same query and rendering it in a CGridview and it works just fine but when i render it in EExcelview it get a "PHP notice Trying to get property of non-object".
In my model i have:
public function getListaAgregadoAdminForExcel($id_processo) {
$entidadesCriteria = "(SELECT cliente.id_cliente as cliente,
cliente.nome,
cliente.nif,
processo.id_processo,
@valor_agregado:=(IFNULL((SELECT
SUM(((artigo.preco_estimado * 1.23)*encomenda_artigo.quantidade)) as valor_total_agregado
FROM
encomenda
INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
INNER JOIN encomenda_artigo ON encomenda.id_encomenda = encomenda_artigo.id_encomenda
INNER JOIN artigo ON encomenda_artigo.id_artigo = artigo.id_artigo
INNER JOIN produto ON artigo.id_produto = produto.id_produto
WHERE
encomenda.id_tipo = 1 AND
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
cliente.estado > 0
group by cliente.nome),0)) as valor_agregado,
@valor_cabimentado:=(IFNULL((SELECT
SUM(garantia.valor) as valor_total_cabimentado
FROM
encomenda
INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
INNER JOIN garantia on encomenda_garantia.id_garantia = garantia.id_garantia
WHERE
garantia.id_tipo < 3 AND
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda_garantia.cabimento IS NOT NULL AND
cliente.estado > 0
group by cliente.nome),0)) as valor_cabimentado,
ROUND(@valor_agregado - @valor_cabimentado,2) as valor_em_falta,
((SELECT
if(
((SELECT
COUNT(
DISTINCT
encomenda.id_encomenda)
FROM
encomenda
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda.id_tipo = 1) -
(SELECT
Count(DISTINCT encomenda.id_encomenda)
FROM
encomenda
INNER JOIN encomenda_garantia ON encomenda.id_encomenda = encomenda_garantia.id_encomenda
INNER JOIN garantia ON encomenda_garantia.id_garantia = garantia.id_garantia
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda.id_tipo = 1 AND
garantia.id_tipo < 3))>0 OR ((SELECT
COUNT(
DISTINCT
encomenda.id_encomenda)
FROM
encomenda
INNER JOIN encomenda_artigo on encomenda.id_encomenda = encomenda_artigo.id_encomenda
INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda_garantia.cabimento IS NOT NULL AND
encomenda.id_tipo = 1) = 0) , 'em falta', 'entregue'))) as declaracoes,
IF(@valor_agregado = 0, 'Sem agregação',
(SELECT CASE WHEN declaracoes = 'entregue' AND valor_em_falta <= 0.05 THEN 'Completo' ELSE 'Incompleto' END)) as estado_processo,
encomenda.id_encomenda as id_encomenda
FROM `encomenda` encomenda
INNER JOIN cliente on encomenda.id_cliente = cliente.id_cliente
INNER join processo_filtro on encomenda.id_cliente = processo_filtro.id_referencia
INNER JOIN processo on processo_filtro.id_processo = processo.id_processo
WHERE processo.id_processo = $id_processo AND cliente.estado >= 0 AND processo_filtro.id_filtro = 1 GROUP BY cliente.id_cliente)
UNION ALL
(SELECT cliente.id_cliente as cliente,
cliente.nome,
cliente.nif,
processo.id_processo,
@valor_agregado:=(IFNULL((SELECT
SUM(((artigo.preco_estimado * 1.23)*encomenda_artigo.quantidade)) as valor_total_agregado
FROM
encomenda
INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
INNER JOIN encomenda_artigo ON encomenda.id_encomenda = encomenda_artigo.id_encomenda
INNER JOIN artigo ON encomenda_artigo.id_artigo = artigo.id_artigo
INNER JOIN produto ON artigo.id_produto = produto.id_produto
WHERE
encomenda.id_tipo = 1 AND
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
cliente.estado > 0
group by cliente.nome),0)) as valor_agregado,
@valor_cabimentado:=(IFNULL((SELECT
SUM(garantia.valor) as valor_total_cabimentado
FROM
encomenda
INNER JOIN cliente ON cliente.id_cliente = encomenda.id_cliente
INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
INNER JOIN garantia on encomenda_garantia.id_garantia = garantia.id_garantia
WHERE
garantia.id_tipo < 3 AND
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda_garantia.cabimento IS NOT NULL AND
cliente.estado > 0
group by cliente.nome),0)) as valor_cabimentado,
ROUND(@valor_agregado - @valor_cabimentado,2) as valor_em_falta,
((SELECT
if(
((SELECT
COUNT(
DISTINCT
encomenda.id_encomenda)
FROM
encomenda
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda.id_tipo = 1) -
(SELECT
Count(DISTINCT encomenda.id_encomenda)
FROM
encomenda
INNER JOIN encomenda_garantia ON encomenda.id_encomenda = encomenda_garantia.id_encomenda
INNER JOIN garantia ON encomenda_garantia.id_garantia = garantia.id_garantia
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda.id_tipo = 1 AND
garantia.id_tipo < 3))>0 OR ((SELECT
COUNT(
DISTINCT
encomenda.id_encomenda)
FROM
encomenda
INNER JOIN encomenda_artigo on encomenda.id_encomenda = encomenda_artigo.id_encomenda
INNER JOIN encomenda_garantia on encomenda.id_encomenda = encomenda_garantia.id_encomenda
WHERE
encomenda.id_processo = $id_processo AND
encomenda.id_cliente = cliente AND
encomenda_garantia.cabimento IS NOT NULL AND
encomenda.id_tipo = 1) = 0) , 'em falta', 'entregue'))) as declaracoes,
IF(@valor_agregado = 0, 'Sem agregação',
(SELECT CASE WHEN declaracoes = 'entregue' AND valor_em_falta <= 0.05 THEN 'Completo' ELSE 'Incompleto' END)) as estado_processo,
encomenda.id_encomenda as id_encomenda
FROM `encomenda` encomenda
INNER join cliente on encomenda.id_cliente = cliente.id_cliente
INNER JOIN direcao_regional on cliente.id_direcao_regional = direcao_regional.id_direcao_regional
INNER JOIN processo_filtro on direcao_regional.id_direcao_regional = processo_filtro.id_referencia
INNER JOIN processo ON processo_filtro.id_processo = processo.id_processo
WHERE processo.id_processo = $id_processo AND cliente.estado >= 0 AND processo_filtro.id_filtro = 2 GROUP BY cliente.id_cliente)";
return new CSqlDataProvider($entidadesCriteria, array( 'pagination'=>false,));
}
In my controller:
public function actionExcelAgregadoAdmin($id_processo) {
$processo = AdminProcesso::model()->findByPk($id_processo);
if ($processo === null)
throw new CHttpException(404, 'Document Not Found');
$data = array(
'entidades'=>AdminEncomenda::model()->getListaAgregadoAdminForExcel($id_processo),
);
$this->render('ExcelAgregadoAdmin', $data);
}
AND finnaly,in my view:
<?php
$factory = new CWidgetFactory();
$widget = $factory->createWidget($this, 'ext.EExcelView', array(
'dataProvider'=>$entidades,
'title'=>'Title',
'filename'=>'Listagem de entidades',
'grid_mode'=>'export',
'exportType'=>'Excel2007',
'columns' => array(
array('name' => 'nif', 'header' => 'NIF', 'type'=>'raw', 'value'=>'$data->nif'),
array('name' => 'nome', 'header' => 'Entidade', 'type'=>'raw', 'value'=>'$data->nome'),
array('name' => 'valor_agregado', 'header' => '€ Agregado','type'=>'raw', 'value'=>'$data->valor_agregado'),
array('name' => 'valor_cabimentado', 'header' => '€ Cabimentado','type'=>'raw', 'value'=>'$data->valor_cabimentado'),
array('name' => 'valor_em_falta', 'header' => '€ em Falta','type'=>'raw', 'value'=>'$data->valor_em_falta'),
array('name' => 'declaracoes', 'header' => 'Declarações',),
array('name' => 'estado_processo', 'header' => 'Estado',),
)
));
$widget->init();
$widget->run();
?>
Thank so so much in advance!