Il miglior approccio per implementare un'operazione di aggiornamento di un oggetto contenitore?

1

Ho un oggetto Fattura che può contenere diversi oggetti FacturedServices come elenco.

Nell'interfaccia può, l'utente può modificare un oggetto Fattura, eliminare aggiungere o modificare il suo elenco FacturedServices.

Quando l'utente ha premuto il pulsante Salva, gli aggiornamenti apportati all'oggetto Invoice dovrebbero essere passati anche al database.

Il problema è che l'elenco FacturedServices conterrà dati eterogenei, perché alcuni dei suoi elementi sono nuovi, altri modificati e alcuni di essi sono stati cancellati dalla lista.

Qual è il modo migliore per implementare l'aggiornamento della fattura dell'oggetto Fattura nel database?

Stavo pensando di aggiungere una proprietà dirty su ogni oggetto FacturedService, ogni volta che viene modificata, o impostare la proprietà su "new" quando è appena creata e poi fare qualcun altro nel mio controller: \

Se ritieni che la mia domanda debba essere riformulata, ti preghiamo di farlo

EDIT : Dì che ho un oggetto Fattura I , Ha 3 FacturedServices FS1, FS2, FS3

Nell'interfaccia, l'utente ha modificato FS1, eliminato FS2 e aggiunto FS4 all'elenco

ora l'elenco contiene FS1 modificato, FS3 invariato e FS4 appena creato.

nel mio database, ho un InvoiceTable e un FactureServicesTable con un riferimento invalicabile all'ID fattura.

il mio problema è nel mio controller, ci deve essere un modo per sapere quale FS è nuovo, quale è stato aggiornato e quale è stato cancellato, quindi posso eseguire i comandi SQL corretti a seconda della situazione.

So che non è una novità, in ogni applicazione desktop a un certo punto dovrebbe esserci qualcosa di simile al mio problema. quindi qual è il modo migliore per farlo.

    
posta user3147619 15.12.2014 - 18:03
fonte

3 risposte

1

Vorrei aggiungere un metodo duplicate() a invoice , in modo che la fattura modificata sia sempre una copia dell'originale.

Se l'utente annulla la modifica, il duplicato viene scartato e non accade nient'altro.

Se l'utente invia le sue modifiche, allora confronterei la fattura modificata con la fattura originale per capire quali campi dovrebbero essere aggiornati sul database, e vorrei anche percorrere i rispettivi elenchi di funzionalità per vedere quali funzionalità sono state aggiunte , che è stato modificato e che sono stati cancellati.

Bonus:

Un'implementazione facoltativa della funzione di confronto che non esegue alcun salvataggio nel database può anche essere utilizzata per calcolare in qualsiasi momento lo stato abilitato dei pulsanti "ok", "applica" e "ripristina" della fattura modulo di modifica, così come il testo del pulsante 'cancella' (sempre abilitato).

Quando la fattura modificata è identica all'originale, i pulsanti "ok", "applica" e "ripristina" dovrebbero essere disabilitati, mentre il testo del pulsante "annulla" dovrebbe essere "chiuso".

Quando la fattura modificata differisce dall'originale, i pulsanti "ok", "apply" e "revers" dovrebbero essere abilitati, mentre il testo del pulsante "cancel" dovrebbe essere "cancel".

    
risposta data 13.02.2015 - 21:12
fonte
1

Semplicemente salverò le opearations create dall'utente e dagli oggetti interessati in Map <String, List<FacturedServices>> . Se un utente cancella un FacturedServices, verrà aggiunto alla mappa con un tasto "DELETE". Quindi eseguirò l'iterazione sulla mappa ed eseguirò l'eliminazione, l'aggiornamento o la creazione di comandi in base alle chiavi. Una soluzione più professionale sarebbe quella di implementare uno schema di comando, ma per il momento va bene, se pensi a qualcosa di meglio fammelo sapere, sarò lieto di discuterne.

Grazie per il tuo tempo

    
risposta data 15.12.2014 - 19:02
fonte
1

Perché non basta passare l'intera lista al tuo database (ristrutturato come un tipo di tabella definito dall'utente)? Quindi puoi scorrere su di esso nella stored procedure e prendere l'azione appropriata? Se la riga esiste nel database, aggiornarla. Se esiste per quella fattura nella nuova tabella ma non nel database, inserirla. Se esiste nel database ma non nella nuova tabella, eliminalo.

    
risposta data 14.01.2015 - 19:50
fonte

Leggi altre domande sui tag