Announcement

Collapse
No announcement yet.

UDF in einer UDF aufrufen

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

  • UDF in einer UDF aufrufen

    Hallo ich habe eine Prozedur geschrieben, in der ich eine UDF aufrufe.

    Sie funktioniert gut, bis auf den call der anderen UDF, könnte mir bitte einer einen Hinweis geben was ich falsch gemacht habe, Quellcode folgt.

    Ich habe irgdnwei das Gefühl dass der durch @art_kat übergebene Datentyp nicht stimmt, denn wenn ich die angesprochene Funktion selbst aufrufe funktioniert es!

    /* Prozedur Art_Buchen
    @args: @art_id: Artikelid, zu der ein neues Stück eingefügt werden soll
    @args: @serien_nr Artikel Seriennummer


    Die Prozedur ist dazu da Einzelartikel eines Typs einzubuchen. Dabei versieht sie Artikel ohne Seriennummer
    mit einer selbstgenerierten Seriennummer, sonst übernimmt sie die normale Seriennummer!

    Benutzt die FUnktion Art_Seriennummer

    */

    -- Prozedur zum Buchen eines Artikels
    CREATE PROCEDURE Art_Buchen
    @art_id UNIQUEIDENTIFIER,
    @serien_nr VARCHAR(32)


    AS
    BEGIN
    DECLARE @serien_gen VARCHAR(32),
    @art_kat UNIQUEIDENTIFIER
    -- füge die Eingabeparameter in die Artikel_Detail und die Artikel Tabelle ein
    -- Konvention zu Einscannen der Warengruppen:
    --Zunächst wird ein Code des Artikeltyps eingescannt, danach die Seriennummer des Artikels
    --Falls es keine Seriennummer gibt wird automatisch eine interne Kennung generiert

    -- finde die Kategorie der Artikel heraus

    SELECT @art_kat = Kategorie FROM Artikel WHERE id = @art_id

    IF @serien_nr = ''
    -- neue interne ID erzeugen
    BEGIN
    EXEC @serien_gen = dbo.Art_Seriennummer @art_id = @art_kat
    PRINT @serien_gen
    END

    ELSE
    BEGIN
    SET @serien_gen = @serien_nr
    END

    IF EXISTS(SELECT * from Artikel A, Artikel_Detail D WHERE A.id = @art_id AND A.id = D.ArtikelID AND D.Seriennummer = @serien_gen)
    BEGIN
    RAISERROR ('Artikel existiert bereits!',16,1)
    END
    ELSE
    BEGIN
    INSERT INTO Artikel_Detail (id,ArtikelID,Seriennummer,Seriennummertyp) VALUES (NEWID(),@art_id,@serien_nr,'S')
    END
    END
    Zuletzt editiert von Andre.Arnold; 10.10.2007, 16:05.

  • #2
    Hallo Andre,

    EXEC @serien_gen = dbo.Art_Seriennummer @art_id = @art_kat
    Das bereitet mit Kopfzerbrechen!

    Ist dbo.Art_Seriennummer eine stored procedure, dann kann als RETURN- wert nur ein INTEGER zurückgegeben werden. VARCHAR- Werte musst du dir über OUTPUT Parameter zurückgeben lassen. Handelt es sich um eine Funktion (UDF), dann muss der Aufruf wie folgt sein:
    SET @serien_gen = dbo.Art_Seriennummer (@art_kat)
    Bei Funktionen kannst du keine Parameternamen beim Aufruf angeben.

    Ich habe irgdnwei das Gefühl dass der durch @art_kat übergebene Datentyp nicht stimmt, denn wenn ich die angesprochene Funktion selbst aufrufe funktioniert es!
    Tja, um das zu beantworten, müsste man wissen, wie die Deklaration von dbo.Art_Seriennummer aussieht und wie du die Funktion aufrufst.

    Viele Grüße
    Thomas

    Comment


    • #3
      Hallo Thomas,

      irgdendwie beschleicht mich das Gefühl das du Recht hast. Mir ist garnicht aufgefallen, dass ich versuche die Funktion aufzurufen indem ich eien procedure call mache :X.

      Dann is auch klar warum das nicht funzt....

      Was ich aber merkwürdig finde ist dass er wenn ich den Funktionsaufruf mit
      function(param) mache bringt der mir ne Fehlermeldung Falsche Syntax in der Nähe von param.

      Ich poste mal den Quellcode der Function Art_Seriennummer:

      CREATE FUNCTION Art_Seriennummer(@art_id UNIQUEIDENTIFIER)
      RETURNS VARCHAR(32)
      AS

      BEGIN
      DECLARE @seriennummer VARCHAR(32),
      @add_nr NUMERIC(3),
      @kat UNIQUEIDENTIFIER
      PRINT 'starte Seriennummergenerierung'
      SELECT @kat = Kategorie FROM Artikel WHERE id = @art_id
      PRINT 'Kategorie gefunden'

      SELECT @Seriennummer = M.Name+'-'+L.Name+'-'+K.Name+'-'+CONVERT(CHAR(2),DAY(GETDATE()))++CONVERT(CHAR(2) ,MONTH(GETDATE()))++CONVERT(CHAR(4),YEAR(GETDATE() ))++'-'
      FROM Artikel_Kategorie K, Artikel_Kategorie L, Artikel_Kategorie M
      WHERE K.id = @kat
      AND K.Okat = L.id
      AND L.Okat = M.id
      AND M.Okat IS NULL
      PRINT 'Erster Teil erledigt'
      --herausfinden ob heute schon ein Artikel der Kategorie geliefert wurde

      SELECT @add_nr = COUNT(ArtikelID)+1
      FROM Artikel_Detail
      WHERE LEFT(Seriennummer,19) = @Seriennummer
      PRINT 'Seriennummer fast fertig'
      -- Zusammensetzen des Neuen Strings:
      -- Kategorie XXX-XXX-XXX-ddmmyyyy-nr

      RETURN @seriennummer++CONVERT(VARCHAR(2),@add_nr)
      END

      Comment


      • #4
        Hallo Andre,

        Was ich aber merkwürdig finde ist dass er wenn ich den Funktionsaufruf mit
        function(param) mache bringt der mir ne Fehlermeldung Falsche Syntax in der Nähe von param.
        Wie schaut denn jetzt dein Aufruf genau aus? Falsche Syntax: da hast du wohl was vergessen

        Poste doch nochmal die ganze Prozedur, dann kann ich dir eventuell weiterhelfen.

        Gruß
        Thomas

        Comment


        • #5
          Guten Morgen ,

          die prozedur wird wie in post #1 aufgerufen und soll die function in post #3 aufrufen. Es sollte eigentlich alles dastehen was wir brauchen um den Fehler zu finden.

          Comment


          • #6
            Hallo Andre,

            der Aufruf muss

            SET @serien_gen = dbo.Art_Seriennummer (@art_kat)

            heissen.

            Gruß
            Thomas

            Comment


            • #7
              Danke ich probiere es mal

              Comment

              Working...
              X