Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Unterschleife in einem Select

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Gimi27, 6 Mai 2020.

  1. Gimi27

    Gimi27 Benutzer

    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
     
  2. Gimi27

    Gimi27 Benutzer

    Hallo Leute,
    hat sich erledigt.

    Hab das Problem mit mehreren With tmpTabelle Runden gelöst.

    Gruß
    Michael
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden