Bonjour à tous,

J'ai un soucis pour résoudre un problème qui se pose dans les données de l'application bancaire sur la quelle je travaille.

Je vous explique le principe :

Nous proposons des services d'assurances que voici :

:Assurance Obsèques, Assurance Obsèque +, Soutra famille semestriel, Soutra famille annuel, Adhesion soutra famille

Et ces différents services d'assurance sont dans la table suivante :

CodeService Montant Description
645 5000 Assurance Obsèque
647 10000 Assurance Obsèque+
681 6000 Soutra famille semestriel
682 12000 Soutra famille annuel
683 1000 Adhesion soutra famille

Je prends des exemples de clients qui sont dans la table suivantes :

CodeClt Nom Prenoms
0001 Dupond Yannick
0002 Yacinthe Albert
0003 Le Boeuf François
0004 Kapersky Annick

les clients ont un compte qui se trouve dans une table que voici :

NumCompte Date Creation CodeClt TypeCompte Solde
11111 01/01/2013 0001 DP 6000
11112 01/05/2013 0003 DP 6000
11113 01/10/2013 0004 DP 6000


Et lorsque le client souscrit à un de ces services, ces souscriptions s'enregistrent dans la table des transactions

ID Date NumCompte Montant CodeService
1 01/02/2013 11111 5000 645
2 02/06/2013 11112 5000 645
3 01/12/13 11113 5000 645
4 01/02/2014 11111 2000 645
5 01/03/2014 11111 3000 645
6 02/06/2014 11112 4000 645
7 02/07/2014 11112 1000 645
8 01/12/14 11113 5000 645


Donc comme vous pouvez le constater, l'adhésion au service 645 est coute au client 5000 et le renouvellement se fait aussi toujours le jour d'anniversaire de la l'adhésion, mais le prélèvement du montant (5000) doit se faire automatiquement tant qu'il ya de l'argent sur le compte du client.

Or le système bancaire sur lequel nous travaillons ne prélève pas forcement les 5000 sur le compte de l'utilisateur si le solde de son compte n'atteint pas les 5000.

Exemple :

Le 18 /01/2015, Monsieur Yao AMANI décide de souscrit au service Soutra (645) et fait un dépôt initial de 100000 Francs sur son compte de dépôt.
Le 18/01/2016 Monsieur Yao AMANI a un montant de 3000 Francs sur son compte et le prélèvement automatique doit se fait pour le service au quel il a souscrit.
Alors le logiciel bancaire dans ce cas ne prélève pas automatiquement les 5000 mais prélève les 3000 francs.
Le 01/02/2016 Monsieur Yao fait un dépôt de 50000 Francs sur son compte. Alors le logiciel vient prélever les 2000 francs restant.

Le problème est qu'on me demande de faire une requête qui va le nombre de client qui on fait un renouvellement.
Or lorsque le logiciel prélève les 5000 lors du renouvellement il y a pas de problème mais lorsqu'il prélève soit 3000 et ensuite 2000 comme mentionné plus haut, là je ne sais plus comment procéder vu qu'il y aura 2 enregistrements passé à des dates de mois différents.


Voici le code que j'ai eu a écris :

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
select br.short_name 'Agence'
, da.rim_no 'Rim'
,rm.first_name +' '+rm.last_name 'Nom et Prénom(s) client ' 
, dh.acct_no 'Numero compte'
, convert (char (10),rm.birth_dt, 103)  'Date de Naissance'
, convert (char (10),dh.create_dt, 103)  'Date adhésion'
, '500 000' 'Montant Capital'
, dh.amt 'Montant Prime annuelle'
/*, dh.description 'Champ libellé'
,case 
  when dh.reversal=0 then 'Non'
  when dh.reversal=1 then 'Oui'
end ' Contrepassé'*/
from dp_history dh, dp_acct da, ad_gb_branch br, rm_acct rm
where dh.acct_no=da.acct_no
and dh.orig_branch_no=br.branch_no
and rm.rim_no=da.rim_no
and dh.tran_code in (645)
and dh.reversal=0
and dh.amt>0
and br.branch_no=140
/*<:and:dh.create_dt:1>
<:and:br.branch_no:2>
<:and:da.rim_no:3>
<:and:dh.acct_no:4>
<:and:dh.tran_code:5>*/
--and year(dh.create_dt)=2016
and dh.create_dt<'20160801'
and da.rim_no in (select da.rim_no
                    from dp_history dh, dp_acct da, ad_gb_branch br, rm_acct rm
                    where dh.acct_no=da.acct_no
                    and dh.orig_branch_no=br.branch_no
                    and rm.rim_no=da.rim_no
                    and dh.tran_code in (645)
                    and dh.reversal=0
                    and dh.amt>0
                    and br.branch_no=140
                    /*<:and:dh.create_dt:1>
                    <:and:br.branch_no:2>
                    <:and:da.rim_no:3>
                    <:and:dh.acct_no:4>
                    <:and:dh.tran_code:5>*/
                    --and year(dh.create_dt)=2014
                    and dh.create_dt between '20160801' and '20160831'
                    --and sum(dh.amt)=5000
                  )
 
order by br.short_name, rm.first_name +' '+rm.last_name

NB: les noms des colonnes de la requête sont celles de la vraie base et pour être plus compréhensible, j'ai utilisé un schéma d'exemple plus haut



Comment dois-je procéder?