Nella tabella dei prezzi è indispensabile avere le due date di Inizio e Fine validità, poi dovrà esserci il campo IDListino.
Quest'ultimo farà riferimento alla tabella Listini (IDListino e Descrizione) in cui il primo listino (IDListino=0) si riferisce al listino di costo (o acquisto) , mentre tutti gli altri listini (dal 1 in avanti) sono quelli che utilizzerai per i clienti (privati, aziene, ecc.).
Questo ti assicura una gestione dinamica di creazione listini e prezzi.
Ovviamente, se vuoi gestire i listini personalizzati per cliente, allora dovrai includere anche il campo IDCliente (FK).
Per il listino 'standard', l'IDCliente deve essere 0.
La riga del singolo prezzo va sempre inserita (mai modificata) ex-novo con la data corrente (oggi) come inizio validità e 31/12/9999 come data di fine validità.
Allo stesso tempo, nel prezzo precedente devi modificare la data di fine validità sostituendola con quella precedente (oggi -1) .
Esempio, prendiamo questo articolo:
IDPrezzo IDArticolo IDListino IDCliente DataIniz DataFine Prezzo
1 1 1 0 01/01/2017 31/12/9999 50.00
Quando inserirai il nuovo prezzo (IDPrezzo 2) deve accadere questo:
IDPrezzo IDArticolo IDListino IDCliente DataIniz DataFine Prezzo
1 1 1 0 01/01/2017 31/12/2017 50.00
2 1 1 0 01/01/2018 31/12/9999 55.00
Quindi i record da modificare sono 2.
A questo punto, durante la compilazione sarà semplice caricare il prezzo corretto in base alla data del documento, applicando la condizione:
WHERE DataDocumento BETWEEN DataIniz AND DataFine.
Ciò ti eviterà di sbagliare prezzo anche se stai modificando un vecchio documento (purché tu abbia registrato correttamente le variazioni di prezzo con le date di validità, ovviamente).
Tutto ciò solo per la determinazione del prezzo da listino, quindi senza considerare la questione Ultimo Prezzo e relativo Sconto...