Gleiche Werte aus 2 Tabellen darstellen



  • 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:

    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



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



  • Also:

    Wenn ich unter Zeitdruck stehe und schnell eine Lösung brauche, warum soll ich denn dann nicht auf fundiertes Wissen in mehreren Foren zurückgreifen?

    Je mehr Leute, desto mehr Lösungsvorschläge.
    Außerdem trägt dadurch niemand einen Schaden.
    Wenn ich eine gute Lösung gefunden habe, dann poste ich diese auch in allen Foren, in denen ich die Frage gestellt habe.

    Also nochmal:
    Wo ist denn das Problem?
    Wer trägt dadurch einen Schaden?

    Danke für deine produktive Antwort.

    Habe mittlerweile auch eine Lösung gefunden.
    Hier der 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



  • Desastermaster schrieb:

    Also:

    Wenn ich unter Zeitdruck stehe und schnell eine Lösung brauche, warum soll ich denn dann nicht auf fundiertes Wissen in mehreren Foren zurückgreifen?

    Je mehr Leute, desto mehr Lösungsvorschläge.

    Weil Du damit die Zeit von Leuten verschwendest, die auf freiwilliger Basis helfen. Die meisten sind nur in wenigen Foren aktiv und machen sich die Mühe, Dir eine Lösung zu erarbeiten, die bereits in einem anderen Forum gegeben wurde. Super! So gesehen gilt also eher: Je mehr Foren, desto mehr Zeitverschwendung und da Zeit Geld ist -> ja es entsteht dadurch Schaden.

    Ich antworte grundsätzlich nicht mehr auf solche Cross-Foren-Postings.

    Natürlich kannst Du in mehreren Foren posten. Aber ich finde es grenzt an Unverschämtheit, ein und dieselbe Frage, im Minutenabstand, in diversen Foren zu stellen.



  • Ich denke mal, wenn du in der Zeit Geld verdienen könntest, würdest du nicht stattdessen etwas auf freiwilliger Basis machen. Außerdem war ich früher auch in mehreren Foren aktiv und habe dort versucht zu helfen, wo ich konnte. Ich habe diesen Job erst seit 1/2 Jahr und bin im den Themen, mit denen ich mich nun befassen muß, noch nicht sehr bewandert. Dashalb kann ich im Moment weder vom Wissensstand, noch von der Zeit her groß helfen. Das wird sich bestimmt noch ändern.
    Ich habe noch nie irgendwo erlebt, daß sich jemand so uneinsichtig und kleinlich anstellt.
    Meine Erfahrung ist nunmal, daß man in mehreren Foren insgesamt bessere Lösungen kriegt und Zeit spart. Und ich finde es auch nett von den Leuten, die helfen. Ich helfe auch gerne wo ich kann.
    Hast du noch nie schnell etwas fertig kriegen müssen und an mehreren Stellen nachgefragt, um schnell eine Antwort zu bekommen?
    Deine Einstellung kann ich nicht verstehen.
    Zeit ist Geld...Ich lebe um zu arbeiten...Wenn du nach solchen Sprüchen dein Leben lebst, dann möchte ich nicht mit dir tauschen. Für mich haben eher Ideelle Werte Priorität. Z.B. wenn man jemandem helfen oder eine Freude machen kann.

    Außerdem: Wenn du selber nie in mehreren Foren postest, dann erwarte ich auch nicht, daß du mir antwortest. Gefundene Lösungen werden von mir Zeitnah gepostet, um den Aufwand für andere Mitglieder gering zu halten. Von diesen Lösungen haben wahrscheinlich auch zukünftige Mitglieder dieses Forums noch was.

    Gruß
    Olli


Anmelden zum Antworten