2017-09-28 4 views
0

Wir haben eine XPage, die eine benannte JDBC-Verbindung über die OpenNTF-Erweiterungsbibliothek verwendet.Zugriff auf Daten für JDBC-Abfrage in ViewPanel auf XPage über OpenNTF-Treiber

Dies ist erfolgreich Abrufen von Daten und platzieren Sie es in einem View Panel, Ich habe ausgewählt, um ein Kontrollkästchen neben dem ersten Feld in der Zeile anzuzeigen, und müssen auf den zurückgegebenen Wert für das Feld in dieser Zeile (oder a Array für Vielfache der ausgewählten Zeilen).

Insgesamt wurden bisher diese Methoden versucht:

var Docs2=getComponent("viewPanelDocs"); 
//var db2 = Docs2.getAttributes(); 
//var doc2Array=Docs2.getSelectedIds(); 
//var test = getComponent("something"); 
var p=Docs2.getParent() 
var pp=something.getColumnValue("extName") 
var Rows = Docs2.getChildCount().valueOf(); 
var doc2Array= new Array(); 
var SelectedDocs2 = new Array(); 
for(i=0; i < Rows; i++) { 
     // Works, no output: var Selected2Docs=Docs2.getAttributes(); 
     // FAILS: var Selected2Docs=Docs2_xspGetRendererData(); 
     // WORKS, no output: var Selected2Docs=Docs2._xspGetRendererData(); 
     // WORKS, gets local ID of viewPanel: var Selected2Docs=Docs2.getId(); 
     // Works: [email protected]: var Selected2Docs=Docs2.getAttributes(); 
     // FAILS, doesn't like string: var Selected2Docs=Docs2.getAttributes("ExternalUNCLink"); 
     // WOrks, no output: var Selected2Docs=Docs2.getAttributes().get("ExternalUNCLink"); 
     // Fails, something, something: var Selected2Docs=Docs2.getAttributes().values("ExternalUNCLink"); 
     var Selected2Docs=Docs2.toString().valueOf(); 
     doc2Array.push(Selected2Docs); 
} 
getComponent("Docs2").value=Rows + ": " + @Implode(doc2Array, ","); 
//viewScope.put("Documents", @Implode(docArray, ",")); 

Irgendwelche Hinweise, wie Sie den Rückgabewert von ExternalUNCLink zugreifen?

Vorbehalt: Ich bin kein Domino-Entwickler, also entschuldige mich, wenn einige der Terminologie nicht korrekt sind.

[EDIT]

Wir haben einen JDBC-Treiber, die in den Packages lebt -> Web Content -> WEB-INF -> jdbc Ordner mit einem Testnamen und vier Betrachtungsweisen in einem XML-Stil-Format, also:

<jdbc> 
    <driver>net.sourceforge.jtds.jdbc.Driver</driver> 
    <url>jdbc:jtds:sqlserver://malbec/aps_dsql</url> 
    <user>user</user> 
    <password>pass</password> 
</jdbc> 

Dann auf der Seite haben wir eine SQL-Abfrage in der afterPageLoad Ereignis:

var TmpSql="select * from TABLE" 
viewScope.put("SQLQuery", TmpSql); 
getComponent("strSQLQuery").value=TmpSql; 

Danach werden Sie die viewScope Variable „sQLQuery“ in das Wertefeld auf einem JDB für sqlquery setzen CQuery-Ansicht, wobei die Variable connectionName des oben angezeigten Namens des JDBC-Treibers verwendet wird. Es gibt die Daten zurück, aber wir können nicht darauf zugreifen.

[/ EDIT]

[EDIT 2]

(Entschuldigung für die Hunde Frühstück ...)

<?xml version="1.0" encoding="UTF-8"?> 
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
    xmlns:xc="http://www.ibm.com/xsp/custom"> 

    <xp:this.afterPageLoad><![CDATA[#{javascript:var TmpSql="select A.extName,A.extUNC,A.extObjInstID,LEFT(A.extUNC,5) as Category, B.cltMailName From cdblink A inner join cdbClientMaster B on A.extobjinstid=B.objInstID where extobjectid=1 and extobjinstid in (1536,1871,632)" 
viewScope.put("strSQLQuery", TmpSql); 
getComponent("strSQLQuery").value=TmpSql; 
getComponent('viewPanelDocs').getData().refresh(); 
}]]></xp:this.afterPageLoad> 
    <xc:testjdbcrowdataaccess></xc:testjdbcrowdataaccess> 
    <xp:br></xp:br> 
    <xp:br></xp:br> 
    <xp:button value="Label" id="button1"> 
     <xp:eventHandler event="onclick" submit="true" 
      refreshMode="complete"> 
      <xp:this.action><![CDATA[#{javascript: 
// --var vp=getComponent("viewPanelDocs"); 
// -- 
// --//var test=vp._xspGetRendererData().getParent(); 
// --//var test=vp._xspGetStateId().valueOf(); 
// --//var test= vp.getChildren().lastIndexOf(); 
// --var test= vp.getChildren().size(); 
// --var test=vp.getChildCount(); 
// --var test=vp._xspGetStateId().valueOf(); 
// --//var test=vp._xspGetReadOnlyObj().hashCode(); 
// --//var test=vp.getAttributes().get(); 
// --var test=vp.getFamily().valueOf(); 
// --var test=vp.getParent(); 
// -- 
// --getComponent("Test").value=test.toString(); 

//var database=mssql_test.jdbc; 
// 
//var viewPanel=getComponent("viewPanelDocs");// get the componet of viewPanel 
//var docIDArray=viewPanel.getSelectedIds(); //get the array of document ids 
//for(i=0; i < docIDArray.length; i++){ 
// var docId=docIDArray[i]; 
    // var doc=database.getDocumentByID(docId); 
    // .. your code to deal with the selected document 

// getComponent("Test").value=doc.toString(); 
//} 

var test = getComponent("viewPanelDocs").value; 
@ErrorMessage("ID: "+test);}]]></xp:this.action> 
     </xp:eventHandler></xp:button> 
    <xp:br></xp:br> 
    <xp:br></xp:br> 
    <xp:br></xp:br><xp:table id="DEBUG" style="width:100%"> 
     <xp:tr> 
      <xp:td>inputText2</xp:td> 
      <xp:td> 
       <xp:inputText id="inputText2" value="#{viewScope.searchDOCID}" style="width:100%"> 
        <xp:eventHandler event="onfocus" submit="true" refreshMode="complete" id="eventHandler2"> 
         <xp:this.action> 
          <![CDATA[#{javascript: 
           var viewPanel:com.ibm.xsp.component.xp.XspViewPanel = getComponent('viewPanel2'); 
           var dominoView:com.ibm.xsp.model.domino.DominoViewData = viewPanel.getData(); 
           var filterValue = getComponent('inputText2').getValue(); 
           if (filterValue == 'NA') { 
           filterValue = '';} 
           viewScope.clear() 
           dominoView.setKeys(filterValue);}]]> 
         </xp:this.action> 
        </xp:eventHandler> 
       </xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>inputText3 (displayvar)</xp:td> 
      <xp:td> 
       <xp:inputText id="inputText3" value="#{viewScope.documentDOCID}" style="width:100%"> 
       </xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>Test</xp:td> 
      <xp:td> 
       <xp:inputText id="Test" style="width:100%" value="#{viewScope.test}"> 
       </xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>inputText1</xp:td> 
      <xp:td> 
       <xp:inputText id="inputText1" style="width:100%"></xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>inputText4</xp:td> 
      <xp:td> 
       <xp:inputText id="inputText4" style="width:100%"></xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>SQLQuery</xp:td> 
      <xp:td> 
       <xp:inputText id="strSQLQuery" style="width:100%" defaultValue="strSQLQuery"> 
       </xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>SQLQueryCat</xp:td> 
      <xp:td> 
       <xp:inputText id="strSQLQueryCat" style="width:100%"> 
       </xp:inputText></xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>Doc1</xp:td> 
      <xp:td> 
       <xp:inputText id="Docs" style="width:100%"> 
</xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td style="width:15%">Doc2</xp:td> 
      <xp:td> 
       <xp:inputText id="Docs2" style="width:100%"></xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>scopeVariable.Documents</xp:td> 
      <xp:td> 
       <xp:inputText id="svDocuments" style="width:100%"></xp:inputText> 
      </xp:td> 
     </xp:tr> 
     <xp:tr> 
      <xp:td>scopeVariable.Recipients</xp:td> 
      <xp:td> 
       <xp:inputText id="svRecipients" style="width:100%"></xp:inputText> 
      </xp:td> 
     </xp:tr> 
    </xp:table></xp:view> 

[/ EDIT 2]

+0

Ein viewPanel zeigt nur eine Notes Ansicht an. Ich frage mich, was Sie getan haben, um das ViewPanel zu zwingen, ein SQL-Ergebnis anzuzeigen. Haben Sie irgendwann eine Datentabelle verwendet? – stwissel

+0

Sagte Sie weg von SQL zu bleiben – stwissel

+0

Aktualisierte Frage zu zeigen, Methode zum Anzeigen von SQL-Daten in einer View-Tabelle ... – neophytte

Antwort

0

Es ist wie die Antwort auf meine Frage aussieht, ist ein dreiteiliger ein - zunächst wir die Domino-Seite der Dinge verwenden, um die Kisten zu erhalten, die geprüft werden, also:

var Docs2=getComponent("viewPanelDocs"); 
var APKArray=Docs2.getSelectedIds(); 
//getComponent("svDocuments")[email protected](APKArray,","); 

Dann verwenden wir die OpenNTF „Model "Java-Code ein Array der Dokumente innerhalb der SQL-Auswahl zu erhalten:

// get the Array from the SQL selection 
var namesArray=[]; 
var PathArray=[]; 
var locationArray = []; 
var FinalNames=[]; 
var FinalLocations=[]; 

var Model:com.ibm.xsp.component.xp.XspViewColumn = getComponent("xxxviewColumn3"); 
var modelData=Model.getDataModel(); 
var Rows = Model.getChildCount().valueOf(); 
namesArray.push(Rows); 
for(i=0; i < modelData.getRowCount(); i++) { 
    modelData.setRowIndex(i); 
    var x=modelData.getRowIndex(); 
    var y=modelData.getRowData().getColumnValue("ExternalName").toString(); 
    var z=modelData.getRowData().getColumnValue("ExternalUNCLink").toString(); 
    namesArray.push(x); 
    locationArray.push(y); 
    PathArray.push(z); 
}      
//getComponent("Docs2").value=namesArray 

Dann benutzen wir den Index aus der Domino-Seite, die Namen auf der SQL-Seite zu verweisen, und setzen das in ein neues Array:

// put the selected docs in the selected array 

for(i=0; i < APKArray.length; i++) { 
    var z = APKArray[i].valueOf(); 
    FinalNames.push(PathArray[z].valueOf() + "\\" + locationArray[z].valueOf()) 
    //FinalLocations.push(locationArray[z].valueOf()) 
} 

getComponent("Docs2")[email protected](FinalNames,","); 

Der Pfad + Namen endet im Bearbeitungsfeld von Docs2. Es ist ziemlich unordentlich, aber funktioniert (ich hoffe, dass dies meine Vorbehalte nicht ruiniert !!)

1

Wenn Sie eine ViewPanel das mit einer Notes-Ansicht verknüpft ist, können die ausgewählten Dokumente mit der Methode getSelectedIds() für das Objekt viewPanel gefunden werden. Sie können dann loop through the values, um die Dokumente und ihre vollständige URLs zu erhalten:

var viewPanel=getComponent("viewPanel1");get the componet of viewPanel 
var docIDArray=viewPanel.getSelectedIds(); get the array of document ids 
for(i=0; i < docIDArray.length; i++){ 
    var docId=docIDArray[i]; 
    var doc=database.getDocumentByID(docId); 
    // .. your code to deal with the selected document 
} 

zu Might für Ihren JDBC Anwendungsfall arbeiten.

+0

Schätzen Sie Ihre Antwort, aber wie Sie auf die "Datenbank" zugreifen Variable - der Code besagt, dass "doc" gleich null ist: Fehler beim Ausführen der JavaScript-Aktion expression Script Interpreter Fehler, Zeile = 23, col = 36: 'doc' ist null – neophytte

+0

Datenbank ist eine globale Variable. Ich vermute jedoch, dass Sie kein an eine Ansicht gebundenes Ansichtspanel verwendet haben. Also aktualisieren Sie Ihre Frage mit der tatsächlichen xpage-Quelle. Sonst spielen wir ein Ratespiel – stwissel

+0

Glücklich, um es aufzustellen, aber es ist ein Stück von einem Chop-Shop-Job, ich habe es auf seine rauhe Form gebracht ... – neophytte