8 messaggi dal 03 febbraio 2011
Ciao a tutti, mi servirebbe un consiglio per affrontare nel modo corretto un'implementazione che devo fare.

Meglio una query complessa come un'accodamento di valori da una tabella "MATERIALE" ad una "MATERIALEINUSO" dove sposto i dati solo se la SUM(select MATERIALEUSCITO) - SUM(select MATERIALERIENTRATO) è maggiore di 0, dove materiale, materialeuscito e materialerientrato sono 3 tabelle diverse...

(ovviamente la query non è cosi, ho solo scritto a spanne la logica)

oppure farlo via codice C# tenendo una connessione aperta con un ciclo tipo:

per ogni materiale{
int uscito = SUM(select MATERIALEUSCITO)
int rientrato = SUM(select MATERIALERIENTRATO)
if ((uscito - rientrato) > 0)
INSERT(MATERIALEINUSO)
}

cosa è più performante? oppure posso utilizzare altri metodi?
grazie mille :)
Modificato da gnecco il 23 febbraio 2011 19.11 -
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
personalmente preferisco sempre "caricare" il server rispetto ai client, tanto piu' che indicando ".. per ogni materiale..." mi pare che il traffico di rete relativo possa diventare "importante"... quindi, proprio in questi casi scriverei [ma probabilmente la scriverei comunque :) ] una bella stored procedure..
tutto questo, ovviamente, non sapendo ne' cosa devi fare [che' le tue indicazioni non sono veramente complete :)] ne' "quando" ne' "come"...
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php
8 messaggi dal 03 febbraio 2011
Grazie per la risposta, in effetti non sono stato molto chiaro...

In ogni caso ho completato la storedprocedure che è la seguente:
ALTER PROCEDURE dbo.PRE2_CalcolaMaterialeInUso
(
@preventivo int
)
AS

INSERT INTO TMaterialeInUso(preventivo, materiale, quantita, datauscita, datarientro, stato)
SELECT  TPreventiviMateriale2.preventivo, TPreventiviMateriale2.chiaveCatalogo AS materiale, 
    ((select (case when sum(quantita) is null then 0 else sum(quantita) end) from tddtmateriale where tddtmateriale.preventivo = @preventivo 
    and tddtmateriale.chiavecatalogo = TPreventiviMateriale2.chiaveCatalogo)
    - (select (case when sum(quantita) is null then 0 else sum(quantita) end) from tddrmateriale where tddrmateriale.preventivo = @preventivo 
    and tddrmateriale.chiavecatalogo = TPreventiviMateriale2.chiaveCatalogo))
    as quantita,
    TPreventivi2.uscita AS datauscita, 
    TPreventivi2.rientro AS datarientro, 1 AS stato
FROM  TPreventiviMateriale2 INNER JOIN TPreventivi2 ON TPreventiviMateriale2.preventivo = TPreventivi2.chiave
WHERE  (TPreventiviMateriale2.preventivo = @preventivo) and (((select (case when sum(quantita) is null then 0 else sum(quantita) end) from tddtmateriale where tddtmateriale.preventivo = @preventivo 
    and tddtmateriale.chiavecatalogo = TPreventiviMateriale2.chiaveCatalogo)
    - (select (case when sum(quantita) is null then 0 else sum(quantita) end) from tddrmateriale where tddrmateriale.preventivo = @preventivo 
    and tddrmateriale.chiavecatalogo = TPreventiviMateriale2.chiaveCatalogo))) > 0

RETURN


quello che non mi piace tanto è il fatto di dover rimettere nella clausola WHERE le select per ricalcolare la SUM del materiale, però amen non saprei come fare diversamente.

per quel che riguarda il farlo tramite codice C# l'avrei fatto lato server in ogni caso, non il server di database, ma quello IIS dove è in hosting l'applicativo, quindi sul client non ci sarebbero state operazioni onerose.

grazie mille per l'aiuto e se c'è qualche osservazione da fare sulla stored procedure è ben accetta!
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
posta per favore uno scenario (il piu' ridotto possibile) con i relativi CREATE TABLE e qualche riga di INSERT INTO... che aiuta molto senza dover inventarsi niente
saluti

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.