When choosing the first option of Coding your Data Synchronization programs, the developer has to code all the objects which manage the interaction with the server.
A sample code for manual synchronization can be seen here: Manual Synchronization Code Sample.
This document states best practices for programming these objects.
Using the clear function of the SDT at the end of the for-endfor block will free memory allocated for that collection. If this is not done, the OS will keep memory allocated for that collection even though the routine is not using it any more.
For example:
&httpclient.Execute(!'GET', !'GetAllDepartments?fmt=json')
&departmentslist.FromJson(&httpclient.ToString())
For &department in &departmentslist
new
DepartmentId = &department.DepartmentId
DepartmentName = &department.DepartmentName
endnew
&i+= 1
endFor
&departmentsList.Clear()
To ensure that all the memory allocated for a table synchronization process is released, it is recomended to separete each table synch on a different Procedure. This will force the OS to release all the memory allocated used for one table before synchronizing the next one. This can be done because once you inserted the data on the local database it is unlikely that you are going to use the SDT collection and httpclient for that table again.
Using Business Components instead of New - EndNew code blocks is better in order to have the KB ready to pass from Manual to Automatic Synchronization with less problems.
This best practice applies only for the Events Tables, because all the data that are going to be inserted via BC (in Procedure or WW) is the one that in Automatic Synchronization is going to be replicated on the server. So, this best practice can be taken in consideration if your application is going to convert to Automatic Synchronization at any time in the future.
Having this virtual division done will also help to be able to switch from one synchronization criteria back and forward. Remember that the data received from the server is usually the Master Tables and the ones added locally and sent to the server are the Event Tables.
This division is going to make your code more maintainable and is easier to see the flow of the information on your system.
To optimize the memory resources of the devices this is quite crucial. Using paging on the request of master Data can save lots of space on the local memory of the device's OS.
Note: This sample suposes that the variable based on HttpClient data type has already been initialized.
Data Provider object: with the total quantity of registers of the Product Table.
Product [NoOutput] Order ProductId
{
&Total = &Total + 1
}
SDTTotal
{
Total = &Total
}
Data Provider: which given a page and quantity returns a subset of registers.
SDTProduct [Count = &PageSize] [Skip = (&PageNumber - 1) * &PageSize]
{
ProductId
ProductName
ProductPrice = ProductPrice.ToString()
ProductStock
ProductImage = ProductImage.ImageURI
DepartmentId
}
Procedure: Code to Get the Products in pages.
&httpclient.Execute(!'GET', !'GetTotalProducts?fmt=json')
&SDTTotal.FromJson(&httpclient.ToString())
&TotalProducts = &SDTTotal.Total
&PageSize = 10
&TolalPages = (&TotalProducts / &PageSize)
If &TolalPages > &TolalPages.Truncate(0)
&TolalPages = &TolalPages.Truncate(0) + 1
Endif
For &PageId = 1 to &TolalPages.Truncate(0) step 1
&httpclient.Execute(!'GET', !'GetAllProducts?Pagenumber='+ &PageId.ToString().Trim() + '&Pagesize=' + &PageSize.ToString().Trim() + '&fmt=json')
&productslist.FromJson(&httpclient.ToString())
For &product in &productslist
new
ProductId = &product.ProductId
ProductName = &product.ProductName
ProductPrice = &product.ProductPrice.ToNumeric()
ProductStock = &product.ProductStock
DepartmentId = &product.DepartmentId
endnew
endfor
endfor
commit