Encore une gestion d'exception

Résolu
Signaler
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
-
Bonjour,

désolé encore bloqué par une exception !!!

Dans le code suivant j'ai une exception que je n'arrive pas gérer.
Je cherche à remplir une table Access à partir d'une feuille excel. J'ai un champ (Domaine) qui n'accepte pas les chaînes vides. Aussi, quand j'arrive sur une cellule vide de ma feuille Excel j'ai un message d'erreur "Le champ tbl_ParcTemp.Domaine ne peut pas etre une chaîne vide. Normal!!!

Ce que je ne comprends pas c'est pour quoi mon try except ne fonctionne pas?

Si quelqu'un peut me débloquer la situation !!!

D'avance merci

Codial

//=======================
//Lire chaque ligne de la feuille
//=======================
for ii:= 2 to NbreLigne do
begin
DM.tbl_ParcTemp.insert; // Insérer une nouvelle ligne
//===================================
//Lire chaque colonne de la feuille
//===================================
for a:=1 to NbreColonne do
begin
DM.tbl_ParcTemp.Edit; //Mettre à jour la nouvelle ligne
strValeur := MaFeuille.Cells.Item[ii,a].Value;
Case a of
1: try
DM.tbl_ParcTemp.fieldbyName('Domaine').asstring:=strValeur; //====> N'accepte pas les chaînes vides.
except
on EDatabaseError do DM.tbl_ParcTemp.Cancel; =======>>>>>>>> Pourquoi ça ne fonctionne pas ????
end;
2: DM.tbl_ParcTemp.fieldbyName('Détenteur').asstring:=strValeur;
3: DM.tbl_ParcTemp.fieldbyName('Formation').asstring:=strValeur;
4: DM.tbl_ParcTemp.fieldbyName('PAa').asstring:=strValeur;
5: DM.tbl_ParcTemp.fieldbyName('Comptable').asstring:=strValeur;
6: DM.tbl_ParcTemp.fieldbyName('Clair_Comptable').asstring:=strValeur;
7: DM.tbl_ParcTemp.fieldbyName('Immatr').asstring:=strValeur;
8: DM.tbl_ParcTemp.fieldbyName('idCivil').asstring:=strValeur;
9: DM.tbl_ParcTemp.fieldbyName('Emat8').asstring:=strValeur;
10: DM.tbl_ParcTemp.fieldbyName('Clair_Emat8').asstring:=strValeur;
11: DM.tbl_ParcTemp.fieldbyName('NumChâs').asstring:=strValeur;
12: DM.tbl_ParcTemp.fieldbyName('DateImmatr').asstring:=strValeur;
end;
end;
DM.tbl_ParcTemp.Post;
progressbar1.Position:=progressbar1.Position+1 ;
//DM.tbl_ParcTemp.next ;
end;
showmessage('Importation terminée..');
ProgressBar1.Position := 0;
Progressbar1.Visible := false;

8 réponses

Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Après pas mal de galère hier, en me levant ce matin j'ai trouvé !!!!

le try except n'est pas au bon endroit !!!

try
DM.tbl_ParcTemp.Post;
except
on EDataBaseError do DM.tbl_ParcTemp.Cancel;
end;

Cordialement

Codial
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Ce qui m'echappe, c'est pourquoi attendre que la table acces te balance une erreur si tu tentes decharger un "domaine" avec une chaine vide, alors que tester la longuer de strValeur est tout a fait possible dans le 1 de ton "case of" du genre.

1: begin
if Length(strValeur) <> 0 then
DM.tbl_ParcTemp.fieldbyName('Domaine').asstring:=strValeur;

Et en plus, je vois pas trop l'interet d'un case of alors que la valeur de a -ton compteur- est incrémentée. Crées toi un array[1..12] of string en constante que tu précharge avec les différent fieldNames dans le bon ordre, apres tu réécris ta boucle avec

if Lenght(MaFeuille.Cells.Item[ii,1].Value)>0 then
begin
DM.tbl_ParcTemp.Edit; //Mettre à jour la nouvelle ligne
for a:=1 to NbreColonne do
DM.tbl_ParcTemp.fieldbyName(MyFieldName[a]).asstring:=
MaFeuille.Cells.Item[ii,a].Value;
end;


M'enfin je dis ca, je dis rien....
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

j'ai bien pris tes remarque en compte et j'ai modifié mon code en conséquence. En fait je reprends sous Delphi 7 une appli que j'ai développé sous Access justement pour améliorer mes connaissances du language Delphi et naturellement je suis preneur de toutes les remarques relatives à mon code.

J'ai donc fait:
var
strChamp:array[1..12] of string;
.....

begin
//---------------------
strChamp[1]:='Domaine';
strChamp[2]:='Détenteur';
strChamp[3]:='Formation';
strChamp[4]:='PAa';
strChamp[5]:='Comptable';
strChamp[6]:='Clair_Comptable';
strChamp[7]:='Immatr';
strChamp[8]:='idCivil';
strChamp[9]:='Emat8';
strChamp[10]:='Clair_Emat8';
strChamp[11]:='NumChâs';
strChamp[12]:='DateImmatr';
//=======================
......
//Lire chaque ligne de la feuille
//=======================
for ii:= 2 to NbreLigne do
begin
DM.tbl_ParcTemp.insert; // Insérer une nouvelle ligne
//===================================
//Lire chaque colonne de la feuille
//===================================
DM.tbl_ParcTemp.Edit; //Mettre à jour la nouvelle ligne
if Length(MaFeuille.Cells.Item[ii,1].Value)>0 then
begin
DM.tbl_ParcTemp.Edit; //Mettre à jour la nouvelle ligne
for a:=1 to NbreColonne do
DM.tbl_ParcTemp.fieldbyName(strChamp[a]).asstring:= MaFeuille.Cells.Item[ii,a].Value;
try
DM.tbl_ParcTemp.Post;
except
on EDataBaseError do
begin
WriteLn(F,MaFeuille.Cells.Item[ii,2].Value + ' ' +MaFeuille.Cells.Item[ii,7].Value);
DM.tbl_ParcTemp.Cancel;
end;
end;
end;
progressbar1.Position:=progressbar1.Position+1 ;
end;
showmessage('Importation terminée..');
//Fermer Excel
ExcelApplication1.quit;
WriteLn(F,'End Of File');
WriteLn(F,'-----------');
CloseFile(F);
ProgressBar1.Position := 0;
Progressbar1.Visible := false;

-----
c'est ce que tu voulais dire ?

Cordialement

Codial
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Bah en gros oui. Ca marche ?
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

oui ça marche mais je n'ai pas vu de gain de rapidité dans mon importation qui dure quand même 5mn pour 20379 enregistrements (Sous Access c'est un peu plus rapide!)

Cordialement

Codial
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Euh, heheheh ... ahem ma remarque a propos du case of n'a pas accéléré des masses ton traitement, et c'est normal. Ca concernait seulement le fait qu'un case of n'était pas à sa place dans ce cas précis vu que les infos arrivaient toujous dans le meme ordre. Le test de la premiere cellule n'avait pour but que de t'eviter une gestion d'exception supplémentaire.

Ce qui fait que ton truc est lent (relativement parlant), c'est d'acceder a chaque cellule, puis une fois que la ligne de ta table est construite, de la soumettre a la DB, qui elle refait une bardée de tests. 20379 en 5 mn, ca fait quand meme 68 enregistrement à la seconde, c'est pas mal du tout hein.

Tchô.
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Arf, si tu veux grapiller quelques nanosecondes, cette ecriture est pas bonne :

progressbar1.Position:=progressbar1.Position+1 ;

Inc(progressbar1.Position) est plus rapide (un micropoil plus rapide)
Messages postés
265
Date d'inscription
mercredi 14 avril 2004
Statut
Membre
Dernière intervention
5 mai 2015
1
Bonjour,

ta remarque me rassure dans la mesure ou le code n'est pas trop nul !!!! car en fait je ne maitrise pas encore parfaitement Delphi. Mais ça viendra !!!

Le test de la premiere cellule pour éviter une gestion d'exception a été le bien venu car j'avais déja essayé mais sans vraiment trouver la bonne syntaxe.

Comme je l'ai dit je suis preneur de toute critique constructive!!!

Cordialement

Codial