Hello everyone,
I appreciate your help or suggestion with the following issue:
1. I have a gallery with thousand items which belong to many users. Each user can have multiple items. I select an item from gallery with combobox (distinct user)
2. Selected records go to Collection1 (on Combobox OnCheck):
Collect(Collection1,{SerialNr:ThisItem.SerialNr, Description:ThisItem.Descr, User:ThisItem.User, ID:ThisItem.ID});
3. After that I create a unique collection for every user ClearCollect(UserUnique,Distinct(Collection1, User));
My goal is to send separate emails with all items that were selected from a gallery to every unique user
For that,
On my SendEmail button OnSelect property I have this:
Set(_emailRecipientString,UserMail);
ClearCollect(myHTML,{htmlString:"<table>
<tr>
<th>Description</th>
<th>SerialNr</th>
</tr>"});
ForAll(UserUnique,
Collect(UniqueCollection,Filter(Collection1,User=Result));
ForAll(UniqueCollection,
Patch(
myHTML,
First(myHTML),
{htmlString: First(myHTML).htmlString&"
<tr>
<td>"&'SerialNr'&"<p></td>
<td>"&'Description'&"</td>
</tr>
<td><img src='https://barcode.tec-it.com/barcode.ashx?data="&'SerialNr'&"'width=100/></p></td>
<td>"&'Description'&"</td>"});
);
Office365Outlook.SendEmailV2(_emailRecipientString,Result(//This is the Subject of email with Unique User), First(myHTML).htmlString //(This is the body of email with my data patched for every unique user);
);
4. I also have this on my Combobox UnCheck
Remove(Collection1, First(Filter(Collection1, SerialNr=ThisItem.SerialNr)))
ClearCollect(myHTML,{htmlString:"<table>
<tr>
<th>SerialNr</th>
<th>Description</th>
</tr>"});
ForAll(
Collection1,
Remove(
myHTML,
First(myHTML),
{htmlString: First(myHTML).htmlString&"
<tr>
<td>"&'SerialNr'&"<p></td>
<td>"&'Description'&"</td>
</tr>"})
);
Patch(myHTML,First(myHTML),{htmlString: First(myHTML).htmlString&"
</table>"});
And finally my issue: when I select 2 and more unique users from my Combobox I recieve 2 separate emails, for the 1st user all is Ok, and for the 2d I also have the items selected for the 1st user. This means that my HTML collection for 1st user wasn't cleared before patching the items for 2d user
Can you please suggest how to correctly use Remove or RemoveIf as we can't use Clear inside ForAll?
I appreciate any help, especially from @mdevaney , as the html part of this code was taken from his Collections CookBook (Thank you so much for that post, Matthew, it was extremely helpful for me)
Thank you very much in advance)
Solved! Go to Solution.
Collections are great if you need an in-memory database with add/remove and edit capabilities. They are way overkill in your scenario, so put the cookbook down!
Also, you are trying to use the ForAll function as a ForLoop like in some development language - which PowerApps is NOT. ForAll is a function that returns a table of records based on your iteration table and record schema. It is more efficient to use the function as intended and will provide better performance.
As ForAll is a function, you cannot "execute" specific behavioral actions in the ForAll...so use it more like it was intended and you will have much better outcomes.
However - that said, in your case, since you are trying to send multiple emails - and the SendEmail function does not support providing a table to work on, then you will have to suffer the performance hit and utilize it backward. But, what you have in your email formula needs some help!
Now it is a little hard to tell some of the sources of your formula as they are all in those collections which are not explained (and mostly not needed).
You also have some Html tag issues in your original formula.
So, there are some assumptions in the following suggestions based on what is not known.
Please consider changing your Formula to the following:
ForAll(UserUnique As _userItem,
Office365Outlook.SendEmailV2(
_userItem.UserMail,
_userItem.Result, //This is the Subject of email with Unique User -assumed this was in your collection.
"<table>
<tr>
<th>Description</th>
<th>SerialNr</th>
</tr>" &
Concat(Filter(Collection1,User=_userItem.Result),
"<tr>
<td>" & 'SerialNr' & "</td>
<td>" & 'Description' & "</td>
</tr>
<tr>
<td><img src='https://barcode.tec-it.com/barcode.ashx?data=" & 'SerialNr' & "' width=100/></td>
<td>" & 'Description' & "</td>"
) &
"</table>"
)
)
What you were trying to do with collections is not really valid and certainly not needed, so proceed with the above (which will no doubt have errors or issues because there are too many other unknowns to your scenario) and see what the problems are that come from it and we can continue from that.
I hope this is helpful for you.
Collections are great if you need an in-memory database with add/remove and edit capabilities. They are way overkill in your scenario, so put the cookbook down!
Also, you are trying to use the ForAll function as a ForLoop like in some development language - which PowerApps is NOT. ForAll is a function that returns a table of records based on your iteration table and record schema. It is more efficient to use the function as intended and will provide better performance.
As ForAll is a function, you cannot "execute" specific behavioral actions in the ForAll...so use it more like it was intended and you will have much better outcomes.
However - that said, in your case, since you are trying to send multiple emails - and the SendEmail function does not support providing a table to work on, then you will have to suffer the performance hit and utilize it backward. But, what you have in your email formula needs some help!
Now it is a little hard to tell some of the sources of your formula as they are all in those collections which are not explained (and mostly not needed).
You also have some Html tag issues in your original formula.
So, there are some assumptions in the following suggestions based on what is not known.
Please consider changing your Formula to the following:
ForAll(UserUnique As _userItem,
Office365Outlook.SendEmailV2(
_userItem.UserMail,
_userItem.Result, //This is the Subject of email with Unique User -assumed this was in your collection.
"<table>
<tr>
<th>Description</th>
<th>SerialNr</th>
</tr>" &
Concat(Filter(Collection1,User=_userItem.Result),
"<tr>
<td>" & 'SerialNr' & "</td>
<td>" & 'Description' & "</td>
</tr>
<tr>
<td><img src='https://barcode.tec-it.com/barcode.ashx?data=" & 'SerialNr' & "' width=100/></td>
<td>" & 'Description' & "</td>"
) &
"</table>"
)
)
What you were trying to do with collections is not really valid and certainly not needed, so proceed with the above (which will no doubt have errors or issues because there are too many other unknowns to your scenario) and see what the problems are that come from it and we can continue from that.
I hope this is helpful for you.
Thank you very much for your reply
Let me try to apply this and come back to you with new questions!
Sounds good!
User | Count |
---|---|
254 | |
107 | |
92 | |
47 | |
37 |