Фильтрация запросов Visualforce RemoteObjectModels с использованием оператора ИЛИ

Я использую на странице visualforce Salesforce.com. В демонстрационных целях я использовал следующий фрагмент кода из примеров документов, показанных в

http://docs.releasenotes.salesforce.com/en-us/spring14/release-notes/rn_vf_remote_objects.htm

В моем фрагменте кода у меня есть предложение «Где», в котором я пытаюсь фильтровать, используя 3 поля. Мое требование состоит в том, что записи должны соответствовать критериям A, или критериям B, или критериям C.

Пример кода

<apex:page >
    
    <!-- Remote Objects definition to set accessible sObjects and fields -->
    <apex:remoteObjects >
        <apex:remoteObjectModel name="Group_Donor__c" jsShorthand="Groupdonor" 
            fields="Name,Id">
            <apex:remoteObjectField name="State__c" jsShorthand="State"/>
            <apex:remoteObjectField name="Org_Phone__c" jsShorthand="Phone"/>
            <apex:remoteObjectField name="Billing_Type__c" jsShorthand="billingtype"/>
        </apex:remoteObjectModel>
    </apex:remoteObjects>

    <!-- JavaScript to make Remote Objects calls -->
    <script>
        var fetchWarehouses = function(){
            // Create a new Remote Object
            var wh = new SObjectModel.Groupdonor();
            
            // Use the Remote Object to query for 10 warehouse records
            wh.retrieve({
                where: { 
                          or: {
                                Name : {like:"%Helloworld%"}, // Error
                                State: {like:"%chennai%"},
                                //Phone: {like:"%098765432344%"}, 
                                billingtype: {like:"%Credit Card%"}
                              } 
                          }, 
                limit: 10 , 
            }, function(err, records, event){
                if(err) {
                    alert(err.message);
                }
                else {
                    var ul = document.getElementById("warehousesList");
                    records.forEach(function(record) {
                        // Build the text for a warehouse line item
                        var whText = record.get("Name");
                        whText += " -- ";
                        whText += record.get("Phone");
                        whText += " -- ";
                        whText += record.get("billingtype"); 
                        
                        // Add the line item to the warehouses list
                        var li = document.createElement("li");
                        li.appendChild(document.createTextNode(whText));
                        ul.appendChild(li);
                    });
                }
            });
        };
    </script>

    <h1>Retrieve Group Donors via Remote Objects</h1>

    <p>Warehouses:</p>

    <ul id="warehousesList">
    </ul>
    <button onclick="fetchWarehouses()">Retrieve Group Donors</button>

</apex:page>

Когда я выполняю этот код, я получаю следующую ошибку.

Сообщение об ошибке:

Invalid criteria specified for retreival. ValidationError [code=11, message=Data does not match any schemas from &quot;oneOf&quot; path=/where, schemaKey=null]

Эта проблема возникает только при следующих условиях.

  1. Когда я использую стандартное поле, такое как имя, в условии ИЛИ. (Даже 2 или 1 фильтр)
  2. Когда я использую более 3 настраиваемых полей в условии ИЛИ (более 2 фильтров запроса)

Но когда я использую только любые 2 настраиваемых поля, упомянутых в RemoteObjectModel, в качестве фильтров, я получаю ожидаемые результаты.

Пожалуйста, дайте мне знать, что мне здесь не хватает. Если я использую более 2 фильтров в одном или другом состоянии, как мне этого добиться? правильно ли использовать «ИЛИ» в удаленных объектах? А кто-нибудь сталкивался с этой проблемой. если так любезно дайте мне несколько указателей.

Заранее спасибо.


person StormBr34ker    schedule 26.11.2015    source источник


Ответы (1)


Я кое-что искал, и есть и плохие, и хорошие новости.

Во-первых, это (неясное) известное ограничение: у вас не может быть более 2 предикатов для запросов AND и OR — документы здесь

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

<apex:remoteObjectModel name="Group_Donor__c" jsShorthand="GroupDonor">
    <apex:remoteObjectField name="Name" jsShorthand="NameJS"/>
    <apex:remoteObjectField name="State__c" jsShorthand="State"/>
    <apex:remoteObjectField name="Org_Phone__c" jsShorthand="Phone"/>
<!--.... etc-->

По крайней мере, вы сможете запрашивать стандартные поля таким образом.

В качестве окончательного обходного пути вам, вероятно, придется получить два списка записей и использовать JavaScript для создания окончательного списка OR.

Удачи!

person Caspar Harmer    schedule 01.12.2015
comment
Похоже, нам с этим жить! Спасибо за уделенное время . - person StormBr34ker; 01.12.2015
comment
Да, я тоже был немного разочарован, обнаружив это ограничение! Я думаю, что есть обходные пути, но все же это не здорово. Мне уже приходилось внедрять рекурсивную систему извлечения записей, чтобы обойти ограничение в 100 записей, так что это только усугубляет ситуацию. Надеюсь, они когда-нибудь обновят API. - person Caspar Harmer; 01.12.2015