Requête SQL sous delphi [Résolu]

Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
- - Dernière réponse : haceneking
Messages postés
5
Date d'inscription
samedi 17 mai 2008
Dernière intervention
23 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.
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
3
Merci
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.

Merci cs_Delphiprog 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Merci de préciser quelle base de données tu utilises.

May Delphi be with you !
Commenter la réponse de cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
Autre question : tu exécutes ta requête en appelant la méthode Open ou la méthode ExecSql dans le code source delphi ?

May Delphi be with you !

<HR color=#008000>
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Commenter la réponse de cs_Delphiprog
Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
0
Merci
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;
Commenter la réponse de toubal_99
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
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.
Commenter la réponse de cs_Delphiprog
Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
0
Merci
je v essayer et je vous confirme si ca marche merci
Commenter la réponse de toubal_99
Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
0
Merci
la g pas de message d'ereure aparament c bon sauf que ca n'efface pas les enregistrements g verifier les clauses elle sonts corectes.
Commenter la réponse de toubal_99
Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
0
Merci
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>
Commenter la réponse de toubal_99
Messages postés
46
Date d'inscription
samedi 10 juillet 2004
Dernière intervention
29 juillet 2008
0
Merci
merci beacoup de votre aide ca a marcher , j'espere que ca serviras au autres !
encor 1000000 merci
Commenter la réponse de toubal_99
Messages postés
3
Date d'inscription
dimanche 20 janvier 2008
Dernière intervention
24 mars 2008
0
Merci
bonjour

jai fait le insert avec le tquery mais le message derreur suivant saffiche :

general error
'string or binary data would be trancated'
'the statement has been terminated' process stopped use step or run to continu'


voila le progran que jai fait :
procedure TForm1.Button2Click(Sender: TObject);
var requete : string;
begin

requete := 'insert into tableclient (code_client,nom_client,prenom_client,adresse_client,mail_client,tel_client,portable_client) values(:x1,:x2,:x3,:x4,:x5,:x6,:x7)';

form2.Query1.SQL.Clear;
form2.query1.sql.add(requete);
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;

merci
Commenter la réponse de naimolphe
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Dernière intervention
9 janvier 2013
0
Merci
@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.
Commenter la réponse de cs_Delphiprog
Messages postés
5
Date d'inscription
samedi 17 mai 2008
Dernière intervention
23 juillet 2010
0
Merci
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
Commenter la réponse de haceneking

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.