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

Signaler
Messages postés
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 2020
-
Messages postés
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 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

2 réponses

Messages postés
16060
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
100
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
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 2020

MERCI infiniment je crois que c'est ce qu'il me faut .Mais est il possible de l'appliquer pour trois tables.
une troisième table : Augmentation

St_dateEd_dateMontant
2002-09-212006-07-11200
2006-07-122019-03-22210


Formule : interet = (salaire base * taux * nombre-de-jours-interval)/3600 + Augmentation
Messages postés
16060
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
100 >
Messages postés
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 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
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 2020
>
Messages postés
16060
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020

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
16060
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020
100 >
Messages postés
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 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
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 2020
>
Messages postés
16060
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
19 octobre 2020

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
14878
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2020
446
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
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 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
14878
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2020
446
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
8
Date d'inscription
samedi 19 août 2006
Statut
Membre
Dernière intervention
11 octobre 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());