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.
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'));
}
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.
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
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.