Funktion aus anderer Form aufrufen

14. Juni 2006 14:41

Hi,

ich möchte eine bestehende Funktion, die sich in einer Form befindet, von einer anderen Form heraus aufrufen.

Hintergrund:
Das Feld "Kontakt E-Mail" wird mit Hilfe dieser Funktion mit den aktuellen Werten aus der Tabel ContactMailingGroup befüllt. Ich möchte nun die Funktionalität auch in der Debitorenkarte im Feld Kontakt verwenden.

14. Juni 2006 16:53

Neuer Versuch :wink:

Ich habe folgenden Code in den OnAfterGetCurrRecord() Trigger der Form geschrieben:

Code:
 
IF "No." = ContactMailingGroup."Structure No." THEN
BEGIN
  ContactMailingGroup.GET;
  ContactMailingGroup.SETCURRENTKEY("Structure No.","Mailing Group Code","Contact No.");
  ContactMailingGroup.SETFILTER(ContactMailingGroup."Structure No.","Structure No.");
  IF ContactMailingGroup.FIND('-') THEN
  BEGIN
    GET(ContactMailingGroup."Contact No.");
    Contact := ContactMailingGroup."Contact Name";
  END;
END;


Wenn die Kontakt Nummer in der Debitorenkarte der Gliederungsnummer aus der Tabelle ContactMailingGroup entspricht, soll in dem Feld "Kontakt" auf der Debitorenkarte mit dem Kontaktname aus der Tabelle ContactMailinGroup gefüllt werden. Irgendwie funktioniert das aber noch nicht so, wie ich mir das vorstelle.

Bin wie immer für Tipps dankbar.

14. Juni 2006 17:07

Habe schon eine Fehler gefunden. Ich muss außerdem noch einen Filter auf das Feld MailingGroupCode setzen. Das Feld Contact muss nämlich leer sein, wenn man die Kontaktperson aus der Mailing Gruppe gelöscht hat. Bastel mal weiter daran.

16. Juni 2006 10:45

Hallo Leute, ich habe jetzt noch mal den Code umgestellt und in den OnValidate Trigger des Feldes Contact geschrieben.

Kurze Zusammenfassung:
Ich möchte beim Öffnen der Debitorenkarte, dass das der Inhalt eines Feldes aus einer anderen Tabelle als die SourceTable der Form geprüft wird. Bspw. öffnet man die Debitorenkarte, sucht eine bestimmte Debitoren NR., jetzt soll in der andere Tabelle der Wert des Feldes auf vorhandensein geprüft und anschließend im Textbox Control der Debitorenkarte ausgegeben werden.

Hintergrund: Einige Debitoren wurden aus der Tabelle Structure importiert. Nicht alle Debitoren stammen daraus. Ist die Debitoren NR. = Structure.Nr, dann soll mit der Prüfung angefangen werden.

Hier ist mal der aktuelle Code:

Code:
GLSetup.GET; //hier sind die VerteilerCodes hinterlegt
ContactMailingGroup.SETCURRENTKEY("Structure No.","Mailing Group Code","Contact No.");
IF "No." = ContactMailingGroup."Structure No." THEN
BEGIN // wenn der Kontakt aus der Tabelle Structure stammt

CASE ContactMailingGroup.Classification OF
   
  ContactMailingGroup.Classification::Class1:
  BEGIN
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Structure No.",COPYSTR("Structure No.",1,2)+'??????'); // Klassifikation anhand d. Struktur Nr.
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Mailing Group Code",GLSetup."Class1 Verteiler Code"); // Filtern auf VerteilerCode
  END;

  ContactMailingGroup.Classification::Class2:
  BEGIN
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Structure No.",COPYSTR("Structure No.",1,4)+'????'); // Klassifikation anhand d. Struktur Nr.
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Mailing Group Code",GLSetup."Class2 Verteiler Code"); // Filtern auf VerteilerCode
  END;
   
  ContactMailingGroup.Classification::Class3:
  BEGIN
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Structure No.",COPYSTR("Structure No.",1,6)+'??'); // Klassifikation anhand d. Struktur Nr.
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Mailing Group Code",GLSetup."Class3 Verteiler Code"); // Filtern auf VerteilerCode
  END;
   
  ContactMailingGroup.Classification::Class4:
  BEGIN
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Structure No.","Structure No."); // Klassifikation anhand d. Struktur Nr.
    ContactMailingGroup.SETFILTER(ContactMailingGroup."Mailing Group Code",GLSetup."Class4 Verteiler Cod"); // Filtern auf VerteilerCode
  END;
END;
 
IF ContactMailingGroup.FIND('-') THEN // Finde den ersten Eintrag
  BEGIN
    GET(ContactMailingGroup."Contact No."); // Datensatz aus der Sourcetable (Customer) holen, der mit Contact No. aus CMG identisch ist
    Contact := ContactMailingGroup."Contact Name"; //Feld "Contact" mit Wert füllen
    CurrForm.UPDATECONTROLS; // TextBox aktualisieren
  END ELSE BEGIN
    Contact := '' // wenn Feld in Tabelle CMG leer, dann Feld auf der KontaktKarte leer
  END;
END;



Leider wird das Feld "Contact" immer noch nicht aktualisiert. Lösche ich bspw. den VerteilerCode (Class1) eines Kontaktes in der Tabelle ContactMailingGroup, so wird die Debitorenkarten nicht aktualisiert. der Wert steht immer noch in der Karte.

Vielleicht sieht ja jemand meinen Fehler. Danke!

16. Juni 2006 11:34

Hab noch nen Fehler gefunden. Es muss am Enden nicht CurrForm.UPDATECONTROLS, sonder CurrForm.UPDATE heißen. Leider hat es immer noch nicht gebracht. Ach ja, außerdem ist das Felde ContactMailingGroup.Classification ein Flowfield. Ich musste also noch ContactMailingGroup.CALCFIELDS(Classification) vor der CASE Abfrage einbauen. Immer noch nichts :-(

16. Juni 2006 11:42

Ich denke, das Feld Contact wird nicht gefüllt, weil nach der Zuweisung kein Modify abgesetzt wird. Gibt doch mal den Wert von Contact nach der Zuweisung mit MESSAGE('%1', Contact) aus. Dann weisst du dann wenigstens, ob dein Programm den richtigen Wert liefert.

16. Juni 2006 12:03

Hmmm, habe ich ausprobiert. Habe auch den Modify jetzt direkt nach der Zuweisung hinterlegt. Leider nimmt das Feld immer noch den alten Wert. Das könnte aber wiederum bedeuten, das keine der zuvor geprüften Bedingungen erfüllt wird, hmmm?

16. Juni 2006 12:13

Mal ganz was anderes. Vielleicht habe ich mir da viel zu viel graue Haare wachsen lassen. Im Grunde möchte ich doch nur den Inhalt des Feldes "Contact" auf der Debitorenkarte mit dem Inhalt des Feldes ContactName aus der Tabelle ContactMailingGroup füllen. So dass, wenn sich der Wert in der CMG Tabelle ändert, auch der Wert in der Karte änderte. Also quasi einen Lookup machen. Muss ich dann eine Relation zwischen den Feldern herstellen oder bastel ich aus dem "Contact" Feld ein FlowField mit der Methode Lookup?

16. Juni 2006 12:20

Na Super, wenn ich aus dem Feld Contact in der Customer Tabelle ein FlowField machen möchte, kommt der Hinweis, dass nur leere Tabellenfelder geändert werden können. Gibts noch eine Alternative?

16. Juni 2006 12:21

Mir scheint, ich führe hier Selbstgespräche. :-?

16. Juni 2006 12:24

Wenn du das Feld Contact inein FlowField umwandeln möchtest, muss es natürlich in allen Mandanten leer sein. Das musst du mit einem kleinen Programm erledigen, dass über alle Records läuft und das Feld leert.

Aber die Lösung mit dem FlowField ist sicher die eleganteste. Du hast dann immer den aktuellen Wert drin. Allerdings kannst du dann die Tabelle nicht mehr nach Contact sortieren, da FlowFields in Keys nicht erlaubt sind.

Hast du eine Message eingebaut? Kommt denn da der richtige Wert?

16. Juni 2006 12:32

Hi Roger, ja hatte eine Message eingebaut. Kein Ergebnis :-(

Tja, wenn ich das Feld "Contact" in der Tabelle "Customer" nun leere, werden sie dann wieder durch das FlowField anschließend mit den Werten aus der Tabelle ContactMailingGroup befüllt?

16. Juni 2006 15:09

Hallo mgerhartz

Wenn die Definition des FlowFields korrekt erfolgte, zeigt es dann jeweils den von dir gewünschten Wert an. Dieser Wert ist dann aber nicht mehr physisch auf der Tabelle Debitoren geführt, sondern zur Laufzeit 'berechnet', sprich aus ContactMailingGroup gelesen.

Mach doch einfach einmal ein ganz neues Feld, dass diesem FlowField entspricht. Dann siehst du sofort, ob die Daten korrekt sind, da du dann die Felder im ObjectDesigner anschauen kannst

19. Juni 2006 17:08

Hallo,

ich habe jetzt also folgendes gemacht. Ich habe in der Tabelle Customer, die ja die SourceTabel der Debitorenkarte ist, ein neues Feld namens "Contact Structure" als FlowField des Typs Lookup angelegt. Als Filter habe ich in der Tabelle Customer das Feld "No." und in der Tabelle MailingGroup das Feld "Structure No." gewählt. Es soll also nur dann ein Lookup durchgeführt werden, wenn der Inhalt des "No." Feldes in der Tabelle Customer identisch ist mit dem Inhalt des Feldes "Structure No." der Tabelle MailingGroup.

Ist sonst noch was dabei zu beachten? Es funktioniert nämlich nicht :-(

19. Juni 2006 17:18

Wenn die Filter richtig sind, hast du nichts vergessen....

...außer, dass du "irgendwo" das neue Feld "kalkulieren musst ;)

Customer.CALCFIELDS("Contact Structure");

Grüße
Gerhard

21. Juni 2006 15:43

Hallo nochmal,

ich habe jetzt eine ganz anderen Ansatz gefunden. Ich habe auf dem Formular Gliederungskarte ein Feld namens "Kontakt Verteiler" eingefügt. Als Source Expression habe ich das Feld Mailing Group Code der Record Variable Contact Mailing Group hinterlegt. Anschließend habe ich eine Table Relation auf das Feld gesetzt: ContactMailingGroup."Mailing Group Code". Und mit einem Filter vesehen: Tab. Gliederung, Feld: Gliederungsnr. und Tab. Contact Mailing Group, Feld: Gliederungsnr.

Eigentlich sollte doch jetzt beim betätigen des Lookup Buttons des Feldes Kontakt Verteiler die auf die Gliederungsnr. gefilterten Datensätze der Tabelle Contact Mailing Group angezeigt werden.

Es erscheint allerdings folgende Fehlermeldung:

"Das Feld kann nicht kopiert werden. Das Herkunftsfeld wurde nicht gefunden"

By the way, beide Felder (Gliederungsnr.) sind im Primary Key beider Tabellen enthalten. Lasse ich den Tabellenfilter in der Table Relation weg, bekomme ich einen LookUp auf die Tabelle Contact Mailing Group (natürlich ungefiltert).

Wie kann ich denn die Datensätze der Tabelle Contact Mailing Group auf die Gliederungsnr. des aktuellen DS der Tabelle Gliederung filtern? Muss ich statt dessen Code in den OnLookUp Trigger des Feldes Mailing Group Code in der Tabelle Contact Mailing Group schreiben?