Toutes mes réponses sur les forums
-
AuteurRéponses
-
bebarth
Maître des clésbonjour,
En script de format personnalisé :
if (event.value<=0) event.value="";
Pas besoin d’écrire this.event car event ne s’applique qu’au document en cours !
@+
😎bebarth
Maître des clésbonsoir,
Ne serait-ce point la même demande que ce post :@+
😎bebarth
Maître des clésbonjour,
Voici un script de calcul pour le champ “Text5” :
if (this.getField("Dropdown1").value!=0) event.value=this.getField("Text"+this.getField("Dropdown1").value).valueAsString;
else event.value="";
…et le fichier qui va avec !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésHeureusement qu’il IA encore nous !
@+
😎bebarth
Maître des clésbonjour,
Voici un exemple avec un champ pour indiquer la vitesse, et le script :
var leTemps=this.getField("ResultatKM").value/this.getField("vitesse").value;
var lesHeures=Math.floor(leTemps);
var resteHeures=leTemps-lesHeures;
var lesMinutes=Math.floor(resteHeures*60);
var lesSecondes=(resteHeures*3600-lesMinutes*60).toFixed(1);
//
if (lesHeures<10) var lesHeures="0"+lesHeures;
if (lesMinutes<10) var lesMinutes="0"+lesMinutes;
if (lesSecondes<10) var lesSecondes="0"+lesSecondes;
//
event.value=lesHeures+":"+lesMinutes+":"+lesSecondes;
Ce script est un peu développé pour une meilleure compréhension.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faudrait écrire :
if (event.value!="") event.value=event.value+" %";
@+
😎bebarth
Maître des clésbonjour,
Je t’ai fait un exemple vite fait car après je pars en vacances…
Script de calcul lorsqu’il n’y a pas beaucoup de champs (cf. premier exemple) :
if (this.getField("distance").value && this.getField("temps").value && this.getField("allureAux").value) {
var Temps=this.getField("temps").value.split(":");
var enSecondes=Number(Temps[0])*3600+Number(Temps[1])*60+Number(Temps[2]);
var regleDe3=enSecondes*this.getField("allureAux").value/this.getField("distance").value;
var lesMinutes=Math.floor(regleDe3/60);
var enSecondes=(regleDe3-lesMinutes*60).toFixed(2).toString().split(".");
var lesSecondes=enSecondes[0];
var lesCentiemes=enSecondes[1];
event.value=lesMinutes+"\'"+util.printf("%,302.0f", lesSecondes)+"\"";
if (lesCentiemes!="00") event.value+=lesCentiemes;
} else event.value="";
Vu que tu as souvent beaucoup de champs, il est préférable de mettre une fonction en script de document et de l’appeler uniquement lorsqu’un champ modifié est désactivé, ce qui évite de lancer le calcul pour tous les champs après chaque évènement (cf. second exemple).
La fonction :
function allure(laDistance,leTemps,lAllureAux) {
if (laDistance && leTemps && lAllureAux) {
var Temps=leTemps.split(":");
var enSecondes=Number(Temps[0])*3600+Number(Temps[1])*60+Number(Temps[2]);
var regleDe3=enSecondes*lAllureAux/laDistance;
var lesMinutes=Math.floor(regleDe3/60);
var enSecondes=(regleDe3-lesMinutes*60).toFixed(2).toString().split(".");
var lesSecondes=enSecondes[0];
var lesCentiemes=enSecondes[1];
this.getField("allure."+ind).value=lesMinutes+"\'"+util.printf("%,302.0f", lesSecondes)+"\"";
if (lesCentiemes!="00") this.getField("allure."+ind).value+=lesCentiemes;
} else this.getField("allure."+ind).value="";
} <code>et tu l'appelles avec :</code> var indice=event.target.name.split(".");
ind=indice[1];
allure(this.getField("distance."+ind).value,this.getField("temps."+ind).value,this.getField("allureAux."+ind).value);
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 9 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Si tu regardes le format de ton champ end.0, tu verras que ce n’est pas un nombre mais une valeur au format H:MM:ss (personnalisé).
Tu ne peux donc pas l’utiliser telle quelle dans ta boucle.@+
😎bebarth
Maître des clésJe n’ai pas étudié le fichier complètement pour savoir à quoi correspondent les différents champs, mais dans ton script :
for (var a=0 ; a<14 ; a++){
var d = this.getField("dist."+a).value;
var b = 500/d;
}
event.value= "";
var somme=Time2Num("mm:ss", this.getField("end.0").value)/b;
HM_Format()
La boucle ne sert à rien vu qu’il n’y a pas d’opération, et ton b sera donc toujours celui de l’indice 13…
Je pense que ce n’est pas ce que u souhaites !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésIl n’y a toujours pas de champs “t.”…
Et pour la boucle de la première ligne, a<=13 (et non a<17).@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Moi je n’ai pas d’erreur mais la première chose que je vois c’est qu’il n’y a pas de champs “t.” (t minuscule).@+
😎4 juillet 2023 à 18:33 en réponse à : Il y a-t-il une façon de faire un calcul plus court que ça? #73046bebarth
Maître des clésEssaye comme ça :
var laSomme=0;
for (var i=1; i<=8; i++) laSomme+=Number(this.getField("TOTAL"+i).value);
if (laSomme==0) event.value="";
else event.value=laSomme;
@+
😎Attachments:
You must be logged in to view attached files.4 juillet 2023 à 17:36 en réponse à : Il y a-t-il une façon de faire un calcul plus court que ça? #73044bebarth
Maître des clésevent.value=0;
for (var i=1; i<=8; i++) event.value+=this.getField("TOTAL"+i).value;
if (event.value==0) event.value="";
@+
😎4 juillet 2023 à 16:51 en réponse à : Il y a-t-il une façon de faire un calcul plus court que ça? #73042bebarth
Maître des clésbonjour,
Quelle est la question ?@+
😎bebarth
Maître des clésbonjour,
Il faut écrire :
if (event.target.buttonGetCaption()=="SUC") event.target.buttonSetCaption("ECH");
else if (event.target.buttonGetCaption()=="ECH") event.target.buttonSetCaption("ABD");
else if (event.target.buttonGetCaption()=="ABD") event.target.buttonSetCaption("");
else event.target.buttonSetCaption("SUC");
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,Un tel script peut aussi être exécuté par une Action (Assistant Action).
Exact ! Ou même depuis la console…
Et pour ces deux façons on n’a pas besoin d’étendre les privilèges.@+
😎bebarth
Maître des clésbonjour,
Il n’est pas possible d’enregistrer avec un script directement à partir d’un bouton.
Pour cela, il faut un script de d’application (un fichier .js que l’on place dans le répertoire JavaScript d’Acrobat).
Le script est du genre :
if (app.formsVersion>=8) {
Save_PDFA=app.trustedFunction(function(cheminFichier) {
app.beginPriv();
this.flattenPages();
this.saveAs({
cPath: cheminFichier,
cConvID: "com.callas.preflight.pdfa"
});
app.endPriv();
})
console.println("Le plugin d\'enregistrement \"Save_PDFA\" est actif.");
}
Et tu appelles le script via ton bouton avec :
event.target.display=display.hidden;
Save_PDFA("myDoc.pdf");
Ici la première ligne cache le bouton avant d’aplatir les champs (on ne peut pas supprimer le champ qui lance l’action).
Ci-joint les fichiers.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…deux petites mofifications :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!=="") lesValeurs.push();
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
for (var i=0; i<=10; i++) {
if (lesValeurs[1]==lesValeurs[0][1]) {
if (this.getField("a."+laLigne+"."+lesValeurs[0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
} else break;
}
for (var i=lesValeurs.length-1; i>=0; i--) {
if (lesValeurs[1]==lesValeurs[lesValeurs.length-1][1]) {
if (this.getField("a."+laLigne+"."+lesValeurs[0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0]).fillColor=this.getField("A."+laLigne).value=="-"?color.green:color.red;
}
}
} catch(e) {}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,J’ai testé le fichier joint, ça ne fonctionnait pas.
Tu as certainement testé le script de mon fichier avec ton fichier, car le miens fonctionne très bien… un peu long en script de calcul comme je l’ai expliqué précédemment. Si les valeurs sont entrées manuellement il vaut mieux utiliser un script de champ désactivé qui ne fera le calcul que sur la ligne.
Pour fonctionner correctement il faut supprimer tous tes autres scripts relatifs à ce calcul. Les menus déroulants doivent également afficher + ou – et ne doivent donc pas être vides.Je ne vois pas ou se trouvent les différences pour les valeurs des listes déroulantes (+ et -).
Il faut regarder les 2 lignes de ce type :
this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
@+
😎bebarth
Maître des clésDu coup, le script d’un seul champ (ici ) doit être :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!=="") lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=this.getField("A."+laLigne).value=="+"?color.green:color.red;
if (this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).value!=="") this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).fillColor=this.getField("A."+laLigne).value=="-"?color.green:color.red;
} catch(e) {}
}
A noter que j’ai ajouté l’inégalité absolu “!==” pour renir compte des éventuels 0.@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,Cela fonctionne sauf pour la selection du + ou – dans la liste déroulante, cela ne change rien, c’est toujours la valeur mini qui apparait en vert.
Les menus déroulants + ou – sont sensés faire quoi ?
@+
😎bebarth
Maître des clésbonjour,
Sur le même principe, on écrit :
for (var laLigne=1; laLigne<=34; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
if (this.getField("a."+laLigne+"."+i).value!="") lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
try {
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[lesValeurs.length-1][0]).fillColor=color.red;
} catch(e) {}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonsoir,
Dans le principe, voici un script que l’on peut placer en script de calcul d’un seul champ :
for (var laLigne=1; laLigne<=15; laLigne++) {
var lesValeurs=[];
for (var i=1; i<=10; i++) {
lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[9][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[9][0]).fillColor=color.red;
}
Ce script est exécuté après chaque évènement, ce qui risque de ralentir si il y a beaucoup d’autres calcul.
Si les valeur sont entrées manuellement pour chaque champ, il vaut mieux mettre une fonction en script de document :
function couleur() {
var ligne=event.target.name.split(".");
var laLigne=ligne[1];
var lesValeurs=[];
for (var i=1; i<=10; i++) {
lesValeurs.push([i,this.getField("a."+laLigne+"."+i).value]);
this.getField("a."+laLigne+"."+i).fillColor=["T"];
}
lesValeurs.sort(function(a,b){return a[1]-b[1]});
if (this.getField("a."+laLigne+"."+lesValeurs[0][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[0][0]).fillColor=color.green;
if (this.getField("a."+laLigne+"."+lesValeurs[9][0]).value!="") this.getField("a."+laLigne+"."+lesValeurs[9][0]).fillColor=color.red;
}
…et de l’appeler avec un script de champ désactivé :
couleur();
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En script de validation du menu déroulant tu écris :
var items=[];
for (var i=0; i<event.target.numItems; i++) items.push([event.target.getItemAt(i,false),event.target.getItemAt(i,true)]);
for (var i=0; i<items.length; i++) {
if (items[0]==event.value) {
this.getField("Text1").value=items[1];
break;
}
}
Et bien sûr tu supprimes le script de calcul du champ texte…@+
😎P.S. : En script de validation d’un menu déroulant, event.value retourne le nom de l’élément et non la valeur d’exportation.
-
Cette réponse a été modifiée le il y a 1 année et 10 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je ne suis pas certain de bien comprendre !
Lorsque l’utilisateur indique un élément, tu souhaites l’ajouter à ta liste sans pour cela modifier le contenu du champ texte.
C’est ça ???@+
😎bebarth
Maître des clésbonjour,
Je ne comprends pas ceci :… si observation rempli copié a l’identique ce qui est marqué dans la textbox …
@+
😎bebarth
Maître des clésbonjour,
C’est également possible en dessinant les aiguilles en SVG, mais alors là bon courage.
Ça me “trottait” dans la tête depuis que j’ai répondu, je me suis donc replongé sur le sujet et voici une horloge analogique !
Le design n’est peut-être pas très moderne, je verrai si je trouve “5 minutes”. 😂@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Si tu utilises mon script pour tous les champs “Total” il faut également supprimer tous les anciens scripts des champs “Heures supplémentaires”.
Il faut également revoir l’ordre de calcul des champs, et enfin placer ce script pour le champ “Total HS” :
var total=0;
for (var i=1; i<=5; i++) total+=Time2Num("hh:mm",this.getField("Champ texte5."+i).value);
event.value=calculHeures(total);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En script de calcul pour le champ “cartebl” :
if (event.value!="Off") this.getField("cartejeune").value="Off";
et pour le champ “cartejeune” :
if (event.value!="Off") this.getField("cartebl").value="Off";
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici les scripts à placer en script de document et script de calcul des champs “Total” :// Fonctions en scripts de document
function Time2Num(sFormat,sTime) {
if(sTime=="") return "";
var oTime=util.scand("mm/dd/yyyy "+sFormat,"01/01/1970 "+sTime);
var fTZOffset=oTime.getTimezoneOffset()*1000*60;
var fTime=oTime.valueOf()-fTZOffset;
return Math.round(fTime/1000);
}
function calculHeures(nbHeures) {
//if (nbHeures<0) nbHeures=(24*3600)+(fin-debut);
nbHeures=Math.round(nbHeures/60);
heures=Math.floor(nbHeures/60);
lesMinutes=((nbHeures/60)-heures)*60;
minutes=util.printf("%,302.0f",lesMinutes);
return heures+":"+minutes;
}
function affichage(ind) {
var debutJournee=this.getField("Champ texte1."+ind).value;
var pauseJournee=this.getField("Champ texte2."+ind).value;
var finJournee=this.getField("Champ texte3."+ind).value;
var heuresTheoriques=this.getField("Champ texte4."+ind).value;
if(debutJournee!="" && finJournee!="") {
var debut=Time2Num("hh:mm",debutJournee);
var pause=Time2Num("hh:mm",pauseJournee);
var fin=Time2Num("hh:mm",finJournee);
var theoriques=Time2Num("hh:mm",heuresTheoriques);
event.value=calculHeures(fin-debut-pause);
this.getField("Champ texte5."+ind).value=calculHeures(fin-debut-pause-theoriques);
} else {
event.value="";
this.getField("Champ texte5."+ind).value="";
}
}
// Script de calcul des champs "Total"
var indice=event.target.name.substr(event.target.name.indexOf(".")+1);
affichage(indice);
Dans le fichier joint, seule la première ligne est calculée avec ce script.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés👍
Juste pour info, voici comment j’aurais écrit le script :
// Fonction en script de document
function light(nSuffix) {
switch (event.changeEx) {
case "Oui":
var couleur=["RGB",0,1,0];
break;
case "Partiellement":
var couleur=["RGB",1,1,0];
break;
case "Non":
var couleur=["RGB",1,0,0];
break;
default:
var couleur=["T"];
}
this.getField("gommette."+nSuffix).fillColor=couleur;
}
// Script de touches personnalisé
if (!event.willCommit) light(event.target.name.substr(event.target.name.indexOf(".")+1));
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésPeux-tu partager un fichier ?
@+
😎bebarth
Maître des clésbonjour,
Si j’ai bien compris, tu dois appeler la fonction avec :
light(event.target.name);
N’importe quoi !!! ça va changer la couleur du menu déroulant…
Comme le dit Merlin, si tu as plusieur menus déroulants et plusieurs gommettes avec le même indice, lu appelles la fonction avec :
light(event.target.name.substr(event.target.name.indexOf(".")+1));
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 11 mois par
bebarth.
bebarth
Maître des clésbonjour,
Dans ce cas on peut simplifier un peu le script :
if (!event.willCommit) {
this.getField("gommette").fillColor=["RGB",1,1,1];
this.getField("ijaune").display=display.hidden;
this.getField("irouge").display=display.hidden;
this.getField("iverte").display=display.hidden;
this.getField("ibleu").display=display.hidden;
switch (event.changeEx) {
case "Bleu":
this.getField("gommette").fillColor=["RGB",0,0,1];
this.getField("ibleu").display=display.visible;
break;
case "Jaune":
this.getField("gommette").fillColor=["CMYK",0,0,1,0];
this.getField("ijaune").display=display.visible;
break;
case "Vert":
this.getField("gommette").fillColor=["RGB",0,1,0];
this.getField("iverte").display=display.visible;
break;
case "Rouge":
this.getField("gommette").fillColor=["RGB",1,0,0];
this.getField("irouge").display=display.visible;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…oui, mais si on écrit 35132023 cela affiche 35/13/2023 ce qui n’est pas une date !
@+
😎bebarth
Maître des clésbonjour,
Voici un script de touches personnalisé pour le menu déroulant :
if (!event.willCommit) {
switch (event.changeEx) {
case "Bleu":
var couleur=["RGB",0,0,1];
break;
case "Jaune":
var couleur=["CMYK",0,0,1,0];
break;
case "Vert":
var couleur=["RGB",0,1,0];
break;
default:
var couleur=["RGB",1,0,0];
}
this.getField("gommette").fillColor=couleur;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je n’ai pas trouvé où se trouve ce code, mais il sert à indiquer le formatage d’un champ où chaque 9 représente un chiffre de 0 à 9.
Vu que c’est un champ où il faut indiquer une date, il faudrait mieux utiliser AFDate_FormatEx(dd/mm/yyyy) qui ne permet d’indiquer qu’une date valide.@+
😎bebarth
Maître des clésbonjour,Bonjour à tous, je suis nouveau et je découvre le langage JavaScript, j’aimerais intégrer une horloge analogique…
Je pense que tu ne commences pas par le plus facile !
Est-il techniquement possible d’avoir une horloge analogique en javascript?? Si oui avez vous un exemple? Merci
Ce sera donc possible si tu utilises les outils commentaires, mais il faudra revoir le script du fichier que Merlin à partagé car il ne fonctionne pas très bien, et après avoir regardé vite-fait je ne vois pas pourquoi ! A-t-il déjà fonctionné correctement avec des version précédentes ?
C’est également possible en dessinant les aiguilles en SVG, mais alors là bon courage.
Il n’y a aucune documentation disponible pour Acrobat et le peu de personnes qui savent utiliser cette méthode ne sont pas disposées à partager leurs connaissances. Il faut dire que c’est assez compliqué… J’ai personnellement mis des mois à comprendre un peu comment ça fonctionne et vu que je n’ai pas pratiqué également depuis d’autres mois il faudrait que je me replonge dedans car biens sur toutes les commandes disponibles (en HTML par exemple) ne le sont pas avec Acrobat.
https://www.w3schools.com/graphics/svg_intro.aspSi je peux te donner un conseil, utilise une horloge numérique !!!!
@+
😎-
Cette réponse a été modifiée le il y a 1 année et 11 mois par
bebarth.
bebarth
Maître des clésbonjour,
en script de calcul du champ tu écris :
event.value=this.getField(«nonChamp»).value;
Avec des guillemets à l’anglaise…
@+
😎bebarth
Maître des clés👍
je regarderai la semaine prochaine car je n’ai qu’un téléphone cette semaine…
@+
😎bebarth
Maître des clésbonjour,
Ça fonctionne si le numéro est attribué à partir un seul fichier initial, mais si on veut établir une facture à partir de documents “fichier client” déjà existants il faudra utiliser un fichier “compteur”.@+
😎bebarth
Maître des clésbonjour,
En même temps, le script d’une horloge n’est pas très compliqué !
function affichage() {
var lesHeures=new Date().getHours();
if (lesHeures<10) var lesHeures="0"+lesHeures;
var lesMinutes=new Date().getMinutes();
if (lesMinutes<10) var lesMinutes="0"+lesMinutes;
var lesSecondes=new Date().getSeconds();
if (lesSecondes<10) var lesSecondes="0"+lesSecondes;
this.getField("horloge").value=lesHeures+":"+lesMinutes+":"+lesSecondes;
}
run=app.setInterval("affichage()",1000);
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Difficile de retrouver ce fichier sans savoir d’où il vient ! Merlin à peut-être une idée, 2004 c’était le début du forum et moi je n’y connaissais rien…
Par contre, voici un fichier de Thom Parker où tu trouveras une horloge intégrée.@+
😎PS : Voici le lien car le fichier est trop gros pour être placé sur le forum :
https://www.pdfscripting.com/public/FreeStuff/PDFSamples/JavaScriptClock.pdfCi-joint également un fichier que j’ai fait avec un chronomètre si ça peut t’aider…
-
Cette réponse a été modifiée le il y a 1 année et 11 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faut écrire :
this.getField("text1").readonly=true;
@+
😎bebarth
Maître des clésbonjour,
…avec un petit script :
if (this.getField("coche1").value=="Off") var c1=0;
else var c1=this.getField("coche1").value;
if (this.getField("coche2").value=="Off") var c2=0;
else var c2=this.getField("coche2").value;
if (c1+c2==0) event.value="";
else event.value=(c1+c2)+" €";
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
La difficulté est qu’il n’y a pas de message d’erreur retourné, juste une alerte qui indique que le format n’est pas conforme !
Je doute sur la possibilité d’effectuer ceci via JavaScript…@+
😎bebarth
Maître des clésbonjour,
En script de format personnalisé :
event.value=event.target.value.toFixed(2)+" m"
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…comme ça !
console.clear();
console.show();
var lesElements=[]
for (var i=0; i<this.numFields; i++) {
if (this.getField(this.getNthFieldName(i)).type=="combobox" || this.getField(this.getNthFieldName(i)).type=="listbox") lesElements.push(this.getNthFieldName(i));
}
if (!lesElements.length) app.alert("Il n'y a ni menu d\u00E9roulant ni zone de liste dans ce document.",3);
else {
lesElements.unshift("- S\u00E9lectionnez -");
var listeElements="var laListe \= \{";
for (var j=0; j<lesElements.length; j++) listeElements+="\""+lesElements[j]+"\": "+(-1*(j+1)).toString()+",";
var listeElements=listeElements.substring(0, listeElements.length-1);
listeElements+="\}";
eval(listeElements);
var bDialog={
DoDialog: function(){return app.execDialog(this);},
initialize: function(bDialog) {this.loadDefaults(bDialog)},
validate: function(bDialog) {
results=bDialog.store();
oRslt=bDialog.store();
var listeElements=bDialog.store()["LIST"];
testOK=1;
for (var j in listeElements) {
if (listeElements[j]>0) {
valItem=listeElements[j];
if (valItem==1) testOK=0;
}
}
var alertReturn=(testOK);
if(!alertReturn) app.alert("\nVeuillez s\u00E9lectionner un menu d\u00E9roulant.");
return alertReturn;
},
loadDefaults: function (bDialog) {
bDialog.load({LIST: laListe,});
},
description: {
name: "Dialog",
align_children: "align_top",
elements: [
{
type: "view",
align_children: "align_fill",
elements: [
{
type: "popup",
item_id: "LIST",
width: 120,
},
{
alignment: "align_right",
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==bDialog.DoDialog()) {
var nomChamp=lesElements[valItem-1];
var f=this.getField(nomChamp);
var numItems=f.numItems;
if (f.type=="combobox") var leType="Menu d\u00E9roulant";
else var leType="Zone de liste";
console.println("***** "+leType+" \""+nomChamp+"\" *****\r\u00C9l\u00E9ment -> Valeur d'exportation");
for (var i=0; i<f.numItems; i++) {
console.println("– "+f.getItemAt(i,false)+" -> "+f.getItemAt(i,true));
}
console.println("**********************************\r");
}
}
@+
😎bebarth
Maître des clésEn script de format personnalisé :
if (event.value!="") {
var somme=event.value.split(",");
if (somme.length==1) event.value=somme[0]+",00 €";
else event.value=somme[0]+","+(somme[1]+"00").substr(0,2)+" €";
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clés…et si on veut être perfectionniste il faut modifier l’alerte et le message affiché dans la console !!!
@+
😎bebarth
Maître des clésil suffit d’écrire :
…
if (this.getField(this.getNthFieldName(i)).type==”combobox” || this.getField(this.getNthFieldName(i)).type==”listbox”) lesElements.push(this.getNthFieldName(i));
…@+
😎bebarth
Maître des clésbonjour,
En script de format personnalisé :
if (event.value!="") event.value+=" €";
ou :
if (event.value!="") event.value="€ "+event.value;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Je suis un peu à la bourre sur ce post, mais voici un script que j’avais écrit il y a quelques temps sur le même sujet.
Le script retourne une boite de dialogue avec le nom de tous les menus déroulants (ça évite d’entrer un nom incorrect) puis liste tous les éléments et leur valeur d’exportation.
console.clear();
console.show();
var lesElements=[]
for (var i=0; i<this.numFields; i++) {
if (this.getField(this.getNthFieldName(i)).type=="combobox") lesElements.push(this.getNthFieldName(i));
}
if (!lesElements.length) app.alert("Il n'y a pas de menu d\u00E9roulant dans ce document.",3);
else {
lesElements.unshift("- S\u00E9lectionnez -");
var listeElements="var laListe \= \{";
for (var j=0; j<lesElements.length; j++) listeElements+="\""+lesElements[j]+"\": "+(-1*(j+1)).toString()+",";
var listeElements=listeElements.substring(0, listeElements.length-1);
listeElements+="\}";
eval(listeElements);
var bDialog={
DoDialog: function(){return app.execDialog(this);},
initialize: function(bDialog) {this.loadDefaults(bDialog)},
validate: function(bDialog) {
results=bDialog.store();
oRslt=bDialog.store();
var listeElements=bDialog.store()["LIST"];
testOK=1;
for (var j in listeElements) {
if (listeElements[j]>0) {
valItem=listeElements[j];
if (valItem==1) testOK=0;
}
}
var alertReturn=(testOK);
if(!alertReturn) app.alert("\nVeuillez s\u00E9lectionner un menu d\u00E9roulant.");
return alertReturn;
},
loadDefaults: function (bDialog) {
bDialog.load({LIST: laListe,});
},
description: {
name: "Dialog",
align_children: "align_top",
elements: [
{
type: "view",
align_children: "align_fill",
elements: [
{
type: "popup",
item_id: "LIST",
width: 120,
},
{
alignment: "align_right",
type: "ok_cancel",
},
]
},
]
}
};
if("ok"==bDialog.DoDialog()) {
var nomChamp=lesElements[valItem-1];
var f=this.getField(nomChamp);
var numItems=f.numItems;
console.println("***** Menu d\u00E9roulant \""+nomChamp+"\" *****\r\u00C9l\u00E9ment -> Valeur d'exportation");
for (var i=0; i<f.numItems; i++) {
console.println("– "+f.getItemAt(i,false)+" -> "+f.getItemAt(i,true));
}
console.println("**********************************\r");
}
}
@+
😎bebarth
Maître des clésbonjour,
Adobe Reader demande une connexion ?
Quel OS ? Il existe d’autres lecteurs gratuits.@+
😎bebarth
Maître des clésbonjour,
Une petite amélioration du script pour ne pas pouvoir taper une série de zéro en début de frappe !
Voici l’expression régulière :
/^(([0]|([1-9]\d{0,11}))(\,\d{0,2})?)?$/
…et ajout automatique d’une virgule après un chiffre qui commence par zéro.@+
😎-
Cette réponse a été modifiée le il y a 2 années par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésQuand j’ai quelque chose dans la tête, je ne l’ai pas au… tre part !
Voici donc un fichier avec le script mis en fonction.Script de touches personnalisé :
if (!event.willCommit) {
if (event.value.length==0 && event.change==",") event.change="0,";
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
RegExAmount=/^(\d{0,12}(\,\d{0,2})?)$/;
if (RegExAmount.test(testeChaine)) {
ecriture(testeChaine);
} else event.rc=false;
} else {
RegExAmount=/^(\d{1,12}(\,\d{0,2})?)$/;
if (event.value=="" || RegExAmount.test(event.value)) {
ecriture(event.value);
} else event.rc=false;
}
Le reste est en script de document.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici un fichier avec script de touches personnalisé qui permet de répondre aux 2 demandes.
L’écriture en lettres se fait au fur et à mesure de la frappe des chiffres.
J’ai recopié 2 fois le script d’origine pour raison de temps mais cela nécessiterait d’écrire une fonction en script de document !
Si j’avais à réécrire ce script aujourd’hui il serait un peu différent mais vu qu’il fonctionne…var etoiles="**********";
if (!event.willCommit) {
var aTester=event.value.split("");
aTester.splice(event.selStart,event.selEnd-event.selStart,event.change);
var testeChaine=aTester.join("");
RegExAmount=/^(\d{0,12}(\,\d{0,2})?)$/;
...
}
} else event.rc=false;
}
@+
😎-
Cette réponse a été modifiée le il y a 2 années par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
As-tu réussi ?@+
😎bebarth
Maître des clés👍
@+
😎bebarth
Maître des clésbonjour,
Dans mon idée « this » représente le document qui vient d’être enregistré, qui est actif et donc au premier-plan à l’instant T.
Ce n’est effectivement pas bien clair, mais pour moi “this” représente “l’objet” d’où est lancé la partie du script. Si c’est un document, “this” est ce document, si c’est d’une boite de dialogue, “this” est cette boite de dialogue.
Bonjour, le script a fonctionné
Combien de fichiers as-tu traité et en combien de temps ?
@+
😎bebarth
Maître des clésbonjour,Je suppose que c’est automatique, mais si ce n’est pas le cas il faudra ajouter (après l’étape Enregistrement) une nouvelle étape « Exécuter un JavaScript » en utilisant ce script : this.closeDoc(true);
“this” représente le fichier dont on veut extraire la première page donc this.closeDoc(true); ne fermera pas le fichier temporaire.
Pour ma part voici le script à utiliser :
var newDoc=app.newDoc();
newDoc.insertPages ({
nPage: 0,
cPath: this.path,
nStart: 0
});
newDoc.deletePages(0);
newDoc.saveAs({
cPath: this.path.replace(/.pdf$/i,"_extrait.jpg"),
cConvID: "com.adobe.acrobat.jpeg",
bCopy: true,
bPromptToOverwrite: true
});
newDoc.closeDoc(true);
Il vaut effectivement traiter les 5000 fichiers par lots, sinon il faudrait écrire un autre script pour savoir où on en est dans le traitement…
@+
😎bebarth
Maître des clés…pas besoin d’indiquer nEnd si on n’imprime qu’une seule page.
@+
😎
bebarth
Maître des clésbonjour,
pour moi il faudra attendre la semaine prochaine car je suis sans ordinateur…
j’espère que ton stage est un peu plus long
@+
😎bebarth
Maître des clésbonjour,
regarde les actions Acrobat :
https://helpx.adobe.com/fr/acrobat/using/applying-actions-scripts-pdfs.html
tu devrais y arriver, sinon il faudra attendre la semaine prochaine…@+
😎bebarth
Maître des clésbonjour,
avec Acrobat Pro ou Reader ?
je n’ai pas d’ordinateur avec moi cette semaine mais regarde la méthode « print » de l’api référence…
@+
😎bebarth
Maître des clésbonjour,
Il faudrait écrire un script de touches personnalisé comme celui que j’ai fait pour ce post :
je serai de retour la semaine prochaine.
@+
😎bebarth
Maître des clésVoici quelquelques liens pour t’aider à comprendre le script :
https://www.w3schools.com/jsref/jsref_obj_date.asp
https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Numbers_and_dates#lobjet_date
et
https://opensource.adobe.com/dc-acrobat-sdk-docs/library/jsapiref/JS_API_AcroJS.html#printd@+
😎bebarth
Maître des clésbonjour,
Il y avait effectivement une erreur dans le script !
Mieux, on met le script au niveau du document :
if (this.getField("validite").value=="") this.getField("validite").value=util.printd("dd/mm/yyyy", new Date(new Date().getTime()+(365*24*3600*1000)));
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Si tu caches le champ de la date du jour cela signifie que tu n’en a pas besoin !
Tu peux donc réduire ton script à :
Oups! Script modifié…
if (event.value=="") event.value=util.printd("dd/mm/yyyy", new Date(new Date().getTime()+(365*24*3600*1000)));
@+
😎-
Cette réponse a été modifiée le il y a 2 années par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
En script de document tu écris :
this.getField("nomDuChamp").setFocus();
@+
😎bebarth
Maître des clés👍
bebarth
Maître des clésbebarth
Maître des clésbonjour,
Le plus simple est de donner un nom à l’annotation lors de sa création puis supprimer celle qui porte ce nom !if (event.target.buttonGetCaption()=="AJOUTER") {
var coordonnees=event.target.rect;
var annotation=this.addAnnot({
page: 0,
type: "Text",
point: [coordonnees[2]+20,coordonnees[1]+20],
name: "annotationNo1",
});
event.target.buttonSetCaption("SUPPRIMER");
event.target.fillColor=color.red;
event.target.textColor=color.white;
} else {
var lesAnnotations=this.getAnnots({nPage:0});
for (var i=0; i<lesAnnotations.length; i++)
if (lesAnnotations.name=="annotationNo1") lesAnnotations.destroy();
event.target.buttonSetCaption("AJOUTER");
event.target.fillColor=color.green;
event.target.textColor=color.black;
}@+
😎-
Cette réponse a été modifiée le il y a 2 années par
Merlin. Raison: Ce script n'est pas complet, voir ci-dessous
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Il faut écrire le script comme ceci :
for (var i=0; i<this.numFields; i++) {
var oFld=this.getField(this.getNthFieldName(i));
if (oFld.type == "text" && (/^Question\.\d+\.\d+/.test(oFld.name) || /^R\.\d+\.\d+/.test(oFld.name) || /^Q\.\d+\.\d+/.test(oFld.name))) {
oFld.setAction("Calculate", "EditReps();");
oFld.setAction("Keystroke", "Default();");
}
}
@+
😎bebarth
Maître des clésIl faut mettre les champs en lecture seule uniquement si ils ont été remplis !
var lesChamps=["champs1","champs2","champs3","etc."];
for (var i=0; i<lesChamps.length; i++) {
if (this.getField(lesChamps).value!=this.getField(lesChamps).defaultValue) this.getField(lesChamps).readonly=true;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Le plus simple est de mettre le noms des champs dans une table et de placer ce script au même endroit que le précédent : “Lorsque le document sera enregistré” :
var lesChamps=["champs1","champs2","champs3","etc."];
for (var i=0; i<lesChamps.length; i++) this.getField(lesChamps).readonly=true;
@+
😎PS : Voir la copie d’écran car les crochets n’apparaissent pas dans la ligne de code !
-
Cette réponse a été modifiée le il y a 2 années et 1 mois par
bebarth.
Attachments:
You must be logged in to view attached files.bebarth
Maître des clésVoici une petite modification de ton formulaire sur le champ Email ou j’ai rajouté un script pour demander une adresse valide
L’expression régulière que tu utilises vérifies vraiment que le minimum… On peut par exemple utiliser des caractères accentués alors qu’ils ne sont pas autorisés.
Si tu cherches sur internet tu trouveras des dizaines d’expressions régulières pour cette vérification et toutes différentes !
Moi j’utilise celle-ci…
/^[a-zA-Z0-9.!#$%&'*+/=?^_
{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/`@+
😎bebarth
Maître des clésbonjour,TOUT fonctionne correctement comme je le souhaitais
Une petite précision : lorsqu’on utilise “event” dans un script, ce n’est pas la peine de le faire précéder par “this”.
“event” ne s’utilise que dans le document actif et “this” indique que c’est pour le document actif ! C’est donc redondant…@+
😎bebarth
Maître des clésbonjour,
Oui, en script d’action lorsque le document sera enregistré on peut passer ces champs en lecture seule !@+
😎bebarth
Maître des clésbonjour,
Il faut modifier l’ordre de calcul des champs.
Voici un des scripts :
if (this.getField("CARTE").value=="") var total=this.getField("1JS").value*this.getField("PU1JSE").value;
else var total=this.getField("1JS").value*this.getField("PU1JS").value;
if (this.getField("SUPPL").value=="") event.value=total;
else event.value=total*0.3;
Ici on peut indiquer n’importe quoi en numéro de carte et pour la réduction supplémentaire !
On pourrait peut-être ajouter une expression régulière afin de vérifier si c’est bien un numéro de carte correct…Désolé pour ne pas t’avoir répondu directement sur ta boite mail, j’ai encore été très occupé ces derniers jours.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbebarth
Maître des clésVoici un exemple de ce qui pourrait se faire !
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,« Et donc dans mes rêves les plus fous, le pop-up n’apparait plus une fois qu’on a ‘enregistré-sous’. » On devrait peut être pouvoir bidouiller quelque chose… Je vais réfléchir.
En script d’actions du document “Le document sera enregistré” on peut supprimer l’alerte avec “this.removeScript”.
… et utiliser “try… catch” pour éviter de futur erreurs lors des prochains enregistrements !
@+
😎-
Cette réponse a été modifiée le il y a 2 années et 1 mois par
bebarth.
bebarth
Maître des clésbonjour,
J’arrive un peu après la bataille, mais pour inverser 2 variables a et b on peur utiliser :
b=[a, a=b][0];
D’où ma version (en français) :
var leMot=this.getField("MelangeLettre").value;
this.getField("MelangeLettre").value=melangerMot(leMot);
function melangerMot(leMot) {
var tableMot=leMot.split("");
var tableMelangee=melangerTable(tableMot);
return tableMelangee.join("");
}
function melangerTable(table) {
for (var i=table.length-1; i>0; i--) {
var j=Math.floor(Math.random()*(i + 1));
table[j]=[table,table=table[j]][0];
}
return table;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Pour programmer ton formulaire plus facilement, il va falloir au préalable revoir les noms des champs et les valeurs d’exportations des menus déroulants. Tu imagines bien que si dans les formules on a uniquement des valeurs du type ” Absence de RDV préalable – 2 appels infructueux, demande de RDV “, le script va vite devenir illisible… Des chaines de caractères de ce type ne doivent être que des valeurs attribuées à des champs.J’ai quand même fait l’exemple donné, mais Merlin à raison : pour établir une formule il faut une règle et non juste un ou des exemple :
if (!event.willCommit) {
if (event.changeEx==" Chantier non déclaré (CND)") {
this.getField("N° Téléservice de la Dict").fillColor=color.gray;
this.getField("N° Téléservice de la Dict").readonly=true;
this.getField("Si absence de RDV").fillColor=color.gray;
this.getField("Si absence de RDV").readonly=true;
this.getField("si rdv non respecté").fillColor=color.gray;
this.getField("si rdv non respecté").readonly=true;
this.getField("si non respect des prescriptions").fillColor=color.gray;
this.getField("si non respect des prescriptions").readonly=true;
} else {
this.getField("N° Téléservice de la Dict").fillColor=color.transparent;
this.getField("N° Téléservice de la Dict").readonly=false;
this.getField("Si absence de RDV").fillColor=color.transparent;
this.getField("Si absence de RDV").readonly=false;
this.getField("si rdv non respecté").fillColor=color.transparent;
this.getField("si rdv non respecté").readonly=false;
this.getField("si non respect des prescriptions").fillColor=color.transparent;
this.getField("si non respect des prescriptions").readonly=false;
}
}
Dans ton cas, s’il n’y a pas de règle bien définies, il faudra utiliser des “else if” pour chaque cas.
if (!event.willCommit) {
if (event.changeEx==" Chantier non déclaré (CND)") {
this.getField("N° Téléservice de la Dict").fillColor=color.gray;
this.getField("N° Téléservice de la Dict").readonly=true;
this.getField("Si absence de RDV").fillColor=color.gray;
this.getField("Si absence de RDV").readonly=true;
this.getField("si rdv non respecté").fillColor=color.gray;
this.getField("si rdv non respecté").readonly=true;
this.getField("si non respect des prescriptions").fillColor=color.gray;
this.getField("si non respect des prescriptions").readonly=true;
} else if (event.changeEx==" Absence de RDV préalable - 2 appels infructueux, demande de RDV") {
...
...
} else if (event.changeEx==" Non respect des prescriptions GRTgaz") {
...
...
} else {
this.getField("N° Téléservice de la Dict").fillColor=color.transparent;
this.getField("N° Téléservice de la Dict").readonly=false;
this.getField("Si absence de RDV").fillColor=color.transparent;
this.getField("Si absence de RDV").readonly=false;
this.getField("si rdv non respecté").fillColor=color.transparent;
this.getField("si rdv non respecté").readonly=false;
this.getField("si non respect des prescriptions").fillColor=color.transparent;
this.getField("si non respect des prescriptions").readonly=false;
}
}
Autre recommendation, pour les menus déroulants, pense à cocher la case “Valider la valeur sélectionnée immédiatement”.
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Dans ton fichier Excel, je ne vois pas à voir quelles cellules sont grisées en fonction de quels éléments des menus déroulants !
Pourrais-tu donner quelques exemples.mais si je met plusieur mot dans la liste d’élément dans la liste déroulante
À première vue if suffirait d’ajouter des “ou” (||).
@+
😎bebarth
Maître des clésbonjour,
Il existe plusieurs façons de faire ça !
En script de touches personnalisé du menu déroulant qui ne s’exécute que lors de la modification du menu :
if (!event.willCommit) {
if (event.changeEx=="Champs grisés") {
this.getField("Text2").fillColor=color.gray;
this.getField("Text2").readonly=true;
this.getField("Text3").fillColor=color.gray;
this.getField("Text3").readonly=true;
} else {
this.getField("Text2").fillColor=color.transparent;
this.getField("Text2").readonly=false;
this.getField("Text3").fillColor=color.transparent;
this.getField("Text3").readonly=false;
}
}
ou en script de calcul des champs modifiés, mais ces scripts s’exécutent après chaque évènement ce qui peut être pénalisant s’il y en a beaucoup :
if (this.getField("Dropdown7").value=="Champs grisés") {
event.target.fillColor=color.gray;
event.target.readonly=true;
} else {
event.target.fillColor=color.transparent;
event.target.readonly=false;
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Les tampons sont stockés dans un répertoire Stamps.
Tu télécharges l’utilitaire show_me_the_path et tu sera exactement où ils se trouvent :@+
😎bebarth
Maître des clésbonjour,
Il y avait la même chose dans l’API Reference, mais perso je préfère regarder la valeur :
var premierPoint=event.target.name.indexOf(".");
var dernierPoint=event.target.name.lastIndexOf(".");
var ind1=event.target.name.substring(premierPoint+1,dernierPoint);
this.getField("Aide."+ind1+".2").display=event.target.value!="Off"?display.visible:display.hidden;
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbebarth
Maître des clésJe n’ai pas de message d’erreur mais ça ne marche pas…
Je n’ai pas vérifié le script entier, mais la première chose que je vois est que resetForm() doit s’appliquer à une table, il faut donc écrire :
if (oFld.type == "combobox") {this.resetForm([oFld.name]);}
Je regarderai plus précisément si ça ne fonctionne pas mieux…
@+
😎bebarth
Maître des clésbonjour,Par exemple si je veux extraire le chiffre compris entre les 2 points d’un champ qui se nommerait R.5.3 (ici le chiffre 5) mais il faudrait que ça fonctionne pour le cas d’un nombre à 2 chiffres comme R.12.10 (pour extraire le nombre 12)
Pour celà, il faut prendre la valeur indiquée entre le premier et le dernier point. Essaye ceci :
var nomChamp="R.12.10";
var premierPoint=nomChamp.indexOf(".");
var dernierPoint=nomChamp.lastIndexOf(".");
var indice=nomChamp.substring(premierPoint+1,dernierPoint);
console.println("indice : "+indice);
Ce serait un peu plus compliqué s’il y avait plus de 2 points mais c’est faisable quand même !@+
😎bebarth
Maître des clésbonjour,
Il faut écrire le script en fonction de l’indice des champs.
Pour la fonction :
function HM_Format(ind) {
var enminutes=Math. round(somme/60)
// Heures
var heures=Math.floor(enminutes/60);
// Minutes
var minutes=((enminutes/60)-heures)*60;
if (this.getField("caseAcocher."+ind).value!="Off") heures--;
event.value=util.printf("%,302.0f", heures)+":"+util.printf("%,302.0f", minutes);
}
et pour appeler la fonction :
event.value= "";
var somme=Time2Num("hh:mm", this.getField("end.0").value)-Time2Num("hh:mm", this.getField("start.0").value);
HM_Format(event.target.name.substr(6));
A noter que tu devrais utiliser la même méthode pour la variable somme.
Tu devrais également positionner ces scripts en scripts de touche personnalisés des menus déroulants start et end ce qui éviterait que les calculs se fassent après chaque évènement déclenché dans ton formulaire !@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,
Voici pour moi ! Juste une petite modification de la fonction HM_Format :function HM_Format() {
var enminutes=Math. round(somme/60)
// Heures
var heures=Math.floor(enminutes/60);
// Minutes
var minutes=((enminutes/60)-heures)*60;
// Suppression d'une heure
if (heures>6) heures--;
// ou
// if (this.getField("caseAcocher").value!="Off") heures--;
//
event.value=util.printf("%,302.0f", heures)+":"+util.printf("%,302.0f", minutes);
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,Attention quand même : cette requête GREP détecte le « R » en début de mot, mais pas forcément en début de nom.
C’est pourquoi il vaut mieux écrire :
...
if (/^R./.test(oFld.name)) {
...
ou
...
if (oFld.name.indexOf("R.")==0) {
...
@+
😎-
Cette réponse a été modifiée le il y a 2 années et 2 mois par
bebarth.
bebarth
Maître des clésVoici donc ma proposition :
function verifier(n) {
var nbChamps=0;
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("Q"+n+".")==0) nbChamps++;
}
var erreurs=0;
for (var a=1; a<=nbChamps; a++) {
this.getField("Q"+n+"."+a).readonly=true;
if (this.getField("Q"+n+"."+a).value!=0) {
this.getField("Q"+n+"."+a).fillColor=color.white;
} if (this.getField("Q"+n+"."+a).value==0) {
this.getField("Q"+n+"."+a).fillColor=color.red;
erreurs++;
}
}
if (!erreurs) {
this.getField("Bravo.1").display=display.visible;
this.getField("Masque."+n).display=display.hidden;
} else {
if (erreurs==1) this.getField("Erreurs.1").value="Il y a une erreur.";
else this.getField("Erreurs.1").value="Il y a "+erreurs+" erreurs.";
this.getField("Erreurs.1").display=display.visible;
}
}
@+
😎Attachments:
You must be logged in to view attached files.bebarth
Maître des clésbonjour,Il faudrait un code qui me permettrait de compter tous les champs qui commencent par « Q »+n+ ». »
Voici ce que tu peux écrire :
var nbChamps=0;
for (var i=0; i<this.numFields; i++) {
if (this.getNthFieldName(i).indexOf("Q"+n+".")==0) nbChamps++;
}
console.println("Nombre de champs Q"+n+". : "+nbChamps);
@+
😎bebarth
Maître des clésBonne année à tous !
🍾😎
bebarth
Maître des clésMath.floor arrondit à l’entier inférieur tandis que Math.round arrondit à l’entier le plus proche.
@+
😎 -
Cette réponse a été modifiée le il y a 1 année et 9 mois par
-
AuteurRéponses