[Gelöst] Vorgegebenen Wert aus DropDown in Tabelle speichern

29. Oktober 2007 14:12

Ich muss mich mal wieder mit einem Problemchen an euch wenden.

Ich habe ein Drop-Down Feld in dem man einstellen kann welche Art ein Kontakt ist (Kunde, Firma oder Vermittler). Wenn der Kontakt nun ein Vermittler ist, wird in dieses Drop-Down Feld der Wert Vermittler schon voreingestellt. Jedoch hab ich das Problem das dies nicht in der Kontakttabelle gespeichert wird.

Code:
IF "Vermittler Nr." <> '' THEN
   Kontaktart := Kontaktart::Vermittler;


Ein anschließendes Validate hat mich bisher auch nicht weiter gebracht. Der Code steht im OnAfterGetCurrRecord-Trigger von der Form.
Kann mir einer nen Tip geben? Muss ich das Validate vielleicht in einen anderen Trigger schreiben? Freue mich über jede Hilfe.
Zuletzt geändert von Heike Bennerscheid am 29. Oktober 2007 15:29, insgesamt 1-mal geändert.

29. Oktober 2007 14:38

Hallo Heike!

Versuchs doch zusätzlich noch mit einem MODIFY.

Code:
IF "Vermittler Nr." <> '' THEN BEGIN
  Kontaktart := Kontaktart::Vermittler;
  MODIFY;
END;

Ich würde jedoch die Programmierung in die Tabelle verlagern. Dort im OnValidate-Trigger des Feldes Vermittler Nr.. Und dann so:

Code:
IF "Vermittler Nr." <> '' THEN
  Kontaktart := Kontaktart::Vermittler;

Gruß, Marc

29. Oktober 2007 14:45

Das mit dem MODIFY hab ich auch schon ausprobiert und ich erhalte dann folgende Fehlermeldung:

Sie können keine Änderung an der Datenbank vornehmen, ehe eine Transaktion gestartet wurde.

29. Oktober 2007 15:00

Eine Forensuche nach dieser Fehlermeldung hätte ergeben, dass du den gesamten Änderungscode in einen Report auslagern musst, der an bisherigen Stelle des Quelltextes aufgerufen werden muss.

Irgendwie erscheint mir das gesamte Prozedere etwas suspekt... Ich hätte den Report wie Marc schon sagte, einmal im OnValidate-Trigger des Felder Vermittler Nr. aufgerufen, außerdem im OnInsert-Trigger der Tabelle Kontakt.

In diesen beiden Triggern brauchst du auch den Reportaufruf nicht mehr: Erstelle in der Tabelle Kontakte eine Funktion (z.B. namens SetKontaktart) und setze da deinen Quelltext hinein. Nun brauchst du in den Triggern nur noch deine Funktion aufrufen.

29. Oktober 2007 15:17

Das bringt aber auch nicht das gewünschte Ergebnis. Weder wird in das Drop-Down Feld der Wert "Vermittler" vorgegeben. Noch wird es in die Tabelle geschrieben.

Vielleicht noch eine Info:
Das soll nicht bei einer Neuanlage passieren sondern wenn ein Record aufgerufen wird. Sei es durch durchswitchen mit den Pfeilen oder sei es durch impliziertes suchen. (Halt sobald der Record mit einer Vermittlernummer angezeigt wird.)

29. Oktober 2007 15:23

Dann kommst du um die Auslagerung in einen Report nicht herum.

29. Oktober 2007 15:28

Sowas hab ich mir schon fast gedacht und bin grad dabei ihn zu erstellen. Schade irgendwie. Aber trotzdem danke für eure Hilfe.

29. Oktober 2007 16:58

Ich bin jetzt vollends verwirrt. Ich glaub irgendwas überseh ich noch.

Ich habe jetzt einen Report erstellt. In dem steht folgender Code in einer eigenen Funktion (Aendern Kontaktart):

Code:
WITH Contact DO BEGIN
     VALIDATE(Kontaktart,Kontaktart::Vermittler);
     MODIFY;
END;


In der Form sieht der Code dann so aus:

Code:
IF "Vermittler Nr." <> '' THEN BEGIN
   Kontaktart := Kontaktart::Vermittler; //Drop-Down wird vorbelegt
   CLEAR(RepKontaktart);
   RepKontaktart."Aendern Kontaktart";
END;


Der Report wird anscheinend auch aufgerufen.. aber er ruft nur wieder die gleiche Fehlermeldung wie ohne Report hervor.

29. Oktober 2007 17:18

Der C/AL-Code in der Form müsste meiner Meinung nach lediglich folgendes enthalten:

Code:
IF "Vermittler Nr." <> '' THEN
   RepKontaktart."Aendern Kontaktart";


Der Rest, dass Setzen des Feldes Kontaktart, wird ja vom Report aus gemacht und muss somit nicht zusätzlich noch in der Form gemacht werden.

Eine Frage habe ich noch. Woher weiß der Report, welchen Datensatz er bearbeiten muss?

Gruß, Marc

29. Oktober 2007 17:58

Marc Teuber hat geschrieben:Der C/AL-Code in der Form müsste meiner Meinung nach lediglich folgendes enthalten:

Code:
IF "Vermittler Nr." <> '' THEN
   RepKontaktart."Aendern Kontaktart";


[...]Eine Frage habe ich noch. Woher weiß der Report, welchen Datensatz er bearbeiten muss?


Darum hätte ich eher auch ein
Code:
RepKontaktart.RUN;

erwartet ...

29. Oktober 2007 18:00

Die Funktion "Aendern Kontaktart" hat einen Parameter Vermittler vom Typ Record mit Subtyp Contact.

Ich übergebe jetzt mit dem Aufruf in der Form den Record

RepKontaktart."Aendern Kontaktart"(Rec);

Und ganz ehrlich hab ich keine Ahnung ob das überhaupt so richtig ist. Ich weiß zwar nicht warum, aber ich habe im Moment total die Probleme das zu verstehen :-(

29. Oktober 2007 18:04

Hast du denn schon einmal Reports erstellt? Weißt du, was DataItems sind und wie diese abgearbeitet werden?

Du musst halt einen Report schreiben, nur mit dem DataItem Contact, der in die Kontaktart setzt und dann ein MODIFY ausführt.
Damit der Report aber weiß, auf welchem Contact-Datensatz dies zu tun ist, muss vor Aufruf des Reports ein entsprechender Filter gesetzt werden.

29. Oktober 2007 18:10

Ja ich hab schon Reports geschrieben. Aber welche die über den Objektdesigner aufgerufen wurden. Und nicht über eine Form.

Was ich mir halt vorstelle ist das ich in der Form durch meine Kontakte durchswitche und wenn ein Vermittler erscheint das im Drop-Down Feld Kontaktart dann dort automatisch Vermittler steht. Und das ganze soll dann auch so in der Taballe Contact gespeichert werden. Wenn ich dafür nen Report benutzen muss, möchte ich natürlich das der Report das im Hintergrund ausführt und nicht noch ein zusätzliches Fenster erscheint.

Brauche ich in meinem Report überhaupt eine extra Funktion? Oder kann ich meinen Code auch in einem Standard Trigger ausführen?

Nachtrag:

Rufe ich den Report mit RUN auf und schreibe meinen VALIDATE/MODIFY Code in den OnAfterGetRecord Trigger vom Report schließt er mir dir Form ohne Fehlermeldung oder sonstiges sobald ich auf einen Vermittler komme. Das verstehe ich irgendwie nicht.

29. Oktober 2007 18:27

Dein Report muss die Eigenschaft ProcessingOnly = Yes haben. Dies sorgt dafür, dass keine Sections gebildet werden (also Passagen, die ausgedruckt werden sollen - die brauchen wir aber nicht).

Weiterhin muss Navision wissen, dass der Report ohne die Request-Form aufgerufen werden soll. Hierzu steht in der NAV-Onlinehilfe unter REPORT.RUN, dass du den Report so parametrisiert aufrufen kannst:

REPORT.RUN(Number [, ReqWindow] [, SystemPrinter] [, Record])

Number = Nummer deines neuen Reports
ReqWindow = FALSE, denn das Fenster möchest du nicht sehen
SystemPrinter = hier egal
Record = eine Record-Variable vom Typ Contact

Achtung: Bevor du REPORT.RUN aufrufst, musst du zuvor einen entsprechenden Filter auf deine Record-Variable gesetzt haben, sonst wird der Report für ALLE Kontakte ausgeführt ...!

29. Oktober 2007 18:31

ProcessingOnly hab ich schon eingestellt. Das kenn ich schon aus den netten Kursen :)

Jetzt check ich erst was dieses Request-Form ist *gegen stirn klatsch* Ich hab in letzter Zeit echt nen Knoten im Hirn. Danke

Womit setz ich den Filter am besten? SETRANGE?

29. Oktober 2007 18:34

Heike Bennerscheid hat geschrieben:Womit setz ich den Filter am besten? SETRANGE?

Ja, z.B.
Es reicht, wenn du nur auf die aktuelle "No." filterst.

30. Oktober 2007 15:31

So habe ich es an anderer Stelle mal gelöst (andere Tabelle, anderer Trigger, aber etwa der gleiche Sachverhalt:

Code:
  locSalesHeader.GET("Document Type", "No."); // Lade den aktuellen VK-Kopf  (Rec) in Record locSalesHeader
  locSalesHeader.SETRECFILTER; // filtere auf nur eben diesen einen Datensatz
  REPORT.RUN(50018, FALSE, FALSE, locSalesHeader); // starte Hilfsreport

30. Oktober 2007 16:00

Bei mir sieht es so aus:

Code:
IF "Vermittler Nr." <> '' THEN BEGIN
   Cont.SETRANGE("No.","No.");
   REPORT.RUN(56755,FALSE,FALSE,Cont);
END;

9. November 2007 16:59

Nochmal ne Frage hierzu. Funktioniert das auch wenn ich anstatt den Report aufzurufen, eine Funktion aus dem Report aufrufe?

9. November 2007 17:51

Das hängt von der Funktion ab, aber warum?

9. November 2007 18:04

Das ist etwas kompliziert.. ich hoffe ich kann das verständlich erklären.

Also wir haben die Form Debitor Karte. Diese greift auf die Tabelle Customer zu. Nun habe ich dort ein paar Felder hinzugefügt die aber von der Tabelle Contact stammen. Diese werden auch richtig angezeigt. Wenn ich nun aber darin etwas ändern möchte, speichert er die Daten mir nicht in die Contact Tabelle. Deswegen dachte ich, ich mach nen Report mit einer Funktion für jedes Feld zum Beispiel fctModifyMobil. Dieser Funktion übergebe ich den Wert aus dem Mobiltelefonnumern Feld und rufe in der Funktion dann VALIDATE und MODIFY auf.

Wenn das so geht wie ich mir das vorstelle müsst ich jetzt nur noch herausfinden wie ich den Filter richtig setze (so dass er auch den richtigen Datensatz ändert) daran häng ich nämlich zur Zeit.