Announcement

Collapse
No announcement yet.

Stückliste - rekursive Liste

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stückliste - rekursive Liste

    Hallo zusammen,

    ich verzweifel gerade an einem rekursiven Aufruf. Ich schätze, mein Verknüpfung haut irgendwo nicht hin.
    Problemstellung: Wir haben eine Tabelle mit Stücklisten. Eine Stückliste kann 1-n Artikel enthalten, die ihrerseits wieder Stücklisten sein können. Nun soll für jede Stückliste die darunterliegenden Ebenen dargestellt werde. Ich hab ein wenig gegoogelt, aber ich scheitere daran, dass die Rekursionstiefe nicht ausreicht.

    Hier wäre mein Aufruf:
    Code:
    with Stueckliste (Kopfartikel, Stuecklistenartikel, Ebene)
    as
    ( 
      SELECT PBL.[Production BOM No_] as Kopfartikel, PBL.No_ as Stuecklistenartikel, 1 as Ebene
     FROM [Production BOM Line] AS PBL where PBL.Type = 1 and
     PBL.[Production BOM No_] = 3200021
     union all
     select STL.Kopfartikel, PBL2.No_, Ebene + 1
     from Stueckliste as STL, [Production BOM Line] as PBL2
     where STL.Stuecklistenartikel = PBL2.No_
    )
    select top 10 * from Stueckliste where Ebene <= 3
    
    
    order by Kopfartikel option (maxrecursion 500)
    Ich habe das nun schon auf eine Stückliste beschränkt, die in 11 Artikel aufgelöst wird - wieso reicht da eine Rekursionstiefe von 500 noch nicht aus - kann mir da jemand weiterhelfen? Soll hinterher so aussehen

    Kopfartikel Stuecklistenartikel Ebene
    3200021 1084401 1
    3200021 1570701 2 <Stücklistenartikel aus der Stückliste 1084401
    3200021 1055801 2 <Stücklistenartikel aus der Stückliste 1084401
    3220021 1622201 1

    und so weiter ^^

    Danke und Gruß

    Carsten
    Zuletzt editiert von Carsten Meister; 04.08.2009, 13:39.

  • #2
    Wenn es nur an der Rekursionstiefe liegt, kannst du diese ja mal vorsichtig erhöhen über den Abfragehinweis MAXRECURSION (im Text mal danach suchen, es gibt weiter unten auch ein Beispiel dazu).

    bye,
    Helmut

    Comment


    • #3
      Hatte ich schon bis zum Maximum - ich hab aber gerade rausgefunden was falsch war ^^ - hier der korrigierte Code:


      Code:
      with Stueckliste (Kopfartikel, Stuecklistenartikel, Ebene)
      as
      ( 
        SELECT PBL.[Production BOM No_] as Kopfartikel, PBL.No_ as Stuecklistenartikel, 1 as Ebene
       FROM [Production BOM Line] AS PBL where PBL.Type = 1 and
       PBL.[Production BOM No_] = '3200021'
       union all
       select STL.Kopfartikel, PBL2.No_, Ebene + 1
       from Stueckliste as STL, [Production BOM Line] as PBL2
       where STL.Stuecklistenartikel = PBL2.[Production BOM No_]
      )
      select * from Stueckliste
      
      
      order by Kopfartikel
      Hatte glatt vergessen dass das ein Textfeld ist

      So jedenfalls funktioniert das.

      MfG

      Carsten

      Comment


      • #4
        Hallo zusammen,

        ich habe die Stücklistenauflösung mittlerweile hinbekommen. Unsere Datenbank beinhaltet Dynamics NAV 4.03 - Tabellen - da wird bei den Stücklisten mit 2 Tabellen gearbeitet, dem Production BOM Header und der der Production BOM Line (nur so zm Verständnis ^^). Von daher hat jede Komponente eines Stücklistenartikels eine Zeilennummer, welche ich für die Sortierung (als VARCHAR-Typ) benutze. Nun habe ich das Problem, dass ich nicht weiss, wie ich in folgendem Code die Länge des Varchars ändern kann - das scheint festgelegt auf 20 Stellen, ich benötige aber deutlich mehr .... hier der Code:

        Code:
        with Stueckliste (Basisartikel, Kopfartikel, Stuecklistenartikel, Komponentenmenge, Zeilenebene, Zeile, Ebene)
        as
        ( 
          SELECT PBL.[Production BOM No_] as Basisartikel,PBL.[Production BOM No_] as Kopfartikel, PBL.No_ as Stuecklistenartikel, 
          Quantity, convert(varchar, pbl.[Line No_]), pbl.[Line No_], 1 as Ebene
         FROM [Production BOM Line] AS PBL where PBL.Type = 1 and
         PBL.[Production BOM No_] = '3200021' or PBL.[Production BOM No_] = '3200023'
         union all
         select STL.Basisartikel, PBL2.[Production BOM No_] as Kopfartikel, PBL2.No_, Quantity,
         cast(stl.Zeilenebene + convert(varchar,pbl2.[Line No_]) as varchar),pbl2.[Line No_], Ebene + 1
         from Stueckliste as STL, [Production BOM Line] as PBL2
         where STL.Stuecklistenartikel = PBL2.[Production BOM No_]
        )
        select cast(convert(varchar,Basisartikel) + Zeilenebene as varchar) as ID, Basisartikel, Kopfartikel, Stuecklistenartikel, cast(Komponentenmenge as decimal(10,2)) as Menge, Zeilenebene, Ebene from Stueckliste
        
        order by Basisartikel, Zeilenebene
        Hat jemand eine Idee?

        MfG

        Carsten

        Comment


        • #5
          Hallo Carsten,

          Auszug aus der BOL zur Convert-Funktion:
          Wenn für CONVERT der length-Parameter nicht angegeben ist, wird der Standardwert 30 verwendet

          Wenn das Feld länger ist und Du alles davon haben willst, musst Du die Länge explizit angeben:

          select cast(convert(varchar(100),Basisartikel)
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Gelöst: Stücklistendarstellung

            Hallo,

            ja, jetzt hab ich es raus. War ein kleiner Krampf, aber eine gute Übung. Die Stücklistenfunktion funktioniert jetzt richtig gut; über die zusammengesetzte SortID werden die Ebenen auch richtig dargestellt. Hier dann die endgültige Fassung:

            Code:
            WITH Stueckliste(Basisartikel, Kopfartikel, Strukturartikel, Komponentenmenge, Sortierung, Zeile, Ebene) AS 
            
            (
            SELECT [Production BOM No_] AS Basisartikel, [Production BOM No_] AS Kopfartikel,  No_ AS Strukturartikel, Quantity, CONVERT(varchar(250), [Line No_]) AS Sortierung, [Line No_], 0 AS Ebene
            FROM [Production BOM Line] AS PBL                                                      WHERE      (Type = 1)
            
            UNION ALL
            
            SELECT STL.Basisartikel, PBL2.[Production BOM No_] AS Kopfartikel, 
                         PBL2.No_, STL.Komponentenmenge,  
                         CAST(STL.Sortierung + CONVERT(varchar(250),   PBL2.[Line No_]) AS varchar(250)) AS Expr1,  PBL2.[Line No_], STL.Ebene + 1 AS Expr2      FROM         Stueckliste AS STL INNER JOIN [Production BOM Line] AS PBL2 ON STL.Strukturartikel = PBL2.[Production BOM No_]
            
            )
            SELECT     CAST(CONVERT(varchar(250), Basisartikel) + Sortierung AS varchar(250)) AS SortID, Basisartikel, Kopfartikel, Strukturartikel, 
            CAST(Komponentenmenge AS decimal(10, 2)) AS Komponentenmenge, Ebene
            FROM Stueckliste AS Stueckliste_1
            Danke für die Eingebungen

            MfG

            Carsten

            Comment

            Working...
            X