Gestione trigger per verifica date

lunedì 08 giugno 2009 - 10.10

dandi.box Profilo | Junior Member

Buon giorno a tutti, ho 3 tabelle che contengono il campo [dataUltimaSpedizione]


io dovrei aggiornare il campo

OrdiniFornitori.dataUltimaSpedizione

in base a questa logica:

se LettereDiCredito.dataUltimaSpedizione = null e ProformaInvoices.dataUltimaSpedizione = null ... lascio il valore presente in OrdiniFornitori.dataUltimaSpedizione

se LettereDiCredito.dataUltimaSpedizione != null e ProformaInvoices.dataUltimaSpedizione = null ... salvo il valore presente in LettereDiCredito.dataUltimaSpedizione

se LettereDiCredito.dataUltimaSpedizione != null e ProformaInvoices.dataUltimaSpedizione != null ... salvo il valore presente in ProformaInvoices.dataUltimaSpedizione


in poche parole le tabelle seguono questa priorità (dalla meno alla piu importante)


OrdiniFornitori
LettereDiCredito
ProformaInvoices

se è presente un valore (dataUltimaSpedizione) in ProformaInvoices ... questo comanda su tutti ...


se è presente un valore (dataUltimaSpedizione) in LettereDiCredito... questo comanda su tutti solo se ProformaInvoices.dataUltimaSpedizione = null

se LettereDiCredito e ProformaInvoices hanno il campo dataUltimaSpedizione = null lascio il valore già presente in OrdiniFornitori.dataUltimaSpedizione



CREATE TABLE [dbo].[OrdiniFornitori](
[PK_idOrdineFornitore] [bigint] IDENTITY(1,1) NOT NULL,
[data] [smalldatetime] NULL,
[numero] [bigint] NULL,
[dataUltimaSpedizione] [smalldatetime] NULL,
[notifyTo] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[dataUltimaApertura] [smalldatetime] NULL,
[FK_idCopy] [int] NULL,
CONSTRAINT [PK_OrdiniFornitori] PRIMARY KEY CLUSTERED
(
[PK_idOrdineFornitore] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]




CREATE TABLE [dbo].[LettereDiCredito](
[PK_idLetteraDiCredito] [int] IDENTITY(1,1) NOT NULL,
[numero] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[dataEmissione] [smalldatetime] NULL,
[dataScadenza] [smalldatetime] NULL,
[dataUltimaSpedizione] [smalldatetime] NULL,
[importo] [money] NULL,
[FK_idOrdine] [bigint] NULL,
CONSTRAINT [PK_LettereDiCredito] PRIMARY KEY CLUSTERED
(
[PK_idLetteraDiCredito] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]





CREATE TABLE [dbo].[ProformaInvoices](
[PK_idProformaInvoice] [int] IDENTITY(1,1) NOT NULL,
[FK_idOrdineFornitore] [int] NULL,
[numero] [nvarchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[data] [smalldatetime] NULL,
[dataLetteraCredito] [smalldatetime] NULL,
[dataUltimaSpedizione] [smalldatetime] NULL,
[totale] [money] NULL,
CONSTRAINT [PK_ProformaInvoices] PRIMARY KEY CLUSTERED
(
[PK_idProformaInvoice] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


Grazie mille!!

alx_81 Profilo | Guru

>Buon giorno a tutti, ho 3 tabelle che contengono il campo [dataUltimaSpedizione]
>io dovrei aggiornare il campo OrdiniFornitori.dataUltimaSpedizione
Ma perchè invece non scrivi una bella stored procedure che coinvolge tutte le tue logiche prima di eseguire l'update?
Non è necessario ricorrere a trigger..

>Grazie mille!!
di nulla!

--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

squilibrio Profilo | Expert

Perchè purtroppo non posso "toccare" l'applicativo che usa query "interne"....

è possibile tramite trigger?

Thanks

alx_81 Profilo | Guru

>Perchè purtroppo non posso "toccare" l'applicativo che usa query "interne"....
ahi ahi..

>è possibile tramite trigger?
sì, è possibile, e da quanto ho capito tu devi intervenire prima del comando. Quindi puoi usare un trigger INSTEAD OF che prima esegue i tuoi controlli e poi lancia il comando.
Leggi bene la sintassi qui:
http://msdn.microsoft.com/it-it/library/ms189799.aspx

>Thanks
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org

squilibrio Profilo | Expert

Potresti farmi un esempio pratico del mio problema??

Grazie mille!

alx_81 Profilo | Guru

>Potresti farmi un esempio pratico del mio problema??
Mancando alcune informazioni, ho immaginato che la tua chiave di riferimento fosse l'id ordine.
Seguendo la documentazione, puoi creare un trigger sulla tabella OrdiniFornitori che fa a grandi linee questo:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

come puoi notare ho creato un trigger INSTEAD OF INSERT, per ridefinire la insert. Ora tu puoi fare lo stesso per la update. Ho creato il trigger per la OrdiniFornitori e sono andato a leggere i valori dei campi per la chiave che stai per inserire (non so se è corretto, cambia in maniera opportuna la where di valorizzazione delle variabili, mancano informazioni). Questo è un modello dal quale puoi partire per risolvere il tuo problema.
Ciao,
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5