Welcome to Sign in | Help
in Search

Procedura stocata in procedura stocata...?

Last post 11-30-2007, 12:47 PM by katalyn. 7 replies.
Sort Posts: Previous Next
  •  11-29-2007, 3:09 AM 3495

    Procedura stocata in procedura stocata...?

    Am o SP folosita ca sursa pt un raport crystal. Sa zicem ca in SP se face : SELECT NRDOC, DATA, VALOARE, MONEDA FROM FACTURI.
    Tabela FACTURI e de genul:
    CREATE TABLE [dbo].[FACTURI](
    [ID] [decimal](18, 0) IDENTITY(1,1) NOT NULL,
    [NRDOC] [decimal](18, 0) NULL,
    [DATA] [smalldatetime] NULL,
    [ID_PARTENER] [decimal](18, 0) NULL,
    [MONEDA] [nvarchar](5) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [VALOARE] [money] MULL,
    [TVA] [money] NULL,)
    ON [PRIMARY]


    Moneda facturii poate sa fie EUR, USD, etc.
    Eu am nevoie in SP de un cimp in care sa am valoarea in RON din data facturii.
    Tabela cu cursuri:
    CREATE TABLE [dbo].[CURSURI](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DATA] [smalldatetime] NULL,
    [EUR] [money] NULL CONSTRAINT [DF_CURSURI_EUR] DEFAULT ((0)),
    [USD] [money] NULL CONSTRAINT [DF_CURSURI_USD] DEFAULT ((0)),
    [CHF] [money] NULL CONSTRAINT [DF_CURSURI_CHF] DEFAULT ((0)),
    [HUF] [money] NULL CONSTRAINT [DF_CURSURI_HUF] DEFAULT ((0)),
    [GBP] [money] NULL
    )
    ON [PRIMARY]

    Cum as putea sa fac asta? Sa fac o SP care sa primeasca ca parametrii de intrare DATA, MONEDA si VALOARE si sa returneze VAL_IN_RON. Cum inserez in SP principala rezultatul acesteia? Se poate si altfel mai eficient/elegant?

    Multumesc!

  •  11-29-2007, 9:17 AM 3496 in reply to 3495

    Re: Procedura stocata in procedura stocata...?

    Rezultatul unei proceduri stocate se poate refolosi cu un INSERT EXEC, însă asta e o ultimă soluţie, dacă nu este posibilă modificarea acelei proceduri.

    În cazul acesta, e posibil cu un simplu JOIN şi un CASE:

    SELECT *, Valoare*Curs as ValoareInLei FROM (
     SELECT F.*, CASE Moneda WHEN 'EUR' THEN EUR WHEN 'USD' THEN USD /*...*/ END AS Curs
     FROM Facturi F LEFT JOIN Cursuri C ON F.Data=C.Data
    ) x

    Răzvan

  •  11-29-2007, 9:29 AM 3497 in reply to 3495

    Re: Procedura stocata in procedura stocata...?

    O solutie mai buna ar fi sa folosesti o functie care sa realizeze conversia valutara:

     

    INSERT INTO CURSURI (DATA,EUR,USD,CHF,HUF,GBP) VALUES ('2007-01-05',2,22,222,2222,22222)

    INSERT INTO CURSURI (DATA,EUR,USD,CHF,HUF,GBP) VALUES ('2007-01-06',3,33,333,3333,33333)

    --simulare o zi de weekend si lipsa anumite cursuri

    INSERT INTO CURSURI (DATA,EUR,USD,CHF,HUF,GBP) VALUES ('2007-01-08',4,44,NULL,NULL,NULL)

    INSERT INTO CURSURI (DATA,EUR,USD,CHF,HUF,GBP) VALUES ('2007-01-09',5,NULL,555,5555,55555)

    GO

     

    CREATE FUNCTION Conversie_Valutara( @dt DATETIME, @vl CHAR(3), @sm MONEY )

    RETURNS MONEY

    BEGIN

          DECLARE @sm_valuta MONEY, @sm_conversie MONEY

          SET @sm_valuta = (SELECT CASE @vl

                                              WHEN 'EUR' THEN EUR

                                              WHEN 'USD' THEN USD

                                              WHEN 'CHF' THEN CHF

                                              WHEN 'HUF' THEN HUF

                                              WHEN 'GBP' THEN GBP

                                              END

                                        FROM CURSURI

                                        WHERE DATA = (SELECT MAX(DATA)

                                                          FROM CURSURI

                                                          WHERE DATA <= @dt

                                                                AND CASE @vl

                                                                      WHEN 'EUR' THEN EUR

                                                                      WHEN 'USD' THEN USD

                                                                      WHEN 'CHF' THEN CHF

                                                                      WHEN 'HUF' THEN HUF

                                                                      WHEN 'GBP' THEN GBP

                                                                      END IS NOT NULL

                                                                AND CASE @vl

                                                                      WHEN 'EUR' THEN EUR

                                                                      WHEN 'USD' THEN USD

                                                                      WHEN 'CHF' THEN CHF

                                                                      WHEN 'HUF' THEN HUF

                                                                      WHEN 'GBP' THEN GBP

                                                                      END > 0))

          SET @sm_conversie = ISNULL(@sm_valuta,0)*@sm

          RETURN @sm_conversie

    END

    GO 

    SELECT dbo.Conversie_Valutara('2007-01-05','USD',1000) AS Suma

    SELECT dbo.Conversie_Valutara('2007-01-06','USD',1000) AS Suma

    SELECT dbo.Conversie_Valutara('2007-01-07','USD',1000) AS Suma

    SELECT dbo.Conversie_Valutara('2007-01-08','USD',1000) AS Suma

    SELECT dbo.Conversie_Valutara('2007-01-09','USD',1000) AS Suma

     

  •  11-29-2007, 9:40 AM 3498 in reply to 3497

    Re: Procedura stocata in procedura stocata...?

    Daca functia nu poate gasi un curs valabil la data solicitata atunci intoarce 0 - zero iar

    câmpul DATA trebuie să fi cheie primară sau cheie candidat (valori unice si nenule/non-nule).

  •  11-29-2007, 10:54 AM 3500 in reply to 3498

    Re: Procedura stocata in procedura stocata...?

    Daca lucrezi pe SQL 2005, poti folosi pentru conversia valutara o functie CLR, care la randul ei "ia" cursul dintr-un web service.

    * Acum vreo 3 ani am avut nevoie de un assemenea web service. Din pacate am cautat in zadar un furnizor in RO...Sper ca au avut loc schimbari in bine (???) 

  •  11-29-2007, 12:16 PM 3502 in reply to 3500

    Re: Procedura stocata in procedura stocata...?

    Serviciu web

    http://www.infovalutar.ro/curs.asmx?WSDL

     

    Iar cursurile trebuie sa fie stocate tot in baza de date.

    Eventual un serviciu Windows instalat pe server-ul SQL sa apeleze la anumite ore / interval serviciul web si sa insereze in baza de date cursurile valutare ( hmmmmm ... ) sau serviciul web sa fie apelat de catre aplicatia client care ulterior realizeaza inserarea datelor privitoare la cursurile din ziua respectiva in baza de date ...

  •  11-29-2007, 12:28 PM 3503 in reply to 3502

    Re: Procedura stocata in procedura stocata...?

    Da! exact acest lucru il folosesc!

    Multumesc pt sfaturile date!

    PS: am uitat sa precizez un lucru....in tabela cursuri nu exista si o coloana RON ...in cazul acesta, cum sa modific functia ca atunci cind parametrul de intrare este RON functia sa returneze exact valoarea de intrare? Am incercat sa fac o selectie dupa moneda dar nu imi dau seama cum se poate face in SQL o chestie de genul:

    case 'EUR':
    case 'USD':
    case 'HUF':
    then
    .......
    end

     

    PPS:
    am reusit, dar ramine intrebarea cu multiple case...

  •  11-30-2007, 12:47 PM 3520 in reply to 3503

    Re: Procedura stocata in procedura stocata...?

    Daca parametrul este RON, atunci trebuie să modifici funcţia pentru a returna aceeaşi valoare dar nu este nevoie neapărat să modifici CASE-ul, poţi să adaugi codul de mai jos:

    IF NOT EXISTS(SELECT 'EXISTA' WHERE @v1 IN ('EUR','USD','CHF','HUF','GBP'))

    SET @sm_conversie=@sm

    ELSE BEGIN

    .....[corpul functiei care contine case]

    END  

     

    Later edit: 

    IF-ul se poate scrie mai usor asa: IF @v1 NOT IN ('EUR','USD','CHF','HUF','GBP')


    Cătălin D.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems