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,

  1. preencher a primeira linha YearlyCost da visão anterior CurrentFYSpend
  2. Permitir substituir a primeira linha YearlyCost, e povoar linhas posteriormente adquiridas ' YearlyCost valor padrão para TotalCost - sum(YearlyCost)
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top