Comment pré-remplir un champ résumé dans une table répéter Infopath
Question
J'ai un formulaire InfoPath 2007 avec plusieurs points de vue, destinés à être utilisés dans un navigateur. Je rencontre des difficultés de pré-remplissage d'un champ d'une table de répétition, en commençant par une valeur donnée, puis en utilisant une valeur par défaut dérivé de formule.
Dans la vue Summary
, je demande la TotalCost
d'un projet et les dépenses de l'exercice en cours projetée (CurrentFYSpend
):
+------------------------------+ | Project Summary | +------------------------------+ | Total Cost: $100,000 | -- TotalCost | Current FY Spend: $ 25,000 | -- CurrentFYSpend +------------------------------+Sur la page suivante (
Detail
) vue, j'ai un FYSpending
de table répétitive où l'utilisateur a besoin de sortir le TotalCost
du projet sur un nombre arbitraire d'exercices. Le tableau de FYSpending
a un champ de YearlyCost
qui détient les dépenses estimées de cette année. Sous la table de répétition je champs RunningTotal
et Remaining
. RunningTotal
a une valeur par défaut de sum(YearlyCost)
; Remaining
a une valeur par défaut de TotalCost - sum(YearlyCost)
; ensemble, ils montrent à l'utilisateur combien du total a déjà été pris en compte, et combien ils ont encore besoin de sortir dans une ligne exercice.
Lorsque nous entrons d'abord la vue Detail
, le champ YearlyCost
de la première ligne de la table répéter FYSpending
doit être rempli avec la valeur 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) +--------------------------------+
Lorsque l'utilisateur ajoute une nouvelle ligne budgétaire année, je veux la valeur par défaut du nouveau champ YearlyCost
de ligne à calculer comme le montant restant: 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 | +--------------------------------+
Je vais avoir du mal parce que les deux actions Préremplissage conflit entre eux et semblent créer une condition de course. J'ai essayé de définir un champ sur la règle de Summary
du CurrentFYSpend
pour définir la valeur de FYSpending
de YearlyCost
, puis définissez une valeur par défaut sur le champ YearlyCost
pour définir Value: TotalCost - sum(YearlyCost)
. Quand je sauve la forme, je reçois l'erreur suivante:
Une erreur dans le code de la forme. Le nombre d'appels au Changement événement pour une mise à jour unique dans les données dépassé la limite maximale.
(Merci, InfoPath, pour un tel message d'erreur spécifique! Combien dois-je payer pour obtenir le nom de l'objet qui a déclenché l'événement, ou que vous avez essayé de mettre à jour?)
Quoi qu'il en soit, peut-on décrire une technique pour y parvenir? En résumé,
- remplir la
YearlyCost
de première ligne de laCurrentFYSpend
de la vue précédente - permet redéfinissant la première de
YearlyCost
de ligne et remplir la valeur par défaut deYearlyCost
de lignes par la suite ajoutée àTotalCost - sum(YearlyCost)
La solution 2
Et une autre technique de Jimmy à le Riche forums infopathdev.com :
CurrentFYSpend
a une règle qui définit YearlyCost = .
RunningTotal
a une valeur par défaut de sum(YearlyCost)
, mis à jour lorsque la formule est recalc'd.
Remaining
a une valeur par défaut de TotalCost - RunningTotal
, mis à jour lorsque la formule est recalc'd.
Enfin, le champ YearlyCost
dans le tableau de répétition a une valeur par défaut de
(Remaining) * (Remaining > 0)
, pas mis à jour lorsque la formule est recalc'd. (Astuce, hein?)
Cela fonctionne bien, même si la formule pour YearlyCost
est, euh, non évidente. Mais, je trouve que beaucoup de XPath est comme ça - il faut trouver des solutions non évidentes à des choses qui seraient morts simple dans un langage impératif. Quoi qu'il en soit, cela fonctionne, donc je suis mise en œuvre.
Autres conseils
OK, je suis une réponse Alec Pojidaev , qui est tout à fait l'expert InfoPath. Il dit:
Vous avez des problèmes ou deux, j'ai pu localiser avec précision. La première est vous avez coché la case « Mettre à jour cette valeur quand le résultat de la formule est recalculé » sur YearlyCost terrain. Son une opération de temps afin que vous ne voulez pas le recalculer.
Le deuxième problème est la formule elle-même. Le résultat de votre formule ../../../my:TotalCost - sum(.)
est tout à fait le même que ../../../my:TotalCost - .
fonction sum () ont aucun sens dans ce contexte.
Si je comprends votre intention de corriger la bonne formule devrait être:
../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
Après avoir fait ces changements, la forme a travaillé comme souhaité.
Le sum(.)
dans la formule a été généré automatiquement. J'ai construit la formule à travers le point-and-click plutôt que d'écrire l'expression XPath. Quand j'ai ajouté la fonction sum()
et choisi le champ YearlyCost
, l'éditeur de formule remplacé YearlyCost
avec un .
je me suis dit qu'il savait ce qu'il faisait, donc je l'ai laissé seul. Je vois que je dois porter une attention particulière à ce que XPath sous-jacente est généré.