on 09-08-2015 11:23 AM
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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
User | Count |
---|---|
95 | |
11 | |
10 | |
6 | |
5 | |
5 | |
4 | |
3 | |
3 | |
3 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.