2016-07-28 16 views
0

Auf der X-Seite wird der Name des Offiziers, der Offizierstyp und die Abteilung angezeigt (dazu verwende ich die Variable sessionScope). Es gibt eine combobox, damit der Benutzer den Officertyp auswählen kann, den der Benutzer vergleichen möchte. Und dann wird eine Schaltfläche zum Exportieren der Daten verwendet.Xpages: Wie benutzt man viewEnt.getColumnValues ​​() um alle relevanten Werte beim Export von Daten zu erhalten?

Die Exportdaten zeigen den Vergleich zwischen dem Dokument, das der ausgewählte Officer-Typ lesen muss, und dem Dokument, das der aktuelle Officer gelesen hat. Wenn der Offizier gelesen Dokument, das den ausgewählten Offizier Typ übereinstimmt muss lesen, wird es zeigen „Dokument gelesen wurde“, andernfalls wird es zeigen

Aufgrund dieser Beitrag me „Dokument nicht gelesen hat,“ wissen export data from panel lassen Wie man Daten aus dem Panel exportiert, beginne ich, den Code aus dem Post zu folgen und einen Code zu modifizieren, um die Benutzeranforderung zu erfüllen.

Ich habe zwei Ansichten den Vergleich zu tun:

Jeder Offizier Typ braucht verschiedene Dokumente zu lesen, so gibt es eine Ansicht, um den Wert zu speichern, ist die erste Spalte der Typ Offizier und die zweite Spalte ist das Dokument , dass der Offizierstyp lesen sollte. Die zweite Spalte ist ein Mehrfachwertfeld und ich kann das Mehrwert-Trennzeichen auf Neue Zeile setzen.

Eine andere Ansicht der Offizier Name, der im Zusammenhang Offizier Typ und Dokument lesen von dem Offizier. (Keine Spalte für Mehrwert)

Ich benutze @DbLookup und for Schleife um den Vergleich zu tun und hier schließt Teil des Codes:

var officer = sessionScope.Officer; 
var officerType = sessionScope.OfficerType; 
var showSelectedTypeDoc = @DbLookup(@DbName(),"view1", officerType, 2); 
var showUserHasReadDoc= @DbLookup(@DbName(),"view2", officer, 3); 
var result = ""; 

while (viewEnt != null) 
{ 
    if(viewEnt.getColumnValues()[1] == officer) //get the value related to the officer in the session 
    { 
     writer.write("<tr>"); 
     for(var s = 0; s < showSelectedTypeDoc.length;s++) //loop in view1 first 
     { 
      for(var r = 0; r < showUserHasReadDoc.length;r++)//then loop the view2 
      { 
       if(showSelectedTypeDoc[s] == showUserHasReadDoc[r])//if value matches between 2 views 
       { 
        result = "Document has been read"; 
       } 
       else 
       { 
        result = "Document has not read"; 
       } 
      } 
     } 
     //display the list of the document category related to specific officer type 
     writer.write("<td>" + viewEnt.getColumnValues()[2] + "</td>"); //Problem occurs here, it only shows the first value, the appearance depends on the loop 
     writer.write("<td>" + result+ "</td>"); // only display the else part 
     writer.write("</tr>"); 
    } 
} 

Eigentlich nehme ich

viewEnt.getColumnValues()[2] 

zeigt alle relevanten Werte. Wenn ich den Wert jedoch exportiere, wird nur der erste Wert angezeigt, z. [erster Wert] Der Code

writer.write("<td>" + result+ "</td>"); 

ich die, wenn die Bedingung zu überprüfen, sollte es in Ordnung sein, aber es zeigt nur den sonst Teil

Ich versuchte

showSelectedTypeDoc[s] 

statt

viewEnt.getColumnValues()[2] 

es zeigt undefined und das Aussehen hängt von der Schleife ab.

Aber wenn ich versuche,

showSelectedTypeDoc[0] //or showSelectedTypeDoc[1], etc 

es den richtigen Wert zeigen und das Aussehen ist abhängig von dem Looping.

aber ich werde nicht, wie viele Werte weiß, dass der Variable gespeichert, so dass ich lieber

showSelectedTypeDoc[s] 

alle relevanten Werte zu finden, aber nicht erfolgreich.

Ich beginne zu denken, warum es nur den ersten Wert zeigt. Ich überarbeite den Code und die Ansicht, wahrscheinlich ist die Multi-Wert-Spalte das Problem. Das liegt daran, dass ich in In Views Client in der Ansicht nur einmal auf einen bestimmten Wert klicke, wenn der Wert einen Mehrfachwert hat, wird das "Tick" -Symbol für relevante Daten angezeigt.

So möchte ich gerne wissen, wie

verwenden
viewEnt.getColumnValues()[2] 

alle Daten auf einen bestimmten Wert bezogen abzurufen. Dankbar für Ihren Rat bitte. Vielen Dank.

+0

In 'writer.write (" "+ viewEnt.getColumnValues ​​() [2] +" ");' habe ich versucht, 'writer.write (" "+ showSelectedTypeDoc.length +""); '. Es kann die korrekte Länge in der Ansicht anzeigen. – beginner

+0

Aber wenn ich versuche 'writer.write (" "+ showSelectedTypeDoc +" ");', Wenn ich die Daten exportieren, zeigt es seltsame Ergebnisse. Es zeigt '<<<<<' und der Standort stimmt nicht mit der relevanten Spalte überein. – beginner

+0

Ich habe diesen Beitrag gelesen [Vorsicht, was getColumnValue zurückgibt] (http://linqed.eu/2010/08/16/beware-of-what-getcolumnvalue-is-returning/). Ich habe den Code in der Anwendung angewendet. Wenn ich die Daten exportiert habe, ist das Ergebnis leer. – beginner

Antwort

1

getColumnsValues() gibt einen Java-Vektor zurück. Die Syntax, die Sie benötigen, um ein spezifisches Element in Vector zu bekommen, ist getColumnValues().get(2) (welches die dritte Spalte bekommt).

Das Abrufen von Spaltenwerten muss nicht kategorisiert werden. Die Kategorisierung wird nur zum Abrufen des Eintrags benötigt, nicht für die Spaltenwerte.

Ich glaube, wenn Sie den Index verwenden, werden statische Spalten (z. B. mit Formel auf einen statischen Wert wie 1 oder "<tr>") übersprungen.

+0

Ein paar zusätzliche Punkte zu beachten, sobald Sie es funktioniert haben. 1) @DbLookup ist die am wenigsten performante Methode, um einen Eintrag zu erhalten. Die Formelsprache kann im Notes Client am schnellsten sein, aber in XPages muss sie zu einer zugrunde liegenden Java-Funktion ('View.getAllEntriesByKey()') weitergeleitet werden, und jeder Parameter muss analysiert und konvertiert werden. Am besten gehen Sie direkt zu 'getAllEntriesByKey()'. 2) Anzeigen von Einträgen sollten während des Schleifens wiederverwendet werden. Dazu gibt es verschiedene Fragen und Blogbeiträge. Wenn die Ansicht Datumsspalten enthält, sollte das Objekt 'getColumnValues ​​()' ebenfalls wiederverwendet werden. –

+0

Paul hat absolut recht. Ihr aktueller Ansatz führt ein @ DbLookup für jede Zeile in der Tabelle aus. Keine gute Idee. Suchen Sie einmal mit getAllEntriesByKey, laden Sie die Units in ein JS-Objekt und vergleichen Sie das – stwissel