Значения поля суммы, если они удовлетворяют условиям
Я пытаюсь суммировать количество значений полей, но только если выполняется условие, связанное с этими полевыми значениями. Например:
У меня есть PDF-форма с несколькими полями числовых значений. Каждое из этих числовых полей сопровождается выбором статуса. Я просто хочу добавить все числовые поля с одинаковым статусом. Вот код, который я пробовал и думал, что он работает, но кажется, что если статус в ранее добавленном поле изменяется, он не работает. Например, если я добавляю Field1, Field2 и Field4, потому что они имеют одинаковый статус, но я возвращаюсь и меняю статус Field2 на что-то другое, он перестает работать:
// field names
var cTotal1 = "Day1Pd1Total";
var cTotal2 = "Day1Pd2Total";
var cTotal3 = "Day1Pd3Total";
var cTotal4 = "Day1Pd4Total";
var cTotal5 = "Day1Pd5Total";
var cTotal6 = "Day1Pd6Total";
var cStatus1 = "Day1Pd1Status";
var cStatus2 = "Day1Pd2Status";
var cStatus3 = "Day1Pd3Status";
var cStatus4 = "Day1Pd4Status";
var cStatus5 = "Day1Pd5Status";
var cStatus6 = "Day1Pd6Status";
// get conditonal field values
var vStatus1 = this.getField(cStatus1).value;
var vStatus2 = this.getField(cStatus2).value;
var vStatus3 = this.getField(cStatus3).value;
var vStatus4 = this.getField(cStatus4).value;
var vStatus5 = this.getField(cStatus5).value;
var vStatus6 = this.getField(cStatus6).value;
// get field values base on condition
if(vStatus1 == "1"){
var vTotal1 = this.getField(cTotal1).value;
}else{
var vTotal1 = "";
}
if(vStatus2 == "1"){
var vTotal2 = this.getField(cTotal2).value;
}else{
var vTotal2 = "";
}
if(vStatus3 == "1"){
var vTotal3 = this.getField(cTotal3).value;
}else{
var vTotal3 = "";
}
if(vStatus4 == "1"){
var vTotal4 = this.getField(cTotal4).value;
}else{
var vTotal4 = "";
}
if(vStatus5 == "1"){
var vTotal5 = this.getField(cTotal5).value;
}else{
var vTotal5 = "";
}
if(vStatus6 == "1"){
var vTotal6 = this.getField(cTotal6).value;
}else{
var vTotal6 = "";
}
// clear result value
event.value = "";
// add values
var FLPTotal = vTotal1 + vTotal2 + vTotal3 + vTotal4 + vTotal5 + vTotal6;
event.value = FLPTotal;
Как мне заставить этот скрипт пересчитать, когда есть изменения? Это также в файле PDF.
Изменить: Дальнейшее тестирование показывает, что проблема заключается в порядке выполнения. vTotal1 будет успешно добавлен к vTotal2, а затем к vTotal3, если они заполнены в указанном порядке. vTotal1 не будет суммироваться с vTotal3. Как мне суммировать поля в любом порядке?
3 ответа
Прежде всего, я не совсем уверен, почему вы создали несколько переменных для каждого поля. Будет ли что-то вроде этой работы?
var FLPTotal = 0;
Затем, если выполняется одно из условий, просто добавьте к нему значение.
FLPTotal += this.getField(cTotal3).value;
Если он возвращается в виде строки, вы можете сделать.
FLPTotal += parseInt(this.getField(cTotal3).value);
Следующее суммирует все значения cTotals.
// field names
var cTotal1 = "Day1Pd1Total";
var cTotal2 = "Day1Pd2Total";
var cTotal3 = "Day1Pd3Total";
var cTotal4 = "Day1Pd4Total";
var cTotal5 = "Day1Pd5Total";
var cTotal6 = "Day1Pd6Total";
var cStatus1 = "Day1Pd1Status";
var cStatus2 = "Day1Pd2Status";
var cStatus3 = "Day1Pd3Status";
var cStatus4 = "Day1Pd4Status";
var cStatus5 = "Day1Pd5Status";
var cStatus6 = "Day1Pd6Status";
// get conditional field values
var vStatus1 = this.getField(cStatus1).value;
var vStatus2 = this.getField(cStatus2).value;
var vStatus3 = this.getField(cStatus3).value;
var vStatus4 = this.getField(cStatus4).value;
var vStatus5 = this.getField(cStatus5).value;
var vStatus6 = this.getField(cStatus6).value;
// Add total variable
var FLPTotal = 0;
// get field values base on condition
if(vStatus1 == "1"){
FLPTotal += parseInt(this.getField(cTotal1).value);
}
if(vStatus2 == "1"){
FLPTotal += parseInt(this.getField(cTotal2).value);
}
if(vStatus3 == "1"){
FLPTotal += parseInt(this.getField(cTotal3).value);
}
if(vStatus4 == "1"){
FLPTotal += parseInt(this.getField(cTotal4).value);
}
if(vStatus5 == "1"){
FLPTotal += parseInt(this.getField(cTotal5).value);
}
if(vStatus6 == "1"){
FLPTotal += parseInt(this.getField(cTotal6).value);
}
// clear result value and set result value
event.value = "";
event.value = FLPTotal;
Скажи мне, если это работает.
Не уверен, что я правильно понимаю, но если вы хотите, чтобы он был кратким и предполагал, что значения всех полей защищены (например, не определено), то вы можете использовать
Object.values(some object)
сделать значения полей массивом. И тогда это будет внутреннее произведение двух массивов: один из среза для части "vStatus" и один из "cTotal".
Math.js может быть допустимой внешней библиотекой для краткого разрешения внутренних продуктов.
Пример Object.values лежит здесь (MDN)
const object1 = {
a: 'somestring',
b: 42,
c: false
};
console.log(Object.values(object1));
// expected output: Array ["somestring", 42, false]
Попробуйте создать входные данные и объявить их как объект в вашем js- файле и попробуйте использовать этот объект внутри вашего случая оператора if , чтобы включить результат. Затем используйте его вне оператора if глобально и скажите мне, работает ли он.