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 :

ParamByName et opérateur LIKE (IBQuery et IBStoredProc)


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut ParamByName et opérateur LIKE (IBQuery et IBStoredProc)
    Bonjour,
    Est il possible de passer en paramétres ( et de quelle façon ?) une chaîne de caractére du type '%A%' ou '1%' pour l'éxécution de procédure stockée ou de requête avec l'opérateur LIKE sur le serveur INTERBASE ?

    Concrétement j'ai écris une PS qui fonctionne parfaitement sous IBconsole:
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    Set Term ^;
     
    CREATE PROCEDURE MAJ_TTT_SEANCES(
      DATE_S DATE,
      IDX_SEANCE VARCHAR(5),
      IDX_MOIS VARCHAR(5) )
     
    AS DECLARE VARIABLE NB INTEGER;
    etc... etc ..
       DECLARE VARIABLE MOIS VARCHAR(12);
       DECLARE VARIABLE AN CHAR(1);
     
    BEGIN /* PROCEDURE */
     
      DELETE  FROM TTT_PROV;
     
    /*=================== INSERTION DES TRAITEMENTS MOIS ET ANNEES =======================*/
     FOR
       SELECT DISTINCT
         D1.IUPATM,
         D.DATESEANCE ,
         D1.IDXMEDIC,
         D1.POSOPPRISE,
         D1.NBPRISE,
         null AS VALIDATION,
         D1.LIEU,
         D1.MOIS,
         D1.AN
       FROM
         SEANCES D,
         TTT_PRESCR D1
       WHERE
         ((D1.MOIS LIKE :IDX_MOIS) OR (D1.AN = '1' ))
         AND(D.DATESEANCE = :DATE_S)
         AND (D1.IUPATM = D.IUPATM)
         AND (D1.DATEDEB <= D.DATESEANCE)
         AND ((D1.DATEFIN >= D.DATESEANCE) OR (D1.DATEFIN IS NULL))
         AND ((D1.LIEU = 'H') OR (D1.LIEU = 'S'))
      INTO
        :IUPATM,
        :DATESEANCE ,
        :IDXMEDIC,
        :POSOPPRISE,
        :NBPRISE,
        :VALIDATION,
        :LIEU,
        :MOIS,
        :AN
     
     DO /* FOR */
       BEGIN
         DATE_DEB_AN = CAST('01/01/'||EXTRACT(YEAR FROM :DATE_S) AS DATE);
         DATE_DEB_MOIS = CAST(EXTRACT(MONTH FROM :DATE_S)||'/01/'||EXTRACT(YEAR FROM :DATE_S) AS DATE);
         INTER_AN = (360/:NBPRISE)-1;
         INTER_MOIS = (30/:NBPRISE)-1;
         NB = :NBPRISE;
     
         WHILE (NB > 0) DO
           BEGIN /* WHILE */
             IF (:AN IS NULL) THEN
             BEGIN
               IF (DATE_DEB_MOIS + INTER_MOIS*(NB-1) <= DATESEANCE ) THEN
               BEGIN
                 INSERT INTO TTT_PROV (
               IUPATM,
               DATESEANCE,
               IDXMEDIC,
               POSOPPRISE,
               NBPRISE,
               VALIDATION,
               LIEU)
             VALUES(
               :IUPATM,
               (:DATE_DEB_MOIS + :INTER_MOIS*(:NB-1)),
               :IDXMEDIC,
               :POSOPPRISE,
               :NBPRISE,
               :VALIDATION,
               :LIEU);
               END
             END
             ELSE
             BEGIN
             IF (DATE_DEB_AN + INTER_AN*(NB-1) <= DATESEANCE ) THEN
             BEGIN
             INSERT INTO TTT_PROV (
               IUPATM,
               DATESEANCE,
               IDXMEDIC,
               POSOPPRISE,
               NBPRISE,
               VALIDATION,
               LIEU)
             VALUES(
               :IUPATM,
               (:DATE_DEB_AN + :INTER_AN*(:NB-1)),
               :IDXMEDIC,
               :POSOPPRISE,
               :NBPRISE,
               :VALIDATION,
               :LIEU);
             END
             END
               NB = NB-1;
         END /* ENDWHILE  */
     END /* FOR */
     
    etc ... etc..
    Cette PS fonctionne sans problème lorsque je l'éxécute à partir de IBConsole :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXECUTE PROCEDURE MAJ_TTT_SEANCES('01/02/2006','%1%','%A%')
    Par contre lorsque je cherche à l'exécuter à partir de DELPHI:

    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
     
    procedure TfSeances.ttt_de_seance(ds : Tdate);    // compléte les données de séance et les tables suivi et ttt
    var
       i_seance : string;
    begin   // ttt_de_seance;
       case DayOfTheWeek(ds) of  // DayOfTheWeek : Lundi =1 dimanche = 7
         1,2 : i_seance := '%1%';
         3,4 : i_seance := '%2%';
         5,6 : i_seance := '%3%';
         7   : i_seance := '%4%'; // jamais le dimanche !
       end;
       with IBSP_MAJ_TTT_SEANCES do
        begin
          Prepare;
          Try
           ParamByName('DATE_S').AsDate := ds;
           ParamByName('IDX_SEANCE').AsString := i_seance;
           ParamByName('IDX_MOIS').AsString := '''%'+CHR(MonthOf(ds)+64)+'%''';
           ExecProc;
          finally
           UnPrepare;
         end;
       end;
       dm.trIBHEMO.CommitRetaining; 
    end;
    ... rien ne se passe , pas même une erreur d'exécution !!!

    Y a t il un problème avec l'utilisation de valeurs passées en paramétre pour LIKE ?

    Merci de vos suggestions
    ... elles m'aideront à mieux démarrer un année
    ... que je vous souhaite excellente !

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Au lieu de % essai avec *, on sait jamais.

    Sous ODBC avec Access il y a se problème la.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Perso, j'aurais "résolu" les variables avant le Prepare...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Merci de vos réponses;

    Pour Malatar: les seuls "wildcards" acceptés avec LIKE sont '_' et '%' ( Réf.EmbedSQL.pdf)
    Using LIKE
    LIKE is a case-sensitive operator that tests a string value against a string containing
    wildcards, symbols that substitute for a single, variable character, or a string of variable
    characters. LIKE recognizes two wildcard symbols:
    % (percent) substitutes for a string of zero or more characters.
    _ (underscore) substitutes for a single character.
    pour qi130 ça marche pô !


  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Citation Envoyé par Papino
    Pour Malatar: les seuls "wildcards" acceptés avec LIKE sont '_' et '%' ( Réf.EmbedSQL.pdf)
    Using LIKE
    LIKE is a case-sensitive operator that tests a string value against a string containing
    wildcards, symbols that substitute for a single, variable character, or a string of variable
    characters. LIKE recognizes two wildcard symbols:
    % (percent) substitutes for a string of zero or more characters.
    _ (underscore) substitutes for a single character.
    en SQL oui, en delphi non, d'où mon explication avec le problème rencontré avec ACCESS ou il faillait que je mette dans la requete un * au lieu d'un %
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 47
    Points : 35
    Points
    35
    Par défaut
    Le problème est (mal? ) résolu:
    J'ai remplacé l'utilisation des paramétres créés dans l'EDI, par une création en cours d'exécution :
    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
     
    procedure TfSeances.ttt_de_seance(ds : Tdate);    // compléte les données de séance et les tables suivi et ttt
    var
       i_seance : string;
    begin   // ttt_de_seance;
       case DayOfTheWeek(ds) of  // DayOfTheWeek : Lundi =1 dimanche = 7
         7   : i_seance := '%4%'; // jamais le dimanche !
         1,2 : i_seance := '%1%';
         3,4 : i_seance := '%2%';
         5,6 : i_seance := '%3%';
       end;
       with IBSP_MAJ_TTT_SEANCES do
        begin
           Params.Clear;
           Params.CreateParam(ftDate, 'DATE_S', ptInput).AsDate := ds;
           Params.CreateParam(ftString, 'IDX_SEANCE', ptInput).AsString := i_seance;;
           Params.CreateParam(ftString, 'IDX_MOIS', ptInput).AsString := '%'+CHR(MonthOf(ds)+64)+'%';
           Prepare;
          Try
           IBSP_MAJ_TTT_SEANCES.ExecProc;
           dm.trIBHEMO.CommitRetaining;
          finally
           UnPrepare;
         end;
        end;
    end;  // ttt_de_seance;
    ... et tout est rentré dans l'ordre !
    Cette solution n'est apparemment pas logique, peut être se produit il une "salade" de paramétres entre deux procédures stockées ?

    Je dormirai mieux ce soir !

    Merci aux contributeurs qui se sont penchés sur mes céphalées !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] opérateur LIKE + '$_GET'
    Par matperino dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/06/2007, 12h30
  2. [VB6] Problème avec l'opérateur LIKE en SQL
    Par MGD_Software dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 22/07/2006, 14h56
  3. pb requête delete/update avec opérateur like, connexion ADO
    Par jerome666 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/02/2006, 16h47
  4. Opérateur Like
    Par clems34 dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 26/08/2005, 16h22
  5. Opérateur like
    Par Troopers dans le forum ASP
    Réponses: 3
    Dernier message: 15/09/2003, 19h19

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