I have googled and searched the forms for days for an answer, but have been unsucessful.
Since the only thread I found is a year old, I wanted to start a new one instead of bumping the old one
Ref : http://forums.adobe.com/message/3000436
I am looking for a script to sort the data in a form based on user input.
The form is just a table with multiple rows and 3-5 colums (depending on the dept it is used by)
Using the above referenced thread, I was able to get static table to sort, but i need to have all fields be text fields and the users inputs the data.
The example from the other thread of the static:
I will use the same layout, just need it to be a form instead of static.
If anyone can help, or point me in the right direction, that would be great.
Update #1:
I did locate this page:http://cookbooks.adobe.com/post_Sorting_tables_in_dynamic_PDF-18993.html
I got the sort to work and it appears to be mostly what I am looking for, but how do i deal with blank field??
Example, the last three rows are blank ( no data) the sort fails.
Here is the code from the page, how can i modify it to correct for the blank fields?
------------------------------------------------
var col = 0; // column index
var num = false; // Is numeric column
var OrderAsc = true; // Order of sorting
function SortTable(tableRef,colIndex,isNumeric,Asc)
{
try
{
col = colIndex;
num = isNumeric;
OrderAsc = Asc;
// String variable containing the form data as XML String
var data = tableRef.saveXML('pretty');
// An XML variable contains the deserialized XML data
var xmlData = xfa.datasets.createNode("dataGroup",tableRef.name);
xmlData.loadXML(data);
// Number of table rows
var rowsCount = xmlData.nodes.length;
//Number of columns in the table
var cols = xmlData.nodes.item(1).nodes.length;
// A two dimensional array contains complete table data
var master = new Array();
// Fill the array with XML data
for(var i=1;i<rowsCount;i++)
{
master[i-1] = new Array();
for(var j=0;j<cols;j++)
{
master[i-1][j] = xmlData.nodes.item(i).nodes.item(j).value;
}
}
//Sort the 2D array
master.sort(sortFunc);
// Re-fill the XML variable with Array data
for(var i=0;i<master.length;i++)
{
for(var j=0;j<master[i].length;j++)
{
xmlData.nodes.item(i+1).nodes.item(j).value = master[i][j];
}
}
// Modify the table data and remerge the form
var result = xmlData.saveXML('pretty');
tableRef.loadXML(result,1,1);
xfa.form.remerge();
}catch(e)
{
app.alert(e)
}
}
// Customize the sort function to handle 2D array and Numeric columns
function sortFunc(a,b)
{
var x = a[col];
var y = b[col];
try
{
if(num)
{
x = parseInt(a[col]);
y = parseInt(b[col]);
}
}catch(e){}
if(OrderAsc)
{
return x==y?0: (x < y ? -1 :1)
}
else
{
return x==y?0: (x < y ? 1 :-1)
}
}
Solved! Go to Solution.
Views
Replies
Total Likes
Solution Found!
Views
Replies
Total Likes
Hello,
Right now, i can give you an approach rather than providng you a techincal solution to the problem.
There are different ways of running java scripts on the forms.
1.Writing a utility in the form and calling those functions where ever and when ever in need.
2.javascript running behing each form /feild element.
3.a Javascript file, located in windows - programfile - adobe- reader8.0 - javascripts - "" .JS "" file
Regarding your problem,
We can only sort ponly after all the 3 columns are filled for each row.
If no row exits then no function to be called.
if row count>1 then
do bubble sort on the both the rows, putting them in an array. ( Dynamic array)
the array need to be sorted with the "column" selected.
then ,
refill the form elements.
Views
Replies
Total Likes
I am still looking for a solution to this issue.
I have exhaused all my resources to get this working.
Can anyone help me with a script?
Views
Replies
Total Likes
I am suprized no one has a solution to this issue or it has never come up before now.
Views
Replies
Total Likes
Solution Found!
Views
Replies
Total Likes
Would it be possible for you to post the solution you found?
Thanks
Mark
Views
Replies
Total Likes
The fix was to modify the code from:
master[i-1][j] = xmlData.nodes.item(i).nodes.item(j).value;
the new lines is
master[i-1][j] = (xmlData.nodes.item(i).nodes.item(j).value == null) ? "" : xmlData.nodes.item(i).nodes.item(j).value;
This allows for null (empty) fields, allowing the sort to work correctly
------ Full Code Below -------
var col = 0; // column index
var num = false; // Is numeric column
var OrderAsc = true; // Order of sorting
function SortTable(tableRef,colIndex,isNumeric,Asc)
{
try
{
col = colIndex;
num = isNumeric;
OrderAsc = Asc;
// String variable containing the form data as XML String
var data = tableRef.saveXML('pretty');
// An XML variable contains the deserialized XML data
var xmlData = xfa.datasets.createNode("dataGroup",tableRef.name);
xmlData.loadXML(data);
// Number of table rows
var rowsCount = xmlData.nodes.length;
//Number of columns in the table
var cols = xmlData.nodes.item(1).nodes.length;
// A two dimensional array contains complete table data
var master = new Array();
// Fill the array with XML data
for(var i=1;i<rowsCount;i++)
{
master[i-1] = new Array();
for(var j=0;j<cols;j++)
{
master[i-1][j] = (xmlData.nodes.item(i).nodes.item(j).value == null) ? "" : xmlData.nodes.item(i).nodes.item(j).value;
}
}
//Sort the 2D array
master.sort(sortFunc);
// Re-fill the XML variable with Array data
for(var i=0;i<master.length;i++)
{
for(var j=0;j<master[i].length;j++)
{
xmlData.nodes.item(i+1).nodes.item(j).value = master[i][j];
}
}
// Modify the table data and remerge the form
var result = xmlData.saveXML('pretty');
tableRef.loadXML(result,1,1);
xfa.form.remerge();
}catch(e)
{
app.alert(e)
}
}
// Customize the sort function to handle 2D array and Numeric columns
function sortFunc(a,b)
{
var x = a[col];
var y = b[col];
try
{
if(num)
{
x = parseInt(a[col]);
y = parseInt(b[col]);
}
}catch(e){}
if(OrderAsc)
{
return x==y?0: (x < y ? -1 :1)
}
else
{
return x==y?0: (x < y ? 1 :-1)
}
}
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies