Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    ListGrid filtering issue when data available in client cache

    Hi Isomorphic,

    I have an issue in our application, but I can't find an explanation for that. Please see this testcase(same setup as our application, but problem is not coming up):

    Code:
    
    isc.VStack.create({
        width:"100%",
        membersMargin:20,
        members:[
    
            isc.ListGrid.create({
                autoDraw:false,
                ID:"boundList",
                tileWidth:158,
                tileHeight:225,
                height:400,
                canReorderTiles:true,
               // showAllRecords:true,
                dataSource:"supplyItem",
    //showFilterEditor: true,
            groupByField: "category",    
               autoFetchData:false,
                animateTileChange:true,
                detailViewerProperties: {
                    rowHeight: 22
                },
                fields: [
                    {name:"itemName", cellStyle: "animalImage"},
     {name:"category", cellStyle: "animalImage"},
     {name:"units", cellStyle: "animalImage"}
    
    
    
                ]            
            }),
    
            isc.HLayout.create({
                autoDraw:false,
                membersMargin:10,
                height: 22,                               
                members:[
                    isc.IButton.create(
                        {
                            title:"units", 
                           click:"boundList.fetchData({_constructor: 'AdvancedCriteria', operator: 'and', criteria: [{ fieldName: 'units', operator: 'equals', value: 'Box' }]});",
    
                            autoFit:true
                        }
                    ),
                    isc.IButton.create(
                        {
                            title:"units and item", 
                              click:"boundList.fetchData({_constructor: 'AdvancedCriteria', operator: 'and', criteria: [{ fieldName: 'units', operator: 'equals', value: 'Box' },{ fieldName: 'item', operator: 'iContains', value: 'int' }]});",
                            autoFit:true
                        }
                    ),
                     isc.IButton.create(
                        {
                            title:"fetch implicitCriteria", 
                              click:"boundList.filterData();",
                            autoFit:true
                        }
                    )
                ]
            })
    
    
        ]
    });
    In this example, if You click first the "units" button a DSRequest is sent to the server, and then if You click the "units and item" button the grid can use the data in cache, so no DSRequest on this. This is completely comprehensible. Now to my problem. If I do the exact same thing in our application, after the click on "units and item" there is no data shown at all in the grid. If I trigger then an invalidateCache, the data in the grid appear again. So there has to be some problem with the communication beetween resultset and grid.

    Here is the Log Message from the above sample:

    14:03:20.891:MUP7: DEBUG:ListGrid:boundList:Setting filter to: {
    "_constructor":"AdvancedCriteria",
    "operator":"and",
    "criteria":[
    {
    "fieldName":"units",
    "operator":"equals",
    "value":"Box"
    },
    {
    "fieldName":"item",
    "operator":"iContains",
    "value":"int"
    }
    ]
    }
    14:03:20.893:MUP7:INFO:ResultSet:isc_ResultSet_0 (dataSource: supplyItem, created by: boundList):setCriteria: filter criteria changed, performing local filtering
    14:03:20.914:MUP7: DEBUG:ResultSet:isc_ResultSet_0 (dataSource: supplyItem, created by: boundList):getRange(0, 335) satisfied from cache
    14:03:20.925:TMR0: DEBUG:ResultSet:isc_ResultSet_0 (dataSource: supplyItem, created by: boundList):getRange(0, 335) satisfied from cache


    Here is the Log Message from our application:

    14:00:20.590:MUP0: DEBUG:ListGrid:isc_MyLeadsGrid_0:Setting filter to: {
    "operator":"and",
    "_constructor":"AdvancedCriteria",
    "criteria":[
    {
    "fieldName":"CAMPAIGN",
    "operator":"iContains",
    "value":"ct"
    },
    {
    "fieldName":"CUST_CONTACTPERS",
    "operator":"iContains",
    "value":"as"
    }
    ]
    }
    14:00:20.592:MUP0:INFO:ResultSet:isc_ResultSet_0 (dataSource: V_L_MGMT, created by: isc_MyLeadsGrid_0):setCriteria: filter criteria changed, performing local filtering
    14:00:20.593:MUP0:INFO:ResultSet:isc_ResultSet_0 (dataSource: V_L_MGMT, created by: isc_MyLeadsGrid_0):doSort: sorting on properties [S_POS,S_DATE] : directions [true,true] : full cache allows local sort


    In both, our app and the example the LogLevel for ResultSet and ResultTree were set to Debug. Can you maybe localize the problem, regarding the Log? As You see, the two DEBUG information, shown in the log from the example, don't appear in our application. Or can you maybe give some advice, on which debug settings are best, to track down what could possibly went wrong on the way from the resultSet to the Grid? Any hint is highly appreciated!

    Thanks in Advance!

    Kind Regards


    #2
    This issue is related to this Post: https://forums.smartclient.com/forum...ide-filterdata

    Comment


      #3
      This is actually pretty simple: the records in the grid do not match the filter criteria, but your server code thinks they do.

      This can happen if you, for example, return records that don’t have all the fields that the criteria apply to, or where the value delivered to the client differs from what was used for filtering on the server.

      Comment


        #4
        Hi Isomorphic,

        thank you, really simple and indeed the root cause of a problem in front of the monitor. There is an "outputs" applied in order to only transfer a few columns to the client (mobile phone).
        Then there is criteria put on columns with null-value on the client...
        Is there some switch to dumb down ListGrid to that it does not filterLocally? setFilterLocalData() seems not to be the correct API.
        fetch()'s-requestProperties parameter also seems not to be the correct place.
        Just putting an invalidateCache() in the DSCallback also seems not to be the correct solution, if the filtering is already causing a server request.

        Thank you & Best regards
        Blama

        Comment


          #5
          There are flags on ResultSet to turn off local filter and sort. However, even on mobile, you are generally better off delivering all filterable columns to the browser, since local filtering allows you to avoid multiple entire requests and responses, as well as remain interactive when the network connection drops, whereas the additional columns turn out to be very little data, especially with compression.

          Comment


            #6
            Hi Isomorphic,

            thanks. A short FYI: ResultSet tries to link applyFilter in setUseClientFiltering() and in the class docs, but this link is displayed as "ResultSet#applyFilter", as most likely the method is not doc'd public.

            Best regards
            Blama

            Comment


              #7
              Hi Isomorphic,

              a minor one, but still open in 12.0/12.1 docs.

              Best regards
              Blama

              Comment

              Working...
              X