Welcome to Sign in | Help
in Search

Verificare facuta cat mai simplu/optimizat

Last post 03-17-2009, 10:34 AM by alinescoo. 3 replies.
Sort Posts: Previous Next
  •  03-16-2009, 1:53 PM 6903

    Verificare facuta cat mai simplu/optimizat

    Salutare,
           Situtia se prezinta in felul urmator: sa zicem ca am o factura care are pe ea 3 produse. Cantitati din aceste produse se pot gasi in 5 depozite. As vrea sa fac o verificare prin care sa se gaseasca in care din aceste depozite s-ar gasi toate cele 3 produse. Toata treaba sa fie facuta pe sql server si pe cat posibil fara cursoare. Any ideas ?

    Tabela cu detalii de la comanda:
    IDDepozit, IDCod, QTY

    Tabela cu stocurile:
    IDDepozit, IDCod, inStock
  •  03-16-2009, 8:30 PM 6905 in reply to 6903

    Re: Verificare facuta cat mai simplu/optimizat

    O joncţiune:
    SELECT C.IDCod ,
        CASE WHEN S.IDCod IS NULL THEN 'NU se afla in stoc sau stocul este insuficient  in depozitul'
        ELSE 'se afla in stoc in depozitul'
        END AS Stare,
        C.IDDepozit
    FROM Comanda AS C LEFT JOIN Stoc S ON C.IDDepozit = S.IDDepozit AND C.IDCod = S.IDCod AND C.QTY <= S.CantitateStoc
    WHERE C.IDComanda = 1

    Daca doresti sa obtii doar produsele aflate in stoc atunci folosesti INNER JOIN.
  •  03-16-2009, 10:21 PM 6906 in reply to 6903

    Re: Verificare facuta cat mai simplu/optimizat

    Dacă vrei să îţi arate doar depozitele în care se găsesc toate produsele din respectiva comandă, atunci poţi folosi ceva de genul:

     

    CREATE TABLE Depozite (ID_Depozit int PRIMARY KEY)

    GO

    CREATE TABLE DetaliiComanda (

          ID_Comanda int,

          ID_Produs int,

          CantitateComanda int NOT NULL,

          PRIMARY KEY (ID_Comanda, ID_Produs)

    )

    GO

    CREATE TABLE DetaliiStoc (

          ID_Depozit int REFERENCES Depozite,

          ID_Produs int,

          CantitateStoc int NOT NULL,

          PRIMARY KEY (ID_Depozit, ID_Produs)

    )

    GO

    INSERT INTO Depozite VALUES (1)

    INSERT INTO Depozite VALUES (2)

    INSERT INTO Depozite VALUES (3)

    GO

    INSERT INTO DetaliiComanda VALUES (1,10,100)

    INSERT INTO DetaliiComanda VALUES (1,11,250)

    INSERT INTO DetaliiComanda VALUES (1,12,300)

    GO

    INSERT INTO DetaliiStoc VALUES (1,10,10)

    INSERT INTO DetaliiStoc VALUES (1,11,10)

    INSERT INTO DetaliiStoc VALUES (1,12,10)

    INSERT INTO DetaliiStoc VALUES (2,10,1000)

    INSERT INTO DetaliiStoc VALUES (2,11,2000)

    INSERT INTO DetaliiStoc VALUES (3,10,200)

    INSERT INTO DetaliiStoc VALUES (3,11,500)

    INSERT INTO DetaliiStoc VALUES (3,12,3000)

     

    DECLARE @ID_Comanda int

    SET @ID_Comanda=1

     

    SELECT ID_Depozit FROM Depozite d

    WHERE NOT EXISTS (

      SELECT * FROM DetaliiComanda c

      LEFT JOIN DetaliiStoc s

        ON c.ID_Produs=s.ID_Produs

        AND s.ID_Depozit=d.ID_Depozit

      WHERE c.ID_Comanda=@ID_Comanda

        AND ISNULL(s.CantitateStoc,0)<=c.CantitateComanda

    )

     

     

    Răzvan

  •  03-17-2009, 10:34 AM 6907 in reply to 6906

    Re: Verificare facuta cat mai simplu/optimizat

    Va multumesc mult pentru sfaturi. Mi-a placut foarte mult modalitatea oferita de rsocol drept urmare o voi folosi.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems