Trabajar Con Tres Model En Un Controlador

Hola tengo tres tablas en mysql, relacionadas por el campo codprod, tengo una tabla productos y una tabla submayorprodctos y otra tabla datosproductos(Entradas), cuando entro una entrada para un producto me debe adicionar la cantidad de esa entrada al campo saldoactual de submayor, para eso hice esto en el controaldor de la tabla datosproductos:

public function actionCreate() lo puse aqui cuando creo una nueva entrada, o sea, cuando creo una nueva entrada y me lo hace bien, el problema es que cuando modifico esa entrada tambien debo ponerlo en la funcion update, pero no me lo hace ya que lo que hace es una nueva entrada, para ello puse esto:

Quiero que cuando modifique me permita modificar y modificar tambien el saldoactual en la tabla submayorprodctos. envio el controlador

Hola, sin entender lo que quieres hacer (no tengo muchas ganas de leer :rolleyes: ) pero yo veo iguales las acciones create y update.

Yo creo que debes cambiar en update la 1º linea:




 $model=new Datosent; 



por:




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



+1

En realidad lo que quiero es cuando haga una entrada en la tabla datosent la cantidad entrada adicionarlo a la tabla submayor en el campo saldoact, para ese hice lo siguiente:




 public function actionCreate()

            	{

              	$model=new Datosent;                      	

           	

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

                	{

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

                    	if($model->save()){   

										   $criteria=new CDbCriteria;                                    	

                                       	$criteria->condition='Codprod=:codigo';                                  	

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

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

                                       	$objSubmp->SaldoAct = $objSubmp->SaldoAct + $model->Cantidad;

                                       	$objSubmp->save();

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

                                      	}

                	} 

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

            	'model'=>$model

					));

            	}



Ademas cuando escoja un articulo de la tabla datosent para modificarlo por la cantidad ese nuevo valor modificado modificado sea el que se actualice, ejemplo: si escogi un articulo con cantidad 120 y lo voy a midificar por 100, entonces a la tabla submayor en el campo saldoact me reste 120-100=20, si ese mismo articulo de 120 lo modifico por 140, entonces a la tabla submayor en el campo saldoact me reste 140-120=40 para ello tengo ahora este codigo:




public function actionUpdate($id)

		{

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

           	

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

                	{

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

						//$cantidadinicial = $model->Cantidad;

						//SaldoAct = salcdo actua;l - cantidad incial

                    	if($model->save()){   

										   $criteria=new CDbCriteria;                                    	

                                       	$criteria->condition='Codprod=:codigo';                                  	

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

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

                                       	$objSubmp->SaldoAct = $objSubmp->SaldoAct + $model->Cantidad;

                                       	$objSubmp->save();

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

                                      	}

										  

                	} 

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

			'model'=>$model

					));

    	}



Pero lo que hace es sumar la cantidad modificada al Saldoact de la tabla submayor

Creo que voy entendiendo el problema, eso espero… prueba con esto:




public function actionUpdate($id)

                {

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

                

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

                        {

                        $cantidad_inicial=$model->cantidad;

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

                                                //$cantidadinicial = $model->Cantidad;

                                                //SaldoAct = salcdo actua;l - cantidad incial

                        if($model->save()){   

                                                                                   $criteria=new CDbCriteria;                                           

                                        $criteria->condition='Codprod=:codigo';                                         

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

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

                                        $objSubmp->SaldoAct = $objSubmp->SaldoAct +$cantidad_inicial -  $model->Cantidad;

                                        $objSubmp->save();

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

                                        }

                                                                                  

                        } 

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

                        'model'=>$model

                                        ));

        }



Creo que es algo así, de todas maneras según dices:

un articulo con cantidad 120 y lo voy a midificar por 100 120-100=20

ese mismo articulo de 120 lo modifico por 140 140-120=40 —> no seria 120-140=-20

Ojo con el signo, de prueba haz este ejemplo que has propuesto y modificalo según necesites.

Por otra parte la variable $id ponla igual en todos los sitios porque en el render aparece como $Id.

Para select sencillas yo suelo ponerlo todo en una fila, por ejemplo:




  $objSubmp=Submayorprod::model()->find('Codprod=:codigo',array(':codigo'=>$model->Codprod));



comenta si va a mejor o a peor …

Ok todo resuelto, pero tuve que cambiar

code]

$objSubmp->SaldoAct = $objSubmp->SaldoAct +$cantidad_inicial - $model->Cantidad;

[/code]

por

code]

$objSubmp->SaldoAct = $objSubmp->SaldoAct -$cantidad_inicial+ $model->Cantidad;

[/code