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.
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.
// 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)));
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.
// 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();
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.
// 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();
public static double NumVal(this string value);
Extrahiert einen nummerischen Wert aus dem übergebenen String und liefert diesen als Double-Wert zurück.
// 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();
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
.
// 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);
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
.
// ORIG: EXEC TAA // ORIG: GET LAST SNLPRM // ORIG: END-EXEC this.DataSnlprm.LastOrDefault()?.CopyLocal(Snlprm);
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
.
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
.
// 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);
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
.
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
.
public static string Reverse(this string value);
Gibt einen String von gleicher Länge in umgekehrter Zeichenreihenfolge zurück.
// ORIG: INSPECT FUNCTION REVERSE(SYSTVAR-GOB-OB) // ORIG: TALLYING L-ANZAHL FOR LEADING SPACE LAnzahl += (Data.Systvar.GobOb).Reverse().Tallying(String.Empty, "", "" , true);
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.
// 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);
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µµµ
.
// 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; }
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.
// ORIG: MOVE K-HIGH-UNIT TO Z0AAPRM-000-HIST-ANUL-TS Z0aaprm._000HistAnulTs = SnstrKonstanten.KHighUnit.FromTimestampString();
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
.
// ORIG: MOVE SNLLPME-PRM-PRAEA-FAELV-D0 // ORIG: TO L-PRM-PRAEA-FAELV-D0 LPrmPraeaFaelvD0 = Snllpme.PrmPraeaFaelvD0.ToDateString();
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.
// ORIG: MOVE ZW-VON-DATUM TO LLPPMEZ-PRM-PRAEA-FAELV-D0 Llppmez.PrmPraeaFaelvD0 = ZwVonDatum.FromDateString();
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.
// 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}";
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.
// 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;
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.
// ORIG: MOVE SNLPVEL-VEG-VEIN-ID TO ZW-SUCH-ID ZwSuchId = Snlpvel.VegVeinId.ToAlphanumeric(11);