,
Achtung - diese Seite ist in noch Bearbeitung und beschreibt eine Funktionalität der noch geändert werden kann!
COBOL Datendefinitionen können nicht so ohne weiteres auf C# Datentypen abgebildet werden. Felder werden automatisch abgeschnitten, Daten werden implizit konvertiert, usw., usw.
Deswegen steht in der Namespace TeamWiSE.Runtime.Interop
eine Reihe von (generischen) Klassen zu Verfügung, welche verwendet werden können um COBOL Datendefinitionen in C# abzubilden.
Für elementare Datendefinitionen wird zwischen Alphanumerisch, Alphabetisch und Numerisch unterschieden. Daneben sind für USAGE INDEX
und USAGE POINTER
bzw. USAGE FUNCTION-POINTER
noch spezielle Klassen (Index und Pointer) vorgesehen. Für komplexe Datendefinitionen wie Klassen, Gruppen, Redefines, Filler, Arrays und Domänen (elementare Datendefinitionen mit Bedingungsnamen, e.g. 88-Stufen) sind eigene Klassen definiert.
Je nach Datentyp gibt es eine generische Klasse, der die COBOL-Komplexität für den Anwendungsentwickler übernimmt, sodass dies nicht im Anwendungscode berücksichtigt werden muss. Als Typargument für die jeweilige generische Klasse muss eine Klasse mit der Formatbeschreibung übergeben werden. Diese Formatbeschreibung enthält die Details zu dem Datenelement, die benötigt werden, um die COBOL-Spezialitäten zu berücksichtigen.
Hier sehen Sie 2 Beispiele, einmal für ein PIC X(10)
Feld, und einmal für ein PIC S9(10)V9(5) COMP
sealed class StringFormat : AlphanumericFormat { public StringFormat() : base(length:10) {} } sealed class BetragFormat : NumericFormat { public BetragFormat() : base(predecimals:10, decimals:5, isSigned:true, usage:UsageEnum.Limited) {} }
Je nach Datentyp sind unterschiedliche Formatangaben definiert. Welche Formatangeben gemacht werden müssen/können, ist bei dem jeweiligen Datentyp beschrieben.
Für die Definition eines Datenelementes wird eine Instanz der entsprechende generische Klasse angelegt. Im Anwendungscode werden die Variablen dann genauso genutzt, wie man eine Variable vom Typ string
oder double
verwenden würde:
Numeric<BetragFormat> betrag = new Numeric<BetragFormat>(); ... betrag = Snlppme.PmePraeBt; if (betrag > 0) { ...
Dazu implementieren diese Klassen eine Reihe von Cast- und Vergleichsoperatoren. Diese sind bei der jeweilige Klasse beschrieben.
public abstract class DataElement;
public abstract class DataFormat;
Alle generischen Klassen sowie auch die Formatbeschreibungen basieren auf gemeinsamen Basisklassen (DataElement
bzw. DataFormat
). Die Basisklasse DateElement
implementiert die Interfaces IEquatable<T>
, IComparable<T>
, IComparable
, IConvertible
, und implementiert entsprechenden Vergleichsoperatoren.
Nachfolgend sind die Formatangaben, Methoden, Eigenschaften und Operatoren beschrieben, die für alle gleich sind. Allerdings kann es sein, das bestimmte Methoden und Operatoren bei den abgeleitete Klassen nicht verwendet werden können. Dies ist dann bei der jeweilige abgeleitete Klasse beschrieben.
public object InitialValue { get; }
Abweichender Initialwert. Dieser wird bei der Neuanlage einer generischen Klasse wie auch von der Methode SetInitialValue
verwendet. Obwohl hier der C# Typ object
verwendet wird, wird bei der Defnition eine Formatbeschreibung eines bestimmten C#-Typs erwartet, z.B. string
für Alphanumerisch bzw. Alphabetisch, oder IntPtr
für Pointer.
public String DisplayFormat { get; }
Enthält die, aus der Datendeklaration abgeleitete Formatieranweisungen welche verwendet werden, um den Inhalt des Datenelementes anzuzeigen.
public void Initialize()
Initialisiert das Datenelement mit seinem Standartwert. e.g. String.Empty
für Alphanumeric
bzw. Alphabetic
, oder 0 für Numeric
public void SetInitialValue()
Initialisiert das Datenelement mit seinem Initialwert. In der Regel handelts es sich dabei um den Standwert, welche auch beim Initialize
verwendet wird, ein abweichender Wert kann aber als InitialValue
bei der Formatangabe festgelegt werden.
public bool IsNumeric();
Prüft, ob die Daten ausschließlich aus den Ziffern 0 bis 9 sowie ein führendes oder nachfolgendes Minus- oder Pluszeichen besteht.
Diese Methode wird für die Umsetzung der IS NUMERIC Bedingung verwendet.
public bool IsAlphabetic();
Prüft, ob die Daten ausschließlich aus Groß- oder Kleinbuchstaben A bis Z sowie Leerzeichen besteht.
Diese Methode wird für die Umsetzung der IS ALPHABETIC Bedingung verwendet.
public bool IsAlphabeticLower();
Prüft, ob die Daten ausschließlich aus Kleinbuchstaben a bis z sowie Leerzeichen besteht.
Diese Methode wird für die Umsetzung der IS ALPHABETIC LOWER Bedingung verwendet.
public bool IsAlphabeticUpper();
Prüft, ob die Daten ausschließlich aus Großbuchstaben A bis Z sowie Leerzeichen besteht.
Diese Methode wird für die Umsetzung der IS ALPHABETIC UPPER Bedingung verwendet.
public bool Parse(string value);
Bestückt die Felder der Gruppe mit dem Inhalt der Zeichenfolge. Eine zu lange Zeichenfolge wird ohne Fehlermeldung abgeschnitten. Es erfolgt hier keine Prüfung von Domänen - hierfür bitte die Parse-Methode an der Felddefinition verwenden.
public bool IsDisplayable();
Gibt an ob die Gruppen Darstellbar ist .
public static int Size { get; }
Liefert die Anzahl Bytes welche für dieses Datenelement benötigt werden. Diese Eigenschaft wird u.A. für die Umsetzung der LENGTH OF-Abfrage verwendet.
public byte[] Bytes { get; set; }
Bietet Zugriff auf die Daten für das Datenelement, um diese z.B. für ein CALL USING
zu übergeben, bzw. zum Bestücken, wenn Daten übergeben werden.
static bool operator ==(DataElement left, DataElement right); static bool operator !=(DataElement left, DataElement right);
Vergleicht den Inhalt von beide Argumente. Wenn für beide Argumente null
übergeben wird, werden sie als gleich angesehen, wenn nur für eine von beiden ''null' übergeben wird, als ungleich.