[Solved]Dudas con la extensión select2

Hola a todos, recientemente di por terminado un post sobre extension Echosen, al cambiar para la extension select2, ya que con select2 se resolvia el problema de mostrar los valores del segundo combo en combos combinados, pero no analice la terminar de hacer la factura, el problema es que ahora me no me deja hacer la factura por el siguiente problema:

Me genera dos errores:




<p>Undefined index: idCodigo (D:\xampp\htdocs\SoftVentas\protected\controllers\DatossalController.php:130)</p> 




Error [8] <p>Undefined index: codcliente (D:\xampp\htdocs\SoftVentas\protected\controllers\DatossalController.php



Voy a poner la forma como trabajo esta parte:

No creo la factura por la accion del controlador (actionCreate)

para eso creo una accion llamada [color="#FF0000"]public function actionSalvarFactura() [color="#000000"]en el controlador[/color][/color]

esta es la accion:




public function actionSalvarFactura() {


        $id = $_POST['modelid'];

        $importeTotal = 0;

        $importeTotalc = 0;

        $impdl = 0;

        $imventas = 0;

        $imrecargo = 0;


        if ($id) {

            $model = $this->loadModel($id);

        } else {

            $model = new Datossal;

            //verificar si el consecutivo ya existe

          /*  $fact = Datossal::model()->find('Idn = :fa', array(':fa' => $_POST['idn']));

            if ($fact) {

                echo "fail";

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

            }*/

        }

        $firm = Firmantes::model()->find('CI=:CI', array(':CI' => $_POST['ci']));

        $Ent = Entidades::model()->find('CodUEB=:CodUEB', array(':CodUEB' => $_POST['codUEB']));

        //echo $firm->Fechaf;

  	

  

        if ($firm->Fechaf > date('Y-m-d') && (isset($_POST['detalle']))) {


            $model->fecha = $_POST['fecha'];

            $model->CodCliente = $_POST['codcliente'];

            $model->CodUEB = $_POST['codUEB'];

            $model->CI = $_POST['ci'];

            $model->IdEstado = $_POST['idestado'];

            $model->CIFac = $_POST['cifac'];

            $model->CodOp = 1;

            $model->NConduce = $_POST['nconduce'];

            $model->norden = $_POST['norden'];

            $model->Codde = 1;

            $model->CodDoc = 2;

            $model->CITra = $_POST['citra'];

            $model->bultos = $_POST['bultos'];

            $model->entregar = $_POST['entregar']; //


            if ($model->save()) {

                $fecha = date("y");

                $cadena1 = "$Ent->Cod";

                $cadena3 = "-";

                $cadena4 = "$model->Idn"; //

                $cadena5 = "0";

                $cadena6 = "00";

                $cadena7 = "000";

                $cadena8 = "MN";

                //llenar numero de factura

                if (!$id) {

                    $criteria = new CDbCriteria;

                    $criteria->addCondition('Idn=:Idn');

                    $criteria->params = array(':Idn' => $model->Idn);

                    $objFact = datossal::model()->find($criteria);

                    if ($model->Idn <= 9) {

                        $objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena7 . $cadena4;

                    } elseif ($model->Idn >= 10 & $model->Idn <= 99) {

                        $objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena6 . $cadena4;

                    } elseif ($model->Idn >= 100 & $model->Idn <= 999) {

                        $objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena5 . $cadena4;

                    } elseif ($model->Idn >= 1000) {

                        $objFact->nfactura = $fecha . $cadena1 . $cadena8 . $cadena3 . $cadena4;

                    }

                    $objFact->save();


                    Detallesfact::model()->deleteAll('Id_sal=:nfactura', array(':nfactura' => $model->nfactura));

//date("y")

                    foreach ($_POST['detalle'] as $item) {

                        //Lo que se guarda en tabla Detallesfactc

                        $detalle = new Detallesfact;

                        $detalle->Id_sal = $objFact->nfactura;

                        $detalle->Codprod = $item['producto']; //

                        $detalle->cantidad = $item['cantidad']; //

                        $detalle->prod = $item['prod']; //

                        $detalle->recargo = $item['recargo']; //

                        $detalle->cmay = $item['cmay'];

                        $produ = Productos::model()->find('Codprod=:Codprod', array(':Codprod' => $item['producto']));

                        $produp = Subproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produ->CodSubp));

                        $prodtipo = Tipoprod::model()->find('Codtipo = :Codtipo', array(':Codtipo' => $produp->Codtipo));

                        $turcadm = Turcadm::model()->find('CodOp=:CodOp', array(':CodOp' => $model->CodOp));

                        $detalle->Codpro = $produp->Codpro; //

                        // $producmayor = Submyproductos::model()->find('Codpro=:Codpro and CodPVen=:codpven', array(':Codpro' => $produp->Codpro, ':codpven' => $venta));

                        $producmayor = Submyproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produp->Codpro));

                        $detalle->CodPVen = $producmayor->CodPVen;

                        $detalle->SaldoDes = $producmayor->SaldoAct - $detalle->cantidad;

                        $mayor = Cmayorista::model()->find('IdMay=:IdMay', array(':IdMay' => $item['cmay']));

                        //formacion de precio mn                  

                        switch ($model->CodOp) {

                            case 1:

                                if ($mayor->IdMay <> 1) {

                                    $detalle->premn = ROUND($produ->PreMay / $turcadm->Tasa, $produ->lg);

                                } elseif ($mayor->IdMay <> 2) {

                                    $detalle->premn = ROUND($produ->PreMay, $produ->lg);

                                }

                                break;

                        }

                        //importemn

                        $detalle->importemn = ROUND($detalle->premn * $detalle->cantidad, 2);


                        //iventas mn

                        switch ($model->CodOp) {//revisar cuando realmente lo lleve

                            case 1:

                                if ($mayor->IdMay <> 1) {

                                    $detalle->imventas = ROUND((($produ->PreMay / $turcadm->Tasa - $produ->PreMay)) * $detalle->cantidad, 2);

                                } elseif ($mayor->IdMay <> 2) {

                                    0;

                                }

                                break;

                        }

                        // $detalle->imventas = ROUND((($produ->PreMay / $turcadm->Tasa - $produ->PreMay)) * $detalle->cantidad, 2);

                        //recargo

                        if ($detalle->recargo <> 1) {

                            $detalle->Recargoca = ROUND($detalle->cantidad * $prodtipo->recargo, 2);

                        }


                        $importeTotal += $detalle->importemn;

                        $imventas += $detalle->imventas;

                        $imrecargo += $detalle->Recargoca;

                        $detalle->save();


                        //para actualizar los saldos en tabla Submyproductos 

                        if (!$id) {

                            $criteria = new CDbCriteria;

                            $criteria->addCondition('CodPVen=:codpven');

                            $criteria->addCondition('Codpro=:codigo');

                            $criteria->params = array(':codpven' => $detalle->CodPVen, ':codigo' => $produp->Codpro);

                            $objSubmp = Submyproductos::model()->find($criteria);

                            $objSubmp->SaldoAct = $objSubmp->SaldoAct - $item['cantidad'];

                            $objSubmp->SaldoAnt = $objSubmp->SaldoAct + $item['cantidad'];

                            $objSubmp->save();

                        }

                        //llenar historico de operaciones

                        $histoper = Histoper::model()->find('nfactura=:nfactura and Cliente=:Cliente', array(':nfactura' => $objFact->nfactura, ':Cliente' => $model->CodCliente));


                        if (!$histoper) {//Si no existe crearla	

                            $histoper = new Histoper;

                            $histoper->nfactura = $objFact->nfactura;

                            $histoper->fecha = $model->fecha; //

                            $histoper->CodUEB = $model->CodUEB; //

                            $histoper->Cliente = $model->CodCliente; //

                            $histoper->CodDoc = 2; //

                            $histoper->IdEstado = $model->IdEstado; //

                            $histoper->ndocu = $model->norden; //

                            $histoper->CodOp = $model->CodOp; //

                            $histoper->Codde = $model->Codde; //

                            $histoper->CIFac = $model->CIFac; //

                            $histoper->CICli = $model->CI; //

                            $histoper->CITra = $model->CITra; //

                            $histoper->save();

                        }

 					//llenar otros calculos


                    	if (!$id) {

                        	$criteria = new CDbCriteria;

                        	$criteria->addCondition('nfactura=:nfactura');

                        	$criteria->params = array(':nfactura' => $objFact->nfactura);

                        	$objFac = Datossal::model()->find($criteria);

                        	$histopera = Histoper::model()->find($criteria);

                        	$histopera->ImporteMN = $importeTotal + $imrecargo;

                        	$histopera->Recargo = $imrecargo;

                        	$histopera->Imporventas = $imventas;

                        	$objFac->Imporventas = $imventas;

                        	$objFac->Recargo = $imrecargo;

                        	$objFac->ImporteMN = $importeTotal + $imrecargo;

                        	$histopera->save();

                        	$objFac->save();


                        	//llenar historico de facturas

                    	}

                    	//Guardar saldos despues de guardarlos en subcmayor en Histsalpro

                    	$histsalpro = Histsalpro::model()->find('id=:id and Codpro=:Codpro and CodPVen=:CodPVen', array(':id' => $model->nfactura, ':Codpro' => $produp->Codpro, ':CodPVen' => $detalle->CodPVen));

                    	// $productos = Submyproductos::model()->find('Codpro=:Codpro and CodPVen=:CodPVen', array(':Codpro' => $produp->Codpro, ':CodPVen' => $detalle->CodPVen));

                    	$productos = Submyproductos::model()->find('Codpro=:Codpro', array(':Codpro' => $produp->Codpro));

                    	if (!$histsalpro) {//Si no existe crearla    

                        	$histsalpro = new Histsalpro;

                        	$histsalpro->Codpro = $produp->Codpro;

                        	$histsalpro->CodPVen = $detalle->CodPVen;

                        	$histsalpro->SaldoAnt = $productos->SaldoAnt;

                        	$histsalpro->SaldoAct = $productos->SaldoAct;

                        	$histsalpro->fecha = date('Y-m-d_h.i.s'); //Fecha de la modificación Y-m-d h:mm:ss 	

                        	$histsalpro->save();

                    	}


                    	//llenar historicos de detalles de operaciones

                    	$histdetaoper = Histdetallesoper::model()->find('nfactura=:nfactura and Codpro=:Codpro', array(':nfactura' => $model->nfactura, ':Codpro' => $produp->Codpro));

                    	if (!$histdetaoper) {//Si no existe crearla    

                        	$histdetaoper = new Histdetallesoper;

                        	$histdetaoper->nfactura = $detalle->Id_sal; //

                        	$histdetaoper->Codprod = $detalle->Codprod; //

                        	$histdetaoper->cantidad = $detalle->cantidad; //

                        	$histdetaoper->Codpro = $produp->Codpro;

                        	$histdetaoper->SaldoDes = $detalle->SaldoDes; //

                        	$histdetaoper->importemne = ROUND($detalle->SaldoDes * $detalle->premn, 2); //

                        	$histdetaoper->importemn = ROUND($detalle->cantidad * $detalle->premn, 2); //

                        	$histdetaoper->Recargo = $detalle->Recargoca; //

                        	$histdetaoper->impventasmn = $detalle->imventas; //

                        	$histdetaoper->premn = $detalle->premn; //

                        	$histdetaoper->CodPVen = $detalle->CodPVen;

                        	$histdetaoper->cmay = $detalle->cmay; //

                        	$histdetaoper->prod = $detalle->prod;

                        	$histdetaoper->save();

                    	}

                	}//para todos los detalles cierra aqui

                	$factura = Facturas::model()->find('nfactura=:nfactura and CodCliente=:CodCliente and CodUEB=:CodUEB', array(':nfactura' => $model->nfactura, ':CodCliente' => $model->CodCliente, ':CodUEB' => $model->CodUEB));

                	// printf("rafael"); //para ver si entra aqui

                	//die();

                	if (!$factura) {//Si no existe crearla    

                    	$factura = new Facturas;

                    	$factura->CodCliente = $model->CodCliente;

                    	$factura->CodUEB = $model->CodUEB;

                    	$factura->nfactura = $objFac->nfactura;

                    	$factura->estado = $model->IdEstado;

                    	$factura->nfactura = $objFac->nfactura;

                    	$factura->estado = $model->IdEstado;

                    	$factura->ImporteMN = $objFac->ImporteMN;

                    	$factura->save();

                	}

            	}

        	}

        	Yii::app()->user->setFlash('success', 'Factura realizada satisfactoriamente');

    	} else {

        	Yii::app()->user->setFlash('error', 'No puede facturar, actualice su contrato');

    	}

	}



En el controlador tengo una funcion para la llamada de los combos:




  public function actionActualizarFirmantes() {

    	$model = Clientes::model()->findByPk($_POST['idCodigo']);

    	//llenar firmantes

    	$data = CHtml::listData($model->firmantes, 'CI', 'Nombre');

    	$firmantes = "";

    	foreach ($data as $value => $name) {

        	$firmantes .= CHtml::tag('option', array('value' => $value), CHtml::encode($name), true);

    	}

    	// return data (JSON formatted)

    	echo CJSON::encode(array(

        	'firmantes' => $firmantes

    	));

	}



El el form tengo un script:




$.ajax({

        	url: 'index.php?r=datossal/actualizarFirmantes',

        	type: 'POST',

        	dataType: 'json',

        	data: {

            	"idCodigo": $('#Datossal_CodCliente').val()

        	},

        	success: function(data) {

            	$("#Datossal_CI").html(data.firmantes);

        	}

    	});

......

 $('#datossal-form').live('submit', function() {


    	var tbl = $('#tblData tbody tr').map(function() {

        	var row = $(this);

        	return {producto: row.find(':nth-child(1)').text(),

            	//return {	prcmay: row.find(':nth-child(2)').text(),

            	// return {	producto: row.find(':nth-child(3)').text(), 

            	//  productos: row.find(':nth-child(4)').text(),

            	cantidad: row.find(':nth-child(3)').text(),

            	prod: row.find(':nth-child(4)').text(),

            	recargo: row.find(':nth-child(5)').text(),

            	cmay: row.find(':nth-child(6)').text(),

        	};

    	}).get();

    	$.ajax({

        	url: 'index.php?r=datossal/salvarFactura',

        	type: 'POST',

        	dataType: 'text',

        	data: {"detalle": tbl,

            	//	"idn": $('#Datossal_Idn').val(),

            	"fecha": $('#Datossal_fecha').val(),

            	"nfactura": $('#Datossal_nfactura').val(),

            	"codsalida": $('#Datossal_Codsalida').val(),

            	"codcliente": $('#Datossal_CodCliente').val(),

            	"codUEB": $('#Datossal_CodUEB').val(),

            	"codde": $('#Datossal_Codde').val(),

            	"ci": $('#Datossal_CI').val(),

            	"idestado": $('#Datossal_IdEstado').val(),

            	"cifac": $('#Datossal_CIFac').val(),

            	"1": $('#Datossal_CodDoc').val(),

            	"citra": $('#Datossal_CITra').val(),

            	"codop": $('#Datossal_CodOp').val(),

            	"nconduce": $('#Datossal_NConduce').val(),

            	"norden": $('#Datossal_norden').val(),

            	"bultos": $('#Datossal_bultos').val(),

            	"entregar": $('#Datossal_entregar').val(), //

            	"2": $('#Datossal_CodMon').val(),

            	"modelid": $('#modelid').val()

        	},

        	success: function(data) {

            	if (data === 'fail')

                	alert('Ya existe un registro con ese número consecutivo');

            	else

                	window.location.href = 'index.php?r=datossal/admin';

        	}

    	});



Muestro los clientes y personas autorizadas a firmar de esta forma:

primer combo (Cliente)




<?php echo $form->labelEx($model, 'CodCliente'); ?>

                    	<?php

                    	$this->widget('ext.select2.ESelect2', array(

                        	'name' => 'CodCliente',

                        	'data' => CHtml::listData(Clientes::model()->findAll(), 'CodCliente', 'Descripcion'),

                        	'htmlOptions' => array(

                            	'style' => 'width: 200px;',

                            	'ajax' => array(

                                	'type' => 'POST',

                                	'url' => CController::createUrl('datossal/actualizarFirmantes'),

                                	'dataType' => 'json',

                                	'data' => array('idCodigo' => 'js:this.value'),

                                	'success' => 'function(data) {

				$("#Datossal_CI").html(data.firmantes); 

			}')

                    	)));

                    	?>

                    	<?php echo $form->error($model, 'CodCliente'); ?>



Segundo combo dependiente del primero (personas autorizadas a firmar)




  <?php echo $form->labelEx($model, 'CI'); ?>

                    	<?php echo $form->dropDownList($model, 'CI', array()); ?>

                    	<?php echo $form->error($model, 'CI'); ?> 



Cuando acciono el boton crear me genera el segundo error, el primer error lo genera al actualizar el formulario. Espero de ustedes la ayuda necesaria para poder resolverlo, dando las gracias por adelantado.

Aclaro, antes de usar la extension select2 para filtro, esto funcionaba bien, pero necesito el filtro.

Aclaro ademas que al debuguear en los parametros del envio no muestra el cliente, que es el parametro asociado con el error:




bultos514124ci74100112907 este es el firmante, si lo muestra

cifac87121329938citra52040512663codUEB0161204detalle[0][cantidad]4detalle[0][cmay]2detalle[0][prod]1detalle[0][producto]123.3.03.0017detalle[0][recargo]1entregar

fecha2017-04-27idestado3



Buenas Rafael.

No tiene nada que ver con select2 o EChosen.

"codcliente" te dice que no está definido pq no está definido. El índice sería "CodCliente".

"idCodigo" -> no sé cuál es la línea 130, que es donde te está fallando, pero seguro que no es en la acción "actionSalvarFactura".

Un saludo.

PD.: deberías utilizar delegate en lugar de live. Por otro lado veo mucho código ahí…pq salvas la factura mediante AJAX?

Hola lagogz, gracias por contestar, mira, ya he probado con las dos variantes y CodCliente y codCliente, tratare de explicarte como funciona:

en la accion del controlador yo defino como hago el post:




 $model->CodCliente = $_POST['codCliente'];//para el error2]



después ese indice lo busca en el form, en este caso codCliente, que se refiere al campo CodCliente de la tabla datossal, en este caso en el form:

aqui como obervaras:




function ActualizarCodigo() {


    	$('#incodigo').val($('#producto option:selected').val());


	}

	;


	$('#datossal-form').live('submit', function() {


    	var tbl = $('#tblData tbody tr').map(function() {

        	var row = $(this);

        	return {producto: row.find(':nth-child(1)').text(),

            	//return {	prcmay: row.find(':nth-child(2)').text(),

            	// return {	producto: row.find(':nth-child(3)').text(), 

            	//  productos: row.find(':nth-child(4)').text(),

            	cantidad: row.find(':nth-child(3)').text(),

            	prod: row.find(':nth-child(4)').text(),

            	recargo: row.find(':nth-child(5)').text(),

            	cmay: row.find(':nth-child(6)').text(),

        	};

    	}).get();

    	$.ajax({

        	url: 'index.php?r=datossal/create',

        	type: 'POST',

        	dataType: 'text',

        	data: {"detalle": tbl,

            	//	"idn": $('#Datossal_Idn').val(),

            	"fecha": $('#Datossal_fecha').val(),

            	"nfactura": $('#Datossal_nfactura').val(),

            	"codUEB": $('#Datossal_CodUEB').val(),

           	"codCliente": $('#Datossal_CodCliente').val(),//aqui el error 2

            	"codde": $('#Datossal_Codde').val(),

            	"ci": $('#Datossal_CI').val(),

            	"idestado": $('#Datossal_IdEstado').val(),

            	"cifac": $('#Datossal_CIFac').val(),

            	"1": $('#Datossal_CodDoc').val(),

            	"citra": $('#Datossal_CITra').val(),

            	"codop": $('#Datossal_CodOp').val(),

            	"nconduce": $('#Datossal_NConduce').val(),

            	"norden": $('#Datossal_norden').val(),

            	"bultos": $('#Datossal_bultos').val(),

            	"entregar": $('#Datossal_entregar').val(), //

            	"modelid": $('#modelid').val()

        	},

        	success: function(data) {

            	if (data === 'fail')

                	alert('Ya existe un registro con ese número consecutivo');

            	else

                	window.location.href = 'index.php?r=datossal/admin';

        	}

    	});

    	return false;

	});



este es el dato que se le pasa a la BD, que es lo que no esta haciendo, ya que le asigna ningun valor a ese campo, lo deja en blanco, y no deja crear la factura, si le quito estos lineas de codigo que marco con //error, entonces crea la factura, sin llenar ese campo, por eso puse en el post que al hacer un debug lo dejaba en blanco, o sea, el valor haciendo en el listData de la forma, referido al campo CodCliente, no lo toma para el post de la factura.

En cuanto al otro error, lo da por que en el script, que dejo:




    	ActualizarCodigo();

    	$.ajax({

        	url: 'index.php?r=datossal/actualizarFirmantes',

        	type: 'POST',

        	dataType: 'json',

        	data: {

       	"idCodigo": $('#Datossal_CodCliente').val(),//aqui error 1

        	},

        	success: function(data) {

            	$("#Datossal_CI").html(data.firmantes);

        	}

    	});




, referido a la accion del controlador no lo ve, pero no crea que eso influya para la creacion de la factura, ya lo probé y es asi, recordar que es parametro tambien se tiene en cuenta a la hora de tomar el valor en el listData.

Buenas de nuevo.

Pero es que es normal que te dé esos errores, ya que no tienes ningún control con identificador "Datossal_CodCliente".

Tú tienes esto:




$this->widget('ext.select2.ESelect2', array(

                                'name' => 'CodCliente',

                                'data' => CHtml::listData(Clientes::model()->findAll(), 'CodCliente', 'Descripcion'),

                                'htmlOptions' => array(

                                'style' => 'width: 200px;',

                                'ajax' => array(

                                        'type' => 'POST',

                                        'url' => CController::createUrl('datossal/actualizarFirmantes'),

                                        'dataType' => 'json',

                                        'data' => array('idCodigo' => 'js:this.value'),

                                        'success' => 'function(data) {

                                $("#Datossal_CI").html(data.firmantes); 

                        }')

                        )));




Que no está relacionado con ningún modelo. Lo estás utilizando “stand-alone”. El identificador de este control será “CodCliente”, no “Datossal_CodCliente”. Si quieres asegurarte lo especificas en el array “htmlOptions” (‘id’ => ‘CodCliente’).

Si quisieras utilizarlo enlazado a un modelo sería:




$this->widget('ext.select2.ESelect2', array(

                                'model' => $model,

                                'attribute' => 'CodCliente' ...

                                ...

                                ...



Así sí que el identificador sería ‘Datossal_CodCliente’.

Un saludo.

Gracias por responder, lo puse asi como dijiste y me sigue dando el mismo error,




$this->widget('ext.select2.ESelect2', array(

                        	'model' => $model,

                         	'attribute' => 'CodCliente',

                        	'data' => CHtml::listData(Clientes::model()->findAll(), 'CodCliente', 'Descripcion'),

                        	'htmlOptions' => array(

                            	'style' => 'width: 300px;',

                            	'id' => 'CodCliente',

                            	'placeholder' => 'Seleccione el cliente!',

                            	'ajax' =>

                            	array(

                                	'type' => 'POST',

                                	'url' => CController::createUrl('datossal/actualizarFirmantes'),

                                	'dataType' => 'json',

                                	'data' => array('idCodigo' => 'js:this.value'),

                                	'success' => 'function(data) {

                                	$("#Datossal_CI").html(data.firmantes); 

                            	}'

                            	)

                        	)

                            	)

                    	);



Ok, gracias lagogz, ya se resolvio el problem, era realmente lo que decias, que do así,




$this->widget('ext.select2.ESelect2', array(

                        	'model' => $model,

                     		'attribute' => 'CodCliente',

                        	'data' => CHtml::listData(Clientes::model()->findAll(), 'CodCliente', 'Descripcion'),

                        	'htmlOptions' => array(

                            	'style' => 'width: 300px;',

                            	'placeholder' => 'Seleccione el cliente!',

                            	'ajax' =>

                            	array(

                                	'type' => 'POST',

                                	'url' => CController::createUrl('datossal/actualizarFirmantes'),

                                	'dataType' => 'json',

                                	'data' => array('idCodigo' => 'js:this.value'),

                                	'success' => 'function(data) {

                                	$("#Datossal_CI").html(data.firmantes); 

                            	}'

                            	)

                        	)

                            	)

                    	);



Gracias de nuevo lagogz, al fin se resolvio los dos grandes problemas que tenia en mi sistema de facturacion, ahora me voy a empeñar en mejoralo con los fundamuentos que me brinda el framework, ya que no estoy seguro si utlizar otra funcion diferente al actionCreate seria recomendable, ya que asi creo lo complico un poco mas.

Buenas.

Me alegro, Rafael.

Es correcto utilizar acciones distintas de "create". Esa es una acción que el framework crea por defecto, pero por supuesto puedes (y en algunos casos debes) crear tus propias acciones.

Imagínate una acción "update" con clave primaria compuesta. Ya tienes que modificar la acción defecto "update".

Siéntete libre para crear tus propias acciones. Yo te lo recomiendo además.

Un saludo.

Gracias lagogz, tambien lo digo porque utilizo algunos script para la creacion de la factura y los combos independientes, debo analizar si puedo optimizar mas esto, de todas formas esto lo analizo con mas calma, lo importante es que ya resolvi los dos problemas fundamentales, lo del autonumerico y lo del filtro, yo al crear la factura las guardo en una tabla historico mpara reportes y busquedas futuras, ya que todos los años se borra las tablas de facturacion y se reinicia el contador, esta operacion lo hago en uhna operacion de cierre contable al final de año, donde se vacian las tablas de facturacion y se reicia el autonuemrico, eso lo hago con esta operacion:




public function actionHacerCierreanual() {

    	// $model = $this->loadModel($id);

    	$almacen = $_POST['entidad']; {

        	Yii::app()->db->beginTransaction();

        	$query = "

		CREATE TABLE IF NOT EXISTS cierreanual (

        	id INT NOT NULL AUTO_INCREMENT,

        	fecha date,

        	PRIMARY KEY (id) )

        	ENGINE = InnoDB";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datosorden FROM datosorden";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE datosorden AUTO_INCREMENT = 1"; //con esto reinicio  el autonumerico

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datosrecepcion FROM datosrecepcion";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE datosrecepcion AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datossal FROM datossal";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE datossal AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datossalc FROM datossalc";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE datossalc AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE datostrans FROM datostrans";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE datostrans AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE invdocumentomov FROM invdocumentomov";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE invdocumentomov AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "DELETE invdocumentomovs FROM invdocumentomovs";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "ALTER TABLE invdocumentomovs AUTO_INCREMENT = 1";

        	Yii::app()->db->createCommand($query)->execute();


        	$query = "UPDATE productos SET lg = 2 WHERE Codde <> 4";

        	Yii::app()->db->createCommand($query)->execute();

        	if (Yii::app()->db->createCommand($query)->execute() > 0) {

            	// Sigues ejecutando las siguientes consultas de eliminación.


            	Yii::app()->db->createCommand($query)->execute();


            	// Esto se pondría después de la última consulta de borrado.

            	Yii::app()->db->getCurrentTransaction()->commit();

        	} else {

            	// No ha eliminado nada, entonces la consulta ha fallado.

            	// Cuidado con esto, pq podría ser que no hubiese ningún registro que eliminar en la tabla,

            	// lo que también devolvería cero. En este caso podrías hacer una consulta de SELECT 

            	// previamente para saber si se debe o no eliminar algún registro.

            	Yii::app()->db->getCurrentTransaction()->rollback();

            	//  exit();

            	//	break; // O exit; o lo que quieras.

        	}

    	}

    	//$dataReader = Yii::app()->db->createCommand($query)->queryAll();

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

    	Yii::app()->user->setFlash('success', 'Cierre realizado satisfactoriamente');

    	$model = new Cierreanual; // para colocar la fecha en la BD

    	$model->fecha = date('Y-m-d');

    	$model->save();

    	$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

    	//  $this->render('cierreanual');	

	}