codial
Messages postés265Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 5 mai 2015
-
6 févr. 2006 à 17:22
codial
Messages postés265Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 5 mai 2015
-
8 févr. 2006 à 14:10
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;
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 7 févr. 2006 à 10:16
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;
codial
Messages postés265Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 5 mai 20151 7 févr. 2006 à 16:36
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;
codial
Messages postés265Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 5 mai 20151 8 févr. 2006 à 09:43
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!)
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 8 févr. 2006 à 10:12
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.
codial
Messages postés265Date d'inscriptionmercredi 14 avril 2004StatutMembreDernière intervention 5 mai 20151 8 févr. 2006 à 14:10
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!!!