ferraro.joseph@gmail.com wrote:
Quote:
Hi,
>
I'm querying Salesforce.com via their AJAX toolkit and outputting query
>
results into a table. Currently, their toolkit does not possess the
ability to do table joins via their structured query language, which
forces me to do the join manually via arrays.
>
>
Right now, I'm having trouble getting these query results (which are in
>
arrays) to combine effectively (mainly towards the end where I'm
outputting into the tables).
You should post an example of the objects that are being returned, then
someone might show you how to combine the arrays in the objects to
create a table. I am not going to try to reverse-engineer the objects
from your usage. :-)
[...]
Quote:
var output = "<table class='sortable' id='table1'>";
output += "<tr>";
Using the += compound operator to concatenate strings is notoriously
slow in some browsers, you are probably better to use an Array and join
it:
var output = ['<table class="sortable" id="table1">'];
output.push('<tr>')
Quote:
output += "<th>Account</th>";
output += "<th>Portfolio</th>";
output += "<th>Last Activity</th>";
output += "<th>Primary Contact</th>";
output += "</tr>";
>
for (var i=0; i < queryResult.records.length; i++)
{
var Account = queryResult.records[i];
var primaryContact = primaryContactByAccountId[Account.get("Id")];
var lastRow = "";
There is no need to declare the variables on every loop (it doesn't
hurt, it's just pointless). Declare them once just before the loop,
then just set their value inside. If there are many rows, it will be
faster to get the length of queryResult.records just once - and set
lastRow once per loop, not twice (lastRow does not seem to be used
anywhere - should it be?):
var Account, primaryContact, lastRow;
var j = queryResult.records.length;
for (var i=0; i < j; i++) {
Account = queryResult.records[i];
primaryContact = primaryContactByAccountId[Account.get("Id")];
lastRow = primaryContact.get("LastName");
Quote:
lastRow = primaryContact.get("LastName");
output += "<tr>";
[...]
Quote:
document.getElementById("ResultsHolder").innerHTML = output;
... = output.join('');
What does output look like when you get to here, does it appear to be
valid HTML?
In most browsers, inserting a table using DOM will be just as fast,
much more reliable, standards compliant and less code than your use of
innerHTML. e.g.
var table, thead, row, cell, cellText;
table = document.createElement('table');
table.className = 'sortable';
table.id = 'table1'
thead = table.createTHead();
row = thead.insertRow(-1);
for ( colTitle in {'Account':'', 'Portfolio':'',
'Last Activity':'','Primary Contact':''}){
cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(colTitle) );
}
var account, primaryContact, lastRow, alink;
var j = queryResult.records.length;
for (var i=0; i<j; i++){
account = queryResult.records[i];
primaryContact =
primaryContactByAccountId[account.get("Id")];
lastRow = primaryContact.get("LastName");
row = table.insertRow(-1);
cell = row.insertCell(-1);
alink = document.createElement('a');
alink.href = '/' + Account.get("Id");
alink.target = 'NEW';
alink.appendChild(document.createTextNode(accountN ame.get('Name'));
cell.appendChild(alink);
for (cellText in { Account.get("Portfolio_Rank__c"):'',
Account.get("SystemModstamp"):'',
"PUT PRIMARY CONTACTS HERE":''} ){
cell = row.insertCell(-1);
cell.appendChild(document.createTextNode(cellText) );
}
document.getElementById("ResultsHolder").appendChi ld(table);
Untested of course, but you should get the idea.
--
Rob