Announcement

Collapse
No announcement yet.

Gleiche Werte aus 2 Tabellen anzeigen

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

  • Gleiche Werte aus 2 Tabellen anzeigen

    Hallo zusammen,
    ich habe da ein kleines Problem:

    Ich möchte aus 2 Tabellen nur die Datensätze anzeigen lassen, welche die gleiche Artikelnummer haben.

    Das war nun erstmal das Grundlegende.
    Falls sich jemand die Mühe machen möchte, sich in die Problematik reinzudenken, hier die genaue Beschreibung der Funktion:

    Es dreht sich um drei Tabellen: STUELI (Stücklisten), Fertigungstage (Fertigungsplanung: Wann wird was in welcher Menge produziert), ARTIKEL (Artikelstammdaten)

    Was in ARTIKEL und Fertigungstage vom Prinzip her festgehalten wird, dürfte allgemein verständlich sein.
    Die Stücklisten sind sozusagen die Bauanleitungen der Fertigprodukte.
    D.h.:
    Die Stückliste 0815 (also auch für Verkaufsartikel 0815) beinhaltet den Fertigungsartikel 1815 und die einzelnen Verpackungsbestandteile (also Einkaufsartikel, z.B. 7845 Folie, 7855 Umkarton, usw, welche nicht bei uns hergestellt werden, also auch keine Stückliste haben)

    Die Stückliste des Fertigungsartikels 1815 beinhaltet wieder andere Fertigungsartikel (welche wieder eigene Stücklisten haben) und andere Einkaufsartikel....usw

    Die bestehende Funktion schreibt alle Planungen eines bestimmten Zeitraums in eine neue Tabelle.
    Im nächsten Schritt werden in einer Schleife die einzelnen Einträge der neuen Tabelle durchgesehen, wobei die Artikelnummern mit den Stücklistennummern verglichen werden. Gibt es eine entsprechende Stückliste, so wird der Inhalt an die neue Tabelle angehangen. So wird gewährleistet, daß die Stücklisten komplett runtergebrochen dargestellt werden.

    Diese Funktion muß nun dahingehend erweitert werden, daß Artikel, die in den Artikelstammdaten als Fertigungsartikel (ARTIKEL.FERTIGUNG = 1) und Lagerbezogen (ARTIKEL.DISPO_LAGER) gekennzeichnet sind, nicht mit aufgeführt werden. Wenn diese Artikel allerdings in der Planung vorkommen, so sollen sie doch aufgeführt werden (ARTIKEL.ARTIKEL = Fertigungstage.Produkt_Nr).

    Hier der Quelltext der bestehenden Funktion:

    Code:
    CREATE  FUNCTION  dbo.rohstoffbedarf_auswahl_datum
    --/// "Aufloesen" mehrerer Stammstuecklistenstrukturen nach Auswahl
    --/// Rueckgabewert ist eine Tabelle 
    -- /// PATH erlaubt eine strukturgerechte Sortierung
    
    
    
    (
      @DATUM_VON AS datetime,@DATUM_BIS AS datetime
    ) 
      RETURNS @tree table
    (
    LINIE char(10),
    F_MENGE decimal(18,2),
    DRUCKEN int,
    PRODUKTIONSTAG datetime,
    ARTIKEL char(22)  collate Latin1_General_CI_AS  NOT NULL,
    STUELI   char(22)  collate Latin1_General_CI_AS NOT NULL,
    POSITION int   NOT NULL,
    lvl     int   NOT NULL,
    id  int not null,
    path    varchar(1000) collate Latin1_General_CI_AS NOT NULL,
    mengestrukt decimal (18,2)
    )
    AS
    
    BEGIN
      DECLARE @lvl AS int, @path AS varchar(1000)
      SELECT @lvl = 1, @path = '.'
      
        INSERT INTO @tree
        SELECT Fertigungstage.Linie, Fertigungstage.F_Menge, Fertigungstage.DRUCKEN, Fertigungstage.PRODUKTIONSTAG, isnull(STUELIPOS.ARTIKEL, ' ') , STUELIPOS.STUELI , STUELIPOS.POSITION, @lvl , STUELIPOS.id,'.' + REPLICATE('0', 10-DATALENGTH(RTRIM(CAST(STUELIPOS.POSITION AS varchar(10))))) + RTRIM(CAST(STUELIPOS.POSITION AS varchar(10)))+ '.', MENGE
        --FROM Fertigungstage JOIN STUELIPOS ON Fertigungstage.Produkt_Nr=STUELIPOS.ARTIKEL
    FROM Fertigungstage JOIN STUELIPOS ON Fertigungstage.Produkt_Nr=STUELIPOS.STUELI
        --/// WHERE STUELI = @ROOT
         WHERE Fertigungstage.Produktionstag >= @DATUM_VON AND Fertigungstage.Produktionstag <= @DATUM_BIS
         ORDER BY POSITION
    
      WHILE @@ROWCOUNT > 0
      BEGIN
        SET @lvl = @lvl + 1
    
        INSERT INTO @tree
          SELECT  T.LINIE, T.F_Menge, T.DRUCKEN, T.PRODUKTIONSTAG, isnull(E.ARTIKEL, ' '), E.STUELI, E.POSITION, @lvl, E.id,T.path + REPLICATE('0', 10-DATALENGTH(RTRIM(CAST(E.POSITION AS varchar(10))))) + RTRIM(CAST(E.POSITION AS varchar(10)))+ '.',(E.MENGE / E.MENGEPMNG) * T.MENGESTRUKT
          FROM STUELIPOS AS E JOIN @tree AS T
            ON  E.STUELI  = T.ARTIKEL
             AND T.lvl = @lvl - 1
          ORDER BY E.POSITION
      END  
      RETURN
    END
    Benutzt wird MS SQL-Server 2000.

    Ich hoffe, daß ich mein Problem einigermaßen klar darstellen konnte und hoffe auf schnelle Hilfe.


    Gruß
    Olli
    Zuletzt editiert von Desastermaster; 01.03.2007, 10:07.

  • #2
    In wie vielen Foren hast Du die Frage eigentlich gestellt? Und dann auch noch im Minutenabstand...

    Hier dann auch noch im falschen Unterforum.

    Comment


    • #3
      Hallo Jochen,

      Das mit dem falschen Unterforum tut mir leid.
      Warum soll man ein Problem nicht in mehreren Foren zur Diskussion stellen?
      Je mehr Leute, desto mehr Lösungsvorschläge.
      Wenn man unter Zeitdruck steht, ist man für jede Hilfe dankbar, oder?
      Wenn ich ein Problem gelöst habe, stelle ich den Lösungsweg auch jedesmal in jedes Forum, in dem ich die Frage gestellt habe, damit die nächsten googler auch was davon haben.
      Wo ist denn nun das Problem?
      Wer trägt da einen Schaden?

      Und danke für deine produktive Antwort.

      Hier nun die Lösung des Problems:

      Code:
      CREATE  FUNCTION  dbo.rohstoffbedarf_auswahl_datum
      --/// "Aufloesen" mehrerer Stammstuecklistenstrukturen nach Auswahl
      --/// Rueckgabewert ist eine Tabelle 
      -- /// PATH erlaubt eine strukturgerechte Sortierung
      
      
      
      (
        @DATUM_VON AS datetime,@DATUM_BIS AS datetime
      ) 
        RETURNS @tree table
      (
      Produkt_Nr char(22),
      LINIE char(10),
      F_MENGE decimal(18,2),
      DRUCKEN int,
      PRODUKTIONSTAG datetime,
      ARTIKEL char(22)  collate Latin1_General_CI_AS  NOT NULL,
      STUELI   char(22)  collate Latin1_General_CI_AS NOT NULL,
      POSITION int   NOT NULL,
      lvl     int   NOT NULL,
      id  int not null,
      path    varchar(1000) collate Latin1_General_CI_AS NOT NULL,
      mengestrukt decimal (18,2)
      )
      AS
      
      BEGIN
        DECLARE @lvl AS int, @path AS varchar(1000)
        SELECT @lvl = 1, @path = '.'
        
          INSERT INTO @tree
          SELECT Fertigungstage.Produkt_Nr, Fertigungstage.Linie, Fertigungstage.F_Menge, Fertigungstage.DRUCKEN, Fertigungstage.PRODUKTIONSTAG, isnull(STUELIPOS.ARTIKEL, ' ') , STUELIPOS.STUELI , STUELIPOS.POSITION, @lvl , STUELIPOS.id,'.' + REPLICATE('0', 10-DATALENGTH(RTRIM(CAST(STUELIPOS.POSITION AS varchar(10))))) + RTRIM(CAST(STUELIPOS.POSITION AS varchar(10)))+ '.', MENGE
          --FROM Fertigungstage JOIN STUELIPOS ON Fertigungstage.Produkt_Nr=STUELIPOS.ARTIKEL
      FROM Fertigungstage JOIN STUELIPOS ON Fertigungstage.Produkt_Nr=STUELIPOS.STUELI
          --/// WHERE STUELI = @ROOT
           WHERE Fertigungstage.Produktionstag >= @DATUM_VON AND Fertigungstage.Produktionstag <= @DATUM_BIS
           ORDER BY POSITION
      
        WHILE @@ROWCOUNT > 0
        BEGIN
          SET @lvl = @lvl + 1
      
          INSERT INTO @tree
            SELECT  T.Produkt_Nr, T.LINIE, T.F_Menge, T.DRUCKEN, T.PRODUKTIONSTAG, isnull(E.ARTIKEL, ' '), E.STUELI, E.POSITION, @lvl, E.id,T.path + REPLICATE('0', 10-DATALENGTH(RTRIM(CAST(E.POSITION AS varchar(10))))) + RTRIM(CAST(E.POSITION AS varchar(10)))+ '.',(E.MENGE / E.MENGEPMNG) * T.MENGESTRUKT
            FROM STUELIPOS AS E JOIN @tree AS T
              ON  E.STUELI  = T.ARTIKEL AND T.lvl = @lvl - 1 JOIN ARTIKEL ON E.STUELI = ARTIKEL.ARTIKEL
            WHERE (ARTIKEL.FERTIGUNG != 0 AND ARTIKEL.DISPO_LAGER != 1) OR T.Produkt_Nr = E.STUELI
            ORDER BY E.POSITION
        END  
        RETURN
      END

      Gruß Olli

      Comment

      Working...
      X