|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Bonsoir à tous
Je voudrais souhaiter un debut de semaine à tous. Mon problème se situe au niveau d'une supprssion d'un enregistrement. Je vouddrais suprimer un enregistrement que je retrouve en faisant une recherche. Mon code utilisé est ceci: /* ** Procédure interne : DELETE_RECORD ** Exemple : Marquer l'enregistrement en cours dans le bloc ** en cours afin qu'il soit supprimé. */ BEGIN Go_Block('Mir_Appartement'); Delete_Record; Commit; END; Ma table st Mir_Appartement Lorsque que j'essaie de faire la supprssion , j'ai l'erreur suivante : FRM-40510 Erreur Oracle :Suppression (Delete) d'enregistrement impossible. Et lorsque je vais verifier dans la base l'enregistrement que j'ai voulu supprimer y est toujours. Merci bien pour votre soutient. |
|
|
00
|
|
|
#2 |
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
Bonsoir,
Je ne suis pas très "Forms", mais voici un début de réponse : FRM-40510: ORACLE error: unable to DELETE record. Cause: A fatal error occurred while trying to delete a record. The table associated with the current block of the form might not exist, your username might not have authority to perform the specified action on the table, or some other reason might have caused the fatal error. Action: Contact your DBA. Level: >25 Type: Error
__________________
Vincent Rogier. Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique ! OCILIB (C Driver for Oracle) Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle |
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Mais ma table existe belet bien .
Que me conseille tu , quelle code utiliser pour faire une suppression parceque cette procedure , je l'ais recupéré dans l'aide de Oracle ( Delete_Record) Merci. |
|
|
00
|
|
|
#4 |
![]() ![]() vincent rogier Inscription : juillet 2007 Messages : 2 355 ![]() |
Et si tu exécutes le code directement sous sql*plus, ca donne quoi ?
__________________
Vincent Rogier. Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique ! OCILIB (C Driver for Oracle) Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle |
|
00
|
|
|
#5 |
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Salut,
Le block 'Mir_Appartement' est un block maitre d'un autre block? Essaie de voir cette discussion http://www.developpez.net/forums/d71410/bases-donnees/oracle/forms-gestion-dexception-contrainte-type-fk/ |
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Mon block est basé sur une block simple (table mir_appartement)
Et lorsque je fais dans sql/plus un : Delete from Mir_Appartement Where Cod_Appart = FG01; J'ai l'érreur suivante: Erreur à la ligne 1: ORA-00904: Nom de colonne non valide |
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
J'ai supprimé le code présédent qui était dans le declencheur , puis je l'ais remplacé par le code suivant:
DELETE FROM Mir_Appartement WHERE cod_Appart = :MIR_APPARTEMENT.COD_APPART; Et voici l'erreur ORA que j'ai : FRM-40735 le declencheur When _Button_Pressed à détécté une exeption 0RA_02292 non traité. Que dois-je faire pour effectué ma suppression en base a l'aide du bouton Supprimer . Merci |
|
|
00
|
|
|
#8 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Mir_Appartement c'est le block et cod_appart est le champ .
Merci |
|
|
00
|
|
|
#9 | ||||||
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Citation:
Code :
Citation:
Code :
|
||||||
|
|
00
|
|
|
#10 |
|
Membre chevronné
![]() Inscription : septembre 2007 Messages : 519 ![]() |
Je ne suis pas expert en FORMS mais as-tu vu ce post : http://www.developpez.net/forums/showthread.php?t=71410
|
|
|
00
|
|
|
#11 |
|
Membre habitué
![]() ![]() Inscription : mai 2002 Messages : 257 ![]() |
Quelle est la version de Forms ?
|
|
|
00
|
|
|
#12 |
|
Membre habitué
![]() ![]() Inscription : mai 2002 Messages : 257 ![]() |
l'erreur ORA-02292 est une erreur d'intégrité, tu essaies de supprimer un enregistrement qui a des fils dans une autre table.
Essaies de voir de ce coté là |
|
|
00
|
|
|
#13 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Bonjour à tous honorable personne
Effectivement mon la propeiété delete de mon block est à yes . Puis comme Salim11 et Nounoursonne le dise mon block , mon Cod_Appart , est une clé etrangère dans une autre table du nom de Mir_Contrat qui est :create table MIR_CONTRAT ( COD_CONTRAT VARCHAR2(10) not null, COD_APPART VARCHAR2(10) not null, COD_LOC VARCHAR2(10) not null, DATE_CONTRAT DATE, CAUTION NUMBER(20), STATUT Varchar2(50), REMBOURSEMENT NUMBER(20), DEVOIR NUMBER(20), constraint PK_MIR_CONTRAT primary key (COD_CONTRAT) ); Merci je vais essayer le code de Salim11 et je vous en direz la suite .Merci |
|
|
00
|
|
|
#14 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Salim11
Lorsque je met le code forms_ddl('DELETE FROM Mir_Appartement WHERE cod_Appart = '||:MIR_APPARTEMENT.COD_APPART); forms_ddl('commit'); go_block('MIR_APPARTEMENT') excute_query; dans le trigger When_Button_Pressed et que je compile il me marque : Erreur 201 ligne 6 ,colonne1 l'indicateur execute_query; doit etre déclaré . |
|
|
00
|
|
|
#15 |
|
Candidat au titre de Membre du Club
![]() Inscription : juillet 2007 Messages : 96 ![]() |
Je tente d'executer la procedure de Finkel qui
PROCEDURE P_delete_record IS str_cur_blk VARCHAR2(60);-- Le nom du block sur lequel on veut faire un delete str_first_itm VARCHAR2(60);-- Le 1er item du block str_last_itm VARCHAR2(60);-- Le dernier item du block str_cur_itm VARCHAR2(60);-- L'item courant que l'on est en train de lire str_pk VARCHAR2(10);-- Variable indiquant si l'item fais partie de la clé primaire str_colname VARCHAR2(60);-- Nom de la colonne auquel se réfère l'item str_type VARCHAR2(20);-- Type de donné de l'item (char, nimber, etc...) str_where VARCHAR2(5000);-- Chaine de carctère dans laquelle on sotcke la clause where str_value VARCHAR2(2000);-- Variable stoquant la valeur du champ que l'on est en train de lir str_delete VARCHAR2(5000);-- Varaible contenant l'instrucation SQL a executer correspondant au delete str_nomtable VARCHAR2(60);-- Le nom de la table sur lequel se réfère le block str_typedonne VARCHAR2(30); -- Type de source de donnée du block (table, procédure, etc... num_bouton NUMBER; Exit_Procedure EXCEPTION; Cle_etrangere EXCEPTION; -- On définie une exception avec le code ORA correspondant -- a l'erreur du à l'intégrité référentiel. PRAGMA EXCEPTION_INIT(Cle_etrangere, -2292); BEGIN -- Initialisation des variables str_where := ''; str_nomtable := ''; str_typedonne := ''; str_cur_blk := :System.Cursor_Block; --On repère le 1er item du block et on se positionne dessus str_first_itm := Get_Block_Property(str_cur_blk, FIRST_ITEM ); str_last_itm := Get_Block_Property(str_cur_blk, LAST_ITEM ); str_cur_itm := str_first_itm; WHILE str_cur_itm != str_last_itm LOOP -- On regarde si l'item fait partie d'une clé primaire str_pk := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,PRIMARY_KEY); IF str_pk = 'TRUE' then -- On recupère le nom de la colonne associée à l'item (en général identique mais pas toujours) str_colname := nvl(GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,COLUMN_NAME),str_cur_itm); -- On récupère le type de variable str_type := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,DATATYPE); IF str_type IN ('ALPHA', 'CHAR', 'LONG') then str_value := ''''||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||''''; elsif str_type IN ('INT', 'RINT', 'NUMBER', 'RNUMBER', 'MONEY', 'RMONEY') then str_value := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE); elsif str_type = 'DATE' then str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD-MON-YY'')'; elsif str_type = 'JDATE' then str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''MM/DD/YY'')'; elsif str_type = 'EDATE' then str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD/MM/YY'')'; elsif str_type = 'DATETIME' then str_value := 'to_date('||GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm, DATABASE_VALUE)||',''DD-MON-YY HH24:MI:SS'')'; else -- On ne sait pas gérer ce cas type Raise Exit_Procedure; end IF; -- L'item courant faisant partie de la clé primaire (donc basé et non nul) on le rajoute à la clause Where str_where := str_where||' AND '||str_colname||' = '||str_value; End IF; str_cur_itm := GET_ITEM_PROPERTY(str_cur_blk||'.'||str_cur_itm,NEXTITEM); END LOOP; -- Si la chaine where n'est pas vide alors cela veut dire qu'elle commence par un AND qu'on doit enlever IF str_where IS NOT NULL then str_where := LTRIM(str_where,'AND '); end IF; --On récupère le nom de la table sur lequel est basé le block str_typedonne := GET_BLOCK_PROPERTY(str_cur_blk, QUERY_DATA_SOURCE_TYPE); IF str_typedonne = 'TABLE' then str_nomtable := GET_BLOCK_PROPERTY(str_cur_blk, QUERY_DATA_SOURCE_NAME); -- Si le nom de la table est un synonyme, alors on va prendre plutot le nom -- de la table en enlevant le 's' devant car le delete sera executé depuis -- une procèdure sotckée str_nomtable := LTRIM(str_nomtable,'s'); end IF; -- Si le block n'est pas basé sur une table -- ou si la clause where ne s'est pas construite -- (car le block n'a pas de clé primaire défini par exemple) -- Alors on ne sais pas gérer le cas IF str_nomtable IS NULL OR str_where IS NULL then Raise Exit_Procedure; end IF; -- Construction de la requete str_delete := 'delete from '||str_nomtable||' where '||str_where; -- On execute l'instruction SQL a l'aide d'un EXECUTE IMMEDIATE placé en procédure stocké sps_com_exec_sql(str_delete); execute_query; EXCEPTION when Cle_etrangere then message('L''enregistrement est référencé'); raise form_trigger_failure --Echec de la tentative de delete, on laisse l'appilcation gérer la suppresion when Exit_Procedure then delete_record; END; Mais j'ai le curseur qui clignote sur l'avant dernière ligne qui est delete_record et erreur 103 , ligne119 colone1 en me disant symbole 'Wen' rencontré a la place d'un symbole suivant";" à été substitué à "When" pôur continuer. |
|
|
00
|
|
|
#16 |
|
Membre habitué
![]() ![]() Inscription : mai 2002 Messages : 257 ![]() |
il manque juste le ";" sur cette ligne :
|
|
|
00
|
|
|
#17 |
|
Membre habitué
![]() ![]() Inscription : mai 2002 Messages : 257 ![]() |
ce que je ne comprends pas c'est pourquoi tu ne supprimes pas les fils avant de supprimer le père, ça serait tellement plus simple
|
|
|
00
|
|
|
#18 | |||
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#19 |
|
Membre habitué
![]() ![]() Inscription : mai 2002 Messages : 257 ![]() |
Salim11, il aura toujours le même problème à cause des clés étrangères, non ?
|
|
|
00
|
|
|
#20 | |
![]() Salim Développeur et DBA Oracle Inscription : octobre 2006 Messages : 872 ![]() |
Citation:
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com