Adicionar Registros A Una Tabla Desde Otra Tabla

Hola a todos tengo el siguiene problema y necesito resolver, gracias por adelantado y cualquier ayuda se agradece.

Tengo dos tabla una Datossal con los siguientes campos:

id incrementable,

fecha, nfactura que es varchar (10), Codsalida, CodCliente, CodUEB, CodMon y CI, todos estos ultimos varchar

y la otra facturas con los siguientes campos:

Codfac incrementable, nfactura que es varchar (10), CodCliente, CodUEB, ademas fechapago, Importe.

Estas tablas estan relacionadas por los campos, nfactura, CodCliente y CodUEB.

En la tabla Datossal nfactura es el numero que se le da a la factura a la hora de facturar.

Lo que deseo es lo siguiente, cuando cree una nueva factura en Datossal, automaticamente me llene la tabla facturas con el campo nfactura, CodCliente, CodUEB.

Para ello hice lo siguiente pero no me trabaja:

en la funcion create de Datossalcontroller hice lo siguiente




 public function actionCreate()

	{

		$model=new Datossal;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['Datossal']))

		{

			$model->attributes=$_POST['Datossal'];

			if($model->save()){

                   		

             		$clientes=  Clientes::model()->findAll(); 

				     foreach($clientes as $cli){

					     $factura= new Facturas;

					     $factura->CodCliente=$cli->CodCliente;

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

					     $factura->nfactura=$model->nfactura;

					     $factura->save();

                     		}

						$this->redirect(array('view','id'=>$model->CodUEB));

                    	

                    	}

		}


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

			'model'=>$model,

		));

	}



Esto fue lo que hice pero no me trabaja, necesito resolver esto, a ver donde esta el error de codigo.

Hola, la lógica del problema se me hace muy rara y solo por asegurar algunas cosas:


$clientes = Clientes::model()->findAll();<--- Todos los clientes que encuentre??


$this->redirect(array('view','id'=>$model->CodUEB));<---Lo normal suele ser $this->redirect(array('view','id'=>$model->id));



Se graba un modelo Datossal y n facturas, una a cada cliente.

Pero si la lógica esta bien todo perfecto, ahora intenta lo siguiente:

Mira que se guarde el registro del modelo Datossal en BBDD, si se guarda tu problema seguramente esta en:

$factura->save();

Quita el redirect (comentalo) y seguramente al no pasar la validación no se graban el resto de registros pero no muestra el error al ir a otra página.

Si no es eso te da algún error??,

Ok rahif’ te respondo en realidad la logica es: que cuando una UEB o Entidad hace una factura a un cliente ese CodUEB, CodCliente y nfactura, se guarda en Datossal por CodUEB para la UEB, CodCliente para el cliente y nfactura el numero de la factura y en realidad lo que quiero es ese CodUEB, CodClientre y nfactura adicionarlo a la tabla facturas y las dos tablas estan relacionadas por esos campos.

Ademas quiero aclarar para salvar la factura en Datossal hice la siguiente funcion que es donde se crea la factura




public function actionSalvarFactura()

{

	$id=$_POST['modelid'];


	if($id)

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

	else        	

    	$model = new Datossal;   

	

	if(isset($_POST['detalle']))

	{

//Lo que se guarda en datossal

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

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

			$model->Codsalida=$_POST['codsalida'];

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

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

			$model->CodMon=$_POST['codmon'];

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

			if ($model->save()) {


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


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

//Lo que se guarda en otra tabla Detallesfact

            	$detalle=new Detallesfact;  	

            	$detalle->Id_sal=$model->id;

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

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

            	$detalle->save();

          	//para actualizar los saldos en otra tabla Submayorprod 

        	if(!$id){

            	$criteria=new CDbCriteria;                                    	

            	$criteria->addCondition('CodUEB=:coden'); 

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

            	$criteria->params=array(':coden'=>$model->CodUEB , ':codigo'=>$item['producto']);			

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

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

            	$objSubmp->save();

            	}

		

        	}

    	}		

	}

 }



Asi que mi duda ahora en hacer lo anterior aqui y donde.

Sin poner código, solo la lógica del problema.

Teniendo las tablas: (puede haber más campos pero creo que no son importantes para el problema)

DatosSal =&gt; id,fecha,nfactura,CodCliente,CodUEB,CodSalida,CodMon,CI


Detallesfact =&gt; id,Id_sal,...


Facturas =&gt; CodFac,nfactura,CodCliente,COdUEB,fechapago,importe

Ahora es esto lo que quieres hacer?:

1- Crear Factura

nuevo DatosSal &lt;= 1º crear elemento 


nuevo Facturas &lt;= 2º crear elemento relacionado con el 1º

2- Actualizar Factura

actualizar DatosSal 


	borrar	Detallesfact


	crear Detallesfact


           //otras acciones como actualizar Submayorprod


actualizar Facturas  &lt;= Las relacionadas con DatosSal 
  • creo que el actionCreate del 1º post realiza la opción 1.

  • actionSalvarFactura esta función quiere realizar las 2 opciones.

Espero no liarte yo, un saludo.

Ok lo que quiero hacer es:

1- Crear facturas en datossal

llena los campos: id, fecha, nfactura, CodCliente, CodUEB, Codsalida, CodMon, CI

Cuando crea factura automaticamente llena

deatalles facturas en tabla Detallesfact

llena los campos: Id, Id_sal, Codprod y cantidad

ademas automaticamente la cantidad se le resta al SaldoAct en la tabla Submayorprod

Todo esto lo hace bien automaticamente, hasta aqui todo esta OK

2- Lo nuevo que quiero hacer es que tengo una tabla facturas y quiero que con los datos de la tabla Datossal al crear una

nueva factura me llene la tabla facturas por los campos: nfactura, CodCliente, CodUEB que estan en la tabla facturas y estan

relacionados con la tabla Datossal.

Ok, ahora ya entiendo mejor el problema, entonces tu función hace casi todo.




public function actionSalvarFactura() {

	$id=$_POST['modelid'];


	if($id)

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

	else            

		$model = new Datossal;   

	

	if(isset($_POST['detalle'])) {

		//Lo que se guarda en datossal

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

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

		$model->Codsalida=$_POST['codsalida'];

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

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

		$model->CodMon=$_POST['codmon'];

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

		if ($model->save()) {

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


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

				//Lo que se guarda en otra tabla Detallesfact

				$detalle=new Detallesfact;      

				$detalle->Id_sal=$model->id;

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

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

				$detalle->save();

				//para actualizar los saldos en otra tabla Submayorprod 

				if(!$id){

					$criteria=new CDbCriteria;                                      

					$criteria->addCondition('CodUEB=:coden'); 

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

					$criteria->params=array(':coden'=>$model->CodUEB , ':codigo'=>$item['producto']);                       

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

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

					$objSubmp->save();

				}

			}

			//buscar factura 

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

				array(':CodCliente'=>$model->CodCliente,':CodUEB'=>$model->CodUEB,':nfactura'=>$model->nfactura));

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

				$factura= new Facturas;

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

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

				$factura->nfactura=$model->nfactura;

				$factura->save();

			}

		}

	}

}



Esto debería crearte 1 factura del modelo Facturas si no existe la factura para los campos (CodCliente,CodUEB,nfactura) del modelo Datossal que ha sido guardado correctamente.

Si estas modificando Detallesfact como la factura ya existe no la volvería a crear.

Solo lo pongo para que veas como lo voy entendiendo yo, pero esto es lo que ya habías intentado antes y decías que no te dejaba. (Creo)

Pon el error si sale o que es lo que pasa si no funciona, avanzando poco a poco…

[SOLUCIONADO] Ok rahif ya esta todo OK, lo que pasa es que estaba haciendolo fuera de la function actionSalvarFactura en la fuccion create y en realidad mi function actionSalvarFactura lo hace todo muchas gracias por tu ayuda, nos vemos en el forum en proximos tópicos.