Welcome to Sign in | Help
in Search

determinare zile restanta...

Last post 09-11-2008, 9:43 PM by ThePuiu. 5 replies.
Sort Posts: Previous Next
  •  09-10-2008, 9:35 PM 5592

    determinare zile restanta...

    Ceao, am o problema pe care as vrea sa o rezolv (daca se poate) folosind doar instructiuni SQL (fara sa mai prelucrez in aplicatie). Am 2 tabele:

    CREATE TABLE [dbo].[CONTRACTE](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ID_CLIENT] [int] NULL,
    [NUMAR] [decimal](18, 0) NULL,
    [DATA] [datetime] NULL,
    [NR_RATE] [int] NULL,
    [DATA_PRIMEI_RATE] [datetime] NULL,
    [DERULARE] [bit] NULL CONSTRAINT [DF_CONTRACTE_DERULARE] DEFAULT ((1))
    )
    ON [PRIMARY]

    si
    CREATE TABLE [dbo].[RATE](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [ID_CONTRACT] [int] NULL,               - key in tabela CONTRACTE
    [NR_RATA] [int] NULL,                       - NUMARUL RATEI (1,2,...CONTRACTE.NR_RATE)
    [NRCHIT] [decimal](18, 0) NULL,
    [DATA] [datetime] NULL,                  - data platii
    [SUMA] [decimal](18, 2) NULL,
    ) ON [PRIMARY]

    dupa cum rezulta si din nume, in prima sint contracte si in a doua sint platile (ratele) aferente. Platile sint lunare si au scadenta tot la o luna dupa valoarea CONTRACTE.DATA_PRIMEI_RATE. Deci daca DATA_PRIMEI_RATE=2008-09-01 atunci ratele vor fi scadente : 2008-10-01, 2008-11-01, etc. Ce as vrea: sa obtin ceva de genul: CONTRACTE.NUMAR, DATA_ULTIMEI_RATE_PLATITE, NUMAR_ZILE_RESTANTE(de la data ultimei plati la data de azi)

    Sper ca m-am exprimat suficient de 'citet' ca sa fiu inteles! Daca nu, va stau la dispozitie! Multumesc mult!

  •  09-11-2008, 7:57 AM 5593 in reply to 5592

    Re: determinare zile restanta...

    O posibila solutie:
    DECLARE @id_contract INT
    SET @id_contract = 1

    DECLARE @nr_rata INT --ultima rata
    SET @nr_rata = (SELECT MAX(NR_RATA) FROM RATE WHERE ID_CONTRACT = @id_contract)

    DECLARE @data_scadenta_rata DATETIME
    SET @data_scadenta_rata = DATEADD(mm,@nr_rata,(SELECT DATA_PRIMEI_RATE FROM CONTRACTE WHERE ID=@id_contract))

    DECLARE @data_plata_rata DATETIME
    SET @data_plata_rata = (SELECT DATA FROM RATE WHERE ID_CONTRACT = @id_contract AND NR_RATA=@nr_rata)

    DECLARE @nr_zile_restante INT
    SET @nr_zile_restante = CASE WHEN @data_plata_rata <= @data_scadenta_rata
                THEN 0
                ELSE DATEDIFF(dd,@data_scadenta_rata,@data_plata_rata)
                END

    SELECT @id_contract, @nr_rata, @data_scadenta_rata, @data_plata_rata, @nr_zile_restante

  •  09-11-2008, 1:00 PM 5594 in reply to 5593

    Re: determinare zile restanta...

    O altă soluţie, care poate fi inclusă şi într-un view:

    SELECT *, CASE WHEN DATA_PLATA<DATA_SCADENTA_RATA THEN 0
        ELSE DATEDIFF(day,DATA_SCADENTA_RATA,DATA_PLATA) END AS NR_ZILE_INTARZIERE
    FROM (
        SELECT ID_CLIENT, C.ID AS ID_CONTRACT, NUMAR AS NR_CONTRACT, C.DATA AS DATA_CONTRACT,
            NR_RATA, NRCHIT, R.DATA AS DATA_PLATA, SUMA,
            DATEADD(month, NR_RATA, DATA_PRIMEI_RATE) AS DATA_SCADENTA_RATA
        FROM CONTRACTE C INNER JOIN RATE R ON C.ID=R.ID_CONTRACT
    ) X

    Răzvan
  •  09-11-2008, 2:58 PM 5595 in reply to 5594

    Re: determinare zile restanta...

    va multumesc pt implicare! adevarul e ca as vrea ceva ce ar fi o combinatie intre cele 2! Anume: primul exemplu (cu mici modificari) returneaza exact ce as vrea dar pt un singur contract. A doua varianta returneaza pt toate contractele dar la nivel de rata, eu am nevoie la nivel de contract (un contract are n rate). Cum as putea integra exemplul 1 in ceva de genul:

    SELECT (CE RETURNEAZA EX 1 WHERE @ID_CONTRACT = CONTRACTE.ID) FROM CONTRACTE ?

  •  09-11-2008, 3:53 PM 5596 in reply to 5595

    Re: determinare zile restanta...

    Mai facem o încercare (porţiunile noi sunt scrise apăsat):

    SELECT *, CASE WHEN DATA_PLATA<DATA_SCADENTA_RATA THEN 0
        ELSE DATEDIFF(day,DATA_SCADENTA_RATA,ISNULL(DATA_PLATA,GETDATE())) END AS NR_ZILE_INTARZIERE
    FROM (
        SELECT ID_CLIENT, C.ID AS ID_CONTRACT, NUMAR AS NR_CONTRACT, C.DATA AS DATA_CONTRACT,
            NR_RATA, NRCHIT, R.DATA AS DATA_PLATA, SUMA,
            DATEADD(month, NR_RATA, DATA_PRIMEI_RATE) AS DATA_SCADENTA_RATA
        FROM CONTRACTE C INNER JOIN RATE R ON C.ID=R.ID_CONTRACT
        WHERE NR_RATA=(SELECT MAX(NR_RATA) FROM RATE R2 WHERE R2.ID_CONTRACT=C.ID)
    ) X

    Dacă nu am nimerit ceea ce doreşti, te rog postează şi nişte date de test (preferabil sub formă de instrucţiuni INSERT INTO ... VALUES ...) şi rezultatele dorite pentru acel caz.

    Răzvan
  •  09-11-2008, 9:43 PM 5598 in reply to 5596

    Re: determinare zile restanta...

    am reusit singur sa le combin! acum e ok! multumesc!
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems