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

Développement de jobs Discussion :

Division d'un montant par un nombre d'occurences ?


Sujet :

Développement de jobs

  1. #1
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut Division d'un montant par un nombre d'occurences ?
    Bonjour,

    Je sollicite votre aide :

    Ci dessous le résultat de ma requête SQL :

    montant numero_commande reference_commande Produit nb_occurence
    3740 COM20161206 REF20161206_001 Produit_A 3
    3740 COM20161206 REF20161206_001 Produit_B 3
    3740 COM20161206 REF20161206_001 Produit_C 3
    1875 COM20161206 REF20161206_002 Produit_A 2
    1875 COM20161206 REF20161206_002 Produit_B 2

    Voici ce que je cherche à obtenir. En SQL je n'ai pas trouvé comment le faire (je me suis orienté vers les fonctions fenêtrées : partition by, lead, lag)
    montant numero_commande reference_commande Produit
    1246.666 COM20161206 REF20161206_001 Produit_A
    1246.666 COM20161206 REF20161206_001 Produit_B
    1246.667 COM20161206 REF20161206_001 Produit_C
    937.5 COM20161206 REF20161206_002 Produit_A
    937.5 COM20161206 REF20161206_002 Produit_B

    Comme vous pouvez le voir le montant est global et il n'est pas au détails (non présent en bdd). Ce que je cherche à faire c'est de pouvoir l'avoir au détails.

    J'ai bien tenté de diviser directement mon montant par le nb_occurence, mais à la fin la somme ne correspond pas au montant (problème d'arrondi)

    sous éclipse j'ai bricolé un bout de code :
    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
     
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    public class div {
    	public static void main(String[] args) {
    		BigDecimal a, b;
    		BigDecimal reste, result;
     
    	        Scanner scan = new Scanner(System.in);
    		a = BigDecimal.valueOf(scan.nextInt());
    		b = BigDecimal.valueOf(scan.nextInt());
    		result = a.divide(b, 3, RoundingMode.HALF_DOWN);
    		reste = a.subtract(result);		
    		do {	
    				b = b.subtract(new BigDecimal(1));
    				result = reste.divide(b, 3, RoundingMode.HALF_DOWN);
    				System.out.println("Résulat = " + result);
    				reste = reste.subtract(result);			
    				System.out.println("reste = " + reste);
    				System.out.println("b = " + b+"\n");
     
    		} while (reste.compareTo(BigDecimal.ZERO) != 0);
    	}
    }
    j'ai essayé de transcoder ça dans un TjavaRow/TjavaFlex mais sans résultat...

    mon Job est de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TpostgresqlInput --row1-->TjavaRow--row2--> TlogRow (avec comme finalité, un tPostgresqlOuput)
    Mes connaissances en java sont assez limitées... Pouvez-vous m'aider ?

    ++

  2. #2
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    dans le tJavaRow

    tu ajoutes du code de ce genre :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         output_row.montant = input_row.montant  / input_row.nb_occurence ;
         output_row.numero_commande = input_row.numero_commande ;
         output_row.reference_commande = input_row.reference_commande ;
         output_row.Produit = input_row.Produit ;

    Dans ce cas j'ai supposé que 'montant' était défini comme double dans le schema et 'nb_occurence' comme entier.

  3. #3
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut
    Bonsoir,

    Merci pour vôtre réponse.

    C'est ce que j'avais fait au début, j'ai oublié de le préciser dans le message initial.

    Le problème de faire ceci c'est que lorsque l'on divise, pour mon exemple, 3740/3 = 1246.666666666667

    Je stocke à 3 chiffres après la virgule : donc ça va me donner : 1246.666 trois fois. La somme donnera 1246.666*3 = 3739.998 ou si je stocke à l'arrondi supérieur : 1246.667*3 = 3740.001.

    Je ne retrouve pas mon montant initial...

    Dans mon idée, je voulais faire :

    1246.666 (issu de 3740/3) pour ma première ligne
    1246.666 (issu de 3740/3) pour ma seconde ligne
    et en déduire le montant pour la dernière ligne qui serait : le montant initial (3740) - la somme de mes 2 lignes précédentes soit : 3740 - (1246.666+1246.666) = 1246.668.

    le faire en SQL je n'ai pas trouvé, et le seul moyen de le faire(ou pas) serait en Java

  4. #4
    Membre très actif Avatar de supergeoffrey
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    802
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2010
    Messages : 802
    Par défaut
    Dans un tJavaFlex
    Avec le code initial:
    Code java : 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
    class Helper {
     
    	public int pow(int x, int exp){
    		if(exp <= 0){
    			return 1;
    		}
    		return x * pow(x,exp -1);
    	}
     
    	double trunk(double toTrunk, int nbDecimal){
    		int exposant = pow(10,nbDecimal);
    		double toTrunkMultiplyExposant = toTrunk * exposant;
    		long trunkMultiplyExposant = (long) toTrunkMultiplyExposant;
    		return (double) trunkMultiplyExposant  / exposant;
    	}
     
    }
    Helper h = new Helper();
    Integer ZERO = Integer.valueOf(0);
    Integer ONE = Integer.valueOf(1);
    int nbDecimale = 3;
    java.util.HashMap<String, Integer> countReferenceCommandeMap = new java.util.HashMap<String, Integer>();

    Le code principal :
    Code java : 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
    // A Modifier  row1Struct & row1
    row1Struct input_row = row1;
    // A Modifier row2Struct & row2
    row2Struct output_row = row2;
     
    Integer countReferenceCommande = countReferenceCommandeMap.get(input_row.reference_commande);
    if(countReferenceCommande == null){
    	countReferenceCommande = ZERO;
    }
    countReferenceCommande = Integer.valueOf(countReferenceCommande.intValue() + ONE.intValue());
    countReferenceCommandeMap.put(input_row.reference_commande, countReferenceCommande);
     
    double trunk = h.trunk(input_row.montant / input_row.nb_occurence,nbDecimale);
     
    double reste = input_row.montant - trunk * input_row.nb_occurence;
    int nbIncrement = (int)( reste * h.pow(10,nbDecimale));
    if(countReferenceCommande <= nbIncrement){
    	output_row.montant = trunk + (double) 1 / h.pow(10,nbDecimale);
    }
    else{
    	output_row.montant = trunk  ;
    }

    code final :

    J'ai le résultat suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1246.667|COM20161206|REF20161206_001|Produit_A
    1246.667|COM20161206|REF20161206_001|Produit_B
    1246.666|COM20161206|REF20161206_001|Produit_C
    937.5|COM20161206|REF20161206_002|Produit_A
    937.5|COM20161206|REF20161206_002|Produit_B
    Est-ce que ça te dérange que les arrondis soient ajoutés aux premières occurrences tant que 1246.667 + 1246.667 + 1246.666 = 3740 ?

  5. #5
    Membre confirmé
    Inscrit en
    Août 2009
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 81
    Par défaut
    Bonjour supergeoffrey,

    Un grand merci, ça fonctionne. Je ne pige pas tout dans le code... je vais essayer de le mettre dans un eclipse et faire du pas à pas pour comprendre.

    Non cela ne me dérange pas que les arrondis soient ajoutés au début.

    En tout cas encore merci d'avoir pris le temps de me dépanner

    Bonne journée et bonne continuation.

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

Discussions similaires

  1. ACP inertie divisée par le nombre d'individus
    Par takout dans le forum Méthodes exploratoires
    Réponses: 0
    Dernier message: 11/02/2013, 14h53
  2. [XL-2007] Diviser toutes les cellules d'un tableau par un nombre
    Par Medde dans le forum Excel
    Réponses: 2
    Dernier message: 10/04/2010, 14h25
  3. Réponses: 2
    Dernier message: 16/03/2009, 15h06
  4. Division par un nombre
    Par Christinita dans le forum MATLAB
    Réponses: 12
    Dernier message: 03/12/2008, 09h53
  5. Diviser un champ montant par 100
    Par zilfana63 dans le forum VBA Access
    Réponses: 7
    Dernier message: 28/02/2008, 11h40

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