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 :

Récupérer la valeur de la fonction MySQL


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 117
    Points
    117
    Par défaut Récupérer la valeur de la fonction MySQL
    Bonjour,

    J'ai ma bd dans MySQL. J'ai créé une function fct_deblocagepret qui marche très bien.
    Je l'appelle ainsi dans 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
    with TADOQuery.Create(nil) do
       begin
          ConnectionString := HR.ConnectionString;
          Sql.Add('select fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
          Prepared := true;
          with Parameters do
          begin
             ParamByName('vparam1').Value := '1';
             ParamByName('vparam2').Value := '2';
             ParamByName('vparam3').Value := '2016-05-20';
          end;
          ExecSQL;
          open;
          if(Fields[1].Value ='test') then
            Prompt(mtInformation,'succès.')
          else
            Prompt(mtInformation,'pas ok.');
          Free;
       end;
    Comme je l'ai dit plus haut, tout marche sauf la ligne de recuperation de la valeur du paramètre output.
    ,
    cette ligne ne genere une erreur:

    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 166
    Points : 41 348
    Points
    41 348
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    ce select fct_deblocagepret(:vparam1,:vparam2,:vparam3) me perturbe, en général un SELECT suivi d'un ensemble de nom de champs (ou *) est suivi d'un FROM puis de la table ou de la "fonction" (je mets fonction entre guillemets pour moi il s'agit plus d'une procédure).
    Ensuite si cette "fonction" renvoi des données, ce n'est pas ExecSQL qu'il faut utiliser mais Open (et pas les deux !)

    qu'en serait-il ainsi ?
    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
    with TADOQuery.Create(nil) do
       begin
          ConnectionString := HR.ConnectionString;
          Sql.Add('select * from  fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
          Prepared := true;
          with Parameters do
          begin
             ParamByName('vparam1').Value := '1';
             ParamByName('vparam2').Value := '2';
             ParamByName('vparam3').Value := '2016-05-20';
          end;
          open;
          if(Fields[1].Value ='test') then
            Prompt(mtInformation,'succès.')
          else
            Prompt(mtInformation,'pas ok.');
          close;
          Free;
       end;

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    ce select fct_deblocagepret(:vparam1,:vparam2,:vparam3) me perturbe, en général un SELECT suivi d'un ensemble de nom de champs (ou *) est suivi d'un FROM puis de la table ou de la "fonction" (je mets fonction entre guillemets pour moi il s'agit plus d'une procédure).
    Ensuite si cette "fonction" renvoi des données, ce n'est pas ExecSQL qu'il faut utiliser mais Open (et pas les deux !)

    qu'en serait-il ainsi ?
    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
    with TADOQuery.Create(nil) do
       begin
          ConnectionString := HR.ConnectionString;
          Sql.Add('select * from  fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
          Prepared := true;
          with Parameters do
          begin
             ParamByName('vparam1').Value := '1';
             ParamByName('vparam2').Value := '2';
             ParamByName('vparam3').Value := '2016-05-20';
          end;
          open;
          if(Fields[1].Value ='test') then
            Prompt(mtInformation,'succès.')
          else
            Prompt(mtInformation,'pas ok.');
          close;
          Free;
       end;
    Bonjour,
    votre proposition ne marche pas,
    ce code ci-dessous marche bien, le seul problème c'est pour récupérer la valeur de retour de la function de MySQL. Au niveau de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(Fields[1].Value ='test') then
    qui genere une erreur de: Le projet xxx.ex a provoqué une classe d'exception ELISTError avec le message 'Indice de liste hors limites (0)'.
    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
    with TADOQuery.Create(nil) do
       begin
          ConnectionString := HR.ConnectionString;
          Sql.Add('select fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
          Prepared := true;
          with Parameters do
          begin
             ParamByName('vparam1').Value := '1';
             ParamByName('vparam2').Value := '2';
             ParamByName('vparam3').Value := '2016-05-20';
          end;
          ExecSQL;
          if(Fields[1].Value ='test') then
            Prompt(mtInformation,'ok.')
          else
            Prompt(mtInformation,'pas ok.');
          Free;
       end;

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 117
    Points
    117
    Par défaut
    Ceci semble marche.


  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    salut,

    moi j'utilise execsql pour un INSERT ou un DELETE quand il n'y a pas de valeurs a retournées, sinon un OPEN
    mais les 2 a la suite, faut pas ...

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 439
    Points : 5 858
    Points
    5 858
    Par défaut
    salut

    1°) tu cherche le champs 1 alors que l'on ne connais pas la structure de la réponse si celle-ci n'a qu'un champs tu te trouveras hors limites
    si je comprend bien tu fais un sélect sur des élément retourné par une fonction
    with TADOQuery.Create(nil) do
    begin
    ConnectionString := HR.ConnectionString;
    Sql.Add('select * from fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
    Prepared := true;
    with Parameters do
    begin
    ParamByName('vparam1').Value := '1';
    ParamByName('vparam2').Value := '2';
    ParamByName('vparam3').Value := '2016-05-20';
    end;
    open;
    if(Fields[0].Value ='test') then
    Prompt(mtInformation,'succès.')
    else
    Prompt(mtInformation,'pas ok.');
    close;
    Free;
    end;
    2°) si ta requette doit renvoyer des élément utiliser de préférence open comme le dis SergioMaster

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 266
    Points : 117
    Points
    117
    Par défaut
    Je dois récupérer une valeur de type string;

    voici un peu le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION fct_deblocagepret (vnopret varchar(15), vnocptevir varchar(15), vdtepech date)
    RETURNS text
    BEGIN

  8. #8
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 786
    Points : 5 918
    Points
    5 918
    Par défaut
    Bonjour,
    Citation Envoyé par BILANGA Voir le message
    Comme je l'ai dit plus haut, tout marche sauf la ligne de recuperation de la valeur du paramètre output.
    Au vu de votre dernier message, essayez ceci :
    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
    with TADOQuery.Create(nil) do
       begin
          ConnectionString := HR.ConnectionString;
          Sql.Add('select fct_deblocagepret(:vparam1,:vparam2,:vparam3)');
          Prepared := true;
          with Parameters do
          begin
             ParamByName('vparam1').Value := '1';
             ParamByName('vparam2').Value := '2';
             ParamByName('vparam3').Value := '2016-05-20';
          end;
          ExecSQL;
          // open; // Open pour les ensembles de données, ExecSql pour les données discrètes ou l'absence de données retournées
          // Comme dit par exyacc, l'un exclut l'autre...
         if (ParamByName('Text').Value = 'test') then  // A remplacer par le nom du paramètre de sortie, éventuellement
         // if(Fields[1].Value ='test') then // Idem remarque sur open pour Fields vis à vis de ParamByName
            Prompt(mtInformation,'succès.')
          else
            Prompt(mtInformation,'pas ok.');
          Free;
       end;
    Ceci dit, en l'occurrence, j'utiliserais plutôt le composant TADOStoredProc...

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par BILANGA Voir le message
    Je dois récupérer une valeur de type string;

    voici un peu le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE FUNCTION fct_deblocagepret (vnopret varchar(15), vnocptevir varchar(15), vdtepech date)
    RETURNS text
    BEGIN

    essayes un
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if sametext(Query.FieldByName('vnopret').AsString,'test') then
            Prompt(mtInformation,'succès.')
          else
            Prompt(mtInformation,'pas ok.');
    si c'est pas le champ 'vnopret' que tu veux lire, mets le bon ...

  10. #10
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 439
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 439
    Points : 5 858
    Points
    5 858
    Par défaut
    resalut

    comme je le dis dans mon message
    prend l'indice 0 des fields et non l'indice 1 avec l'indice 1 tu est hors limite

    tu aurais pu utiliser filedbyname si tu connais a l'avance le nom de ton champs dans ton cas il n'as pas de nom

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 356
    Points : 133
    Points
    133
    Par défaut
    ah oui merdoum, j'avais pas vu que c’était une fonction ...

Discussions similaires

  1. [sgbd] Recuperer valeurs d'un Select dans un tableau
    Par Mu_Belier dans le forum SGBD
    Réponses: 16
    Dernier message: 27/05/2005, 15h46
  2. Réponses: 10
    Dernier message: 10/05/2005, 11h35
  3. [C#] Custom Control : Recuperer valeur formulaire
    Par victorbru dans le forum ASP.NET
    Réponses: 22
    Dernier message: 21/04/2005, 09h02
  4. [STRUTS] Recuperer valeurs d'une url enrichi ?
    Par Ev3rGlide dans le forum Struts 1
    Réponses: 3
    Dernier message: 07/04/2005, 11h39
  5. [DateTimePicker]Recuperation valeur date
    Par jane2002 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 11/02/2003, 11h29

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