Como preencher um campo somado em uma tabela de repetição de infopath
Pergunta
Eu tenho uma forma Infopath 2007 com várias visualizações, destinada a ser usada em um navegador. Estou tendo problemas para a pré-população de um campo em uma tabela repetida, começando com um determinado valor e usando um valor padrão derivado da fórmula.
No Summary
Ver, eu peço um projeto TotalCost
e os gastos projetados do atual ano fiscal (CurrentFYSpend
):
+------------------------------+ | Project Summary | +------------------------------+ | Total Cost: $100,000 | -- TotalCost | Current FY Spend: $ 25,000 | -- CurrentFYSpend +------------------------------+No próximo (
Detail
) Ver, eu tenho uma mesa repetida FYSpending
onde o usuário precisa quebrar o projeto TotalCost
em um número arbitrário de exercícios fiscais. o FYSpending
A tabela tem um YearlyCost
Campo que mantém os gastos estimados daquele ano. Sob a mesa repetida que tenho RunningTotal
e Remaining
Campos. RunningTotal
tem um valor padrão de sum(YearlyCost)
; Remaining
tem um valor padrão de TotalCost - sum(YearlyCost)
; Juntos, eles mostram ao usuário quanto do total já foi contabilizado e quanto eles ainda precisam sair em uma fila do ano fiscal.
Quando entramos pela primeira vez no Detail
Veja o YearlyCost
campo da primeira linha do FYSpending
A mesa de repetição deve ser preenchida com o CurrentFYSpend
valor:
+--------------------------------+ | 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) +--------------------------------+
Quando o usuário adiciona uma nova linha de ano fiscal, quero o valor padrão da nova linha YearlyCost
campo a ser calculado como o valor 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 | +--------------------------------+
Estou tendo problemas porque as duas ações prepopuladoras conflitam entre si e parecem estar criando uma condição de corrida. Eu tentei definir uma regra no Summary
's CurrentFYSpend
campo para definir o valor de FYSpending
's YearlyCost
, então defina um valor padrão no YearlyCost
campo para definir Value: TotalCost - sum(YearlyCost)
. Quando salvo o formulário, recebo o seguinte erro:
Ocorreu um erro no código do formulário. O número de chamadas para o evento alterado para uma única atualização nos dados excedeu o limite máximo.
(Obrigado, Infopath, por uma mensagem de erro específica! Quanto eu preciso pagar para obter o nome do objeto que demitiu o evento ou que você tentou atualizar?)
De qualquer forma, alguém pode descrever uma técnica para realizar isso? Resumindo,
- preencher a primeira linha
YearlyCost
da visão anteriorCurrentFYSpend
- Permitir substituir a primeira linha
YearlyCost
, e povoar linhas posteriormente adquiridas 'YearlyCost
valor padrão paraTotalCost - sum(YearlyCost)
Solução 2
E outra técnica de Jimmy Riche no fóruns Infopathdev.com:
CurrentFYSpend
tem uma regra que define YearlyCost = .
RunningTotal
tem um valor padrão de sum(YearlyCost)
, atualizado quando a fórmula é recalcada.Remaining
tem um valor padrão de TotalCost - RunningTotal
, atualizado quando a fórmula é recalcada.
finalmente, o YearlyCost
o campo na tabela repetida tem um valor padrão de
(Remaining) * (Remaining > 0)
, não Atualizado quando a fórmula é recalcada. (truque legal, hein?)
Isso funciona bem, embora a fórmula para YearlyCost
é, hum, não óbvio. Mas estou descobrindo que muito XPath é assim-você precisa encontrar soluções não óbvias para coisas que seriam mortas simples em uma linguagem imperativa. De qualquer forma, isso funciona, então estou implementando.
Outras dicas
OK, eu recebi uma resposta de Alec Pojidaev, quem é o especialista em infopata. Ele diz:
Você tem alguns problemas que eu consegui identificar. O primeiro é que você verificou a caixa de seleção "Atualize este valor quando o resultado da fórmula é recalculado" no campo anual. É uma operação única para que você não queira recalculá -la.
O segundo problema é a própria fórmula. O resultado da sua fórmula ../../../my:TotalCost - sum(.)
é absolutamente o mesmo que ../../../my:TotalCost - .
A função sum () não tem sentido nesse contexto.
Se eu entender sua intenção correto, a fórmula certa deve ser:../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
Depois que fiz essas mudanças, o formulário funcionou conforme desejado.
o sum(.)
na fórmula foi gerada automaticamente. Eu construí a fórmula através de apontar e clicar em vez de escrever a expressão XPath. Quando eu adicionei o sum()
função e selecionado o YearlyCost
campo, o editor de fórmula substituiu YearlyCost
com um .
Imaginei que sabia o que estava fazendo, então deixei sozinho. Vejo que preciso prestar muita atenção ao que o XPath subjacente está sendo gerado.