37 messaggi dal 24 aprile 2007
AIUTOOO !!! SQL Server 2005 - sommare giacenze di magazzino dopo aver valutato alcune condizioni

Buon pomeriggio a tutti,

ho il seguente problema:
Database SQL Server 2005 con 2 tabelle. Le tabelle vengono alimentate da 2 file flat .txt estratti da un gestionale del mio cliente e caricati nel mio DB tramite SSIS.

1) Creo “Tabella1”
CREATE TABLE [dbo].[Tabella1](
[idContatoreRiga] [int] IDENTITY(1,1) NOT NULL,
[idArticolo] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
[Giacenza] [numeric](18, 2) NULL
) ON [PRIMARY]

idArticolo = codice articolo del prodotto
Giacenza = giacenza a magazzino del codice articolo prodotto

2) Popolo “Tabella1” (ora solo con 9 record ma in realtà ne conterrà circa 450.000)

INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (1111111111, 20.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (2222222222, 40.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (3333333333, 50.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (4444444444, 20.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (5555555555, 2.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (6666666666, 30.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (7777777777, 12.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (8888888888, 25.00)
INSERT INTO Tabella1 ( idArticolo, Giacenza)
VALUES (9999999999, 33.00)

3) SELECT “Tabella1”
idContatoreRiga idArticolo Giacenza
--------------- --------------- ---------------------------------------
1 1111111111 20.00
2 2222222222 40.00
3 3333333333 50.00
4 4444444444 20.00
5 5555555555 2.00
6 6666666666 30.00
7 7777777777 12.00
8 8888888888 25.00
9 9999999999 33.00

(Righe interessate: 9)

4) Creo “Tabella2”
CREATE TABLE [dbo].[Tabella2](
[idContatoreRiga] [int] IDENTITY(1,1) NOT NULL,
[idArticoloA] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
[idArticoloB] [nvarchar](15) COLLATE Latin1_General_CI_AS NULL,
[Intercamb] [nchar](3) COLLATE Latin1_General_CI_AS NULL,
[Status] [nchar](2) COLLATE Latin1_General_CI_AS NULL
) ON [PRIMARY]

idArticoloA = codice articolo prodotto sostituito
idArticoloB = codice articolo prodotto sostituivo di idArticoloA
Intercambiab = codice intercambiabilità
Status = codice status


5) Popolo “Tabella2” (ora solo con 9 record in realtà ne conterrà circa 8.000)

INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (1111111111, 5555555555, 1, 20)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (2222222222, 7777777777, 1, 40)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (3333333333, 5555555555, 1, 20)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (3333333333, 7777777777, 1, 40)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (4444444444, 1111111111, 2, 50)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (7777777777, 8888888888, 1, 20)
INSERT INTO Tabella2 (idArticoloA, idArticoloB, Intercamb, Status)
VALUES (2222222222, 9999999999, 1, 40)

6) SELECT “Tabella2”
id idArticoloA idArticoloB Intercamb Status
----------- --------------- --------------- --------- ------
1 1111111111 5555555555 1 20
2 2222222222 7777777777 1 40
3 3333333333 5555555555 1 20
4 3333333333 7777777777 1 40
5 4444444444 1111111111 2 50
6 7777777777 8888888888 1 20
7 2222222222 9999999999 1 40


(Righe interessate: 6)

7) Obiettivo da raggiungere:

idArticoloB identifica un articolo/parte di ricambio in una logica di “riparazione di un componente rotto” e può sostituire idArticoloA.

Nella “Tabella2” se idArticoloA (articolo sostituito) ha un idArticoloB con “Intercamb = 1 e Status = 20 or 40” (articolo sostitutivo) devo sommare la giacenza di idArticoloA a quella di idArticoloB azzerando alla fine del ciclo la giacenza di idArticoloA ! idArticoloB si porta a casa la giacenza di idArticoloA.

Come si può vedere dalla select della Tabella2 ho però alcune eccezioni da gestire:
ESEMPI

1) record con id = 2 e 7 (stesso idArticoloA) ha ben 2 idArticoloB entrambi con Intercamb = 1 e Status = 40 ! Quale prendo mi direte voi ??? In questo caso devo verificare 2 condizioni: 1° se uno dei due &#8220;idArticoloB&#8221; per caso inizia con il carattere &#8220;P&#8221; lo prendo altrimenti (anche se per esempio entrambi iniziano con la &#8220;P&#8221;) passo alla 2° condizione, vado a verificare nella &#8220;Tabella1&#8221; quale dei due &#8220;idArticoloB&#8221; ha giacenza <> 0 (zero): se entrambi hanno giacenza = 0 oppure <> 0 non faccio nulla, chiudo il ciclo e segnalo il caso al cliente in fase di output con un report.

2) record con id = 2 e 4 vengono sostituiti da un idArticoloB = 7777777777 che ha tutti i requisiti per farlo però anch&#8217; esso a sua volta ha un sostitutivo (8888888888) vedi id = 6 !!! Questa è una eccezione del gestionale del cliente&#8230;. Come la gestisco mi direte voi ?! Considero 8888888888 come sostitutivo di 7777777777 anche se quest&#8217; ultimo ha Intercamb = 1 e Status = 40 !

Posso tranquillamente creare una terza tabella (Tabella3) all&#8217; interno della quale mettere il risultato dell&#8217; elaborazione oppure posso creare un campo aggiuntivo all&#8217; interno della Tabella1. Non ha importanza&#8230;..

Mi scuso, capisco che non è una elaborazione facile !
Ho provato con delle query di UPDATE ma non ci sono riuscito ! Prima di creare una routtine VB.net, che mi porterà via parecchio tempo, vi chiedo un consiglio sulla soluzione da adottare per gestire questo processo valutando ogni eccezione
SSIS ? T-SQL ? STORED PROCEDURE ? Codice VB.net ?

Grazie molte in anticipo a coloro che mi aiuteranno.

Mark
1.976 messaggi dal 27 luglio 2005
Contributi
salve,
roddik1980 wrote:
AIUTOOO !!! SQL Server 2005 - sommare giacenze di magazzino dopo aver valutato alcune condizioni

segui le risposte di Davide sul forum di UGISS che, come ha detto Lorenzo in it.sql, si e' preso carico di te
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.