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 :

Solde par mois tout en gardant le solde du mois précédent


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut Solde par mois tout en gardant le solde du mois précédent
    Bonjour!
    Je voudrais faire un solde des recettes et dépenses tout en gardant le solde des mois précédent et cela en fonction de n'importe quelle mois choisi.
    Alors j'ai la vue suivante
    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
     
    create view `vue` as
          (select  M.mvt_id,
                   E.cr_id                              AS Rang,
                   date_format(M.mvt_date, "%Y-%m")     AS Periode,
                   M.mvt_date,
                   R.cr_ref                             AS Reference,
                   R.cr_motif                           AS Motif,
                   R.cr_Montant                         AS Recette,
                   0                                    AS Depense
     
             from  carnetrecette as R
     
       inner join  entree        as E
               on  E.cr_id = R.cr_id
     
       inner join  mouvement     as M
               on  M.mvt_id = E.mvt_id)
     
    union
     
          (select  M.mvt_id,
                   S.cd_id                              AS Rang,
                   date_format(M.mvt_date, "%Y-%m")     AS Periode,
                   M.mvt_date,
                   D.cd_ref                             AS Reference,
                   D.cd_motif                           AS Motif,
                   0                                    AS Recette,
                   D.cd_Montant                         AS Depense
     
             from  carnetdepense as D
     
       inner join  sortie        as S
               on  S.cd_id  = D.cd_id
     
       inner join  mouvement     as M
               on  M.mvt_id = S.mvt_id)
     
         order by  mvt_id, rang
    et a elle je saisi cette requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select    mvt_date,  reference,  motif,      recette,  depense,  cumul
        from  (  select  mvt_date,   reference,  motif,    recette,
                         depense,    @cum := @cum + recette - depense as cumul,
                         periode,    mvt_id,     rang
     
                   from  vue
             cross join  (select @cum:=0) as x
              ) as y
       where  periode between '2017-04-01' and '2017-04-30' 
    order by mvt_id, rang
    Mais j'obtiens un résultat vide pourtant j'ai des enregistrements dans le mois d'avril
    et même quand je veux avoir des données sur le mois de novembre 2015 j'obtient le même résultat vide.

  2. #2
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    J'ai pu trouver ma solution.
    Au niveau de la vue j'ai ajouter le jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    date_format(M.mvt_date, "%Y-%m-%d")     AS Periode

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut al-faddi.

    La période s'écrit au format "YYYY-MM".
    Si vous désirez récupérer le mois d'avril, vous faites alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where  periode = '2017-04'
    Juste une question ?
    Pourquoi remonter le test sur la période dans la requête alors qu'il était correcte de le mettre dans la view ?

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Bonsoir Artemus. Oui il était très correcte. Mais je me suis dis pourquoi ne pas permettre le choix de n'importe mois. Voilà pourquoi. Sinon l'autre marche à merveille.
    Et la encore j'ai un autre soucis Arthemus.
    Je voudrais faire juste la somme des recettes et dépenses mais quand l'utilisateur choisis par ex le mois de mai j'obtiens la somme du mois précédent c'est à dire le mois d'avril et affiche
    Mois ¦ solde
    04-2017 | 200 000.
    S'il choisi la période de décembre 2015 il obtiendra
    Mois | solde
    11-2015 | 100 000
    NB j'aimerais le faire avec une procédure stockée.
    Voici ce que j'ai fais.
    NB: j'ai utilisé la même vue.
    Voici ce que j'ai écris dans la requête pour la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Sélect sum (cumul)  
    From  ( select  @cum:=@cum + recette -depense  as cumul,  From vue
    Cross join (select @cum:=0) as x)  y
    Where période between  dat1 and  dat2
    And month(periode)-1

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Al_faadi.

    Voici la procédure stockée :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP TABLE IF EXISTS `travail`
    --------------
     
    --------------
    CREATE TABLE `travail`
    ( `mvt_date`   date              not null,
      `reference`  integer unsigned  not null,
      `motif`      char(10)          not null,
      `recette`    decimal(15,2)     not null,
      `depense`    decimal(15,2)     not null,
      `cumul`      decimal(15,2)     not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `cumul`
    --------------
     
    --------------
    CREATE PROCEDURE `cumul`
    (  in_date   date
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _mvt_date   date;
      DECLARE _reference  integer;
      DECLARE _motif      char(10);
      DECLARE _recette    decimal(15,2);
      DECLARE _depense    decimal(15,2);
      DECLARE _cumul      decimal(15,2);
     
      DECLARE _fin   INTEGER  DEFAULT 1;
     
      DECLARE _curs  CURSOR FOR  select  mvt_date, reference, motif, recette, depense, cumul
                        from  (  select  mvt_date, reference, motif, recette, depense, @cum := @cum + recette - depense as cumul,
                                         periode,  mvt_id,    rang
                                   from  (  (select  M.mvt_id,
                                                     E.cr_id                              AS Rang,
                                                     date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                                     M.mvt_date,
                                                     R.cr_ref                             AS Reference,
                                                     R.cr_motif                           AS Motif,
                                                     R.cr_Montant                         AS Recette,
                                                     0                                    AS Depense
     
                                               from  carnetrecette as R
     
                                         inner join  entree        as E
                                                 on  E.cr_id = R.cr_id
     
                                         inner join  mouvement     as M
                                                 on  M.mvt_id = E.mvt_id
                                             having  periode = date_format(in_date,                    "%Y-%m")
                                                 or  periode = date_format(in_date - interval 1 month, "%Y-%m"))
     
                                              union
     
                                            (select  M.mvt_id,
                                                     S.cd_id                              AS Rang,
                                                     date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                                     M.mvt_date,
                                                     D.cd_ref                             AS Reference,
                                                     D.cd_motif                           AS Motif,
                                                     0                                    AS Recette,
                                                     D.cd_Montant                         AS Depense
     
                                               from  carnetdepense as D
     
                                         inner join  sortie        as S
                                                 on  S.cd_id  = D.cd_id
     
                                         inner join  mouvement     as M
                                                 on  M.mvt_id = S.mvt_id
                                             having  periode = date_format(in_date,                    "%Y-%m")
                                                 or  periode = date_format(in_date - interval 1 month, "%Y-%m"))
     
                                           order by  mvt_id, rang) as t
     
                             cross join  (select @cum:=0) as x
                              ) as y
                       where  periode = date_format(in_date, "%Y-%m")
                    order by  mvt_id, rang;
     
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
      OPEN  _curs;
      FETCH _curs INTO _mvt_date, _reference, _motif, _recette, _depense, _cumul;
     
      WHILE (_fin)
      DO
        INSERT INTO `TRAVAIL` (`mvt_date`,`reference`,`motif`,`recette`,`depense`,`cumul`) values (_mvt_date, _reference, _motif, _recette, _depense, _cumul);
     
        FETCH _curs INTO _mvt_date, _reference, _motif, _recette, _depense, _cumul;
      END WHILE;
     
      CLOSE _curs;
    END
    --------------
     
    --------------
    call `cumul` ('2017-04-29')
    --------------
     
    --------------
    select * from travail
    --------------
     
    +------------+-----------+-------+-----------+-----------+------------+
    | mvt_date   | reference | motif | recette   | depense   | cumul      |
    +------------+-----------+-------+-----------+-----------+------------+
    | 2017-04-18 |       125 | six   | 500000.00 |      0.00 |  600000.00 |
    | 2017-04-18 |       125 | six   | 500000.00 |      0.00 | 1100000.00 |
    | 2017-04-24 |       333 | sept  |      0.00 | 300000.00 |  800000.00 |
    | 2017-04-24 |       555 | huit  | 100000.00 |      0.00 |  900000.00 |
    | 2017-04-24 |        66 | neuf  |      0.00 | 400000.00 |  500000.00 |
    | 2017-04-24 |       999 | dix   |      0.00 | 200000.00 |  300000.00 |
    +------------+-----------+-------+-----------+-----------+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Bonsoir Artemus24.
    J'obtient une erreur de syntaxe SQL en procédant ainsi
    Nom : erreurARtemus24.PNG
Affichages : 574
Taille : 48,0 Ko
    Mais serait-il possible que la procédure contienne juste le code qui exécute la vue?
    et cette fois ci elle n'affiche plus un tableau de résultat mais une seule ligne disons un seul résultat.
    A savoir :
    Si l'utilisateur sélectionne en paramètre:
    -date1: le début du mois de Février 2017
    -date2: la fin du mois de Février 2017
    il obtient le solde du mois précédent à savoir celui de Janvier.
    Juste une seule ligne qui sera la somme (dépense - recette des mois antérieures).
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Mois      ¦ solde
    01-2017 | 200 000

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut al_faadi.

    Ce que je vous ai donné précédemment, c'est l'affichage de l'exécution du script source.
    Je vous communique ci-après le script mysql, qui contient des instructions qui n'apparaissent à l'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
    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
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    use base;
     
    -- ========================
    -- Création table `travail`
    -- ========================
     
    DROP TABLE IF EXISTS `travail`;
     
    CREATE TABLE `travail`
    ( `mvt_date`   date              not null,
      `reference`  integer unsigned  not null,
      `motif`      char(10)          not null,
      `recette`    decimal(15,2)     not null,
      `depense`    decimal(15,2)     not null,
      `cumul`      decimal(15,2)     not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED;
     
    -- ============
    -- Requête N° 4
    -- ============
     
    DROP PROCEDURE IF EXISTS `cumul`;
     
    DELIMITER $$
    CREATE PROCEDURE `cumul`
    (  in_date   date
    )
    DETERMINISTIC
    NO SQL
    BEGIN
      DECLARE _mvt_date   date;
      DECLARE _reference  integer;
      DECLARE _motif      char(10);
      DECLARE _recette    decimal(15,2);
      DECLARE _depense    decimal(15,2);
      DECLARE _cumul      decimal(15,2);
     
      DECLARE _fin   INTEGER  DEFAULT 1;
     
      DECLARE _curs  CURSOR FOR  select  mvt_date, reference, motif, recette, depense, cumul
                        from  (  select  mvt_date, reference, motif, recette, depense, @cum := @cum + recette - depense as cumul,
                                         periode,  mvt_id,    rang
                                   from  (  (select  M.mvt_id,
                                                     E.cr_id                              AS Rang,
                                                     date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                                     M.mvt_date,
                                                     R.cr_ref                             AS Reference,
                                                     R.cr_motif                           AS Motif,
                                                     R.cr_Montant                         AS Recette,
                                                     0                                    AS Depense
     
                                               from  carnetrecette as R
     
                                         inner join  entree        as E
                                                 on  E.cr_id = R.cr_id
     
                                         inner join  mouvement     as M
                                                 on  M.mvt_id = E.mvt_id
                                             having  periode = date_format(in_date,                    "%Y-%m")
                                                 or  periode = date_format(in_date - interval 1 month, "%Y-%m"))
     
                                              union
     
                                            (select  M.mvt_id,
                                                     S.cd_id                              AS Rang,
                                                     date_format(M.mvt_date, "%Y-%m")     AS Periode,
                                                     M.mvt_date,
                                                     D.cd_ref                             AS Reference,
                                                     D.cd_motif                           AS Motif,
                                                     0                                    AS Recette,
                                                     D.cd_Montant                         AS Depense
     
                                               from  carnetdepense as D
     
                                         inner join  sortie        as S
                                                 on  S.cd_id  = D.cd_id
     
                                         inner join  mouvement     as M
                                                 on  M.mvt_id = S.mvt_id
                                             having  periode = date_format(in_date,                    "%Y-%m")
                                                 or  periode = date_format(in_date - interval 1 month, "%Y-%m"))
     
                                           order by  mvt_id, rang) as t
     
                             cross join  (select @cum:=0) as x
                              ) as y
                       where  periode = date_format(in_date, "%Y-%m")
                    order by  mvt_id, rang;
     
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
      OPEN  _curs;
      FETCH _curs INTO _mvt_date, _reference, _motif, _recette, _depense, _cumul;
     
      WHILE (_fin)
      DO
        INSERT INTO `TRAVAIL` (`mvt_date`,`reference`,`motif`,`recette`,`depense`,`cumul`) values (_mvt_date, _reference, _motif, _recette, _depense, _cumul);
     
        FETCH _curs INTO _mvt_date, _reference, _motif, _recette, _depense, _cumul;
      END WHILE;
     
      CLOSE _curs;
    END$$
    DELIMITER ;
     
    -- =====================
    -- Exécuter la procédure
    -- =====================
     
    call `cumul` ('2017-04-29');
     
    -- ============
    -- Requête N° 4
    -- ============
     
    select * from travail;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    SET AUTOCOMMIT = 1;
    exit
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Al_Faddi.

    Et voici la fonction. Ci-après l'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
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP FUNCTION IF EXISTS `cumul`
    --------------
     
    --------------
    CREATE FUNCTION `cumul` (in_date date) RETURNS decimal(15,2)
      DETERMINISTIC
      LANGUAGE SQL
    BEGIN
      return (select  sum(Recette) - sum(Depense)
               from  (( select  R.cr_Montant  AS Recette,
                                0             AS Depense
                          from  carnetrecette as R
                    inner join  entree        as E
                            on  E.cr_id = R.cr_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = E.mvt_id
                         where  date_format(mvt_date, "%Y-%m") = date_format(in_date, "%Y-%m"))
     
                         union
     
                      ( select  0             AS Recette,
                                D.cd_Montant  AS Depense
                          from  carnetdepense as D
                    inner join  sortie        as S
                            on  S.cd_id  = D.cd_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = S.mvt_id
                         where  date_format(mvt_date, "%Y-%m") = date_format(in_date, "%Y-%m"))
                     ) as x);
    END
    --------------
     
    --------------
    select  '2017-03-29' as date, cumul('2017-03-01') as cumul
    --------------
     
    +------------+-----------+
    | date       | cumul     |
    +------------+-----------+
    | 2017-03-29 | 100000.00 |
    +------------+-----------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    J'ai vérifié pour le mois de Mars, c'est bien +100.000,00 pour le cumul.

    Et voici le source de mon script :
    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
    SET AUTOCOMMIT = 0;
    START TRANSACTION;
     
    -- ======================
    -- Base de Données `base`
    -- ======================
     
    use base;
     
    -- ============
    -- Requête N° 7
    -- ============
     
    DROP FUNCTION IF EXISTS `cumul`;
     
    DELIMITER $$
    CREATE FUNCTION `cumul` (in_date date) RETURNS decimal(15,2)
      DETERMINISTIC
      LANGUAGE SQL
    BEGIN
      return (select  sum(Recette) - sum(Depense)
               from  (( select  R.cr_Montant  AS Recette,
                                0             AS Depense
                          from  carnetrecette as R
                    inner join  entree        as E
                            on  E.cr_id = R.cr_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = E.mvt_id
                         where  date_format(mvt_date, "%Y-%m") = date_format(in_date, "%Y-%m"))
     
                         union
     
                      ( select  0             AS Recette,
                                D.cd_Montant  AS Depense
                          from  carnetdepense as D
                    inner join  sortie        as S
                            on  S.cd_id  = D.cd_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = S.mvt_id
                         where  date_format(mvt_date, "%Y-%m") = date_format(in_date, "%Y-%m"))
                     ) as x);
    END$$
    DELIMITER ;
     
    -- ============
    -- Requête N° 8
    -- ============
     
    select  '2017-03-29' as date, cumul('2017-03-01') as cumul;
     
    -- ===
    -- Fin
    -- ===
     
    COMMIT;
    SET AUTOCOMMIT = 1;
    exit
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Merci Artemus24 mais je suis un peu perdu.
    Pouvez vous m'éclairer s'il vous plait?

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    A propos de quoi ?
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Actuellement le solde ma caisse est de 3.680.000.
    Et dans le mois de Mai j'ai fais une seule opération qui est de 2.000.000
    Normalement ce que je veux c'est d'avoir une procédure stockée qui en exécutant la vue avec les paramètres date du mois de Mai par exemple
    me donnera le solde cumulé de tous les mois passé en ne comptant pas le mois de Mai lui même.
    SI c'est le mois de Juin qui par exemple est choisi alors il fait le solde cumulé de tous les mois antérieur en ne tenant pas compte du mois de juin.

    Mais quand j’exécute votre requête je trouve 2.000.00 qui correspond a l'opération du mois de Mai

  12. #12
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut Al_faddi.

    Citation Envoyé par Al_Faddi
    serait-il possible que la procédure contienne juste le code qui exécute la vue?
    La réponse est NON et je vous ai déjà indiqué pourquoi !

    Je vous rappelle que votre problème concerne les deux points suivants :
    1) le traitement de la vue pour le mois courant et le mois précédent.
    Ce que vous me demandez est de faire un passage de paramètre à la vue et je vous ai répondu que l'on ne peut pas le faire.

    2) vous calculez le cumul de vos recettes et dépenses pour le mois courant.
    Or pour effectuer ce calcul, j'ai besoin de connaitre le mois que je dois traiter.
    De ce fait, le test de la période doit se faire dans la sélection la plus interne, et non comme vous désirez le faire à l'extérieur de la view.

    La solution que je vous ai proposé est d'utiliser dans la vue "current_date" et vous m'avez repondu que cela vous convenait parfaitement.

    Maintenant, vous modifiez votre requête en me demandant une autre façon de sélectionner la date.
    Et je vous répond encore une fois, qu'on ne peut pas paramétrer une vue et calculer en même temps le cumul du mois courant.

    comme vous désirez paramétrer votre view, le mieux est de créer une procédure stockée où en paramètre, vous passez la date du mois courant.
    Le traitement est similaire à la vue, sauf qu'il y a un paramètre à fournir.
    L'exemple que je vous ai donné correspond à votre demande (message #5 & #7).
    C'est à vous d'adapter cette procédure stockée à ce que vous désirez faire.
    Par exemple remplacer le "insert" sur la table "travail" par un update dans l'une de vos tables afinde stocker votre cumul.

    Citation Envoyé par Al_Faddi
    cette fois ci elle n'affiche plus un tableau de résultat mais une seule ligne disons un seul résultat.
    A savoir :
    Si l'utilisateur sélectionne en paramètre:
    -date1: le début du mois de Février 2017
    -date2: la fin du mois de Février 2017
    il obtient le solde du mois précédent à savoir celui de Janvier.
    Juste une seule ligne qui sera la somme (dépense - recette des mois antérieures).
    Là, c'est une autre demande et pour cela, je vous ai créé une fonction avec un exemple d'utilisation.

    Pour cette fonction, vous devez passer en paramètre la date afin de récupérer le cumul du mois.

    Je pense que vous avez tout ce qu'il vous pour terminer votre projet.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  13. #13
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Salut Atremus24.
    J'ai apporter la modification suivante a la fonction pour qu'au choix d'un mois X il affiche le solde du mois X-1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    in_date - interval 1 month
    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
     
    BEGIN
      return (select  sum(Recette) - sum(Depense)
               from  (( select  R.cr_Montant  AS Recette,
                                0             AS Depense
                          from  carnetrecette as R
                    inner join  entree        as E
                            on  E.cr_id = R.cr_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = E.mvt_id
                         where date_format(mvt_date, "%Y-%m")= date_format(in_date - interval 1 month, "%Y-%m"))
     
                         union 
     
                      ( select  0             AS Recette,
                                D.cd_Montant  AS Depense
                          from  carnetdepense as D
                    inner join  sortie        as S
                            on  S.cd_id  = D.cd_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = S.mvt_id
                         where date_format(mvt_date, "%Y-%m")= date_format(in_date - interval 1 month, "%Y-%m"))
                     ) as x);
    il me donne uniquement le solde du mois X-1 en ne tenant compte que des opérations du mois X-1 sans tenir compte du solde des mois antérieur.
    Alors j'ai essayer 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
    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
     
    BEGIN
      return (select  sum(Recette) - sum(Depense)
               from  (( select  R.cr_Montant  AS Recette,
                                0             AS Depense
                          from  carnetrecette as R
                    inner join  entree        as E
                            on  E.cr_id = R.cr_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = E.mvt_id
                         where date_format(mvt_date, "%Y-%m")= date_format(in_date - interval 1 month , "%Y-%m"))
     
                         union
     
                      ( select  0             AS Recette,
                                D.cd_Montant  AS Depense
                          from  carnetdepense as D
                    inner join  sortie        as S
                            on  S.cd_id  = D.cd_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = S.mvt_id
                         where date_format(mvt_date, "%Y-%m")= date_format(in_date - interval 1 month, "%Y-%m"))
    union 
     
    ( select  R.cr_Montant  AS Recette,
                                0             AS Depense
                          from  carnetrecette as R
                    inner join  entree        as E
                            on  E.cr_id = R.cr_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = E.mvt_id
                         where  date_format(mvt_date, "%Y-%m") = date_format(current_date, "%Y-%m"))
     
                         union
     
                      ( select  0             AS Recette,
                                D.cd_Montant  AS Depense
                          from  carnetdepense as D
                    inner join  sortie        as S
                            on  S.cd_id  = D.cd_id
     
                    inner join  mouvement     as M
                            on  M.mvt_id = S.mvt_id
                         where  date_format(current_date, "%Y-%m") = date_format(current_date, "%Y-%m"))
     
     
     
                     ) as x);
    END
    histoire de récupérer le solde du mois en cour et de le soustraire au mois demandé.
    Et la sa déraille carrément même.

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    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 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut al-faddi.

    Citation Envoyé par Al-faddi
    il me donne uniquement le solde du mois X-1 en ne tenant compte que des opérations du mois X-1 sans tenir compte du solde des mois antérieur.
    C'est ce que doit faire cette procédure stockée, fournir le solde du mois demandée.

    Votre problème repose sur l'absence du stockage du cumul de vos opérations (recettes et dépendes) dans votre table, pour chaque mois.
    Je pense que pour mieux gérer votre comptabilité, vous devriez revoir la modélisation de votre base de données.
    Comme par exemple, stocker le solde du mois, quand le mois est clôturé.
    Ainsi pour un mois donnée, la première ligne serait le report du mois précédant.
    Puis ensuite, vous faites ce que l'on nomme en bourse, un compte de liquidation.
    C'est en gros un tableau à quatre colonnes, où vous avez vos recettes et vos dépenses triées chronologiquement sur une date.
    Et pour la quatrième colonne, vous calculez le solde qui est "@cum = @cum + recette - dépense".
    A la fin du mois, vous clôturez votre mois, et ainsi vous avez un total qui sera reporté sur le mois suivant.

    Sans cette organisation, vous aurez une usine à gaz et il vous sera difficile de reconstituer la position de votre compte à une date d'arrêt.

    A partir du moment ou vous demandez le solde du mois précédent, il suffit alors de lire une seule ligne, celle contenant le solde de fin de mois.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Bonjour Artemus.
    je pense toujours à la modification de ma Bd car je l'utilise avec un langage de programmation et là bas aussi je vais devoir modifier.
    Mais en Amont j'ai pensé a 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
    22
    23
     
    SELECT v1.Periode, SUM(T1.Recette-T1.depense) as CumuleSoldeMoisPrecedent, T2.solde as profitMoisEnCours
    FROM vue as v1
     
    JOIN (
        SELECT
            Periode,
            SUM(RECETTE) as recette,
            SUM(depense) as depense
        FROM
            vue
        GROUp BY Periode
    ) as T1 on T1.Periode < v1.Periode
     
    JOIN (
        SELECT
            Periode,
            SUM(RECETTE-depense) as solde
        FROM
            vue
        GROUp BY Periode
    ) as T2 on T2.Periode = v1.Periode
    Where T2.Periode='2017-06'
    j'obtiens bien le solde du mois de Mai quand je choisis le mois de juin
    Mais quand je saisis le mois de Mai le solde du mois d'avril que j'obtiens n'est pas juste du tout.
    J'ai du loupé un truc

  16. #16
    Membre régulier
    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
    Points : 83
    Points
    83
    Par défaut
    Merci à tous.
    j'ai pu résoudre mon soucis ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT SUM( COALESCE( R.cr_montant, 0 ) - COALESCE( D.cd_montant, 0 ) ) AS solde
        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 m.mvt_date <= '2017-06';

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 28/04/2017, 09h36
  2. [AC-2007] Calcul du solde par date
    Par ulovb dans le forum IHM
    Réponses: 12
    Dernier message: 07/02/2013, 16h08
  3. [WD14] Calcul solde par une requête
    Par Aigle4 dans le forum WinDev
    Réponses: 7
    Dernier message: 05/07/2012, 20h30
  4. Réponses: 6
    Dernier message: 23/10/2006, 23h16
  5. Réponses: 1
    Dernier message: 16/02/2005, 12h04

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