Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung - XPages => Thema gestartet von: leofranz am 08.03.12 - 15:19:09

Titel: Cognos Schnittstelle
Beitrag von: leofranz 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.
Titel: Re: Cognos Schnittstelle
Beitrag von: Ralf_M_Petter 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.