Sql Complejas

Hola Comunidad:

Les cuento lo que sucede es que necesito crear un tabla que muestre los datos de un sql que cree que es el siguiente




SELECT 

MC.medico_rut,

MC.medico_nombres,

MC.medico_apellidos,

A.asiento_id, 

A.asiento_fecha_creacion, 

P.prestacion_codigo, 

P.prestacion_nombre, 

AP.asiento_prestacion_precio

FROM ASIENTO AS A 

INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)

WHERE MONTH(A.asiento_fecha_creacion) = 5



esa por ejemplo es para mostrar del mes 5 solamente,

lo que necesito es que se seleccioné el mes que se desea y mostrar una tabla con el resultado de ese sql , nose si se pudiera hacer directamente con una tabla CgridView o solamente se puede hacer con una tabla dibujada a mano desde 0, cualquiera de las dos formas me sirve, ojalá me puedan ayudar a armar un poco , que pongo en el controlador, y en la vista cualquier ayuda es bienvenida

saludos y gracias por su tiempo,

Espero te sirva:




// Controller

$sql = 'TU CONSULTA';

$rawData = Yii::app()->db->createCommand($sql)->queryAll();

$arrayDataProvider = new CArrayDataProvider($rawData);

$this->render('index', array(

    'arrayDataProvider'=>$arrayDataProvider

));




// View

<?php $this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'data-grid',

    'dataProvider'=>$arrayDataProvider,

    .

    .

    .

)); ?>



en la vista esto iria con comillas o con $




'dataProvider'=>'arrayDataProvider'   o 'dataProvider'=>$arrayDataProvider 



y los campos como los llamaría en la vista

por el ejemplo el MC.medico_Rut como tendria que definirlo en la vista ?

Gracias de ante mano

La “manera Yii” es más flexible y elegante al definir las relaciones entre los modelos ActiveRecord, luego crear un CDbCriteria con “with” y finalmente pasarle un CActiveDataProvider al CGridView. En mi experiencia he tenido que usar SQL solamente para aquellas consultas que procesan decenas de miles de records. Si posteas las relaciones entre las tablas a lo mejor te puedo indicar cómo codificarlo en puro Yii :)

Es ‘dataProvider’=>$arrayDataProvider

En tu SQL tienes que indicar alias a tus columnas




SELECT 

MC.medico_rut as rut,

MC.medico_nombres as nombres,

MC.medico_apellidos as apellidos,

...



y finalmente en tu CGridView




'columns'=>array(

        array(

            'header'=>'RUT',

            'name'=>'rut',

            'value'=>'$data["rut"]'

        ),

        array(

            'header'=>'NOMBRES',

            'name'=>'nombres',

            'value'=>'$data["nombres"]'

        ),

        array(

            'header'=>'APELLIDOS',

            'name'=>'apellidos',

            'value'=>'$data["apellidos"]'

        ),



:)

Un para de modificaciones a la primera respuesta:

// Controller

$sql = ‘TU CONSULTA’;

$rawData = Yii::app()->db->createCommand($sql)->queryAll();

$arrayDataProvider = new CArrayDataProvider($rawData);

$this->render(‘index’, array(

[i][b]'arrayDataProvider'=&gt;&#036;arrayDataProvider[/b][/i]

));

// View

<?php $this->widget(‘zii.widgets.grid.CGridView’, array(

'id'=&gt;'data-grid',


[b][i]'dataProvider'=&gt;&#036;arrayDataProvider,[/i][/b]


.


.


.

)); ?>

Mira tengo en el controlador




    public function actionPrestacionesIngresadasMes() {

        

        $sql = "SELECT MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_creacion as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)"; 

        

        $rawData = Yii::app()->db->createCommand($sql)->queryAll();

        $arrayDataProvider = new CArrayDataProvider($rawData);

        

        $this->render('prestacionesIngresadasMes', array(

            'arrayDataProvider'=>$arrayDataProvider

        ));

    }



y en la vista




<?php

/* @var $this AsientoController */

/* @var $model Asiento */


$this->breadcrumbs=array(

	'Prestaciones Ingresadas del Mes',

);

?>


<div class="form">


<fieldset>

<legend style="font-weight:bold; color:#000000; font-size:2em">Prestaciones Ingresadas en el Mes</legend>




<?php 

$this->widget('zii.widgets.grid.CGridView', array(

    		'id'=>'data-grid',

 			'dataProvider'=>$arrayDataProvider,			

 			'columns'=>array(

       			array(

            		'header'=>'RUT',

            		'name'=>'rut',

            		'value'=>'$data["rut"]'

        		),

        		array(

            		'header'=>'NOMBRE',

            		'name'=>'nombre',

            		'value'=>'$data["nombre"]'

        		),

        		array(

            		'header'=>'APELLIDOS',

            		'name'=>'apellido',

            		'value'=>'$data["apellido"]'

        		),

              	array(

            		'header'=>'FECHA',

            		'name'=>'fecha',

            		'value'=>'$data["fecha"]'

        		),

        		array(

            		'header'=>'CODIGO PRESTACION',

            		'name'=>'codigo_prestacion',

            		'value'=>'$data["codigo_prestacion"]'

        		),

        		array(

            		'header'=>'NOMBRE PRESTACION',

            		'name'=>'nombre_prestacion',

            		'value'=>'$data["nombre_prestacion"]'

        		),

        		array(

            		'header'=>'PRECIO',

            		'name'=>'precio',

            		'value'=>'$data["precio"]'

        		),

			),

		));?>		


</fieldset>

<fieldset>


</div>




todo tal cual como me lo plantiaste compadre pero me da el siguiente error

Undefined index: id

Modica el CArrayDataProvider como sigue:




$arrayDataProvider = new CArrayDataProvider($rawData, array('id'=>'PrestacionesIngresadas'));



Lo modifique asi




    public function actionPrestacionesIngresadasMes() {

        $sql = "SELECT MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_creacion as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)"; 

        

        $rawData = Yii::app()->db->createCommand($sql)->queryAll();

        $arrayDataProvider = new CArrayDataProvider($rawData, array('id'=>'PrestacionesIngresadas'));

        $this->render('prestacionesIngresadasMes', array(

        'arrayDataProvider'=>$arrayDataProvider

        ));

    }



PERO SIGUE EL MISMO PROBLEMA :(

Disculpa tantas modificaciones, pero lo estaba haciendo sin consultar la documentacion; modifica tu SQL y agrega A.asiento_id as id,




$sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_creacion as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio



Tu CArrayDataProvider debe quedar algo como:




$arrayDataProvider = new CArrayDataProvider($rawData, array(

   'keyField' => 'id',                // PRIMARY KEY

   'id' => 'PrestacionesIngresadas'   // ID of the data provider itself

));



compadre te pasaste me funciono de maravilla, lo ultimo que me gustaría saber para terminar,

es como lo tengo que hacer para poder agregarle un filtro,

¿ onda es que necesito buscar por mes ?

Muchas gracias de ante mano !!

Que bien que te sirvio!!!

:D

Como no usas un Modelo tienes hacer un poco mas de trabajo para implementar la busqueda con filtro (via AJAX).

Aqui un ejemplo, no pude probarlo pero te pude dar la pauta para implementarlo correctamente. Si necesitas ayuda, solo avisame.

B)

Controller




public function actionSearch() {

    $criteria = (string) Yii::app()->getRequest()->getQuery('criteria');


    if (Yii::app()->getRequest()->getIsAjaxRequest()) {

        $condition = '';

        if (!empty($criteria))

            $condition = "WHERE MC.medico_nombres LIKE '%{$criteria}%'"


        $sql = "TU SQL" . " {$condition}"; 

        $rawData = Yii::app()->db->createCommand($sql)->queryAll();

        $arrayDataProvider = new CArrayDataProvider($rawData, array(

           'keyField'=>'id',

           'id'=>'PrestacionesIngresadas'

        ));

        $this->renderPartial('_gridView', array('arrayDataProvider'=>$arrayDataProvider), false, true);

        Yii::app()->end();

    }

    throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');

}



View (prestacionesIngresadasMes.php)




<div>

<?php

    echo CHtml::textField('search-field', null, array(

        'class'=>'submit-search',

        'placeholder'=>'Search'

    ));

?>

</div>

<div id="grid-items-view">

    <?php $this->renderPartial('_gridView', array('arrayDataProvider'=>$arrayDataProvider)); ?>

</div>

<script type="text/javascript">

(function($){

    function doSearch() {

        var criteria = $.trim($("#search-field").val());

        var url = "<?php echo $this->createUrl('search'); ?>";


        $.ajax({

                url : url,

                type : "GET",

                data : {

                    criteria : criteria

                },

                dataType : "html",

                beforeSend : function() {

                    //

                },

                success : function(response) {

                    $("#grid-items-view").html(response);

                },

                error: function() {

                }

        });

    }

    $(".submit-search").keypress(function(e) {

        if (e.keyCode == 13) {

            doSearch();

        }

    });

})(jQuery);

</script>



GridView (crea _gridView.php)




<?php 

$this->widget('zii.widgets.grid.CGridView', array(

    'id'=>'data-grid',

    'dataProvider'=>$arrayDataProvider,                     

    'columns'=>array(

        array(

        'header'=>'RUT',

        'name'=>'rut',

        'value'=>'$data["rut"]'

        ),

        array(

        'header'=>'NOMBRE',

        'name'=>'nombre',

        'value'=>'$data["nombre"]'

        ),

        array(

        'header'=>'APELLIDOS',

        'name'=>'apellido',

        'value'=>'$data["apellido"]'

        ),

        array(

        'header'=>'FECHA',

        'name'=>'fecha',

        'value'=>'$data["fecha"]'

        ),

        array(

        'header'=>'CODIGO PRESTACION',

        'name'=>'codigo_prestacion',

        'value'=>'$data["codigo_prestacion"]'

        ),

        array(

        'header'=>'NOMBRE PRESTACION',

        'name'=>'nombre_prestacion',

        'value'=>'$data["nombre_prestacion"]'

        ),

        array(

        'header'=>'PRECIO',

        'name'=>'precio',

        'value'=>'$data["precio"]'

        ),

    ),

));



Compadre pero la actionSearch tengo que cambiarla porque la mia se llamaba actionPrestacionesIngresadasMes o es un action nueva ?

Seria un nuevo action.

:lol:

El que tienes (actionPrestacionesIngresadasMes) no necesita modificacion alguna (hasta ahora).

Compadre tenia este tema de lado pero he seguido dandole y no me ha querido funcionar la busqueda por Ajax queme comentavas, mira esto es lo que agregue,

Controlador




  public function actionPrestacionesIngresadasMes() {

        $sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_creacion as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)"; 

        

        $rawData = Yii::app()->db->createCommand($sql)->queryAll();

        $arrayDataProvider = new CArrayDataProvider($rawData, array(

           'keyField' => 'id',                // PRIMARY KEY

           'id' => 'PrestacionesIngresadas'  // ID of the data provider itself


        ));


        $this->render('prestacionesIngresadasMes', array(

        'arrayDataProvider'=>$arrayDataProvider

        ));

    }


    public function actionSearch() {


        $criteria = (string) Yii::app()->getRequest()->getQuery('criteria');


        if (Yii::app()->getRequest()->getIsAjaxRequest()) {

            $condition = '';

            if (!empty($criteria))

                $condition = "WHERE MC.medico_nombres LIKE '%{$criteria}%'";

                $sql = "SELECT A.asiento_id as id,

                    MC.medico_rut as rut,

                    MC.medico_nombres as nombre,

                    MC.medico_apellidos as apellido,

                    A.asiento_fecha_creacion as fecha, 

                    P.prestacion_codigo as codigo_prestacion, 

                    P.prestacion_nombre as nombre_prestacion, 

                    AP.asiento_prestacion_precio as precio

                    FROM ASIENTO AS A 

                    INNER JOIN ASIENTO_PRESTACION AS AP ON (AP.asiento_prestacion_asiento_id = A.asiento_id)

                    INNER JOIN PRESTACION AS P ON (P.prestacion_id = AP.asiento_prestacion_prestacion_id)

                    INNER JOIN ASIENTO_COBRANZA AS AC ON (AC.as_cob_asiento_id = A.asiento_as_cob_asiento_id)

                    INNER JOIN MEDICO_COBRANZA AS MC ON (MC.medico_id = AC.as_cob_medico_id)" . " {$condition}"; 

                $rawData = Yii::app()->db->createCommand($sql)->queryAll();

                $arrayDataProvider = new CArrayDataProvider($rawData, array(

                   'keyField'=>'id',

                   'id'=>'PrestacionesIngresadas'

                ));

                $this->renderPartial('_gridView', array('arrayDataProvider'=>$arrayDataProvider), false, true);

                Yii::app()->end();

        }

        throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');

    }



Vista prestacionesIngresadasMes




<div>

<?php

    echo CHtml::textField('search-field', null, array(

        'class'=>'submit-search',

        'placeholder'=>'Search'

    ));

?>

</div>

<div id="grid-items-view">

    <?php $this->renderPartial('_gridView', array('arrayDataProvider'=>$arrayDataProvider)); ?>

</div>

<script type="text/javascript">

(function($){

    function doSearch() {

        var criteria = $.trim($("#search-field").val());

        var url = "<?php echo $this->createUrl('search'); ?>";


        $.ajax({

                url : url,

                type : "GET",

                data : {

                    criteria : criteria

                },

                dataType : "html",

                beforeSend : function() {

                    //

                },

                success : function(response) {

                    $("#grid-items-view").html(response);

                },

                error: function() {

                }

        });

    }

    $(".submit-search").keypress(function(e) {

        if (e.keyCode == 13) {

            doSearch();

        }

    });

})(jQuery);

</script>



Vista _gridView




  

<?php 

$this->widget('zii.widgets.grid.CGridView', array(

'id'=>'data-grid',

'dataProvider'=>$arrayDataProvider,

 			'columns'=>array(

       			array(

            		'header'=>'RUT',

            		'name'=>'rut',

            		'value'=>'$data["rut"]'

        		),

        		array(

            		'header'=>'NOMBRES',

            		'name'=>'nombre',

            		'value'=>'$data["nombre"]'

        		),

        		array(

            		'header'=>'APELLIDOS',

            		'name'=>'apellido',

            		'value'=>'$data["apellido"]'

        		),

              	array(

            		'header'=>'FECHA',

            		'name'=>'fecha',

            		'value'=>'$data["fecha"]'

        		),

        		array(

            		'header'=>'CODIGO PRESTACION',

            		'name'=>'codigo_prestacion',

            		'value'=>'$data["codigo_prestacion"]'

        		),

        		array(

            		'header'=>'NOMBRE PRESTACION',

            		'name'=>'nombre_prestacion',

            		'value'=>'$data["nombre_prestacion"]'

        		),

        		array(

            		'header'=>'PRECIO',

            		'name'=>'precio',

            		'value'=>'$data["precio"]'

        		),

			),

		));?>		




OJALA ME PUEDAS AYUDAR PORFAVOR !!

SALUDOS :D

Modifica en tu metodo search la linea siguiente:

$this->renderPartial(’_gridView’, array(‘arrayDataProvider’=>$arrayDataProvider));

<_<