[GELÖST]Nach drücken auf OK prüfen ob Feld gefüllt ist

25. September 2009 17:32

Hallo zusammen,

wenn ich einen VK Auftrag anlege und über "Lief. an Code" jemanden auswähle möchte ich, dass vorher ein Feld geprüft wird, ob es ausgefüllt ist, wenn nicht
soll es eine Warnmeldung geben. Ich habe auf dem OK Button im Trigger: OnPush (in der Form 301) folgenden Code geschrieben

Code:
TESTFIELD("City");


Sobald ich einen Datensatz auswähle wo der Ort nicht gefüllt ist und ok drücke kommt die Fehlermeldung:
'Lief an Adressen Übersicht' kann nicht beendet werden, da das System zurzeit arbeitet.

Drücke ich "OK" kommt meine TESTFIELD Meldung und er bricht ab.

Wie kriege ich diese Meldung, dass das System zurzeit noch arbeitet weg? Bzw. habe ich hier einen falschen Ansatz?


Gruß
Owen
Zuletzt geändert von owenw am 28. September 2009 08:10, insgesamt 1-mal geändert.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

25. September 2009 17:38

Das liegt daran, dass du den Code in den OnPush-Trigger der Lookup-Form geschrieben hast - da gehört er definitiv nicht hin.
Grund: Beim Klick auf OK beginnt die Form den Schließprozess. Wenn nun dieser Schließprozess durch ein ERROR behindert wird (es kann genauso gut aber ein CONFIRM, SLEEP etc. sein), dann kommt es zu der o.g. Meldung.

Positioniere daher deinen Code in den OnValidate-Triggers des Feldes "Lief. an Code" (wenn du die volle Lizenz hast, in das Tabellenfeld, ansonsten in das Feld auf der Form).

Pseudocode:
Wenn "Lief an Code" gefüllt, dann TESTFIELD auf City.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 09:25

Hallo Natalie,

vielen Dank für deine Hilfe, wenn ich auf der Form 42 in den Lief. an Code in den VALIDATE Trigger den Code:

Code:
IF "Ship-to Code" <>'' THEN
ShipToAddr.TESTFIELD("City");


Dann kommt immer die TESTFIELD Meldung: Sie müssen Ort in. Lief. an Adresse Debitorennr. = ",Code" angeben.

Irgendwas mache ich hier doch falsch?

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 11:18

owenw hat geschrieben:Dann kommt immer die TESTFIELD Meldung: Sie müssen Ort in. Lief. an Adresse Debitorennr. = ",Code" angeben.

Irgendwas mache ich hier doch falsch?

Habe ich deine Anforderung falsch verstanden? Was hätte anders passieren sollen?
TESTFIELD funktioniert genau so.

Was mich nur stutzig macht:
owenw hat geschrieben:wenn ich einen VK Auftrag anlege und über "Lief. an Code" jemanden auswähle

Wenn sich das Ganze im VK-Auftrag abspielt und du auch auf der Form VK-Auftrag (42) bist, dann hat die Variable ShipToAddr nichts verloren:
Code:
IF "Ship-to Code" <>'' THEN
  TESTFIELD("City");

Schließlich möchtest du wissen, ob City im aktuellen VK-Kopf (=Rec) gesetzt ist, nicht wahr?
Wofür hast du die Record-Variable ShipToAddr genutzt?

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 12:03

Hallo Natalie,

vielleicht habe ich mich etwas blöde aus gedrückt, ich bin im VK Auftrag im Register Lieferung, bei Lief. an Code, wenn ich auf den Pfeil klicke, öffnet sich die Form 301 und dort kann ich eine Lieferanschrift auswählen. Jetzt möchte ich aber, dass die Lieferanschrift nur übernommen wird, wenn in der Form 301 bzw. dahinter liegenden Tabelle 222 das Feld Ort (ggf. noch andere) überprüft werden, ob diese gefüllt sind, wenn nicht, soll die Lieferanschrift nicht übernommen werden und eine Fehlermeldung ausgeben, deswegen das TESTFIELD.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 12:13

Aaaaaaaah :-)
Ja, dann hatte ich die Anforderung etwas falsch verstanden.
Dennoch ist der Ansatz bis hierhin richtig (also die Programmierung auf der Form 42) du musst ihn nur ergänzen:
Behalte also deine Variable ShipToAddr.
Wenn (Rec.)"Ship-to Code" nicht leer, dann ShipToAddr mit diesem Code holen/füllen (ShipToAddr.GET(..)).
Erst jetzt ein TESTFIELD auf City im ShipToAddr und jedes weitere Feld, das relevant ist.

Wenn ichs mir recht überlege, gehört der Quelltext nicht in den OnValidate, sondern OnAfterValidate-Trigger ..

Falls wirklich nur eine Warnmeldung statt einer Fehlermeldung erscheinen soll, dann musst du statt TESTFIELD etwas in der Art
Code:
IF ShipToAddr.FeldXY = '' THEN
  MESSAGE('Hier fehlt noch was');
programmieren.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 13:00

Irgendwie bin ich jetzt ganz verwirrt und so wie ich es verstanden habe funktioniert es nicht.

Unten findest du ein Screen, wo ich was auswählen möchte. Ich bin im Verkaufsauftrag, in der Registerkarte Lieferung und bei Lief. an Code öffne
ich das Fenster "Lief. an Adressen Übersicht" (Form 301). Jetzt wähle ich aus der Liste jemanden aus und drücke ok. Dann soll geprüft werden, ob
ein bestimmtes Feld, z.B. Ort gefüllt ist. Wenn ja, dann soll er ganz normal die Auswahl übernehmen. Drücke ich ok und der Ort ist z.B. nicht gefüllt,
dann soll er eine Fehlermeldung ausgeben und nichts übernehmen.

Aber das gelingt mir irgendwie nicht, daher war mein Ausgangsversuch auf der Form 301 auf den OK Button im Trigger OnPush zu prüfen, aber wie
gesagt, das hat alles nicht funktioniert. Ich hoffe nun ist mein Gedankengang etwas besser ausgedrückt und bitte um Entschuldigung dafür :oops:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 14:01

owenw hat geschrieben:Aber das gelingt mir irgendwie nicht,

Hast du denn meine Lösung (die genau das machen soll, was du jetzt wiederholt hast) laut letztem Beitrag versucht (Quelltext)? Was genau war jetzt das Problem?

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 14:12

Ich habe jetzt in der Form42 auf dem Lief. an Code

Auf dem: Ship-to Code - OnAfterValidate()

Code:
IF ShipToAddr.Code <>'' THEN
  ShipToAddr.Get("No.");
  ShipToAddr.TESTFIELD("City");


dort kriege ich dann aber dann immer einen Fehler, dass in dem Code der Ort nicht eingetragen ist? :shock:

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 15:10

Wenn du ohne BEGIN ... END arbeitest, liest der Compiler den Quelltext so:
Code:
IF ShipToAddr.Code <>'' THEN
  ShipToAddr.Get("No.");
ShipToAddr.TESTFIELD("City");

Die unterste Zeile wird also IMMER ausgeführt, daher auch
owenw hat geschrieben:dort kriege ich dann aber dann immer einen Fehler, dass in dem Code der Ort nicht eingetragen ist? :shock:


Wichtiger:
Du scheinst nicht zu verstehen, wie GET arbeitet (nämlich auf Basis des Primärschlüssels).
Der Primärschüssel für die Tabelle "Ship-to Address" ist Customer No.,Code..
Logisch, denn schließlich gilt eine bestimmte Lieferadresse auch nur für einen bestimmten Debitoren.
In deinem Befehl fehlt also noch die Referenz auf die "Verk. an Debitornr.".

Wenn dir die Verwendung von Befehlen nicht geläufig ist, konsultiere bitte immer zuerst die Onlinehilfe (C/SIDE Reference Guide) und/oder such im Forum nach Hinweisen.

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 15:20

owenw hat geschrieben:dort kriege ich dann aber dann immer einen Fehler, dass in dem Code der Ort nicht eingetragen ist? :shock:

Du machst ein GET mit der Belegnummer des Auftrags und prüft dann ob der Datensatz, den es in der Tabelle "Lief. an Adresse" mit dem Code nicht geben dürfte (weil da üblicherweise ein Code steht, der zusammen mit der Debitorennummer (deswegen ein zweifeldriger Primärschlüssel) die Anlieferadresse des Debitoren kennzeichnet), ein Ort eingetragen ist. Was soll dabei herauskommen?

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

26. September 2009 16:35

Ich habe jetzt einen Hilfeartikel geschrieben, der beschreibt, wie GET funktioniert:
Records: GET SETFILTER FIND etc.

Owen, könntest du mir sagen, ob der Artikel verständlich genug geschrieben ist? Das wäre nett. :-)

Re: Nach drücken auf OK prüfen ob Feld gefüllt ist

28. September 2009 08:10

Man sollte am Wochenende nicht versuchen seine "Arbeitsprobleme" zu lösen :-D

@Natalie
der Artikel ist soweit verständlich geschrieben, wie der GET funktioniert, dachte ich war mir eigentlich klar, aber ...

Ich habe nun im OnVALIDATE Trigger folgenden Code:

Code:
ShipToAddr.GET("Sell-to Customer No.","Ship-to Code");

IF "Sell-to Customer No." = ShipToAddr."Customer No." THEN BEGIN
  IF ShipToAddr."Salesperson Code" = '' THEN BEGIN
    ShipToAddr.TESTFIELD("Salesperson Code");
  END;
END;


was ich allerdings nicht wusste (das ist mir aus deinem Artikel auch nicht ganz klar geworden, das ich beim GET die Felder von der Tabelle wo ich mich befinde verwenden bzw. vorgeben muss. Ich bin immer davon ausgegangen ich verwende die Feldnamen des Primärschlüssels von der anderen Tabelle, wo ich mir die Daten herholen möchte.)


Also vielen Dank für deinen Denkansatz, wieder etwas gelernt und das Problem gelöst :D


Schöne Grüße
Owen

Re: [GELÖST]Nach drücken auf OK prüfen ob Feld gefüllt ist

28. September 2009 14:25

Ah, freut mich :-)

Aber noch ein Hinweis:
Diese Zeile ist völlig überflüssig:
Code:
IF "Sell-to Customer No." = ShipToAddr."Customer No." THEN BEGIN

Du hast doch gerade den ShipToAddr geholt, der diesen "Sell-to Customer No." als Schlüsselfeldinhalt hat.

Denn dein GET-Befehl könnte auch geschrieben werden als
Code:
ShipToAddr.GET(Rec."Sell-to Customer No.",Rec."Ship-to Code");

wobei Rec hier = Sales Header ist.

Also falls du einen konkreten Verbesserungsvorschlag für den Artikel hast, lass es mich wissen ...