cs_Gokuan
Messages postés51Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention17 novembre 2008
-
31 mars 2005 à 12:26
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 2012
-
31 mars 2005 à 16:19
voilà, l'erreur me marque, que DBExpress fait une erreur avec le user_name/password invalid... je comprends pas, et elle viens genre si je mets 200 dans boucle k, on peut lancé le projet 4 fois, puis la 5 eme il me marque cet erreur...
cs_Gokuan
Messages postés51Date d'inscriptionjeudi 23 mai 2002StatutMembreDernière intervention17 novembre 2008 31 mars 2005 à 12:28
procedure TForm1.BitBtn2Click(Sender: TObject);
var k,l,Quantiterstock : integer;
CA,numfour,Nfourdefaut,Prixachat,PRrevient,marge : string;
begin
SQLQuery1.Close; //Fermeture SQLQuery
if stringgrid1.Cells[0,1]'' then //vérifie si la cellule n'est pas vide
begin
for k:=1 to Stringgrid1.RowCount do //Boucle de 1 jusqu'à la fin du tableau(Stringgrid)
begin
SQLQuery1.SQL.Clear;
if stringgrid1.Cells[1,k]'' then
begin
{****************** REQUETE N°1 *********************************************}
SQLQuery1.SQL.clear; //balayage du composant TSQLQuery
SQLQuery1.SQL.Add('SELECT Nofournisseur as NoFour,codearticleIntern As CodeArticle,codearticlefour FROM Articlesliaisonfour WHERE CodearticleFour="'+Stringgrid1.Cells[0,k]+'"AND NoFournisseur="'+numfournisseur+'"'); //Récupère nofour et codearticle si la condition est correcte
try
SQLQuery1.Open;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
if SQLQuery1.RecordCount>0 then //Condition permettant de vérifier si la condition de la dernière requêtes est correcte
begin
Numfour:=SQLQuery1.fieldbyname('Nofour').AsString; //Attribution à Numfour du résultat de la requête n°1
CA:=SQLQuery1.Fieldbyname('codearticle').AsString; //Attribution à CA variable du résultat de la requête n°1
{****************** REQUETE N°2 ***********************************************}
SQLQuery1.SQL.clear;
SQLQuery1.SQL.Add('SELECT CNOM as NomFourdefaut FROM fournisseurs WHERE NNoFour="'+Numfour+'"'); //permet de récupérer le nom du fournisseur si la condition est correcte
try
SQLQuery1.Open;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
if SQLQuery1.RecordCount>0 then //Condition permettant de vérifier si la condition de la dernière requêtes est correcte
begin
NFourdefaut:=SQLQuery1.fieldbyname('NomFourdefaut').AsString; //Attribution à NFourDefaut variable du résultat de la requête n°2
{****************** REQUETE N°3 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT * FROM articles WHERE fournisseur="'+NFourdefaut+'" AND codearticle="'+CA+'"'); //Permet de récupérer le prix d'achat de la base avant modification
try
SQLQuery1.Open;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
Prixachat:=SQLQuery1.Fieldbyname('PRachat').AsString; //Attibution du résultat de la requête n°3
if SQLQuery1.RecordCount>0 then //Condition permettant de vérifier si la condition de la dernière requêtes est correcte
begin
{****************** REQUETE N°4 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('UPDATE articles SET PRachat="'+Stringgrid1.Cells[2,k]+'" WHERE Codearticle="'+CA+'"'); //Modifie le prix d'achat dans la base(non-transféré)
try
SQLQuery1.ExecSQL;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
{****************** REQUETE N°5 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('UPDATE articles SET PRrevient=PRachat+Port WHERE Codearticle="'+CA+'"'); //Modifie le Prix de revient dans la base
try
SQLQuery1.ExecSQL;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
{****************** REQUETE N°6 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT * FROM articles WHERE codearticle="'+CA+'"'); //Permet de récupéré le prix de revient, la quantité en stock si la condition est correcte
try
SQLQuery1.Open;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
PRrevient:=SQLQuery1.Fieldbyname('PRrevient').asstring; //Attribution de la requête n°6
Quantiterstock:=SQLQuery1.Fieldbyname('Quantitéstockvente').AsInteger;//Attribution de la requête n°6
for l:=1 to 7 do //Boucle pour faire les 7 codes de prix
begin
{****************** REQUETE N°7 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT marge'+IntToStr(l)+' as margeX FROM articles WHERE codearticle="'+CA+'"'); //Permet de récupéré la marge
try
SQLQuery1.Open;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
marge:=SQLQuery1.fieldbyname('margeX').AsString; //Attribution de la requête n°7
{****************** REQUETE N°8 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('UPDATE articles SET code'+IntToStr(l)+'="'+arrondis(marge,PRrevient)+'" WHERE codearticle="'+CA+'"'); //Modifie et calcule tout les codes de prix(liste non-transférée)
try
SQLQuery1.ExecSQL;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
if (Stringgrid1.Cells[2,k]>Prixachat) or (Quantiterstock=0) then //Condition pour mise à jours dans liste prix transféré
begin
{****************** REQUETE N°9 ***********************************************}
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('UPDATE listeprix SET code'+IntToStr(l)+'="'+arrondis(marge,PRrevient)+'" WHERE codearticle="'+CA+'"'); //Modifie et calcule tout les codes de prix(liste transférée)
try
SQLQuery1.ExecSQL;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
exit;
end;
end;
end
end
end
end
end
else
begin
form4.StringGrid1.Cells[0,k]:=stringgrid1.cells[0,k]; //Affiche valeur XLS pas mis à jour dans tableau form4
form4.StringGrid1.Cells[1,k]:=stringgrid1.cells[2,k]; //Affiche valeur XLS pas mis à jour dans tableau form4
Form4.StringGrid1.RowCount:=k;
end;
end;
Progressbar2.Min:=0;
Progressbar2.Max:=Stringgrid1.RowCount;
Progressbar2.Position:=k;
end;
end
else
Messagedlg('Aucun fichier XLS n''est importé',mtInformation,[mbOk],0);
Statusbar1.Panels.Items[1].Text:='Mise à jour terminée';
Messagedlg('Mise à jour terminée!',mtInformation,[mbOk],0);
form4.Visible:=true;
progressbar2.Position:=0;
end;
voilà la boucle. J'utilise à SQLConnection pour me connecté a la base
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 31 mars 2005 à 16:19
A première vue, sans trop analyser et juste histoire de clarifier ton code, tu devrais :
- Créer autant de SQLQuery que tu as de requete ( REQUETE N°1 : SQLQuery1, REQUETE N°2 : SQLQuery2, etc...)
- De plus, Chaque requete a pour ainsi dire la même forme, pourquoi ne pas faire une fonction du style :
type
ActionRequete = ( arOuverture, arExecution ) ;
function ExecutionRequete ( RequeteSQL : TSQLQuery ; const Action : ActionRequete ; const S : string ) : Boolean ;
begin
Result := false ;
RequeteSQL .SQL.Clear;
RequeteSQL .SQL.Add( S );
try
// !!!! ExecSQL pour exécuter des requêtes ne renvoyant pas de curseur
// sur des données (comme INSERT,UPDATE,DELETE et CREATE TABLE).
// !!!! Open au lieu de ExecSQL pour les instructions SELECT
case Action of
arOuverture : RequeteSQL .Open;
arExecution : RequeteSQL .ExecSQL;
end ;
Result := TRUE ;
except on E: exception do
begin
Messagedlg(E.message +' ne peut pas continuer',mtError,[mbOk], 0);
end;
end;
Ok, cela ne solutionnera sans doute pas ton problème ( à voir après remplacement des SQLQuery1 ) mais permettra SURTOUT d'y voir un peu plus clair dans toutes ces requetes :)