Alle Beiträge von Björn Karpenstein

Diplom Informatiker, Programmierer, Musikbegeisterter

Logbuch Rauchstopp 2015

Da ich noch bis zum 04. Januar Urlaub habe, entschließe ich mich wieder auf die positiven Effekten des Nichtrauchens zu konzentrieren und schreibe dieses kleine Logbuch.

Meine Aufhörmethode ist der sofortige Rauchstopp, die letzte Zigarette muss nicht zwangsläufig geraucht werden (wir wollen ihr ja nicht Nachtrauern). Es ist lediglich wichtig sich auf die positiven Gefühle zu konzentrieren (Alan Carr -Easy Way Methode) , die sofort eintreten können wenn man rauchfrei ist. Nach 3 Tagen ist die Nikotinsucht körperlich bekanntlich vorbei.

30.12.2014:

Ich hatte gegen Abend noch ca 5 Zigaretten und mich mit Nico zum Starcraft-2-Spielen verabredet. Zwischen 1.30h und 2.00h am 31.12.2014 beendet wir das letzte Spiel und ich rauchte die letzte der 5 verbliebenen Zigaretten. Da ich ein paar Gläschen Whisky getrunken hatte schlief ich sofort ein.

31. 12.2014:

Ich überlegte nach dem späten Aufstehen zunächst, ob ich mir für den Tag noch eine Schachtel kaufen oder das Rauchen sofort unterlassen sollte. Die Frage die sich stellte war, wie ich es am nächsten Tag ohne Zigaretten aushalten möchte, wenn ich heute schon planen muss über den Tag zu kommen. Darüber hinaus ist die bewusste Aktion notwendig an die Tankstelle zu fahren und Zigaretten zu kaufen. Somit wären die Probleme lediglich auf morgen vertagt. Da ich Sylvester in einem Nichtraucherkreis feierte, fiel mir das erstaunlich leicht. Ich habe den ganzen Tag nicht geraucht, aber mich übers Maß hinaus mit Essen vollgestopft. Gegen 2h verließen wir die Feier und es ging wieder ins Bett.

01.01.2015:

Habe wieder bis 11.30h geschlafen und meiner Waage ein neues Höchstgewicht von 81 KG nach dem Aufstehen entlockt. Das Gewicht ist erstmal zweitrangig, es gilt durchzuhalten.

Ich weiß aus meinen vorherigen Versuchen, dass mir schwindelig werden würde wenn ich jetzt rauche.

Die spürbaren Entzugserscheinungen sind:

  • leichte Schwindelgefühle
  • Kribbeln über den Schläfen an den Kopfseiten
  • ein Gefühl des Unterdrucks in der Mitte des Kopfes.
  • Verstopfung (vermutlich durch Stoffwechselumstellung)
  • Reizbarkeit
  • Schlechte Laune und Niedergeschlagenheit

02.01.2015 – 04.01.2015:

  • Leichte Schwindelgefühle
  • gesteigerter Hunger

Sprachlicher Stil von Anforderungen

Aufbau der Anforderungen nach IREB

Rechtliche Vebindlichkeit

VerbindlichkeitDeutsches SchlüsselwortEnglisches SchlüsselwortKommentar
PflichtmussshallEine Pflicht-Anforderung bedeutet, dass eine Forderung unbedingt erfüllt sein muss. Die Abnahme kann verweigert werden, wenn das System die Anforderung nicht erfüllt.
Wunschsollteshould Eine Wunsch-Anforderung drückt aus, dass es ganz gut wäre, wenn z.B. ein Bericht vom Entwickler wöchentlich erstellt wird. Allerdings fordert der Anforderer verpflichtend nur monatliche Berichte.
AbsichtwirdwillDie Absichts-Anforderungen werden vom Anforderer gestellt, um dem Entwickler die Punkte aufzuzeigen, zu denen er schon Pläne für die Zukunft hat. Diese Information soll es dem Entwickler ermöglichen, das System zukunftssicher zu konzipieren
Vorschlagkanncannforderer kommen beim Nachdenken über zu entwickelnde Systeme auf verschiedene Lösungsmöglichkeiten für ein Problem. Diese werden für die spätere Verwendung durch Entwickler in Form von Vorschlags-Anforderungen konserviert.

Verwendung von Satzschablonen

Selbstständige Systemaktivität

Systemaktivitäten, die ohne Zutun des Benutzers ausgeführt werden.

[<Wann?>] [<Unter welcher Bedingung?>]
MUSS | SOLLTE | WIRD
DAS SYSTEM
<Objekt & Ergänzung des Objektes>
<Prozesswort>

System activities in english without pre-condition:

Agent shall Process/ Function Verb

(<process>)

Complement(s)

(<thing to be processed>)

Adjunct(s)

(<process detail>)

The system shall measure the temperature every 30 seconds.

System activities in english with pre-condition:

Precondition
If Agent Process / Function Verb (in present tense) Complement(s) Adjunct(s)
If the sensor measure a temperture value below  32°C,
Requirement
Agent shall Process/ Function Verb

(<process>)

Complement(s)

(<thing to be processed>)

Adjunct(s)

(<process detail>)

the system shall switch into bypass mode within 500 ms.

Benutzerinteraktion

Funktionalitäten, die dem Benutzer vom System zur Verfügung gestellt werden.

[<Wann?>] [<Unter welcher Bedingung?>]
MUSS | SOLLTE | WIRD
DAS SYSTEM (shall provide the operator the possibility to …)
<Wem?>
DIE MÖGLICHKEIT BIETEN
<Objekt & Ergänzung des Objektes>
<Prozesswort>

Requirements involving user interaction in english:

THE SYSTEM SHALL PROVIDE <whom?> THE ABILITY TO Process/ Function Verb Complement(s)
The SYSTEM shall provide the operator The ability to display the liquid temperature.
„Upon operator request“ Agent „shall“ Process/ Function Verb Complement(s) Adjunct(s)
Upon operator request, the HMI shall display the liquid temperature. in LCD panel
<who> shall be able to <process> <thing to be processed> Adjunct(s), <process details>
The Operator shall be able to display the liquid  temperature .

Schnittstellenanforderung

Systemaktivitäten, die (nur) in Abhängigkeit von Nachbarsystemen ausgeführt werden.

[<Wann?>] [<Unter welcher Bedingung?>]
MUSS | SOLLTE | WIRD
DAS SYSTEM FÄHIG SEIN (shall be able to)
<Objekt & Ergänzung des Objektes>
<Prozesswort>

Interface requirements in english:

The SYSTEM SHALL be able to Process/ Function Verb Complement(s) Adjunct(s)
The SYSTEM SHALL be able to measure the liquid temperature with 5% tolerance
The SYSTEM SHALL provide the possibility to Process/ Function Verb Complement(s) Adjunct(s)
The SYSTEM SHALL provide the possibility to measure the liquid temperature with 5% tolerance

Beispiele für Prozessworte

Prozessworte sind Verben, die aus den Anforderungen hervorgehen

anlegen (syn.: erzeugen, erstellen), ändern (syn.: bearbeiten), speichern, löschen, drucken, ausgeben, anzeigen, archivieren, historisieren, senden, übertragen, empfangen

Überprüfung auf Verständlichkeit

Nachdem eine Anforderung erfasst wurde, liest man den Satz nochmal und stellt die folgenden Fragen:

um unvollständig definierte Prozessworte zu eleminieren…

  • von wem?
  • wann?
  • wie (genau)?
  • wodurch?
  • wer?
  • was?
  • Mit wem?

um Generalisierungen mit Universalquantoren (bsp. für alle / für jedes) zu prüfen

  • soll das beschriebene Verfahren wirklich für alles / alle (bsp. Daten) gelten?
  • gibt es (unter bestimmten Voraussetzungen) Ausnahmen?

um unvollständig definierte Bedingungen zu eleminieren

  • was passiert wenn die Bedingung nicht erfüllt ist (else-Zweig)?
  • Gibt es mehr als nur zwei Fälle (else if?)

um Substantive ohne Bezugsindex zu vermeiden

  • Welche (bsp. Daten) … genau?
  • Was (für eine Frist?) … genau?

um Nominalisierungen aufzulösen

  • „Die Dateneingabe soll überwacht werden“

IBM Doors DXL: Delete and Create Attributes for Doors Module

Problem

An Attribute shall be deleted and replaced (recreated) by the same attribute with another type.

Approach

– Delete old attribute
– Create new one
– Views will not get lost with this method!

Solution

void deleteAttrDef(Module m, string s)
{
  string err;
  AttrDef ad = find(m, s);
  err = delete(ad);
  if (err !="") ack err;
} 

void modifyAttributeType(Module m, string theAttribute, string newAttributType)
{
  current = m;
	
  // Delete Attribute attribute1 if exists
  if (exists(attribute(string theAttribute))) 
  {	
    deleteAttrDef(m, theAttribute);
  }
	
  // Create new attribute1 of type TEXT (not string)
  AttrDef ad = create object type newAttributType attribute theAttribute
		
  if (null ad)
  {
    print "attr didn't create for module " fullName(m) "\n";
    halt;
  }			
}

modifyAttributeType(current Module, "My_Attribut_To_Change_Type", "Text");

IBM Doors DXL: Attribut eines verlinkten Objektes Ausgeben

Problem

Es soll eine LayoutDXL Spalte erzeugt werden, die ein Attribut aus einem verlinktem Requirement (Im V-Model z.B. obendrüber also hier Outlink) ausgibt.

Ansatz

* Öffnen des Moduls
* Nutzen der obj Referenz für das Objekt in der aktuellen Zeile
* Link Modul spezifizieren

Lösung

Module rsModule = read("/pathTo/RS", false);

Link lnk;
Object trg;
string lnkMod;
string strSat = "/pathToLinkModules/Satisfies";

for lnk in obj->"*" do 
{
  lnkMod= fullName module(lnk);
  
  if(!null lnkMod)
  {
	  if(lnkMod == strSat)
	  {
	      Object trg = target(lnk);
	      display trg."BB_PlannedRelease" "";
	  }
  }
}

IBM Doors DXL: Import from Sparx Systems Enterprise Architect

Problem

To refresh all UML Diagrams within an Formal Doors Module, a script is needed that imports all actual versions of a UML Diagram.

Approach

* Copy the GUID of the Diagram / Note
** right-click the project menu on the right side.
** Select „Copy Reference -> Copy Node GUID to clipboard“
* If not done before, create an Module attribute (here ATTRIBUT_WITH_GUID)
* Paste the GUID to the place in your doors module, where the diagram should be created

Solution

// Recommended as module plugin
/**
 * Run through all objects of the current module 
 * and watch for the attribute ATTRIBUT_WITH_GUID.
 * If it is not empty, fetch the diagram/note
 * from this attribute an load it into the 
 * Object Text of Sparx Systems Enterprise Architect
 */

Object o
Filter currentFilter, f
Module m
DB updateWin

string guid
string projectPath = "DP_ENTARCHITECT --- DBType=1;" //-
"Connect=Provider=SQLOLEDB.1;Integrated Security=SSPI;" //-
"Persist Security Info=False;Initial Catalog=DBNAME;" //-
"Data Source=EA_DB_SERVER"

OleAutoObj eaProject, eaRepository, diaObj, actObj
OleAutoArgs autoArgs = create
string diagramName, elementNotes

void establishInterface()
{
 eaProject = oleGetAutoObject("EA.Project")
 if(null(eaProject))
 { 
   eaProject = oleCreateAutoObject("EA.Project")
 }

 if(null(eaProject))
 {
   ack "Creating OLE-Object 'EA.Project' not possible."
   progressStop
   halt
 }

 eaRepository = oleGetAutoObject("EA.Project")

 if(null(eaRepository))
 {
   eaRepository = oleCreateAutoObject("EA.Repository")
 }

 if(null(eaRepository))
 {
   ack "Creating OLE-Object 'EA.Repository' not possible."
  progressStop
  halt
 }

 put(autoArgs,projectPath)
 oleMethod(eaRepository,"OpenFile",autoArgs)
 clear(autoArgs)
}

void closeInterface()
{
  oleMethod(eaRepository,"CloseFile",autoArgs)
  oleMethod(eaRepository,"Exit",autoArgs)
	
  delete(autoArgs)
}

void updateObjects()
{
 int progessbarStep = 0
 bool diagramCopied
 string fileName

 for o in m do
 {
  guid = o."BB_ImageFileName"
  diagramCopied = false
	
  if(guid != "" && guid[0:0] == "{")
  {
   progressMessage("Updating " identifier(o))
   put(autoArgs, guid)
		
   /**************************************************
    * Gets a pointer to a diagram using an absolute 
    * reference number (local ID). This is usually 
    * found using the DiagramID property of an 
    * element, and stored for later use to open a diagram 
    * without using the 
    * collection GetAt() function.
    **************************************************/
    oleMethod(eaRepository, "GetDiagramByGuid", autoArgs, diaObj)
		
    /*************************************************
     * An Element is the main modeling unit. 
     * It corresponds to (for example) a Class, 
     * Use Case, Node or Component. 
     * You create new elements by adding to the 
     * Package Elements collection. 
     * Once you have created an element, you can add it
     * to the DiagramObject 
     * Class of a diagram to include it in the diagram.
     ****************************************************/
     oleMethod(eaRepository, "GetElementByGuid", autoArgs, actObj)
     clear(autoArgs)
		
     // Wenn das Diagramm mit der GUID nicht gefunden wurde
     if(null(diaObj))
     {
      // ... und auch kein Element mit der GUID gefunden wurde
      if(null(actObj))
      {
         ack "GUID " guid " of object " identifier(o) "" //-
            " not found in EA as diagram or element."
      }
      else
      {
        // Es wurde kein Diagramm, aber ein Element 
        // mit der GUID gefunden
        oleGet(actObj, "Notes", elementNotes)
        if(null(elementNotes))
        {
          ack "Getting Notes of GUID " guid " failed."
        }
        else
        {
	 o."Object Text" = elementNotes
	 progressStep(++progessbarStep)
        }
      }
    }
    else // Es wurde ein Diagramm mit der GUID gefunden
    {					
      /***************************************************
       *  EA.Project.PutDiagramImageOnClipboard: 
       *  ======================================
       *  Copies an image of the specified diagram to the 
       *  clipboard.
       *	
       *  Parameters:
       *	•	DiagramGUID: String - the GUID 
       *        (in XML format) 
       *        of the diagram 
       *        to copy
       *	•	Type: Long - the file type
       *		•	If Type = 0 then it is a metafile
       *		•	If Type = 1 then it is a Device 
       *            Independent Bitmap
       *
       *****************************************************/
       put(autoArgs, guid)
       put(autoArgs, 0)				
       oleMethod(eaProject, "PutDiagramImageOnClipboard", autoArgs, 
	             diagramCopied)
       clear(autoArgs)
		
       if(diagramCopied)
       {
         while(oleDelete(o));
         if(olePaste(o))					
         {
	       oleSetMaxWidth(o."Object Text", 400)
	        progressStep(++progessbarStep)
         }
         else
         {
	       ack "Pasting from clipboard of GUID " guid " failed."
         }
       }
       else
       {
         ack "Copying to clipboard of GUID " guid " failed."
       }
     }
	 diaObj = null
     actObj = null
   }
  }
}

void main(DB updateWin)
{
  int accepted, rejected

  currentFilter = current	
  f = contains(attribute("ATTRIBUT_WITH_GUID"),"{", false)
  set(m, f, accepted, rejected)
  unApplyFiltering(m)
  progressStart(updateWin, "Executing update", "Processing...", accepted)
  establishInterface()
  updateObjects()
  if(!null(currentFilter)) set(m, currentFilter, accepted, rejected)
  closeInterface()
  progressStop
  refresh(m)
  hide(updateWin)
  destroy(updateWin)
  updateWin = null
}

m = current
if(null(m))
{
  ack "Update can only be started within a module."
}
else
{
 if(isEdit(m))
 {
   updateWin = create("Update EA ", styleCentered|styleFloating)
   label(updateWin, "Do you wish to update?")
   ok(updateWin, main)
   show updateWin
 }
 else
 {
  ack "Module must be opend in 'Exclusive Edit'."
 }
}

IBM Doors DXL: Browse Triggers on module

Problem

When there are triggers on a module it often is not visible to administrators and other users that can perform DXL operations.

Approach

A menu point as module add in should be generated. Copy the following script to the moduleaddins directory of your doors installation.

Solution

// This is necessary that it works
/*******************************************************
 * Author: Björn Karpenstein
 * Date:   2014-10-01
 * 
 * This script lists all triggers of the module
 ******************************************************/
pragma runLim, 0;

string lstArray [] = {}; 
 
DB mainWindow;
DBE textBox;
DBE textList;

void listAllTriggerForMod (Module mod) 
{
  string theResult="";
  Trigger t;
  int i = 0;
  for t in mod do 
  {
    insert(textList, i, name(t) "", iconNone);
    i++;
  }
}

string getSourceForTriggerName (string theTrigger) 
{
  string sourceCode = "";
  Trigger t;
  for t in current Module do 
  {
    if(name(t) "" == theTrigger)
    {
      sourceCode = dxl(t) "";
    }		
  }
	
  return sourceCode;
}

void doDeselect(DBE dbe, int idx)
{
  //infoBox "You deselected " dbe[idx] "";
} 


void doActivate(DBE dbe, int idx)
{
  // infoBox "You activated " dbe[idx] "";	
}

void doSelect(DBE dbe, int idx)
{
  string triggerName = getColumnValue(textList,idx,0);
  set(textBox, getSourceForTriggerName(triggerName));	
} 

void main(void)
{
  User currentUser = find();
  bool mayDXL = currentUser.mayEditDXL;
  if (!mayDXL)
  {
   // Show error box and inform user. Stop execution of script.
   errorBox "You are not allowed to run/edit DXL code!";
   halt;
  }		
	
  mainWindow = create("List all triggers");
	
  textList = listView(mainWindow, 0, 310, 20, lstArray);		
  textBox = text(mainWindow, "", "", 400, false);
	
  textList->"right"->"unattached";
  textBox->"left"->"flush"->textList;
  textBox->"top"->"aligned"->textList;	

  realize(mainWindow);			
	
  insertColumn(textList, 0, "Trigger Name", 300, iconNone);
	
  set(textList,doSelect,doDeselect,doActivate);		
  listAllTriggerForMod(current);
	
  // set(textBox, listAllTriggerForMod(current));
  show(mainWindow);	
}

main();

IBM Doors DXL: Auslesen aller Module eines Projektes einer BaselineSetDefinition und eines BaselineSets in ihren jeweils gebaseline-ten Versionen

Problem

Alle Module eines Projektes, die in einem BaselineSet freigegeben wurden, sollen in Ihrer Version im BaselineSet ausgelesen werden.

Approach

  1. Generell auslesen der Module in einer BaselineSetDefinition
  2. Auslesen des BaselineSets der Version {baselineSetVersion}
  • Die BaselineSetDefinition beinhaltet die Module, die für ein BaselineSet (hier Release_Set) vorgesehen sind. Eine BaselineSetDefinition hat einen Namen, unter dem die BaselineSet-Versionen erzeugt werden.
  • Das BaselineSet ist eine Version einer BaselineSetDefinition und hat den Namen der BaselineSetDefinition. In einem BaselineSet befinden sich Baseline-Versionen der Module aus der BaselineSetDefinition;

Solution

string baselineSetDefinition="Release_Set";
string baselineSetVersion="5.0";

BaselineSetDefinition bsd;
Folder f = folder "/MyProject";
ModName_ modName;

for bsd in f do
{
  if(name(bsd) "" == baselineSetDefinition)
  {
    // 1.) Generell auslesen der Module in einer BaselineSetDefinition
    for modName in bsd do
    {
      print name(bsd) " " name(modName) "\n";
    }

    // 2.) Bsp: Auslesen des BaselineSets der Version {baselineSetVersion}
    BaselineSet bs;
    for bs in bsd do
    {
       if(versionID(bs) "" == baselineSetVersion)
       {
         ModuleVersion modver;
	for modver in all bs do 
         {
           string versionsString = versionString modver;
           if(versionsString=="") versionsString="N/A";
           print fullName(modver) "\t" versionsString "\n";
	} 
        }
     }
   }
}

IBM Doors DXL: A Layout DXL column that shows the differences to a previous baseline

Problem

A Layout DXL Column script should show the differences to another baseline

Approach

  • Right-click column header
  • Select „New“
  • Choose „Layout DXL“  radio button
  • Click on the browser button
  • Click on New
  • Insert the script below
  • Be aware to have all line breaks in the code like below

Replace {baselineToCompare} to the major version that you want to compare with the current version.

Solution

// This script shall be replace {baselineToCompare}
/**************************************************
 * Author: Björn Karpenstein
 * Date:   2014-10-09
 *
 * This is a layout DXL to show the differences from 
 * the current version to another baseline. 
 **************************************************/
Baseline oldBaseline = baseline({baselineToCompare}, 0,"");

Buffer bBefore = create;
Buffer bAfter = create;
Buffer result = create;
AttrDef ad;

Module oldModule = load(module(obj), oldBaseline, false)
Module currModule = current
showDeletedObjects(true)
int i = obj."Absolute Number"
Object oldObject = object(i, oldModule)

void compareColumn(string columnName)
{
  ad = find(oldModule, columnName);
		
  if(!null(ad) &amp;&amp; !null(oldObject))
  {
    bBefore = oldObject.columnName;
  }
  else bBefore = "";
		
  ad = find(currModule, columnName)

  if(!null(ad))
  {
    bAfter = obj.columnName;
  }
  else bAfter = "";
		
  bAfter = obj.columnName;

  if( bBefore != bAfter )
  {
    diff(result, bBefore, bAfter);
    displayRichWithColor("{\\b " columnName " CHANGED}");
    displayRichWithColor(stringOf(result));
  }
}
				
if(null(oldObject))
{
  displayRichWithColor("{\\b NEW}");
  if(isDeleted(obj)) displayRichWithColor("{\\b DELETED}");
}
else
{			
  if(isDeleted(obj) &amp;&amp; !isDeleted(oldObject))
  {
    displayRichWithColor("{\\b DELETED}");
  }
  else
  {
    if(!isDeleted(obj) &amp;&amp; isDeleted(oldObject))
    {
      displayRichWithColor("{\\b UNDELETED}");
    }
  
    // Here you can add the 
    // module attributes to compare	
		
    /*** BB_ReqStatus ***/		
    compareColumn("BB_ReqStatus");
	
    /*** BB_Type ***/
    compareColumn("BB_Type");

    /*** Last Modified On ***/
    compareColumn("Last Modified On");
		
    /*** Object Heading ***/
    compareColumn("Object Heading");

    /*** Object Text ***/
    compareColumn("Object Text");
  }
}
		
delete bBefore;
delete bAfter;
delete result;

IBM Doors DXL: Filtern mit accept und reject

Problem

Ein Standard-Filter kann aus logischen Ausdrücke nach Spalten und Attributen bestehen. Möchte man einen Filter anhand komplexerer Strukturen aufbauen, stößt man bei den Möglichkeiten, die die Doors GUI bietet, an die Grenzen.

Approach

In solchen Fällen kann man die internen Funktionen benutzen, die bei einer Filterung verwendet werden.

  • Filtern ausschalten
  • Iteration über das Modul
  • Abfrage der komplexeren Bedingungen, die das Filtern tun sollen (hier einfache IF() Struktur)
  • accept(obj) <– diese Objekte kommen in den Filter
  • reject(obj) <– diese Object werden aus dem Filter entfernt
  • Filtern einschalten

Solution

Module m = current;
filtering off;	
Object anObject = null;
for anObject in m do
{
  if(anObject."BB_Type" "" != "Reviewer")
  {
    reject anObject;
  }
  else
  {
    accept anObject;
  }
}
filtering on;

IBM Doors DXL: How to create a new view with LayoutDXL, Object Text and Object Heading, several attributes

Problem

A new view with the Main-Column (Object Heading and Object Text), a LayoutDXL Attribute and any other attribute shall be created.

Approach

  • Create View from Default View (overwrite existing)
  • Delete all columns in the Default View
  • Insert Columns

Solution

With this script you can iterate over all Attributes you can select for the view:

Module m = current;
string attr;

for attr in m do
{
  print attr "\n";
}

The following script generates the view:

void createViewForModule(Module m, string viewName)
{	
  // construct view of attributes chosen
  Column c;
  int n = 0; // number of existing columns
  int i; // column index
	
  View v = view(viewName);
  bool isLoaded = load(m,v);

  if(!isLoaded)
  {
    // If the view is not existing
    // Save the view
    // Normally the default View 
    // is constructed 	
    // save(m,v) is not asking
    // if a view exists -&gt; it 
    // overwrites any view with
    // the same name	
    save(m,v);
   }		
	
   // count the columns
   for c in m do
   {
      n++; 
   }
	
   // Delete all columns that were
   // contained in the default View
   // used as template
   for(i=1;i&lt;=n;i++)
   {
     delete(column 0); 
   }
	
   // Add Object Identifier (i.e. CRS-CS-2)
   insert(column 0);
   attribute(column 0, "Object Identifier");
   width(column 0, 80);
   justify(column 0, left);
	
    // Add the main Column (Object Heading+
    // Object Text) to the View
    Column mainColumn = null;
    mainColumn = insert mainColumn;
    main mainColumn;
    width(mainColumn, 300);
	
    // Add Object Identifier (i.e. CRS-CS-2)
    insert(column 2);
    attribute(column 2, "BB_ReqStatus");
    width(column 2, 80);	
	
    // Create a LayoutDXL Column in a view
    insert(column 3);  
    // I would recommend to #include scripts
    dxl(column 3, "displayRich \"huhu\""); 
    width(column 3, 80);	

    // important! (last column does not appear
    // otherwise)
    refresh m; 
    save view viewName; 
}