Cadastrar e Alterar ao mesmo tempo

Boa noite gente, venho mais uma vez pedir a ajuda de vocês.

Em meu projeto possuo uma transferência que possui um número de processo e possui situação ‘pendente’, ao cadastrar uma nova transferência com o mesmo número de processo gostaria que ele alterasse a situação da transferência anterior que possui aquele mesmo número de processo, para ‘encerrada’.

Alguém pode me dar uma dica de como faço isso ? Pela lógica seria apenas um UPDATE e depois um INSERT em uma mesma query.

Podes fazer assim, criar a ação de editar no Controller do formulário (tendo duas ações separadas, uma de cadastro e outra de edição).


public function actionEditar($id)

{

	$model = Formulario::model()->findByPk($id); // carrega o id previamente salvo com um cadastro

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

	{

		// atribui as variavéis enviadas pelo método post para

		// os campos declarados no model

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

		if ($model->save()) // Se salvar os dados no DB... redireciona para a pagina inicial

		{

			$this->redirect(array('index'));

		}

	}

...

}

Hans Bonini até entendi o que você passou, entretanto como é que vou fazer um update no campo situacao do cadastro anterior ? Atualmente ele tá cadastrando beleza, só que tá ficando mais de um pendente, e na realidade só o cadastro novo é que pode estar pendente.

adicione algo como o seguinte no codigo acima




if ($model->validate()){

  $transferencia = $model->transferencia;//use o nome do relacionamento aqui

  $transferencia->situacao = Transferencia::SITUACAO_ENCERRADA;//sete a situacao para encerrada

  $transferencia->save(false);//salve sem validar

  $model->save(false);//false aqui porque ja foi validado acima

 $this->redirect(array('index'));

 }



Resolvi meu problema, ficou assim:

Controller:


public function actionTransferencia()

	{

		$model=new Processo;


		// Uncomment the following line if AJAX validation is needed

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


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

		{

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

			

			$conexao = mysql_connect('localhost', 'root', '') or die (mysql_error());

			mysql_select_db('protocolo', $conexao) or die (mysql_error());

			

			$num_proc = $model->num_proc;

			$sql = "SELECT * FROM processo WHERE num_proc = ".$num_proc." ORDER BY processo_id DESC LIMIT 1;";

			$result =  mysql_query($sql) or die ("Erro: " . mysql_error());

			$dado = mysql_fetch_array($result);

			

			if ($dado['situacao'] == 'Pendente'){

				mysql_query("UPDATE processo SET situacao = 'Tramitado' where num_proc = ".$num_proc." ORDER BY processo_id DESC LIMIT 1;") or die (mysql_error()); 

			}

			

			if($model->save())

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

		}


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

			'model'=>$model,

		));

	}

Eddie sou bem iniciante em Yii, mas toda essa parte de consulta ñ deveria estar no seu Controller e sim no seu Model. E nesse model o select ser um método e o update em outro, no controller vc faz os "if" que precisa e chama cada método do model de acordo com sua lógica.

Outra coisa fora do padrão aí é esse conexão com o Banco, isso é feito no arquivo protected/config/main.php.

Valeu mesmo cara pelas dicas, e como eu tb sou bem iniciante em yii tem com vc dar um exemplo de como ficaria ?

ficaria +/- assim:

Controller




public function actionTransferencia()

        {

                $model=new Processo;


                // Uncomment the following line if AJAX validation is needed

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


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

                {

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

                                                

                        $num_proc = $model->num_proc;

                        $dado = $this->model->getProcessByNumber($num_proc);

                        

                        if ($dado['situacao'] == 'Pendente'){

                            $this->model->updateProcess($num_proc);

                        }

                        

                        if($model->save())

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

                }


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

                        'model'=>$model,

                ));

        }

Model




...


public function getProcessByNumber($numProcess)

{

  /*$sql = "SELECT * FROM processo WHERE num_proc = ".$num_proc." ORDER BY processo_id DESC LIMIT 1;";

  $result =  mysql_query($sql) or die ("Erro: " . mysql_error());

  $dado = mysql_fetch_array($result);*/


//tente usar algo assim.... Evite usar o *

$sql = "SELECT campo1, campo2, campoN FROM processo WHERE num_proc = :numProcesso ORDER BY processo_id DESC LIMIT 1";

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

$command->bindValue(":numProcesso", numProcess, PDO::PARAM_INT);


return $command->execute();

}


public function updateProcess()

{

/*mysql_query("UPDATE processo SET situacao = 'Tramitado' where num_proc = ".$num_proc." ORDER BY processo_id DESC LIMIT 1;") or die (mysql_error()); */

//tente usar algo assim

$sql = "UPDATE processo SET situacao = 'Tramitado' where num_proc = :numProcesso ORDER BY processo_id DESC LIMIT 1";

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

$command->bindValue(":numProcesso", numProcess, PDO::PARAM_INT);


return $command->execute();

}

..



Acho q é o máximo q posso te ajudar. Acho q os colegas + experientes podem ajudar mais ou melhorar oq sugeri. Dessa forma q falei vc terá + segurança usando o PDO e a estrutura do próprio Yii

Obrigado cara!

Fazend umas adequacoes ao framework, eu faria assim:





public function actionTransferencia()

{

                $model=new Processo;


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

                {

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

			

			if($model->validate()){

				$trans = Yii::app()->db->beginTransaction();

				try{                                                

        				$dado = Processo::model()->findByAttributes(array('num_proc' => $model->$num_proc));

					if(($dado != null) and ($dado->situacao == 'Pendente')){

						$dado->situacao = 'Tramitado';

						$dados->update();

		                        }

						                        

		                        $model->save(false);

					$trans->commit();

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

				}catch(Exception $e){

					$trans->rollBack();

					throw $e;

				}

			}

                }


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

                        'model'=>$model,

                ));

}

Ricardo, tentei dessa forma que você me passou, mas não tá funcionando. Ele não retorna nenhum erro, entretanto não seta a situação do processo anterior para tramitado. Não entendi o que houve.