Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
j'ai un souci entre ma base oracle et mon application Zend.
j'ai Réalisé un trigger et une séquence pour réaliser la fonction Auto incrementation. mon problème est le suivant quand je rajoute une row.
Il m'affiche 'Cannot refresh row as parent is missing ' pourtant j'ai rajouté la fonction protected $_sequence = true;
Dans mon modèle :
<?php
class CreationCompte extends Zend_Db_Table_Abstract{
// nom du schéma sur le SGBD mysql
protected $_schema='XE';
// nom de la table dans la base de données
protected $_name='GIVRY.COMPTE';
// nom de la clé primaire de la table
protected $_primary='NUMCOMPTE';
protected $_sequence = true;
}
?>
mon formulaire :
<HTML>
<BODY LANG="fr-FR" BACKGROUND="/projetBD/isc/images/Marceau.png" DIR="LTR">
<P ALIGN=CENTER><FONT COLOR="#000000"<FONT SIZE=4 STYLE="font-size: 15pt"><B>Formulaire pour créer un compte</B></FONT></P>
<BR>
<BR>
<P ALIGN=LEFT STYLE="font-weight: normal"><FONT COLOR="#000000"<FONT SIZE=3><B><u>Veuillez remplir ce formulaire complètement : </B></u></FONT></P>
<?php
class CreationCompteForm extends Zend_Form
{
public function __construct($options = null)
{
parent::__construct($options);
$this->setName('CreationCompte');
$TYPECOMPTE = new Zend_Form_Element_Text('TYPECOMPTE');
$TYPECOMPTE->setLabel('Quel est le type du compte :');
$TYPECOMPTE->setRequired(true);
$SOLDE = new Zend_Form_Element_Text('SOLDE');
$SOLDE->setLabel('Quel est le solde du compte :');
$SOLDE->setRequired(true);
$NUMAGENCE = new Zend_Form_Element_Text('NUMAGENCE');
$NUMAGENCE->setLabel('Le numero de l agence :');
$NUMAGENCE->setRequired(true);
$NUMCLIENT = new Zend_Form_Element_Text('NUMCLIENT');
$NUMCLIENT->setLabel('le numero d identification du Client :');
$NUMCLIENT->setRequired(true);
$submit = new Zend_Form_Element_Submit('Ajouter');
$this->addElements(array( $TYPECOMPTE, $SOLDE, $NUMAGENCE, $NUMCLIENT, $submit));
echo '<li><a href="/projetBD/index/employe">Retour</a></li>' ;
}
}
?>
</BODY>
</HTML>
Mon Contrôler :
<?php
class CreationCompteController extends Zend_Controller_Action {
public function init(){
Zend_Loader::loadClass('CreationCompte');
Zend_Loader::loadClass('CreationCompteForm');
$registry= Zend_Registry::getInstance();
$this->db=$registry->get('db');
}
// Action poster
function indexAction(){
$this->view->title = "créer un compte";
$form = new CreationCompteForm();
if ($this->_request->isPost()) {
$formData = $this->_request->getPost();
// nous les affectons au formulaire
$form->populate($formData);
// qui applique les filtres
$formData=$form->getValues();
// activation des validateurs
if ($form->isValid($formData)) {
// ok, nous pouvons opérer
$b = new CreationCompte($this->db);
$Ajout=$b->createRow($formData);
if ($Ajout ) {
// sauvegarde dans la BD
$id=$Ajout->save();
return;
}
}
}
$this->view->form = $form;
}
}
?>
Néanmois l'ajout de la Row ce réalise quand même mais je souhaiterais enlever l'erreur quand même.
Hors ligne
Hello,
Il ne faut pas mettre $_sequence à true si c'est ton trigger qui fait le boulot. Avec le sequence à true, ZF réalise avant tout un select ma_sequ.nextval() from dual pour récupérer la valeur de l'incrément et ton trigger lui refait un +1.
A+
Hors ligne
D'accord mais Que je met ou non cette fonction, mon erreur est toujours la.
est-ce que la fonction last Id() pourrait fixer le problème ?
Hors ligne
j'ai exactement le même problème avec oracle, avec des triggers et séquences pour faire de l'auto increment.J'ai aucun problème sous ma vieille base mysql, si quelqu'un a une solution pour que ça marche sous oracle je suis preneur
table
class AncienTable extends Zend_Db_Table_Abstract{
protected $_name = 'ANCIEN';
protected $_primary='n_ancien';
protected $_rowClass='AncienRow';
}
config.ini
[bdd]
db.adapter = PDO_Oci
db.params.host = localhost
db.params.username = root
db.params.password = password
db.params.dbname = XE
db.params.options.caseFolding = 2
db.params.options.autoQuoteIdentifiers = 0
Dernière modification par bakeneko (16-03-2009 09:00:55)
Hors ligne
Hello,
J'ai une variante d'un trigger qui n'utilise la séquence que si la valeur est nulle :
CREATE OR REPLACE TRIGGER "SCHEMA"."TABLE" BEFORE INSERT ON "TABLE" FOR EACH ROW WHEN (new.ID_TABLE IS NULL) declare integrity_error exception; errno integer; errmsg char(200); dummy integer; found boolean; begin select SCHEMA.TABLE_SEQ.NEXTVAL INTO :new.ID_TABLE from dual; -- Traitement d'erreurs exception when integrity_error then raise_application_error(errno, errmsg); end;
A+
Hors ligne