Skip to main content

I am trying to concatenate id’s from one model into another model. On my account Id, I select a list of accounts, No I want to add the id’s of selected accounts onto a field in another model.

Just to make sure that I understand - you want to select accounts from a list then combine the list of Ids into a single field? 


Yes, I want the account ids  into a single field


Here’s one example of how to do it with mass select, adopting rows, and some row actions


<skuidpage unsavedchangeswarning="yes" personalizationmode="server" showsidebar="false" useviewportmeta="true" showheader="false">
<models>
<model id="Accounts" limit="20" query="true" createrowifnonefound="false" datasource="salesforce" sobject="Account">
<fields>
<field id="Id"/>
<field id="Name"/>
</fields>
<conditions/>
<actions/>
</model>
<model id="Accounts_Adopt" limit="20" query="false" createrowifnonefound="false" datasource="salesforce" sobject="Account">
<fields>
<field id="Id"/>
<field id="Name"/>
<field id="index" uionly="true" displaytype="FORMULA" label="index" ogdisplaytype="TEXT" readonly="true" returntype="DOUBLE" precision="9" scale="0">
<formula>{{index}}</formula>
</field>
<field uionly="true" displaytype="DOUBLE" id="currval" label="currval" ogdisplaytype="TEXT" precision="9" scale="0" defaultvaluetype="fieldvalue" defaultValue="0"/>
<field id="nextval" uionly="true" displaytype="FORMULA" label="nextval" ogdisplaytype="TEXT" readonly="true" returntype="DOUBLE" precision="9" scale="0">
<formula>{{currval}}+1</formula>
</field>
</fields>
<conditions/>
<actions>
<action>
<actions>
<action type="branch" whenfinished="stop">
<formula>{{index}}=={{currval}}</formula>
<iftrueactions>
<action type="updateRow" fieldmodel="Concat" affectedrows="context" field="Concat" enclosevalueinquotes="true" value="{{$Model.Concat.data.0.Concat}}{{Id}},"/>
<action type="abandonRows" model="Accounts_Adopt" affectedrows="context"/>
<action type="updateRow" model="Accounts" appendorprepend="prepend" defaultmodefornewitems="edit" affectedrows="all" fieldmodel="Accounts_Adopt" field="currval" enclosevalueinquotes="false" value="{{$Model.Accounts_Adopt.data.0.nextval}}"/>
</iftrueactions>
</action>
</actions>
<events>
<event>row.updated</event>
</events>
<fields>
<field>currval</field>
</fields>
</action>
</actions>
</model>
<model id="Concat" limit="20" query="true" createrowifnonefound="true" datasource="Ui-Only" processonclient="true">
<fields>
<field id="Concat" displaytype="TEXT" label="Concat"/>
</fields>
<conditions/>
<actions/>
</model>
</models>
<components>
<grid uniqueid="sk-1RBR-1706">
<divisions>
<division behavior="flex" minwidth="100px" ratio="1">
<components>
<skootable showconditions="true" showsavecancel="true" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="Accounts" buttonposition="" mode="read" allowcolumnreordering="true" responsive="true" uniqueid="sk-1R8C-408" heading="Accounts">
<fields>
<field id="Id" uniqueid="fi-1R8C-409"/>
<field id="Name" uniqueid="fi-1R8C-410"/>
</fields>
<rowactions>
<action type="edit"/>
<action type="delete"/>
</rowactions>
<massactions usefirstitemasdefault="true">
<action type="multi" label="Concat" icon="sk-icon-magic">
<actions>
<action type="custom" snippet="newSnippet"/>
<action type="adoptRows" sourcemodel="Accounts" targetmodel="Accounts_Adopt" affectedrows="context"/>
<action type="updateRow" fieldmodel="Accounts_Adopt" affectedrows="all" field="currval" enclosevalueinquotes="false" value="1"/>
</actions>
</action>
</massactions>
<views>
<view type="standard"/>
</views>
<actions defaultlabel="Global Actions" defaulticon="sk-icon-magic" usefirstitemasdefault="true"/>
</skootable>
</components>
</division>
<division behavior="flex" verticalalign="top" minwidth="100px" ratio="1">
<components>
<skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="false" model="Accounts_Adopt" buttonposition="" mode="readonly" allowcolumnreordering="true" responsive="true" uniqueid="sk-1RBT-1767" heading="Accounts Adopt">
<fields>
<field id="Id" uniqueid="fi-1RBT-1768"/>
<field id="Name" uniqueid="fi-1RBT-1769"/>
<field id="index" uniqueid="fi-1RBT-1770"/>
<field id="currval" hideable="true" uniqueid="fi-1RCt-2319"/>
<field id="nextval" hideable="true" uniqueid="fi-1RCu-2328"/>
</fields>
<rowactions/>
<massactions usefirstitemasdefault="true"/>
<views>
<view type="standard"/>
</views>
</skootable>
</components>
</division>
</divisions>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</grid>
<skootable showconditions="true" showsavecancel="true" showerrorsinline="true" searchmethod="client" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="Concat" buttonposition="" mode="edit" allowcolumnreordering="true" responsive="true" uniqueid="sk-1R8S-559" heading="Concatenate">
<fields>
<field id="Concat" uniqueid="fi-1R8S-560"/>
</fields>
<rowactions>
<action type="edit"/>
<action type="delete"/>
</rowactions>
<massactions usefirstitemasdefault="true">
<action type="massupdate"/>
<action type="massdelete"/>
</massactions>
<views>
<view type="standard"/>
</views>
</skootable>
</components>
<resources>
<labels/>
<javascript>
<jsitem location="inlinesnippet" name="newSnippet" cachelocation="false">var params = argumentst0],
$ = skuid.$;
console.log(params);</jsitem>
</javascript>
<css/>
<actionsequences uniqueid="sk-3N03-382">
<actionsequence id="d5becc77-bad2-4efa-beb5-7924c60b3c26" label="OppsQuery" type="reusable" uniqueid="sk-1R88-357">
<description/>
<actions>
<action type="blockUI"/>
<action type="requeryModel" model="Opps" behavior="loadmore"/>
<action type="unblockUI"/>
</actions>
</actionsequence>
<actionsequence id="5cd052c7-9b17-4ef0-b17c-fe3761ba4adc" label="New Sequence" type="reusable" uniqueid="sk-1R88-358">
<description/>
<actions/>
</actionsequence>
</actionsequences>
</resources>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</skuidpage>

Jaiti,


You can get all of the Id’s from a model using merge syntax. Note that I have included a comma next to the {{Id}}


{{#$Model.Accounts.data}}{{Id}},{{/$Model.Accounts.data}}


Here is an example page that uses this merge syntax along with a Formula field to remove the last comma from the merge ‘output’. Click the button ‘Get Ids’ to see this work.


<skuidpage unsavedchangeswarning="yes" personalizationmode="server" showsidebar="false" useviewportmeta="true" showheader="false">
<models>
<model id="Accounts" limit="20" query="true" createrowifnonefound="false" datasource="salesforce" sobject="Account">
<fields>
<field id="Id"/>
<field id="Name"/>
</fields>
<conditions/>
<actions/>
</model>
<model id="UIOnly" limit="20" query="true" createrowifnonefound="true" datasource="Ui-Only" processonclient="true">
<fields>
<field id="CleanIds" displaytype="FORMULA" label="CleanIds" ogdisplaytype="TEXT" readonly="true" returntype="TEXT">
<formula>LEFT({{FromActionIds}},(LEN({{FromActionIds}}) - 1))</formula>
</field>
<field id="FromActionIds" displaytype="TEXT" label="FromActionIds" length="5000"/>
</fields>
<conditions/>
<actions/>
</model>

</models>
<components>
<grid uniqueid="sk-1RBR-1706" columngutter="4px">
<divisions>
<division behavior="specified" verticalalign="top" width="50vw">
<components>
<buttonset model="Accounts" uniqueid="sk-1VFk-554" position="left">
<buttons>
<button type="multi" label="Get Ids" uniqueid="sk-1VGJ-939">
<actions>
<action type="updateRow" fieldmodel="UIOnly" affectedrows="context" field="FromActionIds" enclosevalueinquotes="true" value="{{#$Model.Accounts.data}}{{Id}},{{/$Model.Accounts.data}}"/>
</actions>
</button>
</buttons>
</buttonset>
<basicfieldeditor showheader="true" showsavecancel="false" showerrorsinline="true" model="UIOnly" uniqueid="sk-1VGE-903" mode="edit" layout="above">
<columns layoutmode="fixed">
<column uniqueid="sk-1VGE-899" width="100%">
<sections>
<section title="Section A" uniqueid="sk-1VGE-900">
<fields>
<field uniqueid="sk-1VGE-905" id="FromActionIds"/>
</fields>
</section>
<section title="Section B" uniqueid="sk-1VGE-902">
<fields>
<field uniqueid="sk-1VGE-904" id="CleanIds"/>
</fields>
</section>
</sections>
</column>
</columns>
</basicfieldeditor>

</components>
</division>
<division behavior="flex" verticalalign="top" minwidth="100px" ratio="1">
<components>
<skootable showconditions="true" showsavecancel="true" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="Accounts" buttonposition="" mode="read" allowcolumnreordering="true" responsive="true" uniqueid="sk-1R8C-408" heading="Accounts">
<fields>
<field id="Id" uniqueid="fi-1R8C-409"/>
<field id="Name" uniqueid="fi-1R8C-410"/>
</fields>
<rowactions>
<action type="edit"/>
<action type="delete"/>
</rowactions>
<massactions usefirstitemasdefault="true">
<action type="multi" label="Concat" icon="sk-icon-magic">
<actions>
<action type="custom" snippet="newSnippet"/>
<action type="adoptRows" sourcemodel="Accounts" targetmodel="Accounts_Adopt" affectedrows="context"/>
<action type="updateRow" fieldmodel="Accounts_Adopt" affectedrows="all" field="currval" enclosevalueinquotes="false" value="1"/>
</actions>
</action>
</massactions>
<views>
<view type="standard"/>
</views>
<actions defaultlabel="Global Actions" defaulticon="sk-icon-magic" usefirstitemasdefault="true"/>
</skootable>

</components>
</division>
</divisions>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</grid>

</components>
<resources>
<labels/>
<javascript>

</javascript>
<css/>
<actionsequences uniqueid="sk-3N03-382">
<actionsequence id="d5becc77-bad2-4efa-beb5-7924c60b3c26" label="OppsQuery" type="reusable" uniqueid="sk-1R88-357">
<description/>
<actions>
<action type="blockUI"/>
<action type="requeryModel" model="Opps" behavior="loadmore"/>
<action type="unblockUI"/>
</actions>
</actionsequence>
<actionsequence id="5cd052c7-9b17-4ef0-b17c-fe3761ba4adc" label="New Sequence" type="reusable" uniqueid="sk-1R88-358">
<description/>
<actions/>
</actionsequence>
</actionsequences>
</resources>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</skuidpage>

Thanks,


Bill


Matt,

Nice use of the action framework!

Thanks,

Bill


Hi Bill,
I used your code provided above to concatenate the Ids. It worked to concatenate all the account ids but now trying to generate a list of accounts from the ids. 

It displays the if there is only one id but when trying to create a list from the concatenated list of ids it is throwing an error:

1. An error occurred while attempting to perform the following SOQL query: SELECT RecordTypeId,Name,Id FROM Account WHERE (Id in (‘001V000000av0p8IAA,001V000000aSsaBIA’)) Error:invalid ID field: 001V000000av0p8IAA,001V000000aSsaBIA












thanks, will try


Thanks Bill 


As Jaiti said, we are trying to generate a list of accounts in a model based on the concatenated text string. Here is a picture of the error and the field.


Josef/Jaiti,


To use that string of Account Ids as the ‘in’ condition on a model, you will have to add single quotes around each of the commas. The string would have to look like this:


001V000000av0p8IAA’,'001V000000aSsaBIA


Then, when it goes into the ‘in’ condition, it will look like this:


SELECT RecordTypeId,Name,Id FROM Account WHERE (Id in (‘001V000000av0p8IAA’,‘001V000000aSsaBIA’))


If you have a model on your page with Account Ids in it (i.e. a list of Opportunities), why couldn’t you create a model on Account with a condition on Id where the value is ‘in’ the Opportunity model AccountId field?



Thanks,


Bill


Hey Bill,


That was my thought as well, however, Skuid is inserting a backslash long with the ’ symbol. See pic.


And to answer your question about storing Ids in a model. I am unable to do that because I am trying to create a relationship of many accounts to one campaign via a text field. Doing so will allow me to send a campaign link to a user and allow that user to view the accounts I’ve associated to said campaign.



Josef,


I ran into this before. You have to use JavaScript to set the condition. Here is what the code looks like:


var params = arguments[0],
$ = skuid.$;
var uiModel = skuid.$M('UIOnly');
var ids = uiModel.getFirstRow().CleanIds;
console.log(ids);
var loadModel = skuid.model.getModel('AccountsLoadFromString');
var condition = loadModel.getConditionByName('Id');

//assumes ids is a comma separated list of ids
var arrayids = ids.split(',');
console.log(arrayids);
loadModel.setCondition(condition, arrayids);
$.when(loadModel.load()).then(function(){
//do something after model loads
console.log('model loaded');
});
Here is a sample page that demonstrates this:
















LEFT({{FromActionIds}},(LEN({{FromActionIds}}) - 1))


































































































































var params = arguments[0],
$ = skuid.$;
var uiModel = skuid.$M('UIOnly');
var ids = uiModel.getFirstRow().CleanIds;
console.log(ids);
var loadModel = skuid.model.getModel('AccountsLoadFromString');
var condition = loadModel.getConditionByName('Id');

//assumes ids is a comma separated list of ids
var arrayids = ids.split(',');
console.log(arrayids);
loadModel.setCondition(condition, arrayids);
$.when(loadModel.load()).then(function(){
//do something after model loads
console.log('model loaded');
});





















```

Thanks,

Bill

It sounds like we’re trying to use the mass selection to set a model condition. If the goal is to filter a model based on a selected list, I would recommend just using a model condition based on a field in another model alongside adopting rows. Here’s an example


<skuidpage unsavedchangeswarning="yes" personalizationmode="server" showsidebar="true" useviewportmeta="true" showheader="true">
<models>
<model id="Accounts" limit="20" query="true" createrowifnonefound="false" datasource="salesforce" sobject="Account">
<fields>
<field id="Id"/>
<field id="Name"/>
<field id="Industry"/>
</fields>
<conditions/>
<actions/>
</model>
<model id="SelectedAccounts" limit="20" query="false" createrowifnonefound="false" datasource="salesforce" sobject="Account">
<fields>
<field id="Id"/>
<field id="Name"/>
<field id="Industry"/>
</fields>
<conditions/>
<actions/>
</model>
<model id="Opportunities" limit="20" query="false" createrowifnonefound="false" datasource="salesforce" sobject="Opportunity">
<fields>
<field id="Id"/>
<field id="AccountId"/>
<field id="Account.Name"/>
<field id="Name"/>
</fields>
<conditions>
<condition type="modelmerge" value="" field="AccountId" fieldtargetobjects="Account" operator="in" model="SelectedAccounts" enclosevalueinquotes="true" mergefield="Id" novaluebehavior="deactivate"/>
</conditions>
<actions/>
</model>
</models>
<components>
<grid uniqueid="sk-1w8S-438">
<divisions>
<division behavior="flex" minwidth="100px" ratio="1" verticalalign="top">
<components>
<skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="Accounts" buttonposition="" mode="read" allowcolumnreordering="true" responsive="true" uniqueid="sk-1w8Z-495" heading="Accounts">
<fields>
<field id="Id" uniqueid="fi-1w8Z-496"/>
<field id="Name" uniqueid="fi-1w8Z-497"/>
<field id="Industry" uniqueid="fi-1w8Z-498"/>
</fields>
<rowactions/>
<massactions usefirstitemasdefault="true">
<action type="multi" label="Find Opportunities for Selected Accounts" icon="sk-icon-magic">
<actions>
<action type="adoptRows" sourcemodel="Accounts" targetmodel="SelectedAccounts" affectedrows="context"/>
<action type="requeryModel" model="Opportunities" behavior="standard"/>
</actions>
</action>
</massactions>
<views>
<view type="standard"/>
</views>
</skootable>
</components>
</division>
<division behavior="flex" verticalalign="top" minwidth="100px" ratio="1">
<components>
<skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="SelectedAccounts" buttonposition="" mode="read" allowcolumnreordering="true" responsive="true" uniqueid="sk-1w8d-595" heading="Selected Accounts">
<fields>
<field id="Id" uniqueid="fi-1w8d-596"/>
<field id="Name" uniqueid="fi-1w8d-597"/>
<field id="Industry" uniqueid="fi-1w8d-598"/>
</fields>
<rowactions/>
<massactions usefirstitemasdefault="true"/>
<views>
<view type="standard"/>
</views>
</skootable>
</components>
</division>
</divisions>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</grid>
<grid uniqueid="sk-1w8m-810">
<divisions>
<division behavior="flex" minwidth="100px" ratio="1">
<components>
<skootable showconditions="true" showsavecancel="false" showerrorsinline="true" searchmethod="server" searchbox="true" showexportbuttons="false" hideheader="false" hidefooter="false" pagesize="10" alwaysresetpagination="false" createrecords="true" model="Opportunities" buttonposition="" mode="read" allowcolumnreordering="true" responsive="true" uniqueid="sk-1w8g-692" heading="Opportunities in Selected Account">
<fields>
<field id="Id" uniqueid="fi-1w8g-693"/>
<field id="AccountId" uniqueid="fi-1w8g-694"/>
<field id="Account.Name" uniqueid="fi-1w8g-695"/>
<field id="Name" uniqueid="fi-1w8g-696"/>
</fields>
<rowactions/>
<massactions usefirstitemasdefault="true"/>
<views>
<view type="standard"/>
</views>
</skootable>
</components>
</division>
</divisions>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</grid>
</components>
<resources>
<labels/>
<javascript/>
<css/>
<actionsequences uniqueid="sk-1w7z-232"/>
</resources>
<styles>
<styleitem type="background" bgtype="none"/>
</styles>
</skuidpage>