Java parcourir deux tableaux et mettre le resulat dant un autre tableau [Résolu]

Signaler
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020
-
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020
-
Bonjour je dois calculer les intérêts des employés par rapport en fonction du salaire de base qui varient dans le temps en même temps que taux d’intérêt.


exemple de 2002/08/21 à 2004/07/12 34% salaire base 2002/09/21 à 2005/08/12 4500
2005/08/05 à 2006/07/11 17% 2005/08/13 à 2009/09/16 4900
2009/05/23 à 2019/03/22 41% 2009/09/21 à 2019/07/12 5300
interet = (salaire base * taux * nombre-de-jours-interval)/3600

exemple taux=34% nombre-de-jours-interval =jours entre 2002/09/21 et 2005/08/12

Quelle méthode utiliser ou algorithme .Le fait que les date interval se chevauche complique tout.
Merci d'avance
A voir également:

2 réponses

Messages postés
15828
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 avril 2021
532
Bonjour

d'abord rendons ton exemple plus lisible
          Intérêts                                    salaire base 
de 2002/08/21 à 2004/07/12 > 34%             de 2002/09/21 à 2005/08/12 > 4500
de 2005/08/05 à 2006/07/11 > 17%             de 2005/08/13 à 2009/09/16 > 4900
de 2009/05/23 à 2019/03/22 > 41%             de 2009/09/21 à 2019/07/12 > 5300



Ensuite ton titre parle de 2 tableaux, comment sont il structurés?
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020

Bonjour merci pour la reponse ci dessou les deux tables interet et salaire base avec les colonnes date-debut ,date_fin , taux ///et/// start_sal , end_sal ,sal_base

table Intérêts
date-debutdate_fintaux
2002/08/212004/07/1234%
2005/08/052006/07/1117%
2009/05/232019/03/2241%


table salaire base
start_salend_salsal_base
2002/09/212005/08/124500
2005/08/132009/09/164900
2009/09/212019/07/125300


je résultat doit être une table avec les différentes étapes de l’évolution de la carrière de l’agent avec le taux qui s'applique.
J'ai essayé avec une requête sql pour joindre les deux tables mais ça ne marche pas.
excusez moi j’essaie de mettre en forme (note de modération : pour la mise en forme de tableaux voir ici)

merci encore
Messages postés
15828
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
17 avril 2021
532
Dans ton titre, tu parles de tableaux et maintenant de tables, ça n’est pas la même chose.
Il faut donc que tu confirmes et s’il s’agit bien de tables, préciser de quel sgbd elles viennent sera une aide pour celui(celle) qui saura te répondre, pas moi..
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020

Bonsoir Wismeril MERCI, il s'agit bien de deux table dans une base de donnée mysql .je veux avec du code java calculer l’intérêt en fonction du taux d’intérêt et du salaire de base qui évoluent tout deux différemment dans le temps. je vous envoie un bout de code qui récupere une table et la met dans un tableau
j'ai crée les classes Intérêt et SalaireBase
je récupère la table dans un tableau pour effectuer le calcul et afficher le résultat : un bout de code

 Class.forName("com.mysql.jdbc.Driver");
 
            
            String url = "jdbc:mysql://localhost:3306/interet_bd";
            Connection conn = DriverManager.getConnection(url, "root", "");
            Statement st = conn.createStatement();


ArrayList<Interet>  tauxinteretlist= new ArrayList<Interet>();

 ResultSet srs3 = st.executeQuery("SELECT * FROM interet");
            while (srs3.next()) {
               Taux  tauxinteret = new Taux();
               //tauxinteret.setDatedebutcotisation(datedebutcotisation);
                tauxinteret.setDatedebutcotisation(srs3.getDate("datedebut"));
               tauxinteret.setDatefincotisation(srs3.getDate("datefin"));
                tauxinteret.setTauxcotsal(srs3.getInt("taux"));
              
                tauxinteret.setTauxcotemp(srs3.getInt("tauxcotemp"));
              // 
               
                tauxinteretlist.add(tauxinteret);
            }
 
//pour recéperer un taux à l'index i et l'afficher 
 System.out.println(tauxinteretlist.get(i).getTaux());
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021
115
Bonjour,

Tu as mis ta question dans le forum Java, mais dans la mesure où tes données sont dans une table et que tu peux directement obtenir le résultat avec une requête, cela ne sert à rien d'aborder la partie Java ici, voyons donc uniquement la partie SQL :

Tu peux obtenir les différentes plages de dates qui correspondent à un salaire et un taux avec cette requête :
SELECT
  greatest(start_sal,date_debut) AS begin_date,
  least(end_sal,date_fin) AS end_date,
  sal_base,
  taux
FROM interets, salaire_base
WHERE (start_sal >= date_debut AND start_sal <= date_fin)
   OR (end_sal >= date_debut AND end_sal <= date_fin);

J'ai rajouté des couleurs aux valeurs de ton exemple pour mieux visualiser les jointures :
date_debutdate_fintaux    start_salend_salsal_base
2002-08-21 2004-07-12 0.34 2002-09-21 2005-08-12 4500
2005-08-05 2006-07-11 0.17 2005-08-13 2009-09-16 4900
2009-05-23 2019-03-22 0.41 2009-09-21 2019-07-12 5300


Le résultat de la jointure donne bien une succession de plages :
begin_dateend_datesal_basetaux
2002-09-212004-07-1245000.34
2005-08-052005-08-1245000.17
2005-08-132006-07-1149000.17
2009-05-232009-09-1649000.41
2009-09-212019-03-2253000.41


Une fois qu'on a validé ces données, il ne reste plus qu'à utiliser ta formule, avec cette requête :
SELECT SUM((sal_base * taux * (least(end_sal,date_fin) - greatest(start_sal,date_debut))) / 3600)
FROM interets, salaire_base
WHERE (start_sal >= date_debut AND start_sal <= date_fin)
   OR (end_sal >= date_debut AND end_sal <= date_fin);

Ce qui nous donne le résultat : 70921.8136

Tu peux tester les requêtes ici : http://sqlfiddle.com/#!9/51ea8b2/1
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021
115 >
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020

Bien sûr que c'est possible techniquement, mais il faudrait que tu réfléchisses d'abord "à la main" sur quel résultat tu voudrais obtenir parce que ta formule me semble incorrecte en l'état puisque l'augmentation ne prends pas en compte le nombre de jours de l'intervalle.

À propos de l'intervalle il faudrait aussi se poser la question des bornes, afin de savoir si elles sont inclues ou exclues, ce qui pourrait nécessiter de rajouter un +1 dans le nombre de jours de l'intervalle et/ou de remplacer les <= et >=par des < et > lors du calcul des plages.

Par ailleurs dans ta formule, la division par 3600 est bizarre, il faudrait expliquer le rôle de cette valeur pour vérifier qu'elle est bien utilisée, notamment dans sa version avec augmentation.

Bref, il y a encore du travail mais qui est davantage théorique que technique. Il faudrait qu'avec tes données d'exemple tu calcules pour chaque étape le résultat attendu pour qu'une fois implémenté tu puisses comparer avec le résultat obtenu et justifier le bon fonctionnement du calcul.
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020
>
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021

C'est vrai ,je vous expose le problème: il s'agit de calculer l’intérêt en fonction du( salaire de base plus les rubriques qui sont des pourcentage du salaire de base)qui est mensuel :

interet=((salbase + Σ(salbase*tauxrubrique) +augmentation)*12*taux*nbjours)/36000

Rubrique= si l'employé est expatrié le calcule prend en compte les rubriques prime de rendement et prime d'expatriation;
Si l'employé est résident le calcule prend en compte seulement le rendement
Mais tout cela selon le taux de la rubrique appliqué dans la période calculée.
36000 = 360 jours de l’année * les 100 de %
exemple taux = 40%=40/100
12= les 12 mois de l'année
si l'employé est citoyen il obtient la rubrique prime de rendement dans l'assiette du calcul en plus du salaire de base
si l'employé est est un expatrié il obtient en plus du rendement une prime d'expat

selon le table rubrique:

deb fin rubrique Origine tauxRubrique
2002/06/30 2003/06/15 rendement resident 11
2003/04/16 A nos jours rendement resident 13
2002/06/30 2003/06/15 rendement expat 11
2003/04/16 A nos jours rendement expat 13
2005/01/01 A nos jours expatriation expat 30


ce qui fait 4 tables ,je voulais joindre les tables dans une seule et faire les calculs avec du code java.Mais dans la mesure du possible s'il ya un moyen(sql) d'éviter un nombre incalculable d'imbrications dans boucles alors je prends.
Merci pour la disponibilité
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021
115 >
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020

"je voulais joindre les tables dans une seule et faire les calculs avec du code java"
Je pense que c'est effectivement la bonne idée et qu'il faut aller vers ce genre de compromis pour optimiser les bénéfices des deux technologies.
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020
>
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021

C'est exact.je vais donc utiliser les sous requêtes pour joindre les autres tables selon votre méthode.
Merci à tous
On peut donc considérer que c’est résolu
Messages postés
14
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 novembre 2020
>
Messages postés
16308
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 avril 2021

Bonjour KX j'ai posé la question sur le forum sql mais aucune reaction .Mais la piste que vous m'aviez donné est bonne.

sur sqliddle j'ai http://www.sqlfiddle.com/#!9/83d1a4/5
il y'a une partie qui n'apparit pas sur le tableau je ne sai pas pourquoi .
je vous envoie le code

je veux récupérer le résultat après la fusion de plusieurs tables le code est le suivant

creation des tables

CREATE TABLE `tauxcotisation` (
`date_debut` date NOT NULL,
`date_fin` date NOT NULL,
`tauxsal` decimal(6,3) NOT NULL,
`tauxemp` decimal(6,3) NOT NULL
);

INSERT INTO `tauxcotisation` (`date_debut`, `date_fin`, `tauxsal`, `tauxemp`) VALUES
('1961-01-01', '1966-06-30', 0.34, 0.34),
('1966-07-01', '1972-06-30', 0.15, 0.34),
('1972-07-01', '1972-09-30', 0.17, 0.34),
('1972-10-01', '1973-06-30', 0.17, 0.34),
('1973-07-01', '1980-02-29', 0.17, 0.34),
('1980-03-01', '1989-06-30', 0.17, 0.34),
('1989-07-01', '1995-12-31', 0.17, 0.34),
('1996-01-01', '2001-12-31', 0.41, 0.34),
('2002-01-01', '2010-01-01', 0.17, 0.34),
('2010-01-02', '2050-01-01', 0.17, 0.34);

CREATE TABLE `carriere` (
`matricule` varchar(20) NOT NULL,
`employeur` varchar(20) NOT NULL,
`corps` varchar(20) NOT NULL,
`grade` varchar(20) NOT NULL,
`start_sal` date NOT NULL,
`end_sal` date NOT NULL,
`sal_base` decimal(9,3) NOT NULL
);

INSERT INTO `carriere` (`matricule`, `employeur`, `corps`,`grade`, `start_sal`, `end_sal`, `sal_base`) VALUES
('994320', 'DBGT','Enseignant', 'Hierarchie A','1992-09-21', '2005-08-12', 4500),
('994320', 'CAMRAIL','Fonctionnaire', 'Hierarchie B','2005-08-13', '2009-09-16', 4900),
('994320', 'CCM','Universitaire', 'Autre','2009-09-17', '2019-07-12', 5300),
('994321', 'DBPNT','Enseignant', 'Hierarchie A','2002-09-21', '2005-08-12', 4500),
('994321', 'CAMRAIL','Fonctionnaire', 'Hierarchie B','2005-08-13', '2009-09-16', 4900),
('994322', 'DOUALPORT','Universitaire', 'Autre','2009-09-17', '2019-07-12', 5300);

CREATE TABLE `augmentation` (
`St_date` date NOT NULL,
`Ed_date` date NOT NULL,
`grade` varchar(20) NOT NULL,
`Montant` decimal(9,3) NOT NULL
);

INSERT INTO `augmentation` (`St_date`, `Ed_date`,`grade`, `Montant`) VALUES
('1991-01-21', '2002-09-20','Hierarchie A', 201),
('1991-01-21', '2002-09-20','Hierarchie A', 201),
('2002-09-21', '2006-07-11','Hierarchie A', 200),
('2006-07-12', '2019-09-22','Hierarchie A', 210),
('1991-01-21', '2002-09-20','Hierarchie B', 201),
('1991-01-21', '2002-09-20','Hierarchie B', 201),
('2002-09-21', '2006-07-11','Hierarchie B', 200),
('2006-07-12', '2019-09-22','Hierarchie B', 210),
('1991-01-21', '2002-09-20','Autre', 201),
('1991-01-21', '2002-09-20','Autre', 201),
('2002-09-21', '2006-07-11','Autre', 200),
('2006-07-12', '2019-09-22','Autre', 210)

;


CREATE TABLE `rubrique` (
`deb` date NOT NULL,
`fin` date NOT NULL,
`lblrubrique` varchar(20) NOT NULL,
`corps` varchar(20) NOT NULL,
`tauxrubrique` decimal(6,3) NOT NULL
);

INSERT INTO `rubrique` (`deb`, `fin`, `lblrubrique`, `corps`, `tauxrubrique`) VALUES
('1991-01-01','3002/01/01' ,'css', 'Fonctionnaire', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Fonctionnaire', 0.14 ),
('1991/01/01','3002/01/01' ,'css', 'Enseignant', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Enseignant', 0.14 ),
('1900/06/30', '1989/12/31', 'ie', 'Enseignant', 0.20 ),
('1990/01/01', '2003/09/30', 'ie', 'Enseignant', 0.30),
('2003/10/01', '2005/09/30', 'ie', 'Enseignant', 0.35 ),
('2005/10/01', '2006/09/30', 'ie', 'Enseignant', 0.38),
('2006/10/01', '2007/09/30', 'ie', 'Enseignant', 0.41 ),
('2007/10/01', '2008/09/30', 'ie', 'Enseignant', 0.44 ),
('2008/10/01', '2009/09/30', 'ie', 'Enseignant', 0.47 ),
('2009/10/01', '3009/10/01', 'ie', 'Enseignant', 0.50 ),
('2002/01/01','3002/01/01' ,'css', 'Universitaire', 0.20 ),
('2002/01/01','3002/01/01' , 'ir', 'Universitaire', 0.14 ),
('1900/06/30', '1989/12/31', 'ie', 'Universitaire', 0.20 ),
('1990/01/01', '2003/09/30', 'ie', 'Universitaire', 0.30 ),
('2003/10/01', '2005/09/30', 'ie', 'Universitaire', 0.35 ),
('2005/10/01', '2006/09/30', 'ie', 'Universitaire', 0.38 ),
('2006/10/01', '2007/09/30', 'ie', 'Universitaire', 0.41 ),
('2007/10/01', '2008/09/30', 'ie', 'Universitaire', 0.44 ),
('2008/10/01', '2009/09/30', 'ie', 'Universitaire', 0.47 ),
('2009/10/01', '3009/10/01', 'ie', 'Universitaire', 0.50 ),
('2005/01/01', '2020-10-09', 'irf', 'Universitaire', 1.05);


+++++++++++++++++++++++++++++++++++++++++++++++

requete pour recuperer les données de la fusion


SELECT
greatest(begin_date1,deb) AS begin_date2,
least(end_date1,fin) AS end_date2,
sal_base,
tauxsal,
tauxemp,
Montant,
lblrubrique,
corps
FROM rubrique,

((SELECT
greatest(begin_date,St_date) AS begin_date1,
least(end_date,Ed_date) AS end_date1,
sal_base,
tauxsal,
tauxemp,
grade,
Montant
FROM augmentation,
(
SELECT
greatest(start_sal,date_debut) AS begin_date,
least(end_sal,date_fin) AS end_date,
sal_base,
tauxsal,
tauxemp
FROM tauxcotisation, carriere
WHERE ((start_sal >= date_debut AND start_sal <= date_fin )
OR (end_sal >= date_debut AND end_sal <= date_fin ))
AND matricule = '994320' AND (start_sal = '1992-09-21' AND end_sal = '2005-08-12')



)as tab
WHERE ( begin_date >= St_date AND begin_date <= Ed_date)
OR ( end_date >= St_date AND end_date <= Ed_date))as tab1)

WHERE (( begin_date1 >= deb AND begin_date1 <= fin)
OR ( end_date1 >= deb AND end_date1 <= fin))
AND corps = 'Enseignant'
AND grade = 'Hierarchie A'
;


++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Probleme

Entre le 1996-01-01 et 2001-12-31 il n y'a aucune donnée.

sur sqlfiddle http://www.sqlfiddle.com/#!9/83d1a4/5
pouvez vous m'aider s'il vous plait?
Merci