|
#1
|
|||
|
|||
|
I have a ListGrid and a DynamicForm both tied to the same Datasource:
Code:
isc.DataSource.create({
ID:"registrationsDS",
showPrompt: false,
dataFormat: "xml",
dataURL:"/browse/isotest/Registrations.ashx",
recordXPath : "//user",
fields:[
{ name : "userid", title:"UserId"},
{ name : "registrationDate", title:"Reg Date", width: 120},
{ name : "namefirst", title:"First", width: 150 },
{ name : "namemiddle", title:"Middle", width: 75},
{ name : "namelast", title:"Last", width: 150},
{ name : "email", title:"Email", width: 220},
{ name : "company", title:"Company", hidden: companyHidden},
{ name : "letters", title:"Letters", hidden: lettersHidden},
{ name : "salesrepid", title:"Sales Rep Id", hidden: true},
{ name : "salesrep", title:"Sales Rep", hidden: salesRepHidden},
{ name : "comments", title:"Comment", hidden: true}
],
transformRequest : function (dsRequest) {return RequestFields(dsRequest, "registrations");},
transformResponse: function (dsResponse,dsRequest,xmlData) {return ResponseFields(dsResponse,dsRequest,xmlData, "users");}
});
isc.DynamicForm.create({
ID:"RegistrationEditForm",
useAllDataSourceFields:true,
dataSource: "registrationsDS",
fields:[
{ name : "email", title:"Email", width : 200},
{ name : "phone", title:"Phone", width : 200},
{ name : "namefirst", title:"First", width : 200 },
{ name : "company", title:"Company", width : 200},
{ name : "namelast", title:"Last", width : 200},
{ type : "textarea", name : "letters", title:"Letters", height: 50, width : 200, rowSpan: 2},
{ name : "addressone", title:"Address 1", width : 200},
{ name : "addresstwo", title:"Address 2", width : 200},
{ type : "textarea", name : "comments", title:"Comments", width : 200, rowSpan: 4},
{ name : "city", title:"City", width : 200},
{ name : "state", title:"state", width : 200},
{ name : "zip", title:"Zip", width : 200},
{name:"savebtn", editorType:"button", align:"center",
width:75, title:"Save", click:"RegistrationEditForm.saveData()", startRow:true, endRow:false},
{name:"activatebtn", editorType:"button", align:"center",
width:75, title:"Activate", click:"ActivateFromEditor()", startRow:false, endRow:false},
{name:"deleteRegbtn", editorType:"button", align:"center",
width:75, title:"Delete", click:"", startRow:false, endRow:false},
{name:"regAssignGroupsbtn", editorType:"button", align:"center",
width:150, title:"Assign Usergroups", click:"", startRow:false, endRow:false}
],
width:"100%",
numCols:4,
colWidths:[75,75,75,75],
margin:5,
overflow: "auto",
cellPadding:5,
autoFocus:false,
clearDetails : function () {
regId = 0;
RegistrationEditForm.editNewRecord();
UsergroupsForRegList.data.invalidateCache();
UsergroupsForRegList.fetchData({ ts : isc.timeStamp() });
}
});
isc.ListGrid.create({
ID: "registrationList",
alternateRecordStyles:true,
showAllRecords:false,
dataSource: "registrationsDS",
dataPageSize: 10,
autoFetchData: true,
drawAheadRatio: 1,
showFilterEditor: false,
cellContextClick:"return registrationListMenu.showContextMenu()",
recordClick:"this.updateDetails()",
canEdit:true,
modalEditing:true,
cellChanged:"this.updateDetails()",
updateDetails : function () {
var record = this.getSelectedRecord();
if (record == null) return RegistrationEditForm.clearDetails();
if(registrationList.getSelection().getLength() == 1){
RegistrationEditForm.editRecord(record);
regId = record.userid;
UsergroupsForRegList.data.invalidateCache();
UsergroupsForRegList.fetchData({ ts : isc.timeStamp() });
RegistrationEditForm.disabled = false;
}
else {
regId = 0;
UsergroupsForRegList.data.invalidateCache();
UsergroupsForRegList.fetchData({ ts : isc.timeStamp() });
RegistrationEditForm.clearDetails();
RegistrationEditForm.disabled = true;
}
}
});
function ResponseFields(dsResponse,dsRequest,xmlData, rootName){
if (dsRequest.operationType == "fetch") {
if( xmlData ) {
dsResponse.totalRows = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@totalrecords");
dsResponse.startRow = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@startRow");
dsResponse.endRow = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@endRow");
dsResponse.sortBy = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@sortBy");
}
}
return dsResponse;
}
function RequestFields(dsRequest, methodObj, addParms){
if (dsRequest.operationType == "update") {
var params = {
startRow : dsRequest.startRow,
endRow : dsRequest.endRow,
method : "update_" + methodObj,
sortBy: (dsRequest.sortBy == 'undefined') ? "" : dsRequest.sortBy,
global: filterFieldVal
};
return isc.addProperties({}, dsRequest.data, params);
}
if (dsRequest.operationType == "fetch") {
var params = {
startRow : dsRequest.startRow,
endRow : dsRequest.endRow,
method : "fetch_" + methodObj,
sortBy: (dsRequest.sortBy == 'undefined') ? "" : dsRequest.sortBy,
global: filterFieldVal
};
return isc.addProperties({}, dsRequest.data, params);
}
}
Thanks in advance, Paul |
|
#2
|
|||
|
|||
|
You don't seem to have a primaryKey field declared (which is how SmartClient identifies records when talking to the server).
You might also need this patch although it's unlikely. The best way to troubleshoot this is to enable the ResultSet log category (set to DEBUG) in order to watch what's happening as SmartClient tries to update your cache with the new record values. |
|
#3
|
|||
|
|||
|
I was so sure I had a primaryKey field, I didn't even review it in my code, even when posting it.
I have added the primaryKey field property to the datasource as wll as the type property to all the fields. Below is my new Datasource definition. It is still refreshing. I noticed in the sample application, that in the dsResponse for RPC calls we have the following properties: invalidateCache = false status = 0 isDSResponse = true Because I am using an xml datasource (.net on the backend) I am doing a transform request/response as you can see in my code. Do I need to set the above properties for the response object? My transformResponse code is included below. Thanks Paul Code:
var filterFieldVal = "";
function ResponseFields(dsResponse,dsRequest,xmlData, rootName){
if (dsRequest.operationType == "fetch") {
if( xmlData ) {
dsResponse.totalRows = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@totalrecords");
dsResponse.startRow = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@startRow");
dsResponse.endRow = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@endRow");
dsResponse.sortBy = isc.XMLTools.selectNumber(xmlData, "//" + rootName + "/@sortBy");
}
}
if(dsRequest.operationType == "update"){
dsResponse.invalidateCache = false;
dsResponse.status = 0;
dsResponse.isDSResponse = true;
}
return dsResponse;
}
function RequestFields(dsRequest, methodObj, addParms){
if (dsRequest.operationType == "update") {
var params = {
//startRow : dsRequest.startRow,
//endRow : dsRequest.endRow,
method : "update_" + methodObj
//,
//sortBy: (dsRequest.sortBy == 'undefined') ? "" : dsRequest.sortBy,
//global: filterFieldVal
};
return isc.addProperties({}, dsRequest.data, params);
}
if (dsRequest.operationType == "fetch") {
var params = {
startRow : dsRequest.startRow,
endRow : dsRequest.endRow,
method : "fetch_" + methodObj,
sortBy: (dsRequest.sortBy == 'undefined') ? "" : dsRequest.sortBy,
global: filterFieldVal
};
return isc.addProperties({}, dsRequest.data, params);
}
}
var companyHidden = false; //((divid == 1)? true : false );
var lettersHidden = ((divid == 1)? false : true );
var salesRepHidden = ((divid == 1)? true : false );
//alert(companyHidden + '\n' + lettersHidden + '\n' + salesRepHidden );
isc.DataSource.create({
ID:"registrationsDS",
showPrompt: false,
dataFormat: "xml",
dataURL:"/browse/isotest/Registrations.ashx",
recordXPath : "//user",
fields:[
{ name : "userid", title:"UserId", primaryKey: true, type: "sequence"},
{ name : "registrationDate", title:"Reg Date", width: 120, type: "text"},
{ name : "namefirst", title:"First", width: 150 , type: "text"},
{ name : "namemiddle", title:"Middle", width: 75, type: "text"},
{ name : "namelast", title:"Last", width: 150, type: "text"},
{ name : "email", title:"Email", width: 220, type: "text"},
{ name : "company", title:"Company", hidden: companyHidden, type: "text"},
{ name : "letters", title:"Letters", hidden: lettersHidden, type: "text"},
{ name : "salesrepid", title:"Sales Rep Id", hidden: true, type: "text"},
{ name : "salesrep", title:"Sales Rep", hidden: salesRepHidden, type: "text"},
{ name : "comments", title:"Comment", hidden: true, type: "text"}
],
transformRequest : function (dsRequest) {return RequestFields(dsRequest, "registrations");},
transformResponse: function (dsResponse,dsRequest,xmlData) {return ResponseFields(dsResponse,dsRequest,xmlData, "users");}
});
|
|
#4
|
|||
|
|||
|
No, you don't need those properties.
Have you tried the patch? What are you seeing when the ResultSet log is enabled? |
|
#5
|
|||
|
|||
|
Yes, I applied the patch and here is the result from the ResultSet log:
Code:
12:47:19.527:DEBUG:ResultSet:isc_ResultSet_18:getRange: guessing forward scrolling
12:47:19.527:INFO:ResultSet:isc_ResultSet_18:getRange(0, 9) will fetch from 0 to 10
12:47:19.527:INFO:ResultSet:isc_ResultSet_18:fetching rows 0,10 from server
12:47:19.558:DEBUG:DynamicForm:RegistrationEditForm:blur w/o handler: no item to blur
12:47:19.574:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_0 name:userid]
12:47:19.589:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_1 name:registrationDate]
12:47:19.605:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_2 name:namefirst]
12:47:19.605:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_3 name:namemiddle]
12:47:19.621:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_4 name:namelast]
12:47:19.636:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_5 name:email]
12:47:19.636:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_6 name:phone]
12:47:19.652:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_7 name:company]
12:47:19.668:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextAreaItem ID:isc_TextAreaItem_8 name:letters]
12:47:19.683:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_9 name:addressone]
12:47:19.699:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_10 name:addresstwo]
12:47:19.714:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_11 name:city]
12:47:19.730:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_12 name:state]
12:47:19.730:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [TextItem ID:isc_TextItem_13 name:zip]
12:47:19.746:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [ButtonItem ID:isc_ButtonItem_14 name:savebtn]
12:47:19.761:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [ButtonItem ID:isc_ButtonItem_15 name:activatebtn]
12:47:19.777:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [ButtonItem ID:isc_ButtonItem_16 name:deleteRegbtn]
12:47:19.808:DEBUG:DynamicForm:RegistrationEditForm:Drawing FormItem: [ButtonItem ID:isc_ButtonItem_17 name:regAssignGroupsbtn]
12:47:19.964:DEBUG:ResultSet:isc_ResultSet_18:getRange(0, 9) satisfied from cache
12:47:20.089:WARN:Log:operationBinding is: DataSource{ID: "UserGroupsForRegDS",
showPrompt: false,
dataFormat: "xml",
dataURL: "/browse/isotest/Usergroups.ashx",
recordXPath: "//usergroup",
fields: Obj,
canQueueRequests: false,
name: "UserGroupsForRegDS",
mergedFields: Obj,
xmlNamespaces: Obj}
12:47:20.105:INFO:ResultSet:isc_ResultSet_18:Received 0 records from server
12:47:20.136:WARN:ResultSet:isc_ResultSet_18:fetchData callback: dsResponse.endRow set to:10. dsResponse.totalRows set to:0. endRow cannot exceed total dataset size. Clamping endRow to the end of the dataset (0).
12:47:20.152:DEBUG:ResultSet:isc_ResultSet_18:full length set to: 0
12:47:20.168:DEBUG:ResultSet:isc_ResultSet_18:integrating 0 rows into cache at position 0
12:47:20.199:INFO:ResultSet:isc_ResultSet_18:cached 0 rows, from 0 to 0 (0 total rows, 0 cached)
12:47:20.214:INFO:ResultSet:isc_ResultSet_18:Cache for current criteria complete
12:47:20.261:DEBUG:ResultSet:isc_ResultSet_18:getRange(0, 0): returning empty list
12:47:26.199:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'userid' with value '5281'
12:47:26.215:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'registrationDate' with value '06/01/2007'
12:47:26.246:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'namefirst' with value 'Cris B'
12:47:26.261:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'namemiddle' with value 'undefined'
12:47:26.293:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'namelast' with value 'Aglar'
12:47:26.308:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'email' with value 'cr****uilar@******nnel.com'
12:47:26.340:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'company' with value 'Clear Channel Communications'
12:47:26.355:DEBUG:DynamicForm:RegistrationEditForm:Applying 1 validators to field 'letters' with value 'WHP'
12:47:26.590:WARN:Log:operationBinding is: DataSource{ID: "registrationsDS",
showPrompt: false,
dataFormat: "xml",
dataURL: "/browse/isotest/Registrations.ashx",
recordXPath: "//user",
fields: Obj,
canQueueRequests: false,
name: "registrationsDS",
mergedFields: Obj,
xmlNamespaces: Obj}
12:47:26.621:DEBUG:ResultSet:isc_ResultSet_22:dataSource data changed firing
12:47:26.636:INFO:ResultSet:isc_ResultSet_22:Invalidating cache
12:47:26.761:DEBUG:ResultSet:isc_ResultSet_22:getRange(0,15), cache check: 2,12 firstMissingRow: 2 lastMissingRow: 12
12:47:26.793:DEBUG:ResultSet:isc_ResultSet_22:getRange: no scrolling direction detected
12:47:26.824:INFO:ResultSet:isc_ResultSet_22:getRange(0, 15) will fetch from 0 to 15
12:47:27.090:DEBUG:ResultSet:isc_ResultSet_22:getRange(0,15), cache check: 2,12 firstMissingRow: 2 lastMissingRow: 12
12:47:27.121:DEBUG:ResultSet:isc_ResultSet_22:getRange: no scrolling direction detected
12:47:27.152:INFO:ResultSet:isc_ResultSet_22:getRange(0, 15) will fetch from 0 to 15
12:47:27.527:INFO:ResultSet:isc_ResultSet_22:fetching rows 0,15 from server
12:47:27.652:WARN:Log:operationBinding is: DataSource{ID: "registrationsDS",
showPrompt: false,
dataFormat: "xml",
dataURL: "/browse/isotest/Registrations.ashx",
recordXPath: "//user",
fields: Obj,
canQueueRequests: false,
name: "registrationsDS",
mergedFields: Obj,
xmlNamespaces: Obj}
12:47:27.730:INFO:ResultSet:isc_ResultSet_22:Received 16 records from server
12:47:27.761:DEBUG:ResultSet:isc_ResultSet_22:full length set to: 128
12:47:27.793:DEBUG:ResultSet:isc_ResultSet_22:integrating 16 rows into cache at position 0
12:47:27.824:INFO:ResultSet:isc_ResultSet_22:cached 16 rows, from 0 to 15 (128 total rows, 16 cached)
12:47:27.871:DEBUG:ResultSet:isc_ResultSet_22:getRange(0, 15) satisfied from cache
|
|
#6
|
|||
|
|||
|
Hi Picasso,
What version of SmartClient is this? Prior to 6.0 the behavior for a completed "update" operation when the dataset is paged was to invalidate the cache since the row order could get out of sync between client and server, so a refetch of the dataset would be expected and is shown in the logs. This invalidation behavior changed in 6.0 with the updatePartialCache feature. |
|
#7
|
|||
|
|||
|
I'm using smartclient v6 small vendor's edition
|
|
#8
|
|||
|
|||
|
How can I make sure, I am using a particular version of Smartclient?
|
|
#9
|
|||
|
|||
|
The version is reported in the lower left hand corner of the Developer Console.
|
|
#10
|
|||
|
|||
|
Assuming you're really on 6.0, the mystery is these logs:
Code:
12:47:26.621:DEBUG:ResultSet:isc_ResultSet_22:dataSource data changed firing 12:47:26.636:INFO:ResultSet:isc_ResultSet_22:Invalidating cache |