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

Signaler
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014
-
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014
-
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

8 réponses

Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
Bonjour,

commence par mettre cette ligne en commentaire :

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

et dis-nous ce qui se passe..
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014

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
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
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
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014

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
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
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
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
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
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014

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
Messages postés
10
Date d'inscription
jeudi 19 juillet 2007
Statut
Membre
Dernière intervention
20 mars 2014

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