[gelöst] "Search Name" statt Debitor-Nummer

4. November 2007 13:30

Per Standard ist es ja bereits möglich - z.B. bei der Auftragserfassung im Feld "Verk. an Debitor-Nr." - statt der Debitor-Nr. einen Teil des Debitor-Suchbegriffs zu erfassen. So braucht man sich nicht die Debitor-Nr. zu merken oder erst über die Debitorübersicht zu suchen. Navision sucht sich dann eigenständig die passende Debitor-Nr und trägt diese ein.

Bei eindeutigen Suchbegriffen (Search Name) ist dies wunderbar.
Falls es jedoch mehrere ähnliche Suchbegriffe gibt, nimmt Navision einfach den ersten gefundenen Datensatz und trägt dessen Debitor-Nr. ohne Nachfrage ein. Dies kann dann zu falschen Einträgen führen.

Ich würde diesen Bereich nun gerne so erweitern, das bei mehreren "Treffern" automatisch die Debitor-Übersicht mit den darauf gefilterten Datensätzen erscheint und hier dann der passende Debitor ausgewählt werden kann.
Bei eindeutigen Suchbegriffen soll der Standard beibehalten werden.

Aber irgendwie bin ich zu blind, die passenden Code-Zeilen zu finden, in denen NAV nach dem Suchbegriff schaut. :-?

Kann mir mal jemand auf die Sprünge helfen?

Gruß
Ralf Müller
Zuletzt geändert von neckit am 4. November 2007 19:13, insgesamt 1-mal geändert.

4. November 2007 14:35

In der Table gibt es bei den Properties des Primärschlüsselfeldes einen Eintrag AltSearchField. Dort wird eingetragen, in welchem Feld der Lookup zusätzlich ausgeführt werden soll. das passiert Programmintern, da hast du keine Chance einzugreifen, das musst du dann schon viel früher auf der Form im OnInput-Trigger oder an ähnlicher Stelle machen und komplett ausprogrammieren.

4. November 2007 16:25

Dann bin ich ja doch noch nicht ganz so blind
[schild=18 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Glück gehabt[/schild]

Um mein Vorhaben trotzdem umzusetzen, bin ich wie folgt vorgegangen:
Im OnAfterInput-Trigger des Form-Feldes "Sell-to Customer No.":
Code:
GlobalVarCustNo := '';
Customer2.SETFILTER("Search Name",'%1',Text);
IF Customer2.COUNT > 1 THEN
  IF FORM.RUNMODAL(22, Customer2) = ACTION::LookupOK THEN
    GlobalVarCustNo := Customer2."No.";


Im OnAfterValidate-Trigger des Form-Feldes "Sell-to Customer No.":
Code:
IF (GlobalVarCustNo <> '') AND (GlobalVarCustNo <> "Sell-to Customer No.") THEN BEGIN
  VALIDATE("Sell-to Customer No.",GlobalVarCustNo);
END;


Das sieht auch schon mal sehr gut aus.
Allerdings habe ich noch zwei kleine Probleme, wo ich Eure Hilfe gebrauchen könnte.

1.)
Statt "Customer2.SETFILTER("Search Name",'%1',Text);"
wollte ich eigentlich "Customer2.SETFILTER("Search Name",'*%1*',Text);" verwenden, damit ich im Feld nur den Namen und nicht "*Name*" erfassen muss. Allerdings findet er dann keinen Datensatz.
Hab ich was verpasst oder hat SETFILTER hiermit Probleme?

2.)
Da NAV mir das erneute "VALIDATE("Sell-to Customer No.",GlobalVarCustNo);" im "OnAfterInput"-Trigger mit der üblichen Transaktions-Warnung nicht zulässt, habe ich dies in den OnAfterValidate-Trigger verschoben.
Hier will er dann die Bestätigung für das Überschreiben der zuvor automatisch ermittelten Debitor-Nr.; dies muss ich ggf. anderweitig abfangen.
Gibt es eine eleganterer Möglichkeit?
Die Transaktion abzubrechen und mit der folgenden Zeile weiter zu machen - geht ja glaube ich nicht?!

Gruß
Ralf Müller

4. November 2007 17:40

Warum "einfach" wenns auch "kompliziert" geht - oder wie war das doch gleich :oops:

Zu dem Problem mit den "Sternchen" beim SETFILTER brauch ich noch Eure hilfe. :?:

Aber den 2. Punkt konnte ich nun etwas eleganter lösen:
Statt das Feld "Sell-to Customer No." zu nutzen, habe ich einfach ein neues Feld mit "SourceExpr = Suchbegriff" (Suchbegriff ist eine globale Variable vom Typ Text) in die Form eingefügt.
Dort habe ich den folgenden Code im "OnAfterValidate-Trigger" hinterlegt:

Code:
IF Customer2.GET(Suchbegriff) THEN BEGIN
  VALIDATE("Sell-to Customer No.",Suchbegriff);
END ELSE BEGIN
  Customer2.SETFILTER("Search Name",'%1',Suchbegriff);
  IF Customer2.ISEMPTY THEN BEGIN
    MESSAGE('Kein Debitor gefunden!');
  END ELSE BEGIN
    IF Customer2.COUNT = 1 THEN BEGIN
      Customer2.FINDFIRST;
      VALIDATE("Sell-to Customer No.",Customer2."No.");
    END ELSE BEGIN
      IF FORM.RUNMODAL(22, Customer2) = ACTION::LookupOK THEN
        VALIDATE("Sell-to Customer No.",Customer2."No.")
    END;
  END;
END;
Suchbegriff := '';


Jetzt muß ich nur noch den Lookup-Trigger aufbereiten und schon kann ich das Feld "Sell-To Customer No." durch das neue Feld ersetzen.

Bleibt nur noch dieses verflixte Problem mit den "Sternchen" - grrr!

Gruß
Ralf Müller

4. November 2007 18:39

neckit hat geschrieben:Statt "Customer2.SETFILTER("Search Name",'%1',Text);"
wollte ich eigentlich "Customer2.SETFILTER("Search Name",'*%1*',Text);" verwenden, damit ich im Feld nur den Namen und nicht "*Name*" erfassen muss. Allerdings findet er dann keinen Datensatz.
Hab ich was verpasst oder hat SETFILTER hiermit Probleme?


SETFILTER mag '*' innerhalb des 1. Strings nicht. Dass musst du über einer einen Platzhalter in den 2. String schieben, also so:

Code:
Customer2.SETFILTER("Search Name",[b]'%1'[/b],'*' PLUS Text PLUS '*');
// PLUS durch das Pluszeichen ersetzen - irgendwie wird das hier im Forum nicht angezeigt, wenn ich nur Pluszeichen schreibe


(Habs jetzt nicht getestet; falls es doch nicht geht, muss man aber in der Richtung weiter probieren)

4. November 2007 19:10

Natalie hat geschrieben:
Code:
Customer2.SETFILTER("Search Name",'%1','*' + Text + '*');

wo ist das Problem mit dem + ? das wird nur in der Vorschau nicht angezeigt....
Allerdings kannst du innerhalb des Code-Tags keine weiteren BBCodes zur Formatierung verwenden, die werden mit ausgegeben, wie sie eingegeben wurden, wie man bei deinem vorherigen Posting sieht

4. November 2007 19:12

Da muss man erstmal drauf kommen :shock:

Danke Natalie - jetzt klappts.

Gruß
Ralf

4. November 2007 19:23

neckit hat geschrieben:Um mein Vorhaben trotzdem umzusetzen, bin ich wie folgt vorgegangen:
Im OnAfterInput-Trigger des Form-Feldes "Sell-to Customer No.":
Code:
GlobalVarCustNo := '';
Customer2.SETFILTER("Search Name",'%1',Text);
IF Customer2.COUNT > 1 THEN
  IF FORM.RUNMODAL(22, Customer2) = ACTION::LookupOK THEN
    GlobalVarCustNo := Customer2."No.";


In diesem Trigger hast du ja schon erkannt, dass es einen Parameter Text gibt, da dieser allerdings ein VAR-Parameter ist, kannst Du das noch eleganter lösen:
Code:
Customer2.SETFILTER("Search Name",'%1','*'+Text+'*');
IF Customer2.COUNT > 1 THEN
  IF FORM.RUNMODAL(22, Customer2) = ACTION::LookupOK THEN
    Text := Customer2."No.";

Dann solltest du weiter gar nichts tun müssen.

4. November 2007 19:32

PERFEKT !!!

Ich liebe dieses Forum ! :-D

Danke Michael!

4. November 2007 20:32

Michael Schumacher hat geschrieben:wo ist das Problem mit dem + ? das wird nur in der Vorschau nicht angezeigt....

lol
Woher soll ich denn ahnen, dass die Vorschau ungleich Ergebnis ist?
Naja, Hauptsache das Problem ist jetzt gelöst!