none
Definire una formula per un campo RRS feed

  • Domanda

  • Ciao a tutti
    ho queste 3 tabelle:

    tbStruttureImpostazioni
    id | fk_struttura | markup

    tbCamere
    id | codice_camera | fk_struttura

    tbCamereTariffe
    id | fk_camera | costo

    vorrei creare una colonna 'costo_camera' che è dato da: costo + (costo * markup /100)

    Vorrei evitare di calcolare questo da codice c#.
    E' possibile definire una formula in 'Specifica colonna calcolata' o scrivere una funzione da richiamare da c#? Ammetto che non ho mai utilizzato una funzione.

    Vorrei creare anche una colonna di tipo date che è data dalla data di oggi + tot giorni. Dove tot è un intero memorizzato in un'altra tabella.

    Grazie mille

    • Modificato SviPla mercoledì 14 maggio 2014 09:24
    mercoledì 14 maggio 2014 09:09

Risposte

  • Ciao

    Se la colonna calcolata deve andare nella tabella tbCamereTariffe dovrai definire una FUNCTION tramite il seguente costrutto SQL

    CREATE FUNCTION dbo.GetCostoCamera(int @costo, int @id)
    
    RETURNS INT
    
    AS
    
    	SELECT @costo * (@costo * markup / 100) 
    	FROM dbo.tbCamereTariffe AS tbCT
    	INNER JOIN dbo.tbCamere AS tbC ON tbCT.fk_camera=tbC.id
    	INNER JOIN dbo.tbStruttureImpostazioni AS tbSI ON tbC.fk_struttura=tbSI.fk_struttura
    	WHERE tbCT.id=@id

    La colonna calcolata della tabella la definirai sfruttando la funzione

    ALTER TABLE dbo.tbCamereTariffe
    ADD costo_camera AS dbo.GetCostoCamera(costo, id)

    Se ho compreso male la struttura delle tabelle altera il contenuto della SELECT in modo opportuno. Piu che altro spero ti sia chiaro il ragionamento.

    Daniele

    • Contrassegnato come risposta SviPla mercoledì 14 maggio 2014 16:11
    mercoledì 14 maggio 2014 14:37

Tutte le risposte

  • Ciao SviPla, non puoi usare una computed column per realizzare quello che vuoi in quanto i campi devono essere quelli della tabella in cui la colonna è definita.

    Puoi bypassare il problema sfruttando una funzione che ti restituisca il valore calcolato ed usare la funzione per definire la tua colonna calcolata.

    Ogni qualvolta la colonna verrà acceduta la funzione verrà richiamata ed il valore ricalcolato.

    Daniele

    mercoledì 14 maggio 2014 13:23
  • Ciao Daniele
    grazie per la risposta. Consosco poco sql server, come si realizza quello che tu dici?
    Grazie mille

    mercoledì 14 maggio 2014 13:50
  • Ciao

    Se la colonna calcolata deve andare nella tabella tbCamereTariffe dovrai definire una FUNCTION tramite il seguente costrutto SQL

    CREATE FUNCTION dbo.GetCostoCamera(int @costo, int @id)
    
    RETURNS INT
    
    AS
    
    	SELECT @costo * (@costo * markup / 100) 
    	FROM dbo.tbCamereTariffe AS tbCT
    	INNER JOIN dbo.tbCamere AS tbC ON tbCT.fk_camera=tbC.id
    	INNER JOIN dbo.tbStruttureImpostazioni AS tbSI ON tbC.fk_struttura=tbSI.fk_struttura
    	WHERE tbCT.id=@id

    La colonna calcolata della tabella la definirai sfruttando la funzione

    ALTER TABLE dbo.tbCamereTariffe
    ADD costo_camera AS dbo.GetCostoCamera(costo, id)

    Se ho compreso male la struttura delle tabelle altera il contenuto della SELECT in modo opportuno. Piu che altro spero ti sia chiaro il ragionamento.

    Daniele

    • Contrassegnato come risposta SviPla mercoledì 14 maggio 2014 16:11
    mercoledì 14 maggio 2014 14:37