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

Requêtes MySQL Discussion :

Procédures stockées avec deux paramètres de type date


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 66
    Par défaut Procédures stockées avec deux paramètres de type date
    BJR! j'ai un soucis avec ma procédure stockée.
    voici ma procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DELIMITER |
    CREATE PROCEDURE pcd_cumlan (IN filtreDate Date, IN dat Date)
    BEGIN
    	SELECT M.mvt_id, M.mvt_date, COALESCE( R.cr_ref, D.cD_ref ) AS reference, COALESCE( R.cr_motif, D.cD_motif ) AS motif, COALESCE( R.cr_montant, 0 ) AS recette, COALESCE( D.cd_montant, 0 ) AS depense, @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
    FROM Mouvement M
    CROSS JOIN (SELECT @cumul :=0)tmp
    LEFT JOIN entree E ON M.mvt_id = E.mvt_id
    LEFT JOIN carnetrecette R ON E.cr_id = R.cr_id
    LEFT JOIN sortie S ON M.mvt_id = S.mvt_id
    LEFT JOIN carnetdepense D ON S.cd_id = D.cd_id
    WHERE mvt_date BETWEEN filtreDate AND dat;
    END;
    Quand je l’exécute, elle me donne une seul ligne comme résultat or elle devait me donné 5 lignes comme résultats.
    Quelqu'un pourrait til maidé avec ma procedure stockéé SVP

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut al-faddi.

    Je n'ai fait que mettre en forme ta procédure stockée. J'ai ni testé la procédure, ni testé la requête.
    Il faut faire un "cursor" dans ta procédure pour gérer correctement le résultats de ta requête.

    Si j'avais eu les tables, un jeu d'essai complet, et le résultat que tu attends, j'aurai pu faire plus !
    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
     
    drop procedure if exists `pcd_cumlan`;
     
    DELIMITER $$
    CREATE PROCEDURE pcd_cumlan (
      IN filtreDate Date,
      IN dat        Date
    )
    DETERMINISTIC
    NO SQL
    BEGIN
    DECLARE _id    integer unsigned;
    DECLARE _date  date;
    DECLARE _ref   varchar(255);
    DECLARE _mot   varchar(255);
    DECLARE _rec   decimal(15,2);
    DECLARE _dep   decimal(15,2);
    DECLARE _cum   decimal(15,2);
     
    DECLARE _fin   INTEGER  DEFAULT 1;
    DECLARE _tab   CURSOR FOR
    	SELECT M.mvt_id,
               M.mvt_date,
               COALESCE( R.cr_ref, D.cD_ref )     AS reference,
               COALESCE( R.cr_motif, D.cD_motif ) AS motif,
               COALESCE( R.cr_montant, 0 )        AS recette,
               COALESCE( D.cd_montant, 0 )        AS depense,
               @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
        FROM Mouvement M
        CROSS JOIN (SELECT @cumul :=0) as tmp
        LEFT  JOIN entree E        ON M.mvt_id = E.mvt_id
        LEFT  JOIN carnetrecette R ON E.cr_id  = R.cr_id
        LEFT  JOIN sortie S        ON M.mvt_id = S.mvt_id
        LEFT  JOIN carnetdepense D ON S.cd_id  = D.cd_id
        WHERE mvt_date BETWEEN filtreDate AND dat;
     
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    -- ===================================================================
     
    OPEN _tab;
    FETCH _tab INTO _id, _date, _ref, _mot, _rec, _dep, _cum;
     
    WHILE (_fin)
    DO
      select _id    as mvt_id,
             _date  as date,
             _ref   as reference,
             _mot   as motif,
             _rec   as recette,
             _dep   as depense,
             _cum   as cumul;
     
      FETCH _tab INTO _id, _date, _ref, _mot, _rec, _dep, _cum;
    END WHILE;
     
    CLOSE _tab;
    END$$
    DELIMITER ;
    @+

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 66
    Par défaut
    Merci Artemus24.
    voici la base
    Fichiers attachés Fichiers attachés

  4. #4
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut al-faddi.

    J'ai récupéré ta base de données, et j'ai fait quelques tests.
    Hormis le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CROSS JOIN (SELECT @cumul :=0)tmp
    qui me dérange dans la forme d'écriture que tu utilises, je n'ai rien trouvé qui pourrait expliquer pourquoi ta procédure ne fonctionne pas.

    J'ai rajouté le tri sur la date. J'ai repris ta procédure, ainsi que la requête hors procédure. Et j'ai ajouté ma procédure.Voici ce que j'obtiens :
    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    --------------
    drop procedure if exists test_cumlan
    --------------
     
    --------------
    CREATE PROCEDURE test_cumlan (IN filtreDate Date,
                                  IN dat        Date)
    BEGIN
    SELECT M.mvt_id,
           M.mvt_date,
           COALESCE( R.cr_ref,     D.cD_ref   ) AS reference,
           COALESCE( R.cr_motif,   D.cD_motif ) AS motif,
           COALESCE( R.cr_montant, 0 )          AS recette,
           COALESCE( D.cd_montant, 0 )          AS depense,
           @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
    FROM       mouvement     M
    LEFT  JOIN entree        E ON M.mvt_id = E.mvt_id
    LEFT  JOIN carnetrecette R ON E.cr_id  = R.cr_id
    LEFT  JOIN sortie        S ON M.mvt_id = S.mvt_id
    LEFT  JOIN carnetdepense D ON S.cd_id  = D.cd_id,
    (SELECT @cumul := 0) tmp
    WHERE mvt_date BETWEEN filtreDate AND dat
    ORDER BY M.mvt_date
    ;
    END
    --------------
     
    --------------
    call test_cumlan ('2015-11-20', '2015-11-26')
    --------------
     
    +--------+------------+-----------+--------+---------+---------+---------+
    | mvt_id | mvt_date   | reference | motif  | recette | depense | cumul   |
    +--------+------------+-----------+--------+---------+---------+---------+
    |      5 | 2015-11-20 | 2356      | hhjvjh |  280000 |       0 |  280000 |
    |      6 | 2015-11-24 | 1523      | cfhjvj |       0 |  100000 |  180000 |
    |      7 | 2015-11-25 | 1010      | fhjgfj |       0 |  300000 | -120000 |
    |      8 | 2015-11-25 | 1013      | jkgjkg |  500000 |       0 |  380000 |
    |     13 | 2015-11-26 | 2356      | hhjvjh |  280000 |       0 |  660000 |
    +--------+------------+-----------+--------+---------+---------+---------+
    --------------
    SELECT M.mvt_id,
           M.mvt_date,
           COALESCE( R.cr_ref,     D.cD_ref   ) AS reference,
           COALESCE( R.cr_motif,   D.cD_motif ) AS motif,
           COALESCE( R.cr_montant, 0 )          AS recette,
           COALESCE( D.cd_montant, 0 )          AS depense,
           @cumul := @cumul + COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) AS cumul
    FROM       mouvement     M
    LEFT  JOIN entree        E ON M.mvt_id = E.mvt_id
    LEFT  JOIN carnetrecette R ON E.cr_id  = R.cr_id
    LEFT  JOIN sortie        S ON M.mvt_id = S.mvt_id
    LEFT  JOIN carnetdepense D ON S.cd_id  = D.cd_id,
    (SELECT @cumul := 0) tmp
    WHERE mvt_date BETWEEN '2015-11-20' AND '2015-11-26'
    ORDER BY M.mvt_date
    --------------
     
    +--------+------------+-----------+--------+---------+---------+---------+
    | mvt_id | mvt_date   | reference | motif  | recette | depense | cumul   |
    +--------+------------+-----------+--------+---------+---------+---------+
    |      5 | 2015-11-20 | 2356      | hhjvjh |  280000 |       0 |  280000 |
    |      6 | 2015-11-24 | 1523      | cfhjvj |       0 |  100000 |  180000 |
    |      7 | 2015-11-25 | 1010      | fhjgfj |       0 |  300000 | -120000 |
    |      8 | 2015-11-25 | 1013      | jkgjkg |  500000 |       0 |  380000 |
    |     13 | 2015-11-26 | 2356      | hhjvjh |  280000 |       0 |  660000 |
    +--------+------------+-----------+--------+---------+---------+---------+
    --------------
    drop procedure if exists test_cumlan2
    --------------
     
    --------------
    CREATE PROCEDURE test_cumlan2 (
      IN filtreDate Date,
      IN dat        Date
    )
    DETERMINISTIC
    NO SQL
    BEGIN
    DECLARE _id    integer unsigned;
    DECLARE _date  date;
    DECLARE _ref   varchar(255);
    DECLARE _mot   varchar(255);
    DECLARE _rec   decimal(15,2);
    DECLARE _dep   decimal(15,2);
    DECLARE _cum   decimal(15,2);
     
    DECLARE _fin   INTEGER  DEFAULT 1;
    DECLARE _tab   CURSOR FOR
        SELECT M.mvt_id,
               M.mvt_date,
               COALESCE( R.cr_ref,     D.cD_ref   ),
               COALESCE( R.cr_motif,   D.cD_motif ),
               COALESCE( R.cr_montant, 0 ),
               COALESCE( D.cd_montant, 0 )
        FROM       mouvement     M
        LEFT  JOIN entree        E ON M.mvt_id = E.mvt_id
        LEFT  JOIN carnetrecette R ON E.cr_id  = R.cr_id
        LEFT  JOIN sortie        S ON M.mvt_id = S.mvt_id
        LEFT  JOIN carnetdepense D ON S.cd_id  = D.cd_id
        WHERE mvt_date BETWEEN filtreDate AND dat
        ORDER BY M.mvt_date
    ;
     
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
     
     
    SET _cum = 0;
     
    OPEN _tab;
    FETCH _tab INTO _id, _date, _ref, _mot, _rec, _dep;
     
    WHILE (_fin)
    DO
      SET _cum = _cum + _rec - _dep;
     
      select _id    as mvt_id,
             _date  as date,
             _ref   as reference,
             _mot   as motif,
             _rec   as recette,
             _dep   as depense,
             _cum   as cumul;
     
      FETCH _tab INTO _id, _date, _ref, _mot, _rec, _dep;
    END WHILE;
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    call test_cumlan2 ('2015-11-20', '2015-11-26')
    --------------
     
    +--------+------------+-----------+--------+-----------+---------+-----------+
    | mvt_id | date       | reference | motif  | recette   | depense | cumul     |
    +--------+------------+-----------+--------+-----------+---------+-----------+
    |      5 | 2015-11-20 | 2356      | hhjvjh | 280000.00 |    0.00 | 280000.00 |
    +--------+------------+-----------+--------+-----------+---------+-----------+
    +--------+------------+-----------+--------+---------+-----------+-----------+
    | mvt_id | date       | reference | motif  | recette | depense   | cumul     |
    +--------+------------+-----------+--------+---------+-----------+-----------+
    |      6 | 2015-11-24 | 1523      | cfhjvj |    0.00 | 100000.00 | 180000.00 |
    +--------+------------+-----------+--------+---------+-----------+-----------+
    +--------+------------+-----------+--------+---------+-----------+------------+
    | mvt_id | date       | reference | motif  | recette | depense   | cumul      |
    +--------+------------+-----------+--------+---------+-----------+------------+
    |      7 | 2015-11-25 | 1010      | fhjgfj |    0.00 | 300000.00 | -120000.00 |
    +--------+------------+-----------+--------+---------+-----------+------------+
    +--------+------------+-----------+--------+-----------+---------+-----------+
    | mvt_id | date       | reference | motif  | recette   | depense | cumul     |
    +--------+------------+-----------+--------+-----------+---------+-----------+
    |      8 | 2015-11-25 | 1013      | jkgjkg | 500000.00 |    0.00 | 380000.00 |
    +--------+------------+-----------+--------+-----------+---------+-----------+
    +--------+------------+-----------+--------+-----------+---------+-----------+
    | mvt_id | date       | reference | motif  | recette   | depense | cumul     |
    +--------+------------+-----------+--------+-----------+---------+-----------+
    |     13 | 2015-11-26 | 2356      | hhjvjh | 280000.00 |    0.00 | 660000.00 |
    +--------+------------+-----------+--------+-----------+---------+-----------+
     
    Appuyez sur une touche pour continuer...
    J'obtiens toujours le même résultat !
    Dans la seconde procédure, j'ai mis un select pour afficher les résultats.
    Ne sachant pas trop ce que tu veux exactement faire avec ta procédure, il met difficile de poursuivre dans son perfectionnement.

    Si tu veux présenter ton résultat sous forme d'un tableau, la requête suffit largement.
    Si tu veux insérer chaque ligne dans un tableau, le mieux est d'utiliser ma procédure, en remplaçant le select par un insert.

    @+

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 66
    Par défaut
    Bonjour Artemus24.
    quand j'execute la procedure j'ai une erreur à la ligne 16 qui pouinte sur le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT @cumul := 0) tmp
    et voici l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 16

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut Al-faddi.

    N'aurais-tu pas oublié la virgule à la fin de la ligne précédente ?
    Regarde mon code pour voir comment j'ai fait.

    @+

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/02/2010, 12h47
  2. Faire une procédure stockée avec deux tables
    Par mister3957 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2006, 13h54
  3. Procédure stockée avec deux paramètres ADO/ORACLE
    Par zanifu dans le forum Bases de données
    Réponses: 7
    Dernier message: 01/03/2006, 09h13
  4. Procédure stocké avec un ORDER BY paramétrable
    Par Erakis dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 10/11/2005, 14h12
  5. Procédure stockée avec serveur lié et paramètres
    Par AITOZ dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2005, 17h51

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