RÉPERTOIRE

JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 - 21 août 2006 à 20:41
qoprek Messages postés 10 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 26 mars 2007 - 23 août 2006 à 22:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/39202-repertoire

qoprek Messages postés 10 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 26 mars 2007
23 août 2006 à 22:17
L'idéal est de lire la doc delphi :)

Pour les requêtes normales, voici un exemple (je le rédige sans un delphi sous la main donc ptet des erreurs). Si tu as besoin d'explications, après avoir cherché par toi-même, n'hésite pas à demander.

Function ExempleQueryNormale(UneRequete:String;UneDatabase:TIBDataBase):Boolean;
Var UneQuery : TIBQuery;
IBTransaction : TIBTransaction;
RequeteModif : Boolean;
LaRequete : String;
Begin
Result := False;
LaRequete := Trim(UneRequete);
If LaRequete = '' Then Exit;
UneQuery := Nil;
IBTransaction := Nil;
RequeteModif := (Pos('INSERT',AnsiUpperCase(LaRequete)=1)
Or (Pos('UPDATE',AnsiUpperCase(LaRequete)=1)
Or (Pos('DELETE',AnsiUpperCase(LaRequete)=1);
Try
UneQuery := TIbQuery.Create(Nil);
UneQuery.Database := UneDatabase;
UneQuery.Sql.Text := LaRequete;
If RequeteModif Then Begin
IBTransaction := TIBTransaction.Create(UneDatabase);
IBTransaction.DefaultDataBase := UneDatabase;
IBTransaction.Params.Text := 'read_committed'#13#10+'rec_version'#13#10+'nowait';
IBTransaction.DefaultAction := TARollback;
End;
Try
If RequeteModif Then Begin
IBTransaction.StartTransaction;
UneQuery.ExecSql;
Result := UneQuery.RowsAffected>0;
Else Begin
UneQuery.Open;
If Not UneQuery.IsEmpty Then Begin
Result := True;
While Not UneQuery.Eof Do Begin
{ Traitements éventuels sur les résultats de la requête }
{ ... }
UneQuery.Next;
End;
End;
End;
If RequeteModif Then IBTransaction.Commit;
Except
On E : Exception Do Begin
If RequeteModif Then IBTransaction.RollBack;
Raise Exception.Create('ERREUR. Exception dans le traitement de la requête, message: "'+E.Message+'", requête: "+LaRequete+'"');
End;
End;
Finally
FreeAndNil(UneQuery);
If RequeteModif Then FreeAndNil(IBTransaction);
End;
End;

Pour les requêtes paramétrées tu fais le Prepare après l'affection du Sql.Text et le UnPrepare dans le bloc Finally avant le FreeAndNil.

Voila, bonne lecture.
philauto2003 Messages postés 9 Date d'inscription vendredi 7 février 2003 Statut Membre Dernière intervention 3 octobre 2009
23 août 2006 à 17:33
Merci Qoprek pour ces quelques remarques , je suis débutant en SQL et il n'est pas facile de trouver de bons 'tuto' pour se perfectionner
qoprek Messages postés 10 Date d'inscription vendredi 18 août 2006 Statut Membre Dernière intervention 26 mars 2007
21 août 2006 à 22:06
Bonjour,

Je ne suis pas sur un poste avec Delphi pour répondre mais néanmoins un premier parcours rapide de ton code m'amène les remarques suivantes, attention je me base sur mes connaissances sur des TIbQuery et non des TAdoQuery donc peut etre me trompe-je:

With data.Query_repertoire do begin <------------- Tu peux garder ton With même pour la boucle plus bas
SQL.Clear;
SQL.ADD('select * from repertoire');
sql.Add('where nom ='+ QuotedStr(nom));
ExecSQL ; <--------- ExecSql est utile dans les requêtes modifiant la table (Insert/Update/Delete) mais pas dans des Select
Open; <---------- En plus tu fais 2 ouvertures (execsql et open)
If Not IsEmpty Then Begin <--------- Test si il y a des résultats avant de lancer ta boucle, ca évitera de faire une boucle de 10 itérations pour rien
for I:=2 to 11 do
With TEdit(FindComponent('Edit' + IntToStr(I+9))) Do Begin
if Fields.Fields[I].Value<>NULL then text:=Fields.Fields[I].Value;
End;
End;
end;

- Tu utilises une requête paramétrée pour l'insert, pense a faire un Prepare (optimisation) et un Unprepare (le Unprepare n'est pas fait automatiquement lors du Free donc il y a fuite possible de mémoire).

- Pense a encadrer ton code dans des Try Except ou Try Finally avec la fermeture des requêtes (je ne vois pas de Close des requêtes).

- Un effort de mise en forme serait le bienvenue, si tu as la flemme il existe plusieurs code beautyfier .. perso j'utilise celui de la JCL.


Voila, si cela peut t'aider.

Cdlt
JulioDelphi Messages postés 2226 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 18 novembre 2010 14
21 août 2006 à 20:41
Est-ce possible de mettre un titre plus detaillé ? Ainsi qu'une réelle explication de la source, a qui est-elle destinée, à quoi sert-elle, plus de détails encore une fois.
Merci d'avance
Rejoignez-nous