Inhaltsverzeichnis

Migrationsunterstützende Hilfen

Erweiterungsmethoden

Um bei der Migration von COBOL nach C# die Lesbarkeit zu erhöhen, und außerdem nah an der Struktur des ursprünglichen Codes zu bleiben, stehen einige Erweiterungsmethoden zur Verfügung.

CompareCoalesce

public static int CompareCoalesce(this int compareresult, Func<int> nextcomparer);

Liefert das aktuelle Vergleichsergebnis compareresult, falls dieses nicht 0 ist, sonst wird das Ergebnis des nächsten Vergleichs mittels nextcomparer geliefert.

Beispiel

// ORIG: EXEC TAA
// ORIG:     SORT Z0AARIS ON FIELD VEG-VEIN-ID-2 ASCENDING,
// ORIG:                           RIS-RI-ID     ASCENDING
// ORIG: END-EXEC
this.Data.Z0aaris.Sort((left, right) => left.VegVeinId2.CompareTo(right.VegVeinId2)
	.CompareCoalesce(() => left.RisRiId.CompareTo(right.RisRiId)));

DateOfInteger

public static int DateOfInteger(this int integer);

Addiert zum StartDatum (31.12.1600) die angebene Anzahl Tage und gibt diese als Integer im Format YYYYMMDD zurück. Nur zur Erleichterung von Portierungs- oder Migrationsaufgaben gedacht.

Beispiel

// ORIG: COMPUTE W-DATE-INFO = FUNCTION DATE-OF-INTEGER
// ORIG:                       (FUNCTION INTEGER-OF-DATE
// ORIG:                        ((W-DATUM-YYYY * 10000) +
// ORIG:                         (W-DATUM-MM * 100) +
// ORIG:                         (W-DATUM-DD)))
// ORIG: END-COMPUTE
WDateInfo = (((WDatumYyyy * 10000) + (WDatumMm * 100) + (WDatumDd)).IntegerOfDate()).DateOfInteger();

IntegerOfDate

public static int IntegerOfDate(this int date);
public static int IntegerOfDate(this uint date);

Berechnet aus einem Integer im Format YYYYMMDD die Anzahl Tage vom 31.12.1600 bis zum angegebenen Datum.

Beispiel

// ORIG: COMPUTE N-WRTST-D0 = FUNCTION DATE-OF-INTEGER
// ORIG:                      (FUNCTION INTEGER-OF-DATE
// ORIG:                   ((Z0AAPKM-PRM-PRAEA-WRTST-XJ * 10000) +
// ORIG:                    (Z0AAPKM-PRM-PRAEA-WRTST-MM * 100) +
// ORIG:                     Z0AAPKM-PRM-PRAEA-WRTST-TT))
// ORIG: END-COMPUTE
NWrtstD0 = (((Z0aapkm.PrmPraeaWrtstD0.Year * 10000) + (Z0aapkm.PrmPraeaWrtstD0.Month * 100) + Z0aapkm.PrmPraeaWrtstD0.Day).IntegerOfDate()).DateOfInteger();

NumVal

public static double NumVal(this string value);

Extrahiert einen nummerischen Wert aus dem übergebenen String und liefert diesen als Double-Wert zurück.

Beispiel

// ORIG: COMPUTE SNLPRM-RIS-RI-ID =
// ORIG:         FUNCTION NUMVAL (SYSTVAR-GOB-OB (1:L-ANZAHL))
// ORIG: END-COMPUTE
Snlprm.RisRiId = (Data.Systvar.GobOb.Substring(1 - 1, LAnzahl)).NumVal();

FirstOrDefault

public static T FirstOrDefault<T>(this ObjList<T> source) where T : DataObject<T>;
public static T FirstOrDefault<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;

Liefert den ersten Eintrag oder null aus einem Mengenobjekt, ggf. gefiltert durch ein predicate.

Beispiel

// ORIG: EXEC TAA
// ORIG:     GET FIRST SNLPPME
// ORIG:     WHERE
// ORIG:         SNLPPME-T80-VEIN-KNOT-K = K-VEIN-KNOT-VSN   AND
// ORIG:         SNLPPME-X50-PRAE-TYP-K  = K-AVEBPRAEZW
// ORIG: END-EXEC
this.Data.Snlppme.FirstOrDefault(rec => rec.T80VeinKnotK == PraeKonstanten.KVeinKnotVsn && 
	rec.X50PraeTypK == PraeKonstanten.KAvebpraezw)?.CopyLocal(Snlppme);

LastOrDefault

public static T LastOrDefault<T>(this ObjList<T> source) where T : DataObject<T>;
public static T LastOrDefault<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;

Liefert den letzten Eintrag oder null aus einem Mengenobjekt, ggf. gefiltert durch ein predicate.

Beispiel

// ORIG: EXEC TAA
// ORIG:     GET LAST SNLPRM
// ORIG: END-EXEC
this.DataSnlprm.LastOrDefault()?.CopyLocal(Snlprm);

Next

public static T Next<T>(this ObjList<T> source) where T : DataObject<T>;
public static T Next<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;

Liefert aus einem Mengenobjekt den nächsten Eintrag nach dem aktuellen, ggf. gefiltert durch ein predicate.

NextOrDefault

public static T NextOrDefault<T>(this ObjList<T> source) where T : DataObject<T>;
public static T NextOrDefault<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;

Liefert aus einem Mengenobjekt den nächsten Eintrag nach dem aktuellen oder null, ggf. gefiltert durch ein predicate.

Beispiel

// ORIG: EXEC TAA
// ORIG:     GET NEXT SNLPRIS
// ORIG:         WHERE SNLPRIS-VEL-VELE-ID = SNLPVEL-VEL-VELE-ID
// ORIG: END-EXEC
this.Data.Snlpris.NextOrDefault(rec => rec.VelVeleId == Snlpvel.VelVeleId)?.CopyLocal(Snlpris);

Previous

public static T Previous<T>(this ObjList<T> source) where T : DataObject<T>;
public static T Previous<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;

Liefert aus einem Mengenobjekt den Eintrag vor dem aktuellen, ggf. gefiltert durch ein predicate.

PreviousOrDefault

public static T PreviousOrDefault<T>(this ObjList<T> source, Func<T, bool> predicate) where T : DataObject<T>;
public static T PreviousOrDefault<T>(this ObjList<T> source) where T : DataObject<T>;

Liefert aus einem Mengenobjekt den Eintrag vor dem aktuellen oder null, ggf. gefiltert durch ein predicate.

Reverse

public static string Reverse(this string value);

Gibt einen String von gleicher Länge in umgekehrter Zeichenreihenfolge zurück.

Beispiel

// ORIG: INSPECT FUNCTION REVERSE(SYSTVAR-GOB-OB)
// ORIG:         TALLYING L-ANZAHL FOR LEADING SPACE
LAnzahl += (Data.Systvar.GobOb).Reverse().Tallying(String.Empty, "", "" , true);

Substitute

public static string Substitute(this string text, int start, string value);
public static string Substitute(this string text, int start, int length, string value);

Ersetzt den Text ab der angegebenen Position in der angegebenen Länge oder bis zum Ende durch den angegebenen neuen Text. Der neue Text wird, falls notwendig, bis zur erforderlichen Länge rechts mit Leerzeichen aufgefüllt.

Beispiel

// ORIG: MOVE K-BUCHSTABE-S TO L-BUF-SWP (L-LEN + 1:1)
LBufSwp = LBufSwp.Substitute(LLen + 1 - 1, 1, KBuchstabeS);
// ORIG: MOVE L-BUF-TXT
// ORIG:         TO Z0AAX50-X50-PRAE-TYP-LBZ (L-BUF-ANZ:)
Z0aax50.X50PraeTypLbz = Z0aax50.X50PraeTypLbz.Substitute(LBufAnz - 1, LBufTxt);

ToTimestampString

public static String ToTimestampString(this DateTime timestamp)

Wandelt ein Datum/Uhrzeit in einem String nach Timestamp-Konventionen um. Das Format für die Konvertierung ist sinngemäß YYYY-MM-DD-hh.mm.ss.mmmµµµ.

Beispiel

// ORIG: IF Z0AARIS-000-HIST-IKS-TS (1:22) =
// ORIG:    Z0AAVEV-000-HIST-IKS-TS (1:22)
// ORIG: THEN
if (Z0aaris._000HistIksTs.ToTimestampString().Substring(0, 22) == Z0aavev._000HistIksTs.ToTimestampString().Substring(0, 22)) {
	// ORIG: SET B-GEFUNDEN TO TRUE
	BGefunden = true;
}

FromTimestampString

Wandelt ein String in Timestamp-Konventionen (YYYY-MM-DD-hh.mm.ss.mmmµµµ, bzw. YYYY-MM-DD) in einem DateTime um. Wenn das Argument kein gültiges Format aufweist, wird ein ArgumentException aufgeworfen.

Beispiel

// ORIG: MOVE K-HIGH-UNIT TO Z0AAPRM-000-HIST-ANUL-TS
Z0aaprm._000HistAnulTs = SnstrKonstanten.KHighUnit.FromTimestampString();

ToDateString

public static String ToDateString(this DateTime date)

Wandelt ein Datum/Uhrzeit in einem String nach Timestamp-Konventionen um. Das Format für die Konvertierung ist sinngemäß YYYY-MM-DD.

Beispiel

// ORIG: MOVE SNLLPME-PRM-PRAEA-FAELV-D0
// ORIG:                             TO L-PRM-PRAEA-FAELV-D0
LPrmPraeaFaelvD0 = Snllpme.PrmPraeaFaelvD0.ToDateString();

FromDateString

public static DateTime FromDateString(this string date)

Wandelt ein String in Timestamp-Konventionen (YYYY-MM-DD-hh.mm.ss.mmmµµµ, bzw. YYYY-MM-DD) in einem DateTime um, und liefert das Datum. Wenn das Argument kein gültiges Format aufweist, wird ein ArgumentException aufgeworfen.

Beispiel

// ORIG: MOVE ZW-VON-DATUM TO LLPPMEZ-PRM-PRAEA-FAELV-D0
Llppmez.PrmPraeaFaelvD0 = ZwVonDatum.FromDateString();

Upto

public static string Upto(this string text, string stopAt = null);

Liefert den Substring des angegebenen Textes bis zum ersten Vorkommen des Begrenzers. Falls der Begrenzer nicht vorkommt, wird der ganze Quelltext als Ergebnis geliefert.

Beispiel

// ORIG: STRING ZW-LBZ-ZUSATZ     DELIMITED BY SPACE,
// ORIG:     SPACE                DELIMITED BY SIZE,
// ORIG:     LRPPME1-PME-PRAE-LBZ DELIMITED BY SIZE,
// ORIG:     INTO SNLPPME-PME-PRAE-LBZ
// ORIG: END-STRING
Snlppme.PmePraeLbz = $@"{ZwLbzZusatz.Upto(" ")} {Lrppme1.PmePraeLbz}";

RestAfter

public static string RestAfter(this string text, string startAfter = null)

Liefert den Substring des angegebenen Textes nach dem ersten Vorkommen des Begrenzers. Falls der Begrenzer nicht vorkommt, wird ein Leerstring als Ergebnis geliefert.

Beispiel

// ORIG: INSPECT Z0AAX50-X50-PRAE-TYP-LBZ TALLYING L-BUF-ANZ
// ORIG:   FOR CHARACTERS AFTER INITIAL K-LBZ-EBEI-JAHRES
LBufAnz += Z0aax50.X50PraeTypLbz.RestAfter(KLbzEbeiJahres).Length;

ToAlphanumeric

public static string ToAlphanumeric<T>(this T value, int predecimals = -1, int decimals = 0)

Liefert eine Zeichenfolge für den Wert, der bei der Zuweisung oder Vergleich einer alphanumerischer Wert verwendet werden kann (e.g. ohne Vorzeichen und Dezimaltrennung). Die Paramater predecimals und decimals geben die Anzahl Vorkommastellen, bzw Anzahl Nachkommastellen welche berücksichtigt werden soll. Werden diese nicht übergeben, bzw. den Wert -1 für predecimals, werden die Anzahl Vor- und Nachkommastellen vom Wert abgeleitet.

Beispiel

// ORIG: MOVE SNLPVEL-VEG-VEIN-ID TO ZW-SUCH-ID
ZwSuchId = Snlpvel.VegVeinId.ToAlphanumeric(11);