toubal_99
Messages postés45Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention29 juillet 2008
-
12 avril 2006 à 23:04
haceneking
Messages postés5Date d'inscriptionsamedi 17 mai 2008StatutMembreDernière intervention23 juillet 2010
-
26 mars 2010 à 10:43
ma questions concerne sql mais je vais comeme la poser ici puisque je travaills sous delphi.
voici la requétte :
DELETE from Stock WHERE Stock.N_Lot <gras>( select Detail1.N_Lot from Detail1 JOIN Aprovisionnements on (Aprovisionnements.N_Service :N_Ser) and (Aprovisionnements.N_Apr = Detail1.N_Apr) )</gras>
le :N_Ser est un parametre qui est egale a 1 par exemple.
g essayer directement aussi :
DELETE from Stock WHERE Stock.N_Lot ( select Detail1.N_Lot from Detail1 JOIN Aprovisionnements on (Aprovisionnements.N_Service 1) and (Aprovisionnements.N_Apr = Detail1.N_Apr) )
il me sorte la meme ereure : Ereure a la creation du handle du curseur
a noter que meme quand j'utilise directement DELETE from Stock il me sorte la meme ereure sauf que cette fois il efface les enregistrements.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 13 avril 2006 à 23:29
Ok.
En regardant la requête SQL de plus près, je m'interroge sur l'utilité de demander une jointure avec la table approvisionnements. Cela n'a aucun sens et la requête peut être simplifiée ainsi :
DELETE FROM Stock
WHERE N_Lot = ANY ( SELECT N_Lot
FROM Detail1
WHERE Date_Per < "01/01/2005" )
En clair :
Supprimer les enregistrements de la table Stock pour lesquels le champ N_Lot figure dans une liste contenue dans la table Detail1 et pour laquelle le champ Date_Per est inférieur à 01/01/2005. C'est bien cela ?
Autre façon d'écrire cette requête :
DELETE FROM Stock
WHERE N_Lot IN ( SELECT N_Lot
FROM Detail1
WHERE Date_Per < "01/01/2005" )
May Delphi be with you !
<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
toubal_99
Messages postés45Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention29 juillet 2008 13 avril 2006 à 00:25
j'utilise paradox, et j'execute la requette avec la methode Open
StockBr.SQL.Clear; StockBr.SQL.Add('DELETE from Stock WHERE Stock.N_Lot ( select Detail1.N_Lot from Detail1 JOIN Aprovisionnements on (Aprovisionnements.N_Service :N_Ser) and (Aprovisionnements.N_Apr = Detail1.N_Apr) )');
StockBr.ParamByName('N_Ser').AsInteger:=StrToInt(Dbgrid4.SelectedField.DisplayText);
StockBr.Open;
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 13 avril 2006 à 19:20
Alors dans ce cas c'est normal que tu obtiennes ce message d'erreur.
Seules les requêtes renvoyant un ensemble de données (select) doivent être exécutées en utilisant la méthode Open.
Dans les autres cas (delete, update, insert), il faut utiliser la méthode ExecSql du composant TQuery.
May Delphi be with you !
<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
toubal_99
Messages postés45Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention29 juillet 2008 13 avril 2006 à 22:02
voici un exemple de la requette :
DELETE FROM Stock WHERE Stock.N_Lot <gras>( SELEC N_Lot FROM Detail1 JOIN Aprovisionnements on (Aprovisionnements.N_Service 1) AND (Aprovisionnements.N_Apr = Detail1.N_Apr) AND (Detail1.Date_Per < "'01/01/2005'") )</gras>
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 1 avril 2008 à 23:09
@naimolphe :
1- dans le code de la requête d'insertion que tu donnes, je ne vois que 6 noms de champs alors que tu essaies d'insérer 7 valeurs. S'agit-il d'une simple erreur de copier/coller ?
2- Quand tu insères des valeurs de type chaine, il est préférable (voire indispensable) d'utiliser la fonction QuotedStr :
form2.query1.parambyname('x2').asstring := QuotedStr(edit2.text);
Ca évite que le moteur d'analyse de la requête ne soit obligé d'interpréter une chaine avec un guillemet comme le fin de la requête.
Enfin, de grace, allégez vos codes en évitant les formes répétitives. Au lieu de :
form2.query1.parambyname('x1').asinteger := strtoint(edit1.text); form2.query1.parambyname('x2').asstring := edit2.text; form2.query1.parambyname('x3').asstring := edit3.text; form2.query1.parambyname('x4').asstring := edit4.text; form2.query1.parambyname('x5').asstring := edit5.text; form2.query1.parambyname('x6').asinteger := strtoint(edit6.text); form2.query1.parambyname('x7').asinteger := strtoint(edit7.text); form2.query1.execsql; end;
N'est-il pas plus agréable de lire ceci :
with Form2.Query1 do
begin
parambyname('x1').asinteger := strtoint(edit1.text);
parambyname('x2').asstring := edit2.text;
parambyname('x3').asstring := edit3.text;
parambyname('x4').asstring := edit4.text;
parambyname('x5').asstring := edit5.text;
parambyname('x6').asinteger := strtoint(edit6.text);
parambyname('x7').asinteger := strtoint(edit7.text);
execsql;
end;
Tous les langages n'offrent pas cette faculté et cette légèreté d'écriture. Alors, pourquoi ne pas l'utiliser ?
May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
haceneking
Messages postés5Date d'inscriptionsamedi 17 mai 2008StatutMembreDernière intervention23 juillet 2010 26 mars 2010 à 10:43
bonjour
j'aurais bien besoin d'aide pour apprendre a integrer des requetes sql dans ma programmation sous delphi 7 en utilisant des bases de données paradox et si c possible par un ptit exemple en tuto qui va etape par etape
je vous remercie d'avance