Доступ к данным для запроса JDBC в ViewPanel на XPage через драйвер OpenNTF

У нас есть XPage, который использует именованное соединение JDBC через библиотеку расширений OpenNTF.

Это успешное извлечение данных и размещение их на панели просмотра, я выбрал отображение флажка рядом с первым полем в строке, и мне нужно получить доступ к возвращаемому значению для этого поля в этой строке (или массив для кратных выбранные строки).

До сих пор пробовал эти методы:

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: javax.faces.component.UIComponentBase$AttributesMap@0: 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, ","));

Любые подсказки, как получить доступ к возвращаемому значению ExternalUNCLink?

Предупреждение: я не разработчик Domino, так что извините, если какая-то терминология неверна.

[РЕДАКТИРОВАТЬ]

У нас есть драйвер JDBC, который находится в папке Packages -> Web Content -> WEB-INF -> jdbc с тестовым именем и четырьмя критериями в формате XML, таким образом:

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

Затем на странице у нас есть SQL-запрос в событии afterPageLoad:

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

После этого вы помещаете переменную viewScope «SQLQuery» в поле значения для sqlQuery в представлении JDBCQuery, используя переменную connectionName имени драйвера JDBC, показанного выше. Он возвращает данные, но мы не можем получить к ним доступ.

[/РЕДАКТИРОВАТЬ]

[EDIT2]

(с извинениями за собачий завтрак...)

<?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>

[/EDIT2]


person neophytte    schedule 28.09.2017    source источник
comment
ViewPanel не предназначен для отображения чего-либо, кроме представления Notes. Интересно, что вы сделали, чтобы заставить ViewPanel показать результат SQL. Вы когда-нибудь использовали таблицу данных?   -  person stwissel    schedule 28.09.2017
comment
Сказал вам держаться подальше от SQL   -  person stwissel    schedule 28.09.2017
comment
Обновлен вопрос, чтобы показать метод просмотра данных SQL в таблице просмотра...   -  person neophytte    schedule 29.09.2017
comment
К сожалению, половина наших данных находится в Notes, а половина - в псевдо-DMS, которая хранит информацию в MSSQL...   -  person neophytte    schedule 29.09.2017
comment
Код еще неполный — осталось догадаться, что именно происходит. Полный XPage, если вы хотите решить эту проблему. Кстати. Вы добавили элемент управления отладкой, который показывает все свойства элемента управления? ViewPanel предназначен для NotesView. Он не должен принимать данные SQL. Это то, что делает таблица данных.   -  person stwissel    schedule 02.10.2017
comment
Извините, отложился из-за другого вопроса, тогда S/O меня немного огорчил форматированием ... хотя у меня это было готово, когда я комментировал, теперь оно готово :)   -  person neophytte    schedule 02.10.2017


Ответы (2)


Если у вас есть ViewPanel, связанный с представлением Notes, выбранные документы можно найти с помощью метода getSelectedIds() объекта viewPanel. Затем вы можете перебирать значения в цикле чтобы получить документы и их полные URL-адреса:

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
}

Может работать и для вашего варианта использования JDBC.

person stwissel    schedule 28.09.2017
comment
Ценю ваш ответ, но как получить доступ к переменной базы данных - код говорит, что документ имеет значение null: ошибка при выполнении выражения действия JavaScript. Ошибка интерпретатора сценария, строка = 23, столбец = 36: «doc» равен нулю - person neophytte; 29.09.2017
comment
база данных является глобальной переменной. Однако я подозреваю, что вы не использовали панель просмотра, просто привязанную к представлению. Поэтому обновите свой вопрос, указав фактический источник xpage. В противном случае мы играем в угадайку - person stwissel; 29.09.2017
comment
Рад выложить это, но это что-то вроде мелкой работы, я довел его до самой сырой формы... - person neophytte; 02.10.2017
comment
var viewPanel:com.ibm.xsp.component.xp.XspViewPanel = getComponent('viewPanel2'); -›› на вашей странице нет компонента viewPanel2 - person stwissel; 02.10.2017
comment
Это рабочий код из более крупного проекта — viewPanel2 является частью более крупного проекта — в разделе DEBUG (таблица) я помещаю значения для того, что мне нужно увидеть, единственное значение для этого разбавленного кода. m using - это текстовое поле strSQLQuery, которое показывает строку SQL, передаваемую в базу данных (поэтому я могу подтвердить, что она работает в программе просмотра SQL)... надеюсь, это объясняет... - person neophytte; 03.10.2017

Похоже, что ответ на мой вопрос состоит из трех частей: во-первых, мы используем сторону Domino, чтобы получить отмеченные флажки, таким образом:

var Docs2=getComponent("viewPanelDocs");
var APKArray=Docs2.getSelectedIds();
//getComponent("svDocuments").value=@Implode(APKArray,",");

Затем мы используем Java-код OpenNTF «Model», чтобы получить массив документов внутри выбора SQL:

// 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

Затем мы используем индекс со стороны Domino для ссылки на имена со стороны SQL и помещаем их в новый массив:

// 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").value=@Implode(FinalNames,",");

Путь + имена попадают в поле редактирования Docs2. Это довольно грязно, но работает (надеюсь, это не испортит мою оговорку!!)

person neophytte    schedule 23.10.2017