Donnez vie à vos documents numériques !
 

Calcul JavaScript au niveau document

abracadabraPDF Forums PDF – Général Calcul JavaScript au niveau document

  • Ce sujet est vide.
  • Créateur
    Sujet
  • #45005
    Soupull
    Membre

    Bonjour @ tous,

    Je travaille actuellement sur un bon de commande PDF sous Acrobat X.

    J’ai une opération de calcul très basique à réaliser pour obtenir dans un champ sousTotal le produit de Qté * Prix. Jusque là rien de bien complexe allez vous me dire, le panneau Calcul peut très bien me faire cela.
    Là où cela devient plus sympa, c’est que cette opération à lieu 160 fois environ, et que ce bon de commande va devoir être produit dans environ 15 langues.
    Pour corser le tout, dans certaines version de ce bon de commande certains articles apparaitrons mais d’autres pas.

    Le masque du PDF est généré sous InDesign, et chacun de mes champs respecte une codification bien précise pour conserver à chacun un caractère unique.
    J’ai donc une structure de table [qte_y] x [prix_y] = [subTot_y]
    Ma question est donc : quelle fonction JavaScript implémenter au niveau document pour que toutes mes opérations qté x prix = subTotal se mettent à jour automatiquement ?

    J’ai tenté de mettre en variable mes champ en incrémentant leur y avec une boucle for, mais il me semble que la sélection du champ par ce biais ne fonctionne pas.

    Code:
    var i = 1;
    var prix = this.getField(« prix_ » + i);
    var qte = this.getField(« qte_ » + i);
    var subTot = this.getField(« subTot_ » + i);

    for (var i=0; i subTot.value = qte.value * prix.value;
    }
     

    Toutes les idées et pistes de réflexion seront les bienvenues !

    Merci par avance.

Affichage de 7 réponses de 1 à 7 (sur un total de 7)
  • Auteur
    Réponses
  • #57954
    Merlin
    Maître des clés

    On peut faire en décomposant le code, le calcul étant en fonction sous forme d’un script de document et les champs ne faisant que déclarer les variables et lancer la fonction.

    Dans le champ sous-total on met le script de calcul suivant :

    Code:
    var mPrix = this.getField(« PRIX.00 »);
    var mQte = this.getField(« QUANTITE.00 »);
    monCalcul();

    Et en script de document :

    Code:
    function monCalcul()
    {event.target.value = mQte.value * mPrix.value;}

    :Smiley15:

    #57955
    Soupull
    Membre

    Merci pour ta réponse Merlin.
    Malheureusement ce n’est pas tout à fait ce que je recherche. Mon premier post n’est sans doute pas assez explicatif.

    Mon but ultime est de m’affranchir de la saisie d’un script au niveau de chaque champ.
    Dans les faits, je vais avoir ~150 champs subTot et au total 2250 champs à mettre à jour puisque mon bon de commande va être traduit… :mur:

    En fait je vois à peu prêt ce que je voudrait écrire comme calcul, mais je sèche sur la notation.

    Une autre façon de poser la question pourrait être:
    comment sélectionner de façon itérative des champs avec this.getField() et les boucles for ou while ?

    ou encore:
    quelle notation utiliser pour que:

    Code:
    var maVar = x;
    var monField = this.getField(« champ_ » + maVar);

    this.getField(monField).value;

    me renvois la valeur d’un champ de formulaire nommé « champ_x »

    En fait je tourne autour du fait de pouvoir tirer avantage de la fameuse convention de dénomination des champs de formulaire.

    Merci!

    #57956
    Merlin
    Maître des clés

    Je crois que le script publié par Alex dans ce sujet devrait t’intéresser au plus haut point : http://abracadabrapdf.net/forum/index.php/topic,2578.0.html

    :Smiley01:

    #57957
    Soupull
    Membre

    Je suis tout justement en train de le décortiquer et voir comment adapter cette approche en colonne à mon approche en ligne :)
    Ca amène plein d’autre question mais je vais voir ça de prêt.

    Je lorgne aussi du côté de la fonction getNthFieldName qui pourrait peut être m’aider, mais pour l’instant elle énumère bien…mais beaucoup trop :)

    Bref investigation en cours !

    #57958
    brumbies
    Membre

    Bonsoir,

    Petite précision sur ton script :
    var i = 1;
    var prix = this.getField(« prix_ » + i);
    var qte = this.getField(« qte_ » + i);
    var subTot = this.getField(« subTot_ » + i);

    for (var i=0; i subTot.value = qte.value * prix.value;
    }

    il ne peut pas fonctionner de la sorte, car la boucle « for » n’exécute que les lignes situées entre ses accolades…
    ton script se traduit ainsi:
    tu affectes à prix la valeur prix_1; qte la valeur de qte_1 et subTot la valeur subTot_1, et avec la boucle for tu effectues 150 fois le calcul
    subTot_1 = qte_1 * prix_1

    je modifierai ton script de la sorte:

    for (var i=0; i {
    this.getField(« subTot_ » + i).value = this.getField(« prix_ » + i).value * this.getField(« qte_ » + i).value;
    }

    :Smiley01:

    #57959
    Soupull
    Membre

    Merci pour ton commentaire Brumbies. Je n’avais pas vu ton post, mais en décortiquant le code d’Alex suggéré par Merlin,je suis arrivé à obtenir un résultat satisfaisant avec le code suivant :

    Code:
    console.clear();
    masterSubTot= »aSubTot »;
    masterQty= »aQty »;
    masterPrice= »aPrix »;
    subTot=0;

    for (var i = 0; i price = this.getField(masterPrice + « . » + i).value;
    subTot = qty * price;

    this.getField(masterSubTot + « . » + i).value = subTot;
    };

    total = this.getField(« aSubTot »).value;
    this.event.value = total;

    Mes sous totaux de ligne fonctionne à l’exception de mon dernier total qui devrait afficher le résumé des mes sous totaux de ligne dans mon champ SubTotA ou SubTotB.

    En regardant dans la console j’ai une erreur persistante :
    this.getField(masterQty + « . » + i) is null
    10:Field:Calculate

    et je pense que cette erreur interrompt toute action après ma boucle for. :Euuuh:

    Je joint un fichier de test si votre coeur est à l’analyse en ce jolie vendredi matin :)

    #57960
    brumbies
    Membre

    Bonjour,

    tu es proches d’une solution opérationnelle…
    le problème vient de this.numFields que tu as placé au niveau de ta boucle for.
    this.numFields renvoi le nombre total de champs présents… soit dans ton cas 101.
    Alors que le nombre de ligne du pavé A n’est que de 12.
    => remplace this.numFields par 12 et ca devrait marcher (enfin tu n’auras plus l’alerte au niveau de la console)
    dans son exemple Alex n’effectuait le calcul de somme que sur les champs ayant la même racine de nom (Montant) d’ou l’utilsation possible de this.numFields

    ensuite pour pouvoir calculer la somme des subtot, il faut ajouter
    total = total + subTot; à l’intérieur de ta boucle for (après le calcul de subTot)
    et il faut ajouter aussi une ligne en début de script pour réinitialiser total = 0;
    ta ligne en fin de script total = this.getField(« aSubTot »).value est donc à retirer…

    :Smiley01:
    A noter que les variables masterSubTot, masterQty et masterPrice ne sont pas utiles, tu peux directement mettre leur valeur (« aSubTot », « aQty » et « aPrix ») dans les this.getField de la boucle for…

Affichage de 7 réponses de 1 à 7 (sur un total de 7)
  • Vous devez être connecté pour répondre à ce sujet.