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 et SQL. Discussion :

Calcul Solde caisse à partir de deux tables


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut Calcul Solde caisse à partir de deux tables
    Bonsoir à tous!

    suis bloqué dans le développement d'une application.

    En fait, je dispose de deux tables "tblPaiments" et "tblDepenses" (qui ne sont pas liées) et j'aimerai avoir le solde progressif (journalier)
    les paiements et les dépenses doivent-ils figurés dans une même et unique table? Si oui! comment faire pour (conserver ces tables) tout en utilisant les infos des deux tables (colonnes MontantPaiement et MontantDepense) dans une unique table nommée "tblCaisse"


    Vos points de vue et conseils sont les bienvenus.

    Au plaisir de vous lire...

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Utiliser une seule table simplfierai le problème.

    Voici une structure possible :
    tblEcriture
    Clef (Numero automatique)
    NumeroEcriture (supposé numérique)
    DateEcriture
    CodeTypeEcriture (Texte : "PAIMENT", "DEPENSE")
    MontantEcriture

    La requête suivante te donne un nombre positif pour un paiement et un nombre négatif pour une dépense.

    reqEcriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select *, iif([tblEcriture].[CodeTypecriture]="PAIEMENT", +1, -1) * [tblEcriture].[MontantEcriture] as MontantEcritureSigne 
    from tblEcriture
    Le solde courant devient immédiat à calculer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqEcriture.*, dsum("MontantEcritureSigne", "reqEcriture", "[DateEcriture]<=#" & format([reqEcriture].[DateEcriture], "yyyy\-mm\-dd") & "# and [NumeroEcriture]<" [reqEcriture].[NumeroEcriture]) as Solde
    from reqEcriture
    On fait l'addition de tous les montants signés qui précédent l'écriture en court.

    On aurait sans doute pu tout faire dans une seule requête mais je trouve cela plus facile à mettre au point avec 2 requêtes.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Attention si tu as beaucoup d'écriture le calcul peut s'avérer lent.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Bonjour et merci Marot_r pour ta réponse

    vu sous cet angle et dans le meilleur des cas, la solution simplifie le problème posé ; mais tel que mentionné plus haut, je dispose de deux tables importantes:

    --> tblPaiements:
    NumPaiment (autonumber)
    NumFacture (autonumber de la tblVentes)
    DatePaiement (date/heure)
    montantPaiement (numérique)

    --> tblDepenses
    IdDepense (numauto)
    DateDepense (date/heure)
    libelleDepense (texte long)
    MontantDepense (numérique)

    la tblPaiements est une table importante.

    J'ai fait une requête regroupant les champs DateDepense, DatePaiement, MontantPaiement, MontantDepense afin de voir le résultat, et c'est pas bon dut tout.

    Comment pourrais-je utiliser les données générées par ces tables afin de calculer un solde progressif?


    Au plaisir de vous lire

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,

    Si modifier le modèle de données est impossible, il faudrait utiliser une requête UNION des 2 tables en ajoutant une colonne pour distinguer les 2 types d'opérations et trier par les dates;

    Code SQL du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DatePaiement as DateOperation, montantPaiement as MONTANT,"Paie" FROM tblPaiements
    UNION
    SELECT DateDepense as DateOperation, MontantDepense AS MONTANT,"Dep" FROM tblDepenses
    attention : Code non testé

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Bonsoir!

    merci @madefemere pour ta contribution.

    J'ai créer la reqOperation (requete union)

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DatePaiement as DateOperation, montantPaiement as MontantOperation,"RECETTE" as TypeOperation  FROM tblPaiements;
    UNION SELECT DateDepense as DateOperation, MontantDepense AS MONTANT,"DEPENSE" as TypeOperation FROM tbl_Depenses;
    et en suivant les conseils de marot_r, je crée la requête reqOperation2

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT reqOperation.DateOperation, IIf([reqOperation].[TypeOperation]="RECETTE",+1,-1)*[reqOperation].[MontantOperation] AS MontantOperationSigne, reqOperation.TypeOperation
    FROM reqOperation;


    Je bloque pour calculer le solde (j'ai une erreur)

    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqOperation2.*, dsum("MontantOperationSigne", "reqOperation2", "[DateOperation]<=#" & format([reqOperation2].[DateOperation], "yyyy/mm/dd") &"#)  as Solde
    from reqOperation2;
    Comment corriger cette erreur??

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Re-,

    et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqOperation2.*, dsum("MontantOperationSigne", "reqOperation2", "[DateOperation]<=#" & format([DateOperation], "yyyy/mm/dd") &"#)  as Solde
    from reqOperation2
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par madefemere Voir le message
    Re-,

    et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqOperation2.*, dsum("MontantOperationSigne", "reqOperation2", "[DateOperation]<=#" & format([DateOperation], "yyyy/mm/dd") &"#)  as Solde
    from reqOperation2

    Il n'est pas bon. je viens de corriger juste avant votre réponse, il ya " qui manquait à la de SomDom (Dsum)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqOperation2.*, dsum("MontantOperationSigne", "reqOperation2", "[DateOperation]<=#" & format([DateOperation], "yyyy/mm/dd") &"# ") as Solde
    from reqOperation2
    et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DateOperation	MontantOperationSigne	TypeOperation	Solde
    16/01/2018	10000	                    RECETTE	376000
    16/01/2018	16000	                    RECETTE	376000
    16/01/2018	350000	                    RECETTE	376000
    17/01/2018		                          RECETTE	376000
    20/01/2018	0	                          RECETTE	376000
    23/01/2018	-150000	                  DEPENSE	-1774000
    23/01/2018	-2000000	                  DEPENSE	-1774000

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Re-,

    Il y a 2 soucis :
    1- Nous avons oublié d'ordonner les enregistrements par date pour que la comparaison fonctionne correctement.
    2- Dans la requête requête nous n'avons pas de champ qui permet d'ordonner 2 enregistrements faits la même date : les numéros automatiques de recette et dépenses sont inutilisables parce qu'ils peuvent avoir la même valeur.

    Solutions :

    1- A partir de ta requête union, créer une nouvelle requête "R_intermediaire" avec un nouveau champ qui va mettre un ordre dans les enregistrements de la même date (un classement par montant) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT reqOperation2.DateOperation, reqOperation2.MontantOperationSigne, reqOperation2.TypeOperation, DCount("[MontantOperationSigne]","[reqOperation2]","[DateOperation]=#" & Format([DateOperation],"yyyy-mm-dd") & "# AND MontantOperationSigne<=" & [MontantOperationSigne]) AS Ordredate
    FROM reqOperation2
    ORDER BY reqOperation2.DateOperation;
    2- Et à partir de cette requête, créer ta requête définitive qui triera selon la date et le numéro d'ordre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT R_intermediaire.DateOperation, R_intermediaire.MontantOperationSigne, R_intermediaire.TypeOperation, R_intermediaire.Ordredate, DSum("[MontantOperationSigne]","[R_intermediaire]","[DateOperation]<=#" & Format([DateOperation],"yyyy-mm-dd") & "# AND [Ordredate]<=" & [Ordredate])+0 AS Solde
    FROM R_intermediaire
    ORDER BY R_intermediaire.DateOperation, R_intermediaire.Ordredate;
    Regardes ce sujet qui est très intéressant sur le traitement des classements : https://www.developpez.net/forums/d1...e-rang-access/

    Cordialement.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Il est vrai que ajouter un numéro de rang est une méthode mais elle est couteuse en calcul.
    Il faut compter les enregistrements pour chacun des enregistrements.

    Au lieu du rang, pourquoi ne pas concatener le numéro automatique et le type. Cela permettra de distinguer les dépenses des paiments d'une même date.
    On gagne aussi une requête et les calculs associés. L'information étant disponible dans le même enregistrement.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Bonsoir à vous!

    Désolé pour ce silence.


    medefemere , Marot_t merci pour vos nombreux conseils.

    @medefemere en adoptant ton chemin, j'ai les résultats suivants:

    reqIntermediaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT reqOperation2.DateOperation, reqOperation2.MontantOperationSigne, reqOperation2.TypeOperation, DCount("[MontantOperationSigne]","[reqOperation2]","[DateOperation]=#" & Format([DateOperation],"yyyy-mm-dd") & "# AND MontantOperationSigne<=" & [MontantOperationSigne]) AS Ordredate
    FROM reqOperation2
    ORDER BY reqOperation2.DateOperation;
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateOperation	MontantOperationSigne	TypeOperation	Ordredate
    16/01/2018	10000	                                   RECETTE	1
    16/01/2018	350000	                                   RECETTE	3
    16/01/2018	16000	                                   RECETTE	2
    23/01/2018	-150000 	                                   DEPENSE	1
    25/01/2018	-1500	                                   DEPENSE	1
    résultat de la requête reqSolde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateOperation	MontantOperationSigne	TypeOperation	Ordredate	Solde
    16/01/2018	10000	                                   RECETTE	1	10000
    16/01/2018	16000	                                   RECETTE	2	26000
    16/01/2018	350000	                                   RECETTE	3	376000
    23/01/2018	-150000	                                   DEPENSE	1	-140000
    25/01/2018	-1500	                                   DEPENSE	1	-141500
    Constat fait: la dépense du 23/01/2018 de 150.000 vient se soustraire du solde de 10.000 au lieu du solde de 376.000 et je crois qu'il y a un problème de rang.

    j'ai modifié le code :

    reqIntermediaraire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT reqOperation2.DateOperation, reqOperation2.MontantOperationSigne, reqOperation2.TypeOperation, DCount("[MontantOperationSigne]","[reqOperation2]","[DateOperation]<=#" & Format([DateOperation],"yyyy-mm-dd") & "# AND MontantOperationSigne>=" & [MontantOperationSigne]) AS Ordredate
    FROM reqOperation2
    ORDER BY reqOperation2.DateOperation;
    résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateOperation	MontantOperationSigne	TypeOperation	Ordredate
    16/01/2018	10000	                           RECETTE	3
    16/01/2018	350000	                           RECETTE	1
    16/01/2018	16000	                           RECETTE	2
    23/01/2018	-150000	                            DEPENSE	4
    25/01/2018	-1500	                           DEPENSE	4
    avec résultat de la requête reqSolde:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DateOperation	MontantOperationSigne	TypeOperation	Ordredate	   Solde
    16/01/2018	350000	                               RECETTE	      1	350000
    16/01/2018	16000	                               RECETTE	      2	366000
    16/01/2018	10000	                               RECETTE	      3	376000
    23/01/2018	-150000	                               DEPENSE	      4	226000
    25/01/2018	-1500	                               DEPENSE	      4	224500

    Je regarde le conseil de Marot_t en concatenant et revient vers vous.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2016
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Bonjour!

    Au finish, je vais utiliser la solution précédemment posté (elle me satisfait). Merci encore pour toute votre assistance (Marot_t et madefemere).

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par marot_r Voir le message
    Bonjour.

    Utiliser une seule table simplfierai le problème.

    Voici une structure possible :
    tblEcriture
    Clef (Numero automatique)
    NumeroEcriture (supposé numérique)
    DateEcriture
    CodeTypeEcriture (Texte : "PAIMENT", "DEPENSE")
    MontantEcriture

    La requête suivante te donne un nombre positif pour un paiement et un nombre négatif pour une dépense.

    reqEcriture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select *, iif([tblEcriture].[CodeTypecriture]="PAIEMENT", +1, -1) * [tblEcriture].[MontantEcriture] as MontantEcritureSigne 
    from tblEcriture
    Le solde courant devient immédiat à calculer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select reqEcriture.*, dsum("MontantEcritureSigne", "reqEcriture", "[DateEcriture]<=#" & format([reqEcriture].[DateEcriture], "yyyy\-mm\-dd") & "# and [NumeroEcriture]<" [reqEcriture].[NumeroEcriture]) as Solde
    from reqEcriture
    On fait l'addition de tous les montants signés qui précédent l'écriture en court.

    On aurait sans doute pu tout faire dans une seule requête mais je trouve cela plus facile à mettre au point avec 2 requêtes.

    A+
    Bonjour monsieur svp j'ai besoin de votre aide. Ma préoccupation c'est comment traduire cette deuxième partie de votre code en Mysql? merci...

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

Discussions similaires

  1. Calculer la somme à partir de deux tables
    Par abdouel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/08/2012, 15h55
  2. Réponses: 6
    Dernier message: 26/06/2008, 03h53
  3. Réponses: 1
    Dernier message: 20/02/2008, 11h34
  4. Créer une table a partir de deux tables existantes
    Par Aguiran dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/12/2006, 08h16
  5. Requete Delete à partir de deux tables
    Par Le_Phasme dans le forum Access
    Réponses: 2
    Dernier message: 09/10/2006, 10h22

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