Unterschleife in einem Select

Gimi27

Benutzer
Beiträge
12
Hallo zusammen,

ich bin dabei eine Stored Procedure zu schreiben. Ich habe schon mehrere Ähnliche fertig. Aber hier stoße ich an Problem und ich weiß noch nicht mal, wie ich die Frage als Google Suche formulieren soll. Am einfachsten deshalb hier der komplette Code bis jetzt:

Code:
CREATE PROCEDURE [dbo].[P_OFB_SuSaDate] 
    -- Add the parameters for the stored procedure here
    @Mandant numeric(4,0) = NULL,
    @datumBereich char(255)  = Null,
    @ProjBereich char(255) = ''
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    declare @Proj_von char(20)
    declare @Proj_bis char(20)
    declare @datum date
    declare @datumVon date
    DECLARE @param2 XML

    -- Bei den Bereichsangaben '-' wie '..' behandeln
    set @datumBereich = REPLACE(@datumBereich, '-', '..')
    set @ProjBereich = REPLACE(@ProjBereich, '-', '..')

    select @param2 = CAST('<i>' + REPLACE(@ProjBereich,'|','</i><i>') + '</i>' AS XML)    -- Projektbereich in XML-Datei überführen mit | als Satztrenner

    --    Auflösen des Datumsbereiches
    if @datumBereich is null Begin
        set @datum = getdate();
        set @datumVon = Null;
    end else if charindex('..', @datumBereich) > 0 Begin                                        -- es ist ein Bereich angegeben worden
        if charindex('..', @datumBereich) = len(@datumBereich) - 1 Begin                        -- der Bereich geht bis aktuell  <Datum>..
            set @datumVon = cast(SUBSTRING(@datumBereich, 0, CHARINDEX('..', @datumBereich)) as date);
            set @datum = Null;
        end else Begin                                                                            -- der Bereich hat einen Anfang und ein Ende oder er beginnt beim erst möglichen Datensatz
            set @datumVon = cast(SUBSTRING(@datumBereich, 0, CHARINDEX('..', @datumBereich)) as date);
            set @datum = cast(SUBSTRING(@datumBereich, charindex('..', @datumBereich)+2,len(@datumBereich) - CHARINDEX('..', @datumBereich)-1) as date);
        end
    end else Begin                                                                                -- es ist kein Bereich angegeben worden
        set @datum = cast(@datumBereich as Date);
        set @datumVon = Null;
    end

    --    Auflösen des Projektbereiches
    declare @tmpTabelle Table (Proj nvarchar(44));
    insert into @tmpTabelle
        SELECT                                                    -- die einzelnen Projektbereiche aus der XML-Datei in Datensätze überführen
            x.i.value('.','NVARCHAR(20)') as Proj
        FROM @param2.nodes('//i') x(i);

    Declare @tmpTabelle3 Table (Konto nvarchar(44), Kontobezeichnung varchar(60), Saldo float)
    insert into @tmpTabelle3
        select
            k.sk_konto,
            k.bezeichng,
            (  -- Hier beginnt das Problem, dies soll quasi eine Schleife sein, die für jeden Datensatz von ktot durchlaufen werden soll und als Ergebnis das Feld Saldo aus @tmpTabelle3 füllt.
                Declare @tmpTabelle2 Table (Konto nvarchar(44), Proj nvarchar(44), Proj_von char(20), Proj_bis char(20), Saldo float);
                insert into @tmpTabelle2                                    -- alle möglichen Kombinationen mit den weiteren Angaben ergänzen (Saldo und Steuersaldo sind zunächst noch NULL)
                    select
                        Proj,
                        case
                            when CHARINDEX('..', Proj) > 0 Then                --Proj_von
                            SUBSTRING(Proj, 0, CHARINDEX('..', Proj))
                        else
                            Proj
                        end,
                        case                                                --Proj_bis
                            when CHARINDEX('..', Proj) = 0 Then
                            Proj
                            when CHARINDEX('..', Proj)+1 = len(Proj) Then
                            '..'
                        else
                            SUBSTRING(Proj, CHARINDEX('..', Proj)+2, len(Proj) - CHARINDEX('..', Proj)-1)
                        end,
                        null                                                -- Saldo
                    from @tmpTabelle;

                update @tmpTabelle2                                            -- zu jedem Kontobereich den Saldo hinzufügen
                    set Saldo = dbo.fct_OFB_SkljSaldoDate(@Mandant, k.sk_konto, @datum, @datumVon, k.sk_Konto, Proj_von, Proj_bis, 'S', null)
                    from @tmpTabelle2

                select sum(Saldo) as Saldo                                    -- Summe über alle Kontobereiche zurückgeben
                from @tmpTabelle2

            )
        from ktot k

END

Im Code gibt es einen Kommentar der mit "Hier beginnt das Problem ..." beginnt.

Hat jemand eine Idee, wie der Code für diese "Unterschleife" richtig eingegeben werden muss?

Und der Code ist am Ende noch nicht fertig. Als Ergebnis soll die komplette @tmpTabelle3 ausgegeben werden. Das ist aber nicht das Problem.

Vielen Dank für eure Hilfe

Michael
 
Werbung:
Oben