Trouble combining arrays in a table

F

ferraro.joseph

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.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.get("Id") + "'" + " and IsPrimary = true)";
if (i < contactQuery.records.length - 1) {
contactIdCriteria += " or "};
contactsById[contactQuery.records.get("Id")] =
contactQuery.records;



}


<!-- 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;
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;
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 += "<td> NEED TO PUT PRIMARY CONTACTS HERE </td>";
output += "</tr>";



}


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

RobG

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 += "<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;
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;
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;
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(accountName.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").appendChild(table);


Untested of course, but you should get the idea.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top