{"id":673,"date":"2012-07-23T11:53:03","date_gmt":"2012-07-23T09:53:03","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=673"},"modified":"2018-03-05T10:27:59","modified_gmt":"2018-03-05T09:27:59","slug":"ibm-doors-dxl-tipps-und-tricks","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=673","title":{"rendered":"IBM Doors DXL: Tipps und Tricks"},"content":{"rendered":"<h1>Zahlen an String konkatenieren<\/h1>\n<p>Zahlen oder andere Datentypen die in einen String gecastet werden sollen m\u00fcssen mit leerem String abgeschlossen werden:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nreal zahl = 4.555;\r\nprint &quot;Die Zahl lautet: &quot; zahl &quot; &quot;; \r\n<\/pre>\n<p>Jedes Attribut sollte bei einem String-Vergleich immer mit Doppelanf\u00fchrungszeichen abgeschlossen werden.<\/p>\n<h1>Substrings in DXL<\/h1>\n<p>Auf Abschnitte aus einem String zugreifen:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstring ganzerString = &quot;Hello world&quot;;\r\nstring meinSubstring = ganzerString&#x5B;0:6];\r\nstring vonVierBisEnde = ganzerString&#x5B;4:];\r\nprint meinSubstring &quot; &quot; vonVierBisEnde; \r\n<\/pre>\n<p>Es k\u00f6nnen auch Funktionen und Variablen in die eckigen Stringklammern geschrieben werden.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint i=2;\r\nstring einString = &quot;Hello world&quot;;\r\nprint einString&#x5B;i: (length(einString)-4)];\r\n<\/pre>\n<h1>Strings unterliegen der lexikographischen Ordnung<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nif(&quot;Hallo&quot; &gt; &quot;hallo&quot;) print &quot;Hallo ist groesser uppercase first&quot;;\r\n<\/pre>\n<h1>Ist ein Teilstring enthalten indexOf<\/h1>\n<p>string einString = &#8222;Hello world&#8220;;<br \/>\nif (matches(&#8222;Hello&#8220;,einString))<br \/>\n{<br \/>\nprint &#8222;Is drinn!&#8220;;<br \/>\n}<\/p>\n<h1>Type conversions von String<\/h1>\n<p>string eineZahl= &#8222;12.3&#8220;<br \/>\nint iType = intOf(eineZahl);<br \/>\nreal rType = realOf(eineZahl);<br \/>\nchar cType = charOf(iType); \/\/ Konvertiert in den Ascii-Wert<\/p>\n<h1>Datumsvergleich<\/h1>\n<p>Date heute = today();<br \/>\nDate einDatum = &#8222;1\/1\/2000 0:0:0&#8220;;<br \/>\nif(heute>einDatum)<br \/>\n{<br \/>\nprint &#8222;Das Jahr 2000 ist vorbei!&#8220;;<br \/>\n}<\/p>\n<h1>FOR-Schleifen<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nfor i in 0 : 100 do\r\n{\r\n   print &quot;Hello world! &quot; i &quot;&quot;;\r\n}\r\n\r\nfor (x=0; x&lt;100; x++)\r\n{\r\n   print &quot;Hello world&quot;;\r\n}\r\n<\/pre>\n<h1>Ausschalten von Skript Timeout<\/h1>\n<p>Folgendes Statement im Kopf der Schleife setzt den Skript-Timeout auf unendlich:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npragma runLim,0 \/\/ 0 bedeutet unendlich\r\n<\/pre>\n<h1>Iterations- und Ablaufssteuerungsbefehle<\/h1>\n<p>halt: Das gesamte DXL Programm wird abgebrochen<br \/>\ncontinue: Vergiss den Rest der Schleife und beginne mit n\u00e4chster Iteration<br \/>\nbreak: Brich die Schleife komplett ab<\/p>\n<h1>Left Trim in DXL<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstring leftTrim(string einString)\r\n{\r\n   int dieLetztePosition=-1;\r\n   for (x=0; x&lt;length(einString); x++)\r\n   {\r\n      if( einString&#x5B;x:x] != &quot; &quot; )\r\n      {\r\n        dieLetztePosition=x;\r\n         break;\r\n      }\r\n   }\r\n\r\n   return einString&#x5B;dieLetztePosition:];\r\n}\r\n\r\n\r\nprint leftTrim(&quot;    Hello world!&quot;);\r\n<\/pre>\n<h1>Bibliothek g\u00e4ngiger String-Funktionen wie in JAVA<\/h1>\n<p>DXL ist sehr rudiment\u00e4r was String Manipulationen angeht.<\/p>\n<p>Ich empfehle meine String Bibliothek mit den g\u00e4ngigsten String Functions zu verwenden:<\/p>\n<p><a href=\"https:\/\/www.capri-soft.de\/blog\/?p=832\">Zum Beitrag \u00fcber String Functions<\/a><\/p>\n<h1>Call by reference und Call by Value<\/h1>\n<p>a: Call by Value<br \/>\nb: Call by Reference<\/p>\n<p>Bei Call by Reference wird die Zahl nach der \u00dcbergabe auch im Context au\u00dferhalb des FUnktionsaufrufs ge\u00e4ndert.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvoid myfunction (int a, int&lt;b)\r\n{\r\n   b=a+100;\r\n   a=b+1;\r\n   return(a);\r\n}\r\n<\/pre>\n<h1>Durch statisches Array iterieren<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstring biers&#x5B;]={&quot;Becks&quot;, &quot;Licher&quot;, &quot;Jever&quot;, &quot;Heineken&quot;};\r\n\r\n\/\/ sortiere die Biers lexikographisch\r\nsort(biers);\r\n\r\nint i=0;\r\nfor (i=0; i&lt;sizeof(biers); i++)\r\n{\r\n   print biers&#x5B;i] &quot;\\n&quot;;\r\n}\r\n\r\n<\/pre>\n<h1>Dynamische Arrays<\/h1>\n<p>Dynamische Arrays sind in DXL immer 2-dimensional.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Eine Spalte, eine Zeile array\r\nArray einArray = create(1,1);\r\n\r\nput(einArray, &quot;Huhuhuhu&quot;, 0,0);\r\n\/\/ Das Array passt sich automatisch an\r\nput(a,23,10,10);\r\n\r\nstring huhuString = (string get(einString,0,0));\r\nreal eineZahl = (real get(10,10));\r\n\r\n\/\/ Speicher wieder freigeben\r\ndelete(einArray);\r\n<\/pre>\n<p>Anmerkung zu dyn. Arrays:<\/p>\n<p>Es gibt die M\u00f6glichkeit ein statisches Array dynamisch zu alloziieren, allerdings nicht zur Laufzeit anzupassen.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint hallo = 10;\r\nint i;\r\n\r\nstring test&#x5B;hallo];\r\n\r\nfor (i=0; i&lt;10; i++)\r\n{\r\n\ttest&#x5B;i]=i &quot;&quot;;\r\n}\r\n\r\nfor (i=0; i&lt;10; i++)\r\n{\r\n\tprint test&#x5B;i] &quot;\\n&quot;;\r\n}\r\n<\/pre>\n<p>Da ein dynamisches Array allem\u00f6glichen Datentypen enthalten kann, gibt es hier keine Standardfunktion um dieses zur sortieren. Die eingetragenen Daten k\u00f6nnen von beliebigem Typ sein ; z.B. kann auf (1,1) ein String stehen, auf (2,1) ein Object, auf (3,1) eine Attributdefinition etc. Man k\u00f6nnte die Spalte in ein Standard-Array (z.B. string myArray) wie im obigen Beispiel \u00fcbertragen, darin sortieren und danach zur\u00fcckkopieren.<\/p>\n<p>Es gibt keine M\u00f6glichkeit die Gr\u00f6\u00dfe eines dynamischen Arrays (Anzahl Zeilen) zu ermitteln.<br \/>\nDa man aber das Array im Verlauf des Programms mit &#8222;put&#8220; gef\u00fcllt hat, wurden dort zwangsl\u00e4ufig die maximalen Koordinaten verwendet; wenn man die gr\u00f6\u00dfte Koordinate also nach der Bef\u00fcllung speichert (typischerweise in globalen Variablen myMaxX, myMaxY), kann man sie ap\u00e4ter wieder nutzen.<\/p>\n<h1>Skip Listen<\/h1>\n<p>Skip Listen sind assoziative Arrays (PHP), HashMaps (Java) oder Dictionaries (C#) . Laut IBM sind dies sehr effiziente Datenstrukturen.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSkip idStringList = createString; \/\/ F\u00fcr String Datentypen\r\nSkip idList = create; \/\/ F\u00fcr nicht-String Datentypen\r\n\r\n\/\/ put Paramater: skip-list, key, value\r\nput (idList, &quot;234-22-2345&quot;, &quot;Hallo&quot;);\r\n\r\n\/\/ PUT liefert falls zur\u00fcck falls der Wert schon vorhanden ist\r\nput (idList, &quot;123-45-6789&quot;, &quot;Welt&quot;);\r\n\r\nstring gleichZuweisen;\r\n\/\/ find nutzen um zu testen ob in Skip List vorhanden\r\nif( find(idList, &quot;234-22.2345&quot;, gleichZuweisen) )\r\n{\r\n   print gleichZuweisen;\r\n   delete (idList, &quot;234-22.2345&quot;);\r\n}\r\n\r\nput(idList &quot;234-222-2222&quot;, &quot;world&quot;);\r\n\r\n<\/pre>\n<p>Beispiel um Dubletten mit Skip-Listen rauzufiltern:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nSkip myList = create;\r\nint numList&#x5B;] = {1,6,2,3,1,2,1,4,2,5,6,7,2,1,3,4,8};\r\n\r\nint i;\r\nfor (i=0; i&lt;sizeof(numList); i++)\r\n{\r\n   put (myList, numList&#x5B;i], numList&#x5B;i]);\r\n}\r\n\r\n\/\/ Iteration durch SkipList\r\nfor i in myList do \r\n{\r\n   print i;\r\n}\r\n\r\n\r\n<\/pre>\n<p>Iteration durch SkipList mit DxlObject.<\/p>\n<p>Anmerkung: DxlObject eignet sich prima als Ersatz f\u00fcr ein Model\/Value-Object. Hierzu folgenderma\u00dfen d<\/p>\n<p>&#8230;<br \/>\nSkip result = create;<br \/>\nDxlObject obj = new();<br \/>\nobj->&#8220;alarm_id&#8220; = &#8222;Bla!&#8220;; &#8230;.<br \/>\nput(result, alarm_id, obj);<br \/>\n&#8230;.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Iteration durch SkipList\r\nfor myIterator in result do \r\n{\r\n   string keyValue = (string key(result));\r\n   DxlObject currentObject = null;\r\n\r\n   if(find(result, keyValue, currentObject))\r\n   {\r\n       \/\/ Just put the column names here.. it will work\r\n       print (string currentObject-&gt;&quot;alarm_id&quot;) &quot; &quot;;\r\n       print (string currentObject-&gt;&quot;subsystem&quot;) &quot; &quot;;\r\n       print (string currentObject-&gt;&quot;bitnumber&quot;) &quot; &quot;;\r\n       print (string currentObject-&gt;&quot;eqwinid&quot;) &quot; &quot;;\r\n       print (string currentObject-&gt;&quot;eqwintextid&quot;) &quot; &quot;;\r\n       print (string currentObject-&gt;&quot;eqwinhandling &quot;) &quot;\\n&quot;;\r\n   }\r\n}\r\n\r\n<\/pre>\n<h1>Current<\/h1>\n<p>Current ist eine Referenz auf das momentan selektierte \/ markierte Element und kann ein Project, Folder, Module oder Object sein.<\/p>\n<p>Wenn man \u00fcber mehrere Objekte eines Moduls iterierts muss es oft explizit das current gesetzt werden.<\/p>\n<p>Project p = current;<br \/>\nFolder f = current;<br \/>\nModule m = current;<br \/>\nObject o = current;<\/p>\n<p>current = f;<\/p>\n<h1>\u00dcber das Projekt iterieren<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nProject p = create(&quot;\/Project1&quot;,&quot;&quot;);\r\n\r\nfor name in p do \r\n{\r\n   print name;\r\n}\r\n\r\ncurrent = folder &quot;\/&quot; \r\n\r\nfor itemRef in current  do \r\n{\r\n   print name(itemRef) &quot; &quot; type(itemRef) &quot; \\n&quot;;\r\n}\r\n<\/pre>\n<h1>Unterschied zwischen Baseline und Baseline Set<\/h1>\n<p>Eine Baseline ist ein eingefrorener Stand f\u00fcr ein Modul. Ein Baseline Set ist ein eingefrorener Stand f\u00fcr die gesamte Maschine \/ das Projekt \/ alle Module des Projekts.<\/p>\n<h1>Zugriff auf Attribute eines Moduls<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nModule m = null;\r\nm=read(&quot;\/Projekt\/Modul&quot;, true);\r\n\r\nstring modulName = m.&quot;Name&quot;;\r\nstring attributName = &quot;Created On&quot;;\r\nDate createdOn = m.attributeName;\r\n<\/pre>\n<h1>Editieren von Modulattributen<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncurrent = folder(&quot;\/New Family Car Project\/Requirements&quot;);\r\nModule m = edit(&quot;System Requirements&quot;, true);\r\nm.&quot;Description&quot; = &quot;Capri Soft- System requirements&quot;;\r\nsave(m);\r\nclose(m);\r\nrefreshDBExplorer();<\/pre>\n<h1>Link Beziehungen<\/h1>\n<p>ManyToMany beliebig viele Inlinks beliebig viele Outlinks<br \/>\nOneToMany beliebig viele Inlinks maximal ein Outlink<br \/>\nmanyToOne beliebig viele Outlinks maximal ein Inlink<br \/>\nOneToOne maximal ein Outlink maximal ein Inlink<\/p>\n<h1>Zugriff auf Attribute<\/h1>\n<p>identifier(o): Die Doors-Containernummer (z.B. UR12)<br \/>\nnumber(o): Sagt was aus \u00fcber die Stellung in der Hierarchie<br \/>\nlevel(o): Gibt die Tiefe der Schachtelung zur\u00fcck<br \/>\nleaf(o): Gibt true zur\u00fcck, wenn das Objekt keine Unterobjekte hat.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Modul manuell \u00f6ffnen und im Modul-Men\u00fc Tools -&gt; &quot;Edit DXL&quot; \r\nModule m = current;\r\n\r\nObject o;\r\n\r\nfor o in m do \r\n{\r\n   print number(o) &quot; \\t\\t&quot;identifier(o) &quot;    &quot;;\r\n   print o.&quot;Object Heading&quot; &quot; &quot;;\r\n   print o.&quot;Object Text&quot; &quot;\\n&quot;\r\n}\r\n<\/pre>\n<h1>Navigation durch Kindkapitel eines Objektes<\/h1>\n<p>Object erstesKind = first(o);<br \/>\nObject letztesKind = last(o);<br \/>\nObject vorherige = previous(o);<br \/>\n&#8230; next(o)<br \/>\n&#8230; first sibling(o)<br \/>\n&#8230; last sibling(o)<br \/>\n&#8230; next sibling(o)<\/p>\n<p>Bsp.: Z\u00e4hle alle Kinder eines Kapitels:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nModule m = current;\r\nObject oChild, o = current;\r\n\r\nint count = 0;\r\nfor oChild in o do \r\n{\r\n   count++;\r\n}\r\n\r\nprint count &quot; &quot;;\r\n<\/pre>\n<h1>Loop \u00fcber alle Links jedes Linkmoduls<\/h1>\n<p>Folgendes Beispiel iteriert \u00fcber die Outgoing links (->) jedes Linkmoduls (&#8222;*&#8220;)<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Modul \u00f6ffnen und auf Tools -&gt; Edit DXL \r\nModule m = current;\r\nLink derLink;\r\nObject objekt ;\r\nint linkAnzahl = 0;\r\nSkip eindeutigeZielModule;\r\n\r\nfor objekt in m do\r\n{\r\n   for derLink in objekt-&gt;&quot;*&quot; do\r\n   {\r\n      linkAnzahl++;\r\n      \r\n\r\n      \/\/ Der Name des Ziel Moduls;\r\n      print fullName target(derLink) &quot; \\n&quot;;\r\n\r\n   }\r\n}\r\n\r\nprint &quot;Es gibt &quot; linkAnzahl &quot; Outgoing Links!&quot;;<\/pre>\n<p>Mit diesem Beispiel kann man sich die Outgoing Links in einem Layout DXL ausgeben lassen<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">Link lnk;\r\nstring textToShow = &quot;&quot;;\r\nbool isFirst = true;\r\n\r\nfor lnk in obj-&gt;&quot;*&quot; do\r\n{\r\n\tstring tmn=fullName target(lnk);\r\n\r\n\tif(!open module tmn)\r\n\t{\r\n\t\tread(tmn,false);\r\n\t}\r\n\r\n\tObject tgt = target(lnk);\r\n\r\n\tif(isFirst)\r\n\t{\r\n\t\ttextToShow = identifier(tgt) &quot;&quot; textToShow ;\r\n\t}\r\n\telse\r\n\t{\r\n\t\ttextToShow = identifier(tgt) &quot;\\n&quot;  textToShow;\r\n\t}\r\n\r\n\tisFirst = false;\r\n\r\n}\r\n\r\ndisplayRich (textToShow &quot;&quot;);\r\n<\/pre>\n<p>Bei Incoming Links muss das SourceModul immer ge\u00f6ffnet werden:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Modul \u00f6ffnen und auf Tools -&gt; Edit DXL \r\n\r\nvoid handleInLinks(Object einObjekt)\r\n{\r\n   LinkRef eineLinkReferenz;\r\n   string modulWoDerIncomingLinkHerkommt;\r\n\r\n   print identifier(einObjekt) &quot; \\n&quot;;\r\n\r\n   for eineLinkReferenz in einObjekt&lt;-&quot;*&quot; do\r\n   {\r\n     modulWoDerIncomingLinkHerkommt= fullName source (eineLinkReferenz);\r\n     print modulWoDerIncomingLinkHerkommt;\r\n\r\n   }\r\n}\r\n\r\nModule m = current;\r\n\r\nLink lnk;\r\nLinkRef lref;\r\nObject o;\r\nint numLinks = 0;\r\nstring srcModuleName;\r\n\r\nfor o in current Module do \r\n{\r\n   for lref in o&lt;-&quot;*&quot; do\r\n   {\r\n     srcModuleName = fullName source (lref);\r\n\r\n     if (!open module srcModuleName)\r\n     {\r\n        read(srcModuleName, false);\r\n     }\r\n   }\r\n}\r\n\r\nfor o in m do\r\n{\r\n  handleInLinks(o);\r\n}\r\n<\/pre>\n<p>Eine weitere M\u00f6glichkeit bietet das Iterieren \u00fcber die Module der Inlinks. Man kann sie z.B. in einer Schleife \u00f6ffnen.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstring srcModName;\r\nfor srcModName in o&lt;-&quot;*&quot; do\r\n{\r\n   print srcModName &quot;\\n&quot;;\r\n}\r\n\r\n\/\/ Voller Pfad der Module zu den IncomingLinks\r\nModName_ srcModRef\r\nfor srcModRef in o&lt;-&quot;*&quot; do\r\n{\r\n    print fullName(srcModRef) &quot;\\n&quot;;\r\n}\r\n<\/pre>\n<p>Hier ein Beispiel f\u00fcr ein Layout DXL, das alle Incoming Link Objekte ausgibt<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nLinkRef lRef;\r\nLink aLink;\r\nModName_ srcModRef;\r\nint inCount = 0;\r\n\r\nObject anObj = obj;\r\n\r\nfor lRef in anObj &lt;- &quot;*&quot; do { \r\n\r\n string smn = fullName(source(lRef)) \r\n\r\n  if (! open(module(smn))) { \r\n      oMod = read(smn, false) \r\n   } \r\n} \r\n\r\nfor aLink in anObj &lt;- &quot;*&quot; do \r\n{ \r\n         Object src = source aLink;\r\n          displayRich( identifier(src) &quot;&quot;);\r\n} \r\n<\/pre>\n<h1>Alle Attribute eines Moduls ausgeben<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nModule m=read(&quot;System Requirements&quot;, false);\r\n\r\nAttrDef adRec;\r\n\r\nfor adRec in m do \r\n{\r\n   if(!adRec.system)\r\n   {\r\n      print adRec.typeName &quot; attribute: &quot; adRec.name &quot; \\n&quot;;\r\n   }\r\n}\r\n<\/pre>\n<h1>Rechnen in Layout DXL<\/h1>\n<p>Wenn man auf einer Spalten\u00fcberschrift in einem Doors Modul rechte Maustaste -> Properties -> Layout DXL -> Browse \u00f6ffnet, kann man in eine Spalte hinzuf\u00fcgen um z.B. zu rechnen.<\/p>\n<p>Die Variable obj ist die aktuelle Zeile.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nreal cost, result;\r\nint noPerDay;\r\n\r\ncost = obj.&quot;Cost&quot;;\r\nnoPerDay = obj.&quot;No per day&quot;;\r\nresult = cost * realOf(noPerDay);\r\ndisplay result &quot;&quot;;\r\n<\/pre>\n<h1>Filtern und Sortieren<\/h1>\n<p>Filter und Sortierungen k\u00f6nnen miteinander verkn\u00fcpft werden<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nModule m=read(&quot;Stakeholder Requirements&quot;, false);\r\n\r\nFilter f, f1, f2;\r\nSort s1,s2,s;\r\n\r\ns1 = descending(&quot;Cost&quot;);\r\ns2 = ascending(&quot;Priority&quot;);\r\n\r\nf1 = attribute &quot;Cost&quot; &gt; &quot;1000.0&quot;\r\nf2 = attribute &quot;Cost&quot; &lt; &quot;2000.0&quot;\r\nf3 = contains (attribute &quot;Object Text&quot;, &quot;shall&quot;, false);\r\n\r\n\/\/ Filter verkn\u00fcpfen\r\nf = f1 &lt;&lt; f2 &lt;&lt; f3;\r\n\r\n\/\/ Sortierungen verkn\u00fcpfen\r\ns = s1 &lt;&lt; s2;\r\n\r\nset(m,f);\r\nset(m,s);\r\nfiltering on;\r\n<\/pre>\n<h1>In Datei schreiben<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nStream output = write(&quot;c:\\\\datafile.txt&quot;);\r\nObject o;\r\nreal cost;\r\n\r\nfor o in current Module do\r\n{\r\n   cost = o.&quot;Cost&quot;;\r\n   output &lt;&lt; cost &quot;\\n&quot;;\r\n}\r\n<\/pre>\n<p>Lesen&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nprint fileExists(&quot;C:\\\\meinedate.txt&quot;) &quot; &quot;;\r\nStream eingabe = read &quot;C:\\\\meinedate.txt&quot;;\r\n\r\nstring costLine;\r\n\r\nwhile(!end(eingabe))\r\n{\r\n   input &gt;&gt; costLine;\r\n   print costLine &quot;\\n&quot;;\r\n}\r\nclose(eingabe);\r\n<\/pre>\n<h1>User Interfaces<\/h1>\n<p>DB: Dialog Box<br \/>\nDBE: Dialog Box Element<\/p>\n<p>OnChange-Ereignisse \u00fcber callback()-Funktion, die mit Set auf das DBE gesetzt wird. set(DBE dbe, callbackfkt)<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nDB bierDialogBox = create (&quot;Bier Type&quot;, styleStandard);\r\n\r\nstring meineRadioButtonListe&#x5B;] = {&quot;Heineken&quot;, &quot;Becks&quot;, &quot;Krombacher&quot;, &quot;Licher&quot;};\r\nDBE bierName=field(bierDialogBox, &quot;Biername:&quot;, &quot;Schnaps&quot;, 20,false);\r\nDBE radioButton = radioBox (bierDialogBox, &quot;Biersche:&quot;, meineRadioButtonListe, 0);\r\nDBE datumFeld = date (bierDialogBox, 30, today, true);\r\nDBE slider = slider (bierDialogBox, &quot;&quot;, 5,0,10);\r\n\r\nvoid printOrder(DB win)\r\n{\r\n   string customer = get bierName;\r\n   int radioButtonNummer = get radioButton;\r\n   string radioButtonStyle=meineRadioButtonListe&#x5B;radioButtonNummer];\r\n   print &quot;Ein &quot; radioButtonStyle &quot; bier vom &quot; customer &quot;&quot;;\r\n}\r\n\r\napply (bierDialogBox, &quot;Print&quot;, printOrder);\r\n\r\nshow bierDialogBox;\r\n<\/pre>\n<h1>History<\/h1>\n<p>Die History wird mit einer Baseline abgespeichert und beginnt von vorne. D.h. das History-Objekt ist auf einem gerade gebaselintem Modul leer.<\/p>\n<p><span style=\"text-decoration: underline;\"><b>Bsp.-Anwendungsf\u00e4lle<\/b><\/span><\/p>\n<ul>\n<li>\u00c4nderungsreports<\/li>\n<li>Recherche \u00fcber \u00c4nderungen<\/li>\n<\/ul>\n<h1>Discussions<\/h1>\n<p>Eine Chat\u00e4hnliche Option sind Discussions. Sie werden in der Baseline abgelegt aber nicht ins Archiv eingepackt. Discussions setzen nur Leserechte voraus. Derjenige der die Discussion ausgel\u00f6st hat ist der einzige, der sie schlie\u00dfen kann.<\/p>\n<h1>Probleme mit Rechten: Kein Zugriff auf ein Objekt<\/h1>\n<p>Wenn man keine Zugriffsrechte auf ein Objekt hat kann mit<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninherited(o);\r\n<\/pre>\n<p>Das Objekt auf die Rechte des parents gesetzt werden.<\/p>\n<h1>Einfaches isNumeric<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbool isNumeric(string einString)\r\n{\r\n   int x;\r\n   for (x=0; x&lt;length(einString); x++)\r\n   {\r\n      if( (!isdigit(einString&#x5B;x]) ) &lt;&lt; (einString&#x5B;x]!='.' ) &lt;&lt; (einString&#x5B;x]!='-' ) )\r\n      {\r\n\t\treturn false;\r\n      }\r\n   }\r\n   return true;\r\n}\r\n\r\n\r\nstring eineZahl = &quot;12.345&quot;;\r\nprint isNumeric(eineZahl) &quot;&quot;;\r\n<\/pre>\n<h1>Installierte und unterst\u00fctzte Codepages anzeigen<\/h1>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nint d;\r\n\r\nint installed=0;\r\nint supported=0;\r\n\r\nprint &quot;INSTALLED:\\n&quot;;\r\nfor d in installedCodepages do\r\n{\r\n\tprint d &quot;\\n&quot;;\r\n\tinstalled++;\r\n}\r\nprint &quot;\\n\\n\\nSUPPORTED:\\n&quot;;\r\nfor d in supportedCodepages do\r\n{\r\n\tprint d &quot;\\n&quot;;\r\n\tsupported++;\r\n}\r\n\r\nprint &quot;Installed: &quot; installed &quot;\\n&quot;;\r\nprint &quot;Supported: &quot; supported &quot;\\n&quot;;\r\n<\/pre>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D673&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Zahlen an String konkatenieren Zahlen oder andere Datentypen die in einen String gecastet werden sollen m\u00fcssen mit leerem String abgeschlossen werden: real zahl = 4.555; print &quot;Die Zahl lautet: &quot; zahl &quot; &quot;; Jedes Attribut sollte bei einem String-Vergleich immer mit Doppelanf\u00fchrungszeichen abgeschlossen werden. Substrings in DXL Auf Abschnitte aus einem String zugreifen: string ganzerString &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=673\" class=\"more-link\"><span class=\"screen-reader-text\">IBM Doors DXL: Tipps und Tricks<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[22,19],"tags":[],"class_list":["post-673","post","type-post","status-publish","format-standard","hentry","category-dxl","category-ibm-doors"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-aR","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=673"}],"version-history":[{"count":92,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/673\/revisions"}],"predecessor-version":[{"id":2618,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/673\/revisions\/2618"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}