cancel
Showing results for 
Search instead for 
Did you mean: 

Stored Procedure

Former Member
0 Kudos

Hallo und guten Mittag,

ich möchte gerne mit einer Stored Procedure verhindern, dass in einem Kundenauftrag unterschiedliche Werte im Feld Lager (RDR1.WhsCode) gespeichert werden können, wenn ein Feld "Ladeort" einen bestimmten Wert hat.

Hierzu habe ich ein UDF im Kopf des Beleges angelegt: ORDR.U_Ladeort

Beim Anlegen eines neuen Belegs entscheidet der Kollege über den Ladeort, nachdem er alle Artikel-Positionen erfasst hat. (alle Artikel sind buchbar auf Lager 01 und Lager 02, haben jedoch nicht das selbe als Standardlager.)

Eine FMS auf dem Feld RDR1.Whscode prüft den Ladeort und überschreibt den Wert falls notwendig.

 

Aber einige Male ist es schon vorgekommen, dass der Ladeort zwar gewählt wurde, jedoch wurden nachträglich nochmal Artikelpositionen erfasst, und die FMS hat nicht gegriffen.

die Stored-Proc. soll nun prüfen, wenn

U_Ladeort = EH, dann darf im Feld Lager nicht 02 stehen,... und

U_Ladeort = WH, dann darf im Feld Lager nicht 01 stehen...


DECLARE @whscode AS NVARCHAR(8)

IF @object_type = '17' AND @transaction_type IN ('A','U')

  BEGIN

     SELECT @whscode = ISNULL(T1.Whscode , '')

      FROM ORDR T0

      INNER JOIN RDR1 T1 on T0.DocEntry = T1.DocEntry

     WHERE T0.DocEntry = @list_of_cols_val_tab_del and T1.Whscode = '02' and T0.U_Ladeort = 'WK'

        IF @whscode <> '02'

        BEGIN

          SET @error = 1

          SET @error_message = 'Jede Zeile ändern auf Lager = 02 '

        END

   END

IF @object_type = '17' AND @transaction_type IN ('A','U')

  BEGIN

     SELECT @whscode = ISNULL(T1.Whscode , '')

      FROM ORDR T0

      INNER JOIN RDR1 T1 on T0.DocEntry = T1.DocEntry

     WHERE T0.DocEntry = @list_of_cols_val_tab_del and T1.WhsCode = '01' and T0.U_Ladeort = 'EH'

        IF @whscode <> '01'

        BEGIN

          SET @error = 1

          SET @error_message = 'Jede Zeile ändern auf Lager = 01 '

        END

   END

... aber das funktioniert so nicht... die SP scheint nicht zu greifen. Was habe ich falsch gemacht ?

Vielen Dank für Eure Wissenswerte.

Gruß

Markus

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Hallo Marcus,

das ist ja schon fast Projektarbeit...

Kurze Hilfe (in die Tüte), keine Zeit Deinen Code zu analysieren...

Mach Doch einfach einen Count(*) auf den Fehlerfall - also Kopflager = 01 and WhsCode <> 01 oder so... also z.B. select @Anzhal = count(*) from rdr1 ....

if @Anzahl > 0 --> Fehler.

Ist sicher einfacher. In deinem Code stecken einige potentielle Fallen, und gerade bei einer TN sollte man das anders machen.

hdh

Andreas

Former Member
0 Kudos

Hey Andreas,

geil ! Rettung ! Danke
... mit dem Weg über @Anzahl klappt es:

für alle interessierten Leser hier der funktionierende Query:


DECLARE @Anzahl AS INT

-- START 06c ### 17 = Kundenauftrag ###

IF @object_type = '17' AND @transaction_type IN ('A','U')

  BEGIN

     SELECT @Anzahl = COUNT(*)

      FROM ORDR T0

      INNER JOIN RDR1 T1 on T0.DocEntry = T1.DocEntry

     WHERE T0.DocEntry = @list_of_cols_val_tab_del and T1.Whscode <> '02' and T0.U_Ladeort = 'WK' and T1.LineStatus = 'O'

        IF @Anzahl > '0'

        BEGIN

          SET @error = 1

          SET @error_message = 'Jede Zeile ändern auf Lager = 02'

        END

   END

IF @object_type = '17' AND @transaction_type IN ('A','U')

  BEGIN

     SELECT @Anzahl = COUNT(*)

      FROM ORDR T0

      INNER JOIN RDR1 T1 on T0.DocEntry = T1.DocEntry

     WHERE T0.DocEntry = @list_of_cols_val_tab_del and T1.Whscode <> '01' and T0.U_Ladeort = 'EH' and T1.LineStatus = 'O'

        IF @Anzahl > '0'

        BEGIN

          SET @error = 1

          SET @error_message = 'Jede Zeile ändern auf Lager = 01 '

        END

   END

Alles Gute

Former Member
0 Kudos

Hallo Markus,

will nicht den Oberlehrer... aber Du solltest auf die Datentypen achten.

@Anzahl ist numerisch, und dann sollte man es auch numerisch abfragen. Also @Anzahl > 0 nicht @Anzahl > '0'. Das kann, in diesem Fall zwar nicht, aber zu Problemen führen. Auch NULL Werte sollten berücksichtigt werden. Ein Vergleich T0.U_Ladeort = 'WK' schlägt fehl, wenn Ladeort NULL ist, und hat ebenfalls ggf. unangenehme Konsequenzen... besser also ISNULL(Ladeort,'') = 'WK'.

hdh

Andreas

Former Member
0 Kudos

Hallo Andreas,

das werde ich nochmal prüfen. Danke für den Tip.
In meinem Fall liegt dem UDF Ladeort eine Festwert-Tabelle an. Standard ist 0 = auswählen

eine andere SP verhindert das Abspeichern, wenn kein Ladeort gewählt wurde, also 0 ...

Gruß und

Markus

Answers (0)