Delphi - Oracle - Clef primaire auto incerment [Résolu]

pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 6 mars 2014 à 12:31 - Dernière réponse : pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention
- 13 mars 2014 à 21:29
Bonjour,

En préambule, je précise que je suis un amateur et que les développements que j'effectuent sont pour, autant que possible, aider les femmes et les hommes autour de moi dans leurs tâches quotidiennes. Enfin, je n'ai, jusqu'à présent, jamais utilisé de tables sous Oracle.

Ceci étant dit, j'utilise Delphi 5 pour ce projet (J'ai aussi la possibilité d'utiliser Delphi 2009). J'ai à ma disposition une base de données Oracle sur un serveur accessible via le réseau avec des tables que je peux consulter via un lien ODBC.

Aucun problème de connexion, de lecture. En revanche, lorsque je souhaite créer un enregistrement sur une table (DOSSIER) j'ai un message d'erreur que j'attribue au fait que le champ "INDENTIFIANT" est une clef primaire avec un auto incrément.

En fin de message (PS) vous trouverez ce que j'obtiens comme informations sur ce champ via l'interface Access.

Le code que j'utilise est le suivant :

procedure TForm1.Button1Click(Sender: TObject);
begin

// Création d'un enregistrement (d'un dossier dans la table DOSSIER
DOSSIER.Edit;
DOSSIER.Append;
DOSSIER.FieldByName('IDENTIFIANT').AsFloat:= 609371;
DOSSIER.FieldByName('ID_LDD').AsFloat := 1133971;
DOSSIER.FieldByName('ID_MOTIF_DOSSIER').AsFloat := 29;
...
//GCA_DOSSIER.FieldByName('NUM_DOSS').AsString := '';
//GCA_DOSSIER.FieldByName('COMPL_ADRESSE').AsString := '';
...
GCA_DOSSIER.Post;
GCA_DOSSIER.Refresh;

end;


Pouvez vous m'indiquer comment je dois m'y prendre pour gérer et traiter ce problème ?
N'étant qu'un simple amateur dans le domaine, un complément à mon code serait le bienvenu.
J'avoue très humblement que je ne sais pas comment gérer l'auto incrément sur une table Oracle.

Avec mes remerciements anticipés pour votre aide.

Pierre

PS : Infos champ "IDENTIFIANT" via Access :

IDENTIFIANT Décimal 16
AggregateType: -1
AllowZeroLength: Faux
AppendOnly: Faux
Attributes: Longueur variable
CollatingOrder: 10
ColumnHidden: Faux
ColumnOrder: Par défaut
ColumnWidth: Par défaut
CurrencyLCID: 0
DataUpdatable: Faux
DecimalPlaces: Auto
DisplayControl: Zone de texte
GUID: {guid {4455CEF8-7CE6-47E1-8129-D154F69F7B66}}
OrdinalPosition: 1
Required: Vrai
ResultType: 0
SourceField: IDENTIFIANT
SourceTable: GCA_DOSSIER1
TextAlign: Standard
...
PK_DOSSIER 1
Clustered: Faux
DistinctCount: 0
Foreign: Faux
IgnoreNulls: Faux
Name: PK_DOSSIER
Primary: Vrai
Required: Vrai
Unique: Vrai
Champs :
IDENTIFIANT Ascendant
Afficher la suite 

Votre réponse

8 réponses

cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscriptionModérateurStatut 27 mars 2018 Dernière intervention - 7 mars 2014 à 10:21
0
Merci
Bonjour,

commence par mettre cette ligne en commentaire :

//DOSSIER.FieldByName('IDENTIFIANT').AsFloat:= 609371;

et dis-nous ce qui se passe..
Commenter la réponse de cs_cantador
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 7 mars 2014 à 15:38
0
Merci
Tout d'abord merci de votre intérêt et de votre réponse.

J'avais effectivement oublié de vous faire part de cette information. En effet, si je supprime cette ligne de code j'obtiens le message d'erreur suivant :

"Le projet TEST.exe a provoqué une classe d'exception EDatabaseError avec le message 'Le champ 'IDENTIFIANT' doit avoir une valeur'. Processus stoppé. Utilisez pas-à-pas ou Exécuter pour continuer."

Et là je bloque... j'avoue !

Pierre
Commenter la réponse de pierre_claval
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 9 mars 2014 à 21:03
0
Merci
Salut,
Si ton champ DOSSIER.IDENTIFIANT est de type auto incrément, tu n'as pas le droit de lui affecter une valeur (sauf la valeur NULL), car c'est Oracle (le serveur de DB) qui gère l'auto incrémentation au moment du post. Avant le post le champ IDENTIFIANT doit être à NULL, et après le post, tu verras sa valeur : dernier+1.
Dans ton code append, ... et de même dans tes scripts SQL
soit tu ignores le champ
soit tu lui mets := NULL
salut.
solilog
Commenter la réponse de solilog
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 10 mars 2014 à 00:29
0
Merci
Bonjour,

Merci, je viens de tester avec le code suivant :

...
DOSSIER.FieldByName('IDENTIFIANT').AsFloat:= NULL;
...

J'obtiens le message d'erreur suivant :

"Le projet TEST.exe a provoqué une classe d'exception EVariantError avec le message 'Conversion de type Variant incorrecte'. Processus stoppé. Utilisez pas-à-pas ou Exécuter pour continuer."

J'ai essayé
...
DOSSIER.FieldByName('IDENTIFIANT').AsFloat:= UNASSIGNED;
...
Et j'ai une erreur !

Désolé mais la je ne vois pas.

Pierre
Commenter la réponse de pierre_claval
solilog 273 Messages postés samedi 13 juin 2009Date d'inscription 18 avril 2015 Dernière intervention - 10 mars 2014 à 07:35
0
Merci
Salut,

Selon les SBBD, soit tu renseignes le champs avec NULL, soit tu ignores complêtement ce champ, tu n'y touches pas. Tu fais ton append, tu renseignes les autres champs et tu fais le post.
Bon courage.

solilog
Commenter la réponse de solilog
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscriptionModérateurStatut 27 mars 2018 Dernière intervention - 11 mars 2014 à 16:52
0
Merci
je pense que ce champ ne doit pas être du type auto-incrémental ou du moins improprement paramétré..

sinon ça marcherait tout seul
Commenter la réponse de cs_cantador
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 12 mars 2014 à 20:02
0
Merci
Bonsoir,

Le champ est bien "auto incrémenté". En effet, sous Access en remplissant les champs obligatoires et en laissant "l'identifiant" vide, lors de la validation de l'ajout, Oracle insère automatiquement la valeur.

La table DOSSIER est liée à une séquence Oracle via un triggers (...
BEGIN
SELECT DOSSIER_SEQ.nextval INTO :new.IDENTIFIANT FROM dual;
END;)

Surprenant donc que mon code sous Delphi ne fonctionne pas, mais bon, encore une fois je n'ai aucune expérience avec ce type de base de données.

Je vais essayer de passer par une requête SQL du type :

"Query1.SQL.Add('insert into Table1 (ch2, ch3, ch4) values (val2, val3, val4)');

Champ 'ch1' correspondant à l'identifiant."

On ne sait jamais !

Pierre
Commenter la réponse de pierre_claval
pierre_claval 10 Messages postés jeudi 19 juillet 2007Date d'inscription 20 mars 2014 Dernière intervention - 13 mars 2014 à 21:29
0
Merci
Bonsoir,

Voici la solution que je vous livre en détail et à toutes fins utiles pour aider d'autres candidats à l'insertion d'enregistrement dans une table Oracle avec Delphi !

Utilisation d'un objet Tquery
Insertion dans la propriété SQL du "texte" suivant :

INSERT
INTO DOSSIER (ID_LDD, ID_MOTIF_DOSSIER, ID_NAT_DOSSIER,...)
VALUES (:LDD, :ID_MOTIF_DOSSIER, :ID_NAT_DOSSIER,...)

NB : Comme vous pouvez le voir, sans faire référence au champ "IDENTIFIANT"

Et enfin le code :

with query1 do
begin
close;
query1.ParamByName('LDD').Value := Li_ID_LDD;
query1.ParamByName('ID_MOTIF_DOSSIER').value := 29;
...
try
query1.ExecSQL;
except
showmessage('erreur');
end;
end;


Cela fonctionne et je clôture donc cette discussion.

Pierre
Commenter la réponse de pierre_claval

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.