Cómo rellenar previamente un campo sumado en una tabla de repetición de InfoPath
Pregunta
Tengo un formulario de InfoPath 2007 con varios puntos de vista, destinado a ser utilizado en un navegador. Estoy teniendo pre-rellenar un campo de una tabla de repetición, a partir de un valor dado y a continuación, utilizando un valor por defecto fórmula derivada de problemas.
En la vista Summary
, pido TotalCost
de un proyecto y la corriente del año fiscal prevé que el gasto (CurrentFYSpend
):
+------------------------------+ | Project Summary | +------------------------------+ | Total Cost: $100,000 | -- TotalCost | Current FY Spend: $ 25,000 | -- CurrentFYSpend +------------------------------+En la siguiente vista (
Detail
), tengo una tabla de repetición FYSpending
donde el usuario tiene que salir TotalCost
del proyecto durante un número arbitrario de los años fiscales. La tabla tiene un campo FYSpending
YearlyCost
que mantiene el gasto estimado de ese año. Debajo de la mesa repitiendo tengo campos RunningTotal
y Remaining
. RunningTotal
tiene un valor predeterminado de sum(YearlyCost)
; Remaining
tiene un valor predeterminado de TotalCost - sum(YearlyCost)
; Juntos se muestran al usuario la cantidad del total ya se ha tenido en cuenta, y lo mucho que todavía tienen que romper en una fila año fiscal.
Cuando primero entrar en la vista Detail
, el campo YearlyCost
de la primera fila de la FYSpending
tabla de repetición debe ser poblado con el valor CurrentFYSpend
:
+--------------------------------+ | Project Detail | +--------------------------------+ | Total Cost: $100,000 | <- TotalCost | | | Fiscal Year Spending: | | +---------------------------+ | <- FYSpending repeating table | | FY | Yearly Cost | | +---------------------------+ | <- FYSpending repeating table | | 2009 | $ 25,000 | | <- YearlyCost[1], from Summary CurrentFYSpend | +---------------------------+ | | | Add Fiscal Year | | | +-----------------+ | | | | Running Total: $ 25,000 | | Remaining: $ 75,000 | <- TotalCost - sum(YearlyCost) +--------------------------------+
Cuando el usuario agrega una nueva fila año fiscal, quiero que el valor por defecto del campo YearlyCost
de la nueva fila que se calcula como la cantidad restante: YearlyCost[n] = TotalCost - sum(YearlyCost)
:
+--------------------------------+ | Project Detail | +--------------------------------+ | Total Cost: $100,000 | | | | Fiscal Year Spending: | | +---------------------------+ | | | FY | Yearly Cost | | | +---------------------------+ | | | 2009 | $ 25,000 | | | | 2010 | $ 50,000 | | -- YearlyCost[2], calc'd by rule on Add Row | +---------------------------+ | | | Add Fiscal Year | | | +-----------------+ | | | | Running Total: $ 75,000 | | Remaining: $ 25,000 | +--------------------------------+
tengo problemas porque el conflicto dos acciones rellenando previamente entre sí y parece estar creando una condición de carrera. Traté de establecer una regla en el campo de la Summary
CurrentFYSpend
para establecer el valor de FYSpending
de YearlyCost
, a continuación, establecer un valor predeterminado en el campo YearlyCost
al conjunto Value: TotalCost - sum(YearlyCost)
. Cuando guardo la forma, me sale el siguiente error:
Se ha producido un error en el código del formulario. El número de llamadas a la Cambiada acontecimiento para una sola actualización de los datos superado el límite máximo.
(Gracias, InfoPath, para tal mensaje de error específico! ¿Cuánto tengo que pagar para obtener el nombre del objeto que generó el evento, o que ha intentado actualización?)
De todos modos, ¿alguien puede describir una técnica para lograr esto? En resumen,
-
YearlyCost
de poblar primera fila deCurrentFYSpend
de la vista anterior - permitir anulando
YearlyCost
de la primera fila, y llenar posteriormente añadido valor predeterminadoYearlyCost
filas aTotalCost - sum(YearlyCost)
Solución 2
Y otra técnica de Jimmy Riche en en los foros infopathdev.com :
CurrentFYSpend
tiene una regla que establece YearlyCost = .
RunningTotal
tiene un valor predeterminado de sum(YearlyCost)
, actualizado cuando se recalc'd la fórmula.
Remaining
tiene un valor predeterminado de TotalCost - RunningTotal
, actualiza cuando se recalc'd la fórmula.
Finalmente, el campo YearlyCost
en la tabla de repetición tiene un valor predeterminado de
(Remaining) * (Remaining > 0)
, no actualizado cuando se recalc'd la fórmula. (Puro truco, ¿eh?)
Esto funciona muy bien, aunque la fórmula para YearlyCost
es, um, no evidente. Pero, estoy encontrando que una gran cantidad de XPath es como que - usted tiene que encontrar soluciones no evidentes a cosas que serían simples muertos en un lenguaje imperativo. De todos modos, esto funciona, así que estoy implementarlo.
Otros consejos
OK, tengo una respuesta de Alec Pojidaev , que es bastante el experto InfoPath. Dice:
tiene problemas de pareja que fue capaz de identificar. La primera es que marcar la opción "Actualizar este valor cuando el resultado de la fórmula se calcula de nuevo" en el campo YearlyCost. Su funcionamiento una vez por lo que no quiero a calcular de nuevo.
El segundo problema es la fórmula en sí. El resultado de su fórmula ../../../my:TotalCost - sum(.)
es absolutamente el mismo que ../../../my:TotalCost - .
sum () la función tiene ningún sentido en ese contexto.
Si entiendo su intención de corregir la fórmula correcta debe ser:
../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
Después de hacer estos cambios, la forma trabajó como deseado.
El sum(.)
en la fórmula fue generado automáticamente. Construí la fórmula a través de apuntar y hacer clic con el botón en lugar de escribir la expresión XPath. Cuando añadí la función sum()
y seleccionado el campo YearlyCost
, el editor de fórmulas reemplazado YearlyCost
con un .
pensé que sabía lo que estaba haciendo, así que lo dejé solo. Veo que tengo que prestar mucha atención a lo que subyace XPath se está generando.