Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Outils > Forms
Forms Forum d'entraide sur Oracle Forms
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2008, 21h54   #1
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
Par défaut Suppression d'un enregistrement Impossible

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.
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2008, 21h59   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2008, 22h34   #3
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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.
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2008, 22h37   #4
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 02h50   #5
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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/
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 19h39   #6
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 19h53   #7
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2008, 19h55   #8
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
Mir_Appartement c'est le block et cod_appart est le champ .
Merci
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 01h42   #9
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Citation:
Envoyé par Bayoro Voir le message
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
Essaie
Code :
1
2
 
DELETE FROM Mir_Appartement WHERE Cod_Appart = 'FG01';
Est ce que la propriété delete de ton block Mir_Appartement est à YES?

Citation:
Envoyé par Bayoro Voir le message
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 .
Essaie
Code :
1
2
3
4
5
6
 
forms_ddl('DELETE FROM Mir_Appartement WHERE cod_Appart 
= '||:MIR_APPARTEMENT.COD_APPART);
forms_ddl('commit');
go_block('MIR_APPARTEMENT')
excute_query;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 08h57   #10
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Je ne suis pas expert en FORMS mais as-tu vu ce post : http://www.developpez.net/forums/showthread.php?t=71410
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 09h22   #11
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
Quelle est la version de Forms ?
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 09h27   #12
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
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à
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 11h01   #13
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 11h08   #14
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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é .
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 12h57   #15
Candidat au titre de Membre du Club
 
Inscription : juillet 2007
Messages : 96
Détails du profil
Informations forums :
Inscription : juillet 2007
Messages : 96
Points : 14
Points : 14
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.
Bayoro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 13h08   #16
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
il manque juste le ";" sur cette ligne :
Code :
1
2
raise form_trigger_failure ;
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 13h10   #17
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
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
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 14h16   #18
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Citation:
Envoyé par Bayoro Voir le message
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é .
Je m'execuse erreur de frappe, execute_query qui correct
Code :
1
2
3
4
5
6
 
forms_ddl('DELETE FROM Mir_Appartement WHERE cod_Appart 
= '||:MIR_APPARTEMENT.COD_APPART);
forms_ddl('commit');
go_block('MIR_APPARTEMENT');
execute_query;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 14h19   #19
Membre habitué

 
Avatar de Nounoursonne
 
Inscription : mai 2002
Messages : 257
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 257
Points : 145
Points : 145
Salim11, il aura toujours le même problème à cause des clés étrangères, non ?
Nounoursonne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2008, 15h22   #20
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Citation:
Envoyé par salim11 Voir le message
Salut,

Le block 'Mir_Appartement' est un block maitre d'un autre block?

Essaie de voir cette discussion
http://www.developpez.net/forums/showthread.php?t=71410
Je corrige mon erreur seulement.
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h34.


 
 
 
 
Partenaires

Hébergement Web