469,339 Members | 8,437 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,339 developers. It's quick & easy.

Trouble combining arrays in a table

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).
Any help would be greatly appreciated!
Thanks
My code looks like so:
<!--THIS QUERIES A LIST OF ACCOUNTS LABELED AS 'A LIST'--!>
var queryResult = sforceClient.query("Select ID, Name,
Prospect_Status__c, SystemModstamp, Portfolio_Rank__c From Account
where Prospect_Status__c = 'A List' and OwnerID = '{!User_ID}'");
var accountIdCriteria = "Where ";
for (var i=0;i<queryResult.records.length;i++) {accountIdCriteria +=
"AccountId = '" + queryResult.records[i].get("Id") + "'";
if (i < queryResult.records.length - 1) {accountIdCriteria += " or "};

}
<!--THIS QUERIES THE CONTACT TABLE FOR CONTACTS RELATED TO THE RETURNED

ACCOUNTS--!>
var contactQuery = sforceClient.query("Select Id, FirstName, LastName,
AccountId From Contact " + accountIdCriteria);

var contactIdCriteria = "Where ";
var contactsById = [];
for (var i=0; i<contactQuery.records.length;i++) {
contactIdCriteria += "(ContactId = '" +
contactQuery.records[i].get("Id") + "'" + " and IsPrimary = true)";
if (i < contactQuery.records.length - 1) {
contactIdCriteria += " or "};
contactsById[contactQuery.records[i].get("Id")] =
contactQuery.records[i];

}
<!-- THIS QUERIES THE PRIMARY CONTACTS FROM THE ACCOUNTCONTACTROLE
TABLE--!>
var roleQuery = sforceClient.query("Select ContactId from
AccountContactRole " + contactIdCriteria);

for (var i=0;i<roleQuery.records.length;i++) {
var roleRecord = roleQuery.records[i];
var primaryContactByAccountId = [];
var contactRecord = contactsById[roleRecord.get("ContactId")];
if (contactRecord) {
primaryContactByAccountId[contactRecord.get("AccountId")] =
contactRecord;

}
}
var output = "<table class='sortable' id='table1'>";
output += "<tr>";
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 = "";
lastRow = primaryContact.get("LastName");
output += "<tr>";
output += "<td><a href='/"+Account.get("Id")+"' target='NEW'>" +
Account.get("Name") + "</a></td>";
output += "<td>" + Account.get("Portfolio_Rank__c") + "</td>";
output += "<td>" + Account.get("SystemModstamp") + "</td>";
output += "<tdNEED TO PUT PRIMARY CONTACTS HERE </td>";
output += "</tr>";

}
output += "</table>";
document.getElementById("ResultsHolder").innerHTML = output;

Jul 27 '06 #1
1 1779
fe************@gmail.com wrote:
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. :-)

[...]
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>')

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");
lastRow = primaryContact.get("LastName");
output += "<tr>";
[...]
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

Jul 28 '06 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by sekdab | last post: by
1 post views Thread by Mr. Jingles | last post: by
3 posts views Thread by loisk | last post: by
6 posts views Thread by tshad | last post: by
8 posts views Thread by rodeored | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by Purva khokhar | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.