Come pre-compilare un campo di riassunta in una tabella ripetuta Infopath
Domanda
Ho un modulo di InfoPath 2007 con diverse viste, destinati ad essere utilizzati in un browser. Ho problemi precompilarlo un campo di una tabella ripetuta, iniziando con un determinato valore e quindi utilizzando un valore predefinito formula derivata.
Nella visualizzazione Summary
, chiedo TotalCost
di un progetto e di spesa programmato l'anno fiscale in corso di (CurrentFYSpend
):
+------------------------------+ | Project Summary | +------------------------------+ | Total Cost: $100,000 | -- TotalCost | Current FY Spend: $ 25,000 | -- CurrentFYSpend +------------------------------+Sulla prossima vista (
Detail
), ho una tabella FYSpending
ripetuta in cui l'utente ha bisogno di uscire TotalCost
del progetto su un numero arbitrario di esercizi. La tabella FYSpending
ha un campo YearlyCost
che sostiene la spesa stimata di quell'anno. Sotto la tabella ripetuta ho campi RunningTotal
e Remaining
. RunningTotal
ha un valore predefinito di sum(YearlyCost)
; Remaining
ha un valore predefinito di TotalCost - sum(YearlyCost)
; insieme mostrano all'utente come gran parte del totale è già stato rappresentato, e quanto hanno ancora bisogno di uscire in fila anno fiscale.
Quando è necessario inserire la vista Detail
, il campo YearlyCost
della prima riga della tabella ripetuta FYSpending
deve essere presente il valore 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) +--------------------------------+
Quando l'utente aggiunge una nuova riga anno fiscale, voglio che il valore predefinito di campo YearlyCost
della nuova riga da calcolare come l'importo rimanente: 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 | +--------------------------------+
Ho problemi perché il conflitto due azioni Precompilazione tra loro e sembrano essere la creazione di una condizione di competizione. Ho cercato di impostare una regola sul campo Summary
del CurrentFYSpend
per impostare il valore di FYSpending
di YearlyCost
, quindi impostare un valore predefinito sul campo YearlyCost
per impostare Value: TotalCost - sum(YearlyCost)
. Quando ho salvare il modulo, ottengo il seguente errore:
è verificato un errore nel codice del modulo. Il numero di chiamate al Modificato evento per un singolo aggiornamento nei dati superato il limite massimo.
(Grazie, InfoPath, per tale specifico messaggio di errore! Quanto ho bisogno di pagare per ottenere il nome dell'oggetto che ha attivato l'evento, o che si è tentato di aggiornare?)
In ogni caso, qualcuno può descrivere una tecnica per realizzare questo? In sintesi,
- popolare
YearlyCost
prima di fila dalCurrentFYSpend
della vista precedente - permettere l'override
YearlyCost
della prima fila, e popolare, successivamente, il valore aggiunto di defaultYearlyCost
le righe perTotalCost - sum(YearlyCost)
Soluzione 2
E un'altra tecnica da Jimmy Riche presso il infopathdev.com forum :
CurrentFYSpend
ha una regola che imposta YearlyCost = .
RunningTotal
ha un valore predefinito di sum(YearlyCost)
, aggiornato quando la formula è recalc'd.
Remaining
ha un valore predefinito di TotalCost - RunningTotal
, aggiornato quando la formula è recalc'd.
Infine, il campo YearlyCost
nella tabella ripetuta ha un valore predefinito di
(Remaining) * (Remaining > 0)
, non aggiornati quando la formula è recalc'd. (Trucco pulito, eh?)
Questo funziona bene, anche se la formula per YearlyCost
è, um, non ovvie. Ma, ho constatato che un sacco di XPath è così - è necessario trovare soluzioni non ovvie per cose che sarebbe morto semplice in un linguaggio imperativo. In ogni caso, questo funziona, quindi sto attuazione.
Altri suggerimenti
OK, ho ricevuto una risposta da Alec Pojidaev , che è piuttosto l'esperto di InfoPath. Egli dice:
Hai problemi di coppia sono stato in grado di individuare. Il primo è che hai controllato casella di controllo "Aggiorna questo valore quando risultato della formula viene ricalcolato" su YearlyCost campo. Il suo funzionamento una volta in modo da non volete ricalcolare esso.
Il secondo problema è la formula stessa. Il risultato del vostro ../../../my:TotalCost - sum(.)
formula è assolutamente lo stesso di ../../../my:TotalCost - .
sum () funzione non hanno alcun senso in quel contesto.
Se ho capito la tua intenzione di correggere la formula giusta dovrebbe essere:
../../../my:TotalCost - sum(../../my:FY/my:YearlyCost)
Dopo aver fatto queste modifiche, il modulo lavorato come desiderato.
Il sum(.)
nella formula è stata generata automaticamente. Ho costruito la formula attraverso point-and-click, piuttosto che scrivere l'espressione XPath. Quando ho aggiunto la funzione sum()
e selezionato il campo YearlyCost
, l'editor di formule sostituito YearlyCost
con un .
ho pensato che sapeva ciò che stava facendo, così ho lasciato da solo. Vedo che ho bisogno di prestare molta attenzione a ciò che viene generato XPath sottostante.