SSIS - valutare un gruppo di record e restituire un campo calcolato

venerdì 23 novembre 2007 - 17.59

roddik1980 Profilo | Junior Member

Vorrei risolvere con un pacchetto SSIS il seguente problema. Come posso fare ???

Hp la seguente tabella:
CREATE TABLE [dbo].[MagDef](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CodArticolo] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
[Magazzino] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL,
[MagDef] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL

id = contatore puro, campo popolato
CodArticolo = codice articolo, può esser duplicato, campo popolato
Magazzino = può contenere vari codici (001, 002, 005, 006, Y52 ecc), campo popolato
MagDef = campo che devo popolare solo coi codici 001, 005, 006 dopo aver fatto delle valutazioni sul campo Magazzino.

Se dovessifarlo in vb o vba all' interno di un pulsante di una form farei così:

Creo ciclo col quale leggo tutti i record della tabella. Se trovo un codArticolo 3 volte con Magazzino = 001 e poi = 005 e poi = 006 per me 001 è prioritario sugli altri quindi andrò ad aggiornare MagDef con 001 per tutti i 3 codArticolo con una UPDATE.

Sostanzialmente devo inserire delle condizioni dentro un ciclo e poi fare un update...

Come posso strutturare il mio pacchetto SSIS ???

Grazie a tutti. Spero di esser stato abbastanza chiaro !

Mark

lbenaglia Profilo | Guru

>Vorrei risolvere con un pacchetto SSIS il seguente problema.
>Come posso fare ???
Tutto dipende cosa intendi con "prioritario"...
Posta una decina di righe con diverti articoli e magazzini (INSERT INTO), spiega il tuo concetto di "priorità" e mostraci quale risultato vorresti al termine dell'operazione di UPDATE.

>Grazie a tutti. Spero di esser stato abbastanza chiaro !
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

alx_81 Profilo | Guru

>Vorrei risolvere con un pacchetto SSIS il seguente problema.
>Come posso fare ???
>
>Hp la seguente tabella:
>CREATE TABLE [dbo].[MagDef](
> [ID] [int] IDENTITY(1,1) NOT NULL,
> [CodArticolo] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
>[Magazzino] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL,
> [MagDef] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL
>
>id = contatore puro, campo popolato
>CodArticolo = codice articolo, può esser duplicato, campo popolato
>Magazzino = può contenere vari codici (001, 002, 005, 006, Y52
>ecc), campo popolato
>MagDef = campo che devo popolare solo coi codici 001, 005, 006
>dopo aver fatto delle valutazioni sul campo Magazzino.
>
>Se dovessifarlo in vb o vba all' interno di un pulsante di una
>form farei così:
>
>Creo ciclo col quale leggo tutti i record della tabella. Se trovo
>un codArticolo 3 volte con Magazzino = 001 e poi = 005 e poi
>= 006 per me 001 è prioritario sugli altri quindi andrò ad aggiornare
>MagDef con 001 per tutti i 3 codArticolo con una UPDATE.
>
>Sostanzialmente devo inserire delle condizioni dentro un ciclo
>e poi fare un update...
>
>Come posso strutturare il mio pacchetto SSIS ???
Quello che mi chiedo è: "E' veramente necessario un SSIS per questa operazione?".
Forse, se identifiche bene le regole, potrebbe bastarti una query di Update..
Se fai come dice Lorenzo, spiegandoci il tuo concetto di priorità, forse riusciamo a risolvere tutto con un'operazione più smart..
Attendiamo
>
>Grazie a tutti. Spero di esser stato abbastanza chiaro !
di nulla!
Alx81 =)

http://blogs.dotnethell.it/suxstellino

roddik1980 Profilo | Junior Member

Eccomi ! Avete ragione, è sempre meglio postare esempi concreti.

Tabella iniziale (ho aggiunto il campo Giacenza per farvi capire meglio l' ambito di sviluppo, parliamo di giacenze a magazzino).
Devo assegnare il Magdefinitivo !

1) Creo tabella:
CREATE TABLE [dbo].[MagDef](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CodArticolo] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
[Magazzino] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL,
[Giacenza] [numeric](18, 2) NULL,
[MagDefinitivo] [nvarchar](3) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

2) Inserisco i dati:
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('1111111111', '001', 10)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('1111111111', '006', 20)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('1111111111', '005', 100)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('1111111111', 'Y50', 55)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('2222222222', '001', 14)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('2222222222', '006', 19)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('2222222222', '007', 25)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('3333333333', '006', 32)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('3333333333', '001', 70)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('3333333333', 'D99', 9)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('4444444444', 'D99', 55)
INSERT INTO dbo.[MagDef]
(CodArticolo,Magazzino,Giacenza)
VALUES
('4444444444', 'Y50', 55)

3) Select dei dati:
SELECT [ID], [CodArticolo], [Magazzino], [Giacenza], [MagDefinitivo]
FROMdbo.[MagDef]

4) Valuto insieme tutti i record con ugual CodArticolo e stabilisco per tutti il MagDefinitivo:

Se un record ha Magazzino <> 001, 005, 006 allora lo devo aggiornare a 001 se trovo lo stesso articolo almeno una volta con Magazzino = 001, a 005 se trovo lo stesso articolo almeno una volta con Magazzino = 005 e non con 001, a 006 se trovo lo stesso articolo almeno una volta con Magazzino = 006 e non con 001 e non con 005.
La priorità Magazzini è la seguente:
001
005
006

Prendiamo il caso del CodArticolo = 1111111111
Lo trovo 4 volte.
('1111111111', '001', 10) - in questo caso MagDefinitivo lo aggiorno con 001, non varia !
('1111111111', '006', 20) - in questo caso MagDefinitivo lo aggiorno con 006, non varia !
('1111111111', '005', 100) - in questo caso MagDefinitivo lo aggiorno con 005, non varia !
('1111111111', 'Y50', 55) - in questo caso MagDefinitivo lo aggiorno con 001

5) Visualizzo la tabella MagDef prima e dopo:

SELECT [ID]
,[CodArticolo]
,[Magazzino]
,[Giacenza]
,[MagDefinitivo]
FROM dbo.[MagDef]

La tabella MagDef prima dell' update:

1 1111111111 001 10.00 NULL
2 1111111111 006 20.00 NULL
3 1111111111 005 100.00 NULL
4 1111111111 Y50 55.00 NULL

La tabella MagDef dopo l' update:

1 1111111111 001 10.00 001
2 1111111111 006 20.00 006
3 1111111111 005 100.00 005
4 1111111111 Y50 55.00 001

Spero di essere stato abbastanza chiaro.

Grazie ancora.

Mark

lbenaglia Profilo | Guru

>INSERT INTO dbo.[MagDef]
> (CodArticolo,Magazzino,Giacenza)
>VALUES
>('4444444444', 'D99', 55)
>INSERT INTO dbo.[MagDef]
> (CodArticolo,Magazzino,Giacenza)
>VALUES
>('4444444444', 'Y50', 55)

Ed in questo caso che non hai 001, 005 e 006?

>Spero di essere stato abbastanza chiaro.
Mica troppo

>Grazie ancora.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roddik1980 Profilo | Junior Member

Scusa, è vero.
Nel caso in cui non ho nè 001, nè 005, nè 006 metto di default 001.

Ciao e grazie.

Mark

lbenaglia Profilo | Guru

>Nel caso in cui non ho nè 001, nè 005, nè 006 metto di default
>001.

Ho aggiunto qualche riga in più al tuo esempio in modo da avere due articoli con rispettivamente il codice magazzino '005' e '006' senza '001'.
Ti allego una soluzione basata su due UPDATE: la prima aggiorna i codici magazzino '001', '005' e '006' mentre la seconda tutti gli altri:

INSERT dbo.MagDef(CodArticolo,Magazzino,Giacenza) VALUES ('5555555555', '005', 78); INSERT dbo.MagDef(CodArticolo,Magazzino,Giacenza) VALUES ('5555555555', 'DR5', 89); INSERT dbo.MagDef(CodArticolo,Magazzino,Giacenza) VALUES ('6666666666', 'GK3', 33); INSERT dbo.MagDef(CodArticolo,Magazzino,Giacenza) VALUES ('6666666666', '006', 48); UPDATE dbo.MagDef SET MagDefinitivo = Magazzino WHERE Magazzino IN('001', '005', '006'); WITH CTE_GetMagCode(CodArticolo, MagDefinitivo) AS ( SELECT CodArticolo , CASE WHEN MIN(Magazzino) NOT IN('001', '005', '006') THEN '001' ELSE MIN(Magazzino) END FROM dbo.MagDef GROUP BY CodArticolo ) UPDATE dbo.MagDef SET MagDefinitivo = CTE.MagDefinitivo FROM dbo.MagDef AS M JOIN CTE_GetMagCode AS CTE ON M.CodArticolo = CTE.CodArticolo WHERE M.MagDefinitivo IS NULL; SELECT * FROM dbo.MagDef; /* Output: ID CodArticolo Magazzino Giacenza MagDefinitivo ----------- --------------- --------- --------- ------------- 1 1111111111 001 10.00 001 2 1111111111 006 20.00 006 3 1111111111 005 100.00 005 4 1111111111 Y50 55.00 001 5 2222222222 001 14.00 001 6 2222222222 006 19.00 006 7 2222222222 007 25.00 001 8 3333333333 006 32.00 006 9 3333333333 001 70.00 001 10 3333333333 D99 9.00 001 11 4444444444 D99 55.00 001 12 4444444444 Y50 55.00 001 13 5555555555 005 78.00 005 14 5555555555 DR5 89.00 005 15 6666666666 GK3 33.00 006 16 6666666666 006 48.00 006 (16 row(s) affected) */ DROP TABLE dbo.MagDef;

>Ciao e grazie.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roddik1980 Profilo | Junior Member

Grazie Lorenzo, mi hai risolto il problema !

Devo ammettere che è quasi impossibile che un problema postato in questo forum non venga risolto, tra l' altro in tempi brevi !
Grande competenza e disponibilità ! Questo vale anche per Alx_81 il quale mi ha aiutato a risolvere problematiche passate !

Ora provo a mettere tutta l' istruzione SQL dentro un pacchetto SSIS in quanto ho bisogno di automatizzare il processo !

Grazie ancora e buona serata.

Mark

lbenaglia Profilo | Guru

>Ora provo a mettere tutta l' istruzione SQL dentro un pacchetto
>SSIS in quanto ho bisogno di automatizzare il processo !

Se con "automatizzare" intendi schedulare un processo, non c'è bisogno di scomodare i SSIS.
E' sufficiente definire un job con uno step che esegua i due comandi di UPDATE e scegliere una schedulazione in modo che il tutto venga automaticamente eseguito ogni x tempo.

>Grazie ancora e buona serata.
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roddik1980 Profilo | Junior Member

Grazie. Non ho mai usato i job !
Mi puoi per favore indicare qualche risorsa online dove trovare esempi pratici dei job !?

Ciao

lbenaglia Profilo | Guru

>Mi puoi per favore indicare qualche risorsa online dove trovare
>esempi pratici dei job !?

Le informazioni che ti servono le trovi sui Books Online.
Inizia dal seguente capitolo:

"Implementing Jobs"
http://technet.microsoft.com/en-us/library/ms187880.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

roddik1980 Profilo | Junior Member

In italiano non c' è ancora nulla ?

Grazie

lbenaglia Profilo | Guru

>In italiano non c' è ancora nulla ?
Sostituisci "en-us" con "it-it":
http://technet.microsoft.com/it-it/library/ms187880.aspx

>Grazie
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
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