Informationen

Wiederholende Funktionalitäten sollten in der Regel immer ausgelagert werden, während selbstständige und themenfremde Funktionalitäten von Fall zu Fall zu entscheiden sind. Durch das Auslagern von Code ist dieser gut wiederverendbar, lesbar und wartbar. Zudem lässt sich so Zeit bei Änderungen einsparen.

Beispiel für wiederholende Funktionalitäten

Falsch:

Width - OnValidate()
  Volume := Width * Height * Length;

Height - OnValidate()
  Volume := Width * Height * Length;

Length - OnValidate()
  Volume := Width * Height * Length;

Richtig:

Width - OnValidate()
  CalculateVolume;

Height - OnValidate()
  CalculateVolume;

Length - OnValidate()
  CalculateVolume;

CalculateVolume();
  Volume := Width * Height * Length;

Beispiel für selbstständige Funktionalitäten

Falsch:

PostDocument(VAR Rec : Record "Sales Header")
  // SalesLines filtern
  SalesLine.SETRANGE("Document Type",SalesHeader."Document Type");
  SalesLine.SETRANGE("Document No.",SalesHeader."No.");

  // SalesLines prüfen
  SalesLine.FINDSET;
  REPEAT
    IF SalesLine.Type <> SalesLine.Type::" " THEN BEGIN
      SalesLine.TESTFIELD("No.");
      [...] //tausende weitere Tests
      SalesLine.TESTFIELD(Quantity);
    END;
  UNTIL SalesLine.NEXT = 0;

  // SalesHeader prüfen
  SalesHeader.TESTFIELD("External Document No.");
  [...] //tausende weitere Tests
  SalesHeader.TESTFIELD("Sell-to Customer No.");

  // SalesHeader freigeben
  SalesHeader.Status := SalesHeader.Status::Released;
  SalesHeader.MODIFY;

  // Buchen
  SalesPost.SETMODE(TRUE);
  SalesPost.RUN(SalesHeader);

Richtig:

PostDocument(VAR Rec : Record "Sales Header")
  CheckDocument(Rec);

  ReleaseDocument(Rec);

  PostDocument(Rec);

Beispiel für themenfremde Funktionalitäten

Falsch:

ReleaseSalesHeader(VAR Rec : Record "Sales Header")
  [...]

  // Erstelle EDI Dokument
  EDIDocument.INIT;
  EDIDocument."No. Series" := EDISetup."Order Nos.";
  EDIDocument."No." := NoSeriesMgt.GetNextNo2(
    EDIDocument."No. Series",
    '',
    '',
    0D);
  EDIDocument.INSERT(TRUE);

  EDIDocument."Description" :=
    FORMAT(SalesHeader."Document Type") + " " +
    SalesHeader."No.";
  [...]
  EDIDocument.MODIFY(TRUE);

  SalesLine.FINDSET;
  REPEAT
    EDIDocumentLine.INIT;
    [...]
    EDIDocumentLine.INSERT;
    [...]
    EDIDocumentLine.MODIFY;
  UNTIL SalesLine.NEXT = 0;
  
  // EDI Dokument freigeben
  EDIDocument.TESTFIELD(Description);
  [...]
  EDIDocument.Status := EDIDocument.Status::Released;
  EDIDocument.MODIFY;

  // EDI Dokument versenden/für FTP-Versand abspeichern
  EDIDocument.SaveToFile('C:\EDI\Outbound');

Richtig:

ReleaseSalesHeader(VAR Rec : Record "Sales Header")
  [...]

  EDIDocNo := EDIMgt.CreateOrderFromSalesDoc(Rec);

  EDIMgt.CheckAndRelease(EDIDocNo);
  EIDMgt.Send(EDIDocNo);