Autor Thema: Cognos Schnittstelle  (Gelesen 2315 mal)

Offline leofranz

  • Frischling
  • *
  • Beiträge: 1
Cognos Schnittstelle
« am: 08.03.12 - 15:19:09 »
Hallo,

ich habe mit XPages eine Cognos Schnittstelle erstellt die auch schon ganz gut funktioniert.
Da meine Erfahrung mit Domino im Allgemeinen und XPages im Speziellen recht bescheiden ist habe ich dazu 2 Fragen:
Kann man die Schleifen mit denen die XML Tags erstellt werden performanter gestalten bzw. gibt es eine einfachere Variante eine Ansicht als XML auszugeben?
Gibt es eine einfache Möglichkeit per SSJS herauszufinden ob eine Spalte einer Ansicht eine Zahl bzw. ein Datum beinhaltet? Im Moment übergebe ich alles als String. (im Metadata Bereich) Es gibt zwar in den Eigenschaften der Spalte das Feld "Stil", aber ich weiß nicht wie ich darauf zugreifen kann.

Code
var exCon = facesContext.getExternalContext(); 
var writer = facesContext.getResponseWriter();

var response = exCon.getResponse();

response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");

writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+
"<dataset xmlns=\"http://developer.cognos.com/schemas/xmldata/1/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\">\n"+
"<metadata>\n");

for (var i=1;i<=c_view.getColumnCount();i++){ // alle Spalten ermitteln und den Title als item name uebergeben
	writer.write("\t<item name=\""+c_view.getColumn(i).getTitle()+"\" type=\"xs:string\"/>\n");
}
writer.write("</metadata>\n<data>\n");

var ae=c_view.getAllEntries() // alle Zeilen der Ansicht
for (var i=1;i<=c_view.getEntryCount();i++){
	writer.write("\t<row>\n");
	var fee=ae.getNthEntry(i).getColumnValues().elements();
	while(fee.hasMoreElements()){ // alle Werte der Zeile
		writer.write("\t\t<value>"+fee.nextElement().toString().replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace("'","&apos;").replace("\"","&quot;")+"</value>\n")	
	}
	writer.write("\t</row>\n")	
}

writer.write("</data>\n</dataset>");

writer.endDocument();
facesContext.responseComplete();


Ich habe diesen Code unter "afterRenderResponse" kopiert und "rendered" auf "false" gesetzt.
Als c_view kann man eine beliebige Ansicht definieren. Diese Ansicht steht dann in Cognos für Reports zur Verfügung.

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: Cognos Schnittstelle
« Antwort #1 am: 27.03.12 - 11:28:58 »
Ich habe zwar keine Ahnung von xPages, aber im Dominoumfeld sollte man Schleifen mit getNthEntry vermeiden. Je größer der index wird, desto länger dauert der Aufruf von getNthEntry. Besser ist es die View mit getNextDocument oder get NextEntry zu durchlaufen.

Also ganz grob ohne den Code getestet zu haben.

Code
var exCon = facesContext.getExternalContext(); 
var writer = facesContext.getResponseWriter();

var response = exCon.getResponse();

response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");

writer.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+
"<dataset xmlns=\"http://developer.cognos.com/schemas/xmldata/1/\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema-instance\">\n"+
"<metadata>\n");

for (var i=1;i<=c_view.getColumnCount();i++){ // alle Spalten ermitteln und den Title als item name uebergeben
	writer.write("\t<item name=\""+c_view.getColumn(i).getTitle()+"\" type=\"xs:string\"/>\n");
}
writer.write("</metadata>\n<data>\n");

var ae=c_view.getAllEntries() // alle Zeilen der Ansicht
var fee=ae.getFirstEntry();
while (fee!=null){ //Bin nicht ganz sicher, ob das in javascript auch so funktioniert. 
	writer.write("\t<row>\n");
	while(fee.hasMoreElements()){ // alle Werte der Zeile
		writer.write("\t\t<value>"+fee.nextElement().toString().replace("&","&amp;").replace("<","&lt;").replace(">","&gt;").replace("'","&apos;").replace("\"","&quot;")+"</value>\n")	
	}
	writer.write("\t</row>\n")	
        // Objektreferenz in einem temporären Objekt speichern. Damit es recycelt werden kann.
        var tmpentry:NotesViewEntry = ae.getNextEntry(fee);
	fee.recycle(); 
	fee = tmpentry;
}

writer.write("</data>\n</dataset>");

writer.endDocument();
facesContext.responseComplete();

Wie gesagt, Code ohne Gewähr, da ich mich weder mit xPages noch mit Javascript so wirklich auskenne.
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz