Hola comunidad, ante todo mis saludos y agradecimiento por las ayudas que me puedan brindar.
El problema es que tengo en mi sistema dos tablas para guardar las prefacturas, en una (prefacturas) se guardan los datos generales con los campos: nprefac, fecha, Codsalida, CodCliente, CodUEB, CodMon, CI, CodPVen en esta tabla [size="2"]nprefac es la clave principal, la misma es varchar(10).[/size]
[size="2"]En otra tabla ([/size]detallespre[size="2"]) tengo los detalles de la prefactura con los campos: Id, [/size]Id_pre, Codprod, cantidad, Codpre, Cosdes, Codrec, estas dos tablas esta relacionadas uno a muchos por los campos [size="2"]nprefac de [/size][size="2"]prefacturas con [/size][size="2"]Id_pre de [/size]detallespre[size="2"] en la tabla[/size]prefacturas [size="2"]no puede haber articulos repetidos, ya que es llave principal, por lo que es el objeto de este tema, quiero que cuando intente crear un numero de factura que ya exista en la tabla [/size][size="2"]prefacturas, me envie un mensaje que el numero ya existe y no se puede crear.[/size]
Para crearla hice en mi controlador esta función, como verán ella me crea el articulo, pero no me da el mensaje de alerta que quiero lo que hace es no crearla y el navegador se queda parado, si la veo por herramientas de desarrollo me da el error que no se puede crear ya que se crearía repetido y los usuarios finales no saben verla por aquí, entonces necesito me de la alerta:
alcgo asi:
else
alert("No puede crearla ya que existe ese número");
Esta es la función de mi controlador
public function actionSalvarPrefac() {
$id=$_POST['modelid'];
if($id)
$model=$this->loadModel($id);
else
$model = new Prefacturas;
if(isset($_POST['detalle'])) {//se guarda en la tabla prefacturas
//Lo que se guarda en tabla Prefacturas
$model->fecha=$_POST['fecha'];
$model->nprefac=$_POST['nprefac'];
$model->Codsalida=$_POST['codsalida'];
$model->CodCliente=$_POST['cliente'];
$model->CodUEB=$_POST['codueb'];
$model->CodMon=$_POST['codmon'];
$model->CI=$_POST['ci'];
$model->CodPVen=$_POST['codpven'];
if ($model->save()) {
Detallespre::model()->deleteAll('Id_pre=:nprefac', array(':nprefac'=>$model->nprefac));
foreach($_POST['detalle'] as $item){
//Lo que se guarda en tabla Detallespre
$detalle=new Detallespre;
$detalle->Id_pre=$model->nprefac;
$detalle->Codprod=$item['producto'];
$detalle->cantidad=$item['cantidad'];
$detalle->Codpre=$item['precio'];
$detalle->Cosdes=$item['descuento'];
$detalle->Codrec=$item['recargo'];
$detalle->save();
}
}
}
}
amigo porque no defines en las reglas de validacion el campo como "unique" Rules Unique en tu modelo de esa forma con esa regla no podrán repetir dicho numero en el campo, si quieres poner un mensaje personalizado cuando se genera el error aqui te dejo para que veas el ejemplo --> Personalizar mensaje de error … en tal caso de que desees mostrar un alert seria de la siguiente forma --> flash yii
Espero querido amigo que los enlaces que te envió te ayuden con tu problema de igual manera en caso de que continúes con la duda la pones aquí para
Hola amigo erickMartinez, en mi modelo ya tengo esa regla aplicada.
public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('nprefac', 'required'),
array('Codsalida, CodMon', 'numerical', 'integerOnly'=>true),
array('nprefac', 'length', 'max'=>10),
array('CodCliente, CodUEB, CodPVen', 'length', 'max'=>12),
array('CI', 'length', 'max'=>11),
array('fecha', 'safe'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('nprefac, fecha, Codsalida, CodCliente, CodUEB, CodMon, CI, CodPVen', 'safe', 'on'=>'search'),
);
}
Como veras ya tengo esa regla y realmente no me permite duplicar un muero, lo que quiero es que me envíe un mensaje de alerta
Hola a todos de nuevo, ya tengo hecho en otros momento algo de mensaje de alerta, el problema es que aquí en especifico no se como hacerlo, por ejemplo para comprobar saldos tengo lo siguiente:
Disculpen halla puesto toda mi forma, es para que vean donde puedo poner una condición para comprobar si existe el numero que no se puede duplicar en es caso [size=2]nprefac[/size][size=2] .[/size]
antes de guardar, en la parte donde recibes los datos has un criteria
en tu controlador …
// luego de recibir los datos
$criteria = new CDbCriteria;
$criteria->AddCondition('tu_campo='.$model->tu_campo);
$buscar = Tu_Modelo::model()->findAll($criteria);
....
.......
..........
//justo antes de guardar preguntas si buscar es mayor que cero
if ($buscar>=0){
//pones tu alert
}
else{
//guardas
}
public function actionSalvarPrefac() {
$id=$_POST['modelid'];
if($id)
$model=$this->loadModel($id);
else
$model = new Prefacturas;
if(isset($_POST['detalle'])) {
//Lo que se guarda en tabla Prefacturas
$model->fecha=$_POST['fecha'];
$model->nprefac=$_POST['nprefac'];
$model->Codsalida=$_POST['codsalida'];
$model->CodCliente=$_POST['cliente'];
$model->CodUEB=$_POST['codueb'];
$model->CodMon=$_POST['codmon'];
$model->CI=$_POST['ci'];
$model->CodPVen=$_POST['codpven'];
// luego de recibir los datos
$criteria = new CDbCriteria;
$criteria->AddCondition('nprefac='.$model->nprefac);
$buscar = Prefacturas::model()->findAll($criteria);
}
if ($model->save()) {
Detallespre::model()->deleteAll('Id_pre=:nprefac', array(':nprefac'=>$model->nprefac));
foreach($_POST['detalle'] as $item){
//Lo que se guarda en tabla Detallespre
$detalle=new Detallespre;
$detalle->Id_pre=$model->nprefac;
$detalle->Codprod=$item['producto'];
$detalle->cantidad=$item['cantidad'];
$detalle->Codpre=$item['precio'];
$detalle->Cosdes=$item['descuento'];
$detalle->Codrec=$item['recargo'];
//justo antes de guardar preguntas si buscar es mayor que cero
if ($buscar>=0){
alert("No puede guardarla ya que existe ese número de prefactura");
}
else{
$detalle->save();
}
}
}
}
, no me tira la alerta y lo que hace entonces que no llena la tabla Detallespre que son los detalles de la prefactura