IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

delphi requête mysql


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut delphi requête mysql
    je voudrais un conseil voilà mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    lst := TStringList.Create;
     
       if eIdentite.Text <> '' then
        lst.Add('p.identite =' + eIdentite.Text);
     
      if eRefSib.Text <> '' then
        lst.add('c.refsib=' + eRefSib.Text);
     
      if (eIdentite.Text = '') and (eRefsib.Text = '') then
        lst.Add('c.d_refsib between '+quotedstr(sDate)+' and '+quotedstr(sDate1));
     
      with qAud do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT c.idcorresp,c.refsib,c.d_refsib,p.idpostulant,p.idcorresp, '
            +'p.identite,p.typebadge,CONCAT(p.nom,'+quotedstr( ', ')+', p.prenom) AS NomComplet '
            +' FROM corresp c INNER JOIN postulant p ON (c.idcorresp = p.idcorresp) ');
        if lst.Count > 0 then
          SQL.Add(' where');
        for i := 0 to lst.Count -1 do
        begin
          sChamp := lst.Names[i];
          sValue := lst.Values[sChamp];
          SQL.Add(sChamp+  ' LIKE ' + QuotedStr('%' + sValue + '%'));
          if i <> lst.count -1 then
            SQL.Add('And');
        end;
        SQL.Add(' order BY c.d_refsce, p.identite');
        SQL.SaveToFile('Marequetetest.txt');
        Open;
      end;
    j'arrive pas à injecter la condiction sur les dates dans la requête
    Pour commenter ce code je dirais que c'est une procédure de reherche multicritère
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  2. #2
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Essaie ce code je ne sais pas la version de SQL mais tu doit penser pour convertir le texte vers utf8
    Ajouter cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    function MySqlDate(const DateStr:String;StrFmt:string='DD/MM/YYYY'):String;
    var
      LDate : TDateTime;
      sortie : string;
      f:TFormatSettings ;
    begin
     //MySql datetime{YYYY-MM-DD hh:mm:ss}
     //date   'yyyy-mm-dd '
     //datetime 'yyyy-mm-dd hh:nn:ss'
     f.TwoDigitYearCenturyWindow:=TwoDigitYearCenturyWindow;
     f.ShortDateFormat:= StrFmt ;
     f.DateSeparator:='/';
     DateTimeToString(Result, 'YYYY-MM-DD',StrToDate(DateStr,f));
     
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    lst := TStringList.Create;
      with qAud do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT c.idcorresp,c.refsib,c.d_refsib,p.idpostulant,p.idcorresp, '
            +'p.identite,p.typebadge,CONCAT(p.nom,'+quotedstr( ', ')+', p.prenom) AS NomComplet '
            +' FROM corresp c INNER JOIN postulant p ON (c.idcorresp = p.idcorresp) ');
     
        SQL.Add(' WHERE ');
      if eIdentite.Text <> '' then
        SQL.Add(' p.identite LIKE '+QuotedStr('%'+eIdentite.Text+'%'));
     
      if eRefSib.Text <> '' then
        SQL.Add(' AND c.refsib  LIKE '+QuotedStr('%'+ eIdentite.Text+'%'));
     
      if (eIdentite.Text = '') and (eRefsib.Text = '') then
        SQL.Add('c.d_refsib BETWEEN '+QuotedStr(MySqlDate(sDate))+' AND '+
             QuotedStr(MySqlDate(sDate1)));
     
       SQL.Add(' ORDER BY c.d_refsce, p.identite');
      SQL.SaveToFile('Marequetetest.txt');
        Open;
      end;

  3. #3
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    je n'ai pas de problème de conversion de date mais seulement lors de la construction de la requête la condition qui ne se fait pas correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (eIdentite.Text = '') and (eRefsib.Text = '') then
        lst.Add('c.d_refsib between '+quotedstr(sDate)+' and '+quotedstr(sDate1));
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

  4. #4
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Le champs c.d_refsib doit avoir le format correcte de date de MySql

  5. #5
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    Ce que je fais dans un cas comme ça :

    Je lance l'appli en mode debug avec un point d'arrêt juste avant d'exécuter la requête. Je récupère (par un copier/coller) la string de ma requête (dans ton cas SQL.text), puis je la teste en direct avec un client MySql.

    Je la corrige dans le client jusqu'à ce qu'elle fonctionne, et ensuite je la compare à ce que j'avais dans le SQL.text et je n'ai plus qu'à corriger mon code en fonction des différences...

    Voili voilou !

  6. #6
    Membre régulier
    Homme Profil pro
    Chef de projet
    Inscrit en
    Juin 2004
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 101
    Points : 122
    Points
    122
    Par défaut
    En regardant de plus près ton code, je pense que le problème vient de ta façon d'accéder à ta StringList LST par les propriété NAMES et VALUES.
    L'utilisation de ces propriétés est liée à la propriété NameValueSeparator qui définit le caractère qui va séparer le nom de la valeur. Par défaut, ce caractère est le "=".
    Mais dans ton code, au moment ou tu ajoute les dates dans ta stringlist, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lst.Add('c.d_refsib between '+quotedstr(sDate)+' and '+quotedstr(sDate1));
    Et là, si tu accèdes à cette ligne avec les propriétés NAMES et VALUES, je ne sais pas ce que Delphi peut te retourner, mais c'est très ambigu...

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Je la corrige dans le client jusqu'à ce qu'elle fonctionne, et ensuite je la compare à ce que j'avais dans le SQL.text et je n'ai plus qu'à corriger mon code en fonction des différences
    C’est ma démarche aussi
    Bonjour je ne sais pas si le problème est réglé mais mon code fonctionne j'avais testé avant de le poster peu être que colfire_dev n'a pas aperçu les modifications que j'ai apporté sur son code c'est utilisation du TStringlist qui complique les chose et d'ailleurs il n'est pas bon pour insérer directement le texte des edits sans aucune validation dans le SQL c'est trop risqué pour la sécurité et l'intégrité de base le QuotedStr ne protège pas contre les antislashs.

  8. #8
    Membre habitué Avatar de colfire_dev
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Novembre 2007
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Directeur des systèmes d'information

    Informations forums :
    Inscription : Novembre 2007
    Messages : 244
    Points : 195
    Points
    195
    Par défaut
    c'est pas encore réglé, je cherche une meilleure façon d'avoir une fenêtre de recherche multicritére intégrant date, texte, chiffres sous delphi/mysql
    A la Recherche du Parfait il faut faire et refaire
    L'homme sage apprend de ses erreurs. L'homme encore plus sage apprend des erreurs des autres.

Discussions similaires

  1. Delphi et MySQL avec ADO
    Par sylviefrfr dans le forum Bases de données
    Réponses: 8
    Dernier message: 05/12/2007, 14h15
  2. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  3. Delphi 7/ MySQL / DBExpress
    Par yvescollet dans le forum Bases de données
    Réponses: 13
    Dernier message: 16/07/2004, 23h12
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 10h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo