Since templates are based on HTML you can use HTML coding to form the template as you want. Below you may find more information about tables and lists in HTML:
We can recommend you to setup a printable with the data from a detail and then send it with the help of a business process. The example of the implementation is described below:
You can implement you business task by the means of business process. The idea is to add read data elements, which would retrieve needed data from particular records. Afterwards, use “send email” business element to combine data into email and send it. You can add a button on the section, or action to trigger the process.
Please see the following article. You can use this example to select needed records and pass this info to business process to send email.
For example, I made this a while back to show a filtered list of products on an order; the HTML is very simple, as it was a demonstration, but that can easily be edited with CSS as necessary. You can see that 'arguments' is passed the record ID if you link the template to a record; the macro is then called by including [#@Invoke.UsrEmailProducts#] in your template.
namespace Terrasoft.Configuration{using System;using Terrasoft;using Terrasoft.Common;using Terrasoft.Core;using Terrasoft.Core.Entities;using Terrasoft.Core.DB;using Newtonsoft.Json;publicclass UsrEmailProducts : IMacrosInvokable
{public UserConnection UserConnection {
get;
set;}public string GetMacrosValue(object arguments){
var sjson = JsonConvert.SerializeObject(arguments);
var templ =new{Key = String.Empty, Value = String.Empty};
var args = JsonConvert.DeserializeAnonymousType(sjson, templ);
var orderId = args.Value;
var esq =new EntitySchemaQuery(UserConnection.EntitySchemaManager, "OrderProduct");
var colCode = esq.AddColumn("Product.Code");
var colDescription = esq.AddColumn("Product.Name");
var colQty = esq.AddColumn("Quantity");
var colSpecs = esq.AddColumn("UsrSpecifications");
var colColour = esq.AddColumn("UsrColour");
var OrderFilter = esq.CreateFilterWithParameters(
FilterComparisonType.Equal, "Order", orderId);
var ModifiedFilter = esq.CreateFilterWithParameters(
FilterComparisonType.Equal, "UsrModified", true);
esq.Filters.LogicalOperation= LogicalOperationStrict.And;
esq.Filters.Add(OrderFilter);
esq.Filters.Add(ModifiedFilter);
EntityCollection entities = esq.GetEntityCollection(UserConnection);
var html ="<table><tr><td>Code</td><td>Description</td><td>Quantity</td><td>Specifications</td><td>Colour</td></tr>";
foreach (Entity entity in entities){
html +="<tr>";
html +="<td>"+ entity.GetColumnValue(colCode.Name).ToString()+"</td>";
html +="<td>"+ entity.GetColumnValue(colDescription.Name).ToString()+"</td>";
html +="<td>"+ entity.GetColumnValue(colQty.Name).ToString()+"</td>";
html +="<td>"+ entity.GetColumnValue(colSpecs.Name).ToString()+"</td>";
html +="<td>"+ entity.GetColumnValue(colColour.Name).ToString()+"</td>";
html +="</tr>";}
html +="</table>";return html;}}}
Edit: All the </> should be proper lt/gt characters, that's just the forum software replacing them.
I'm working together with Luis Gonçalves, and we finally had some time to test your sugestion.
It is actually working perfectly, the table is created in the email in the context of the record ID and there isn't even any need to replace the "</>".
Thank you very much.
I've got one more question for you: this works fine if I start an email from the Case and the ID is passed perfectly.
But if I try to reply to an email that was sent by a costumer and the email is linked with that same Case. Then the conection does not work and the recordID is not retrieved. Any idea how I could make the conection between the macro and the case that is linked with the email that I'm replying to?
I'm afraid that's more of a back-end BPM thing; to the best of my knowledge, the 'arguments' argument ought to hold the current record, but as I'm not a BPM employee, I don't know what the mechanics behind it are. It may be that the 'current record' when you're replying to an email is the Activity object representing the email instead of the Case object, but that's just a guess. I don't know to what extent you're comfortable with the code, but have you tried temporarily returning the contents of the arguments variable (instead of the table) to see what's being passed in?
I have a detail on my edit page which displays the records coming from another object, this records contains some duplicate records. Now I want to group these duplicate records so that only one distinct record will show on the detail list. Is there a way that I can compose my own query lets say "select distinct(code) from product" and display the result as detail list. How can I achieve this?
1. Create a replacing client module for the detail. Or just click on "Detail setup" and then click on "Save". This way the system will create the module in the custom package automatically.
2. Override the getGridDataESQ method in the module. Please use the code below as an example.
Unfortunately, bpmonline has no functionality that you have requested, so you can display distinct records in the detail only via developing some custom functionality.
If you have further questions about implementing such functionality, please send a video where it`s clear that the detail isn`t working. Please note, that it`s necessary to demonstrate entire screen and devtools with opened network tab. Also, you should find the request to the server from this detail to make sure that it`s built in right way.
In addition, if you are unable to achieve the task you can contact your account manager to use the paid service and developer will help you to implement the desired detail.
Here, I currently working fine with any format is attached in a section. But I need to format validation example like only upload (.doc ) format. How to do this functionality?. Please guide me.
To achieve it you should check extension when the file uploads. Please note on the "FileDetailV2" client module, more specifically, on methods that are responsible for file uploading. The idea is to create replacing client module where additional upload logic can be put.
In that case you will face with client code debugging:
I need to edit organizational roles and show some additional fields in its page. can we do this by replacing object ? or what is the best approach and how can we do it?
Unfortunately as for now there is no possibility to change the org.role page with the help of out-of-the-box tools of the application and we do have a correspondent problem registered on our side.
As for now theoretically the only one way to change them is with the help of the replacing object, but we should warn you that it is risky to do, because roles like "All employees" and "System administrators" are used almost everywhere in the application and making some changes to them can lead to some new errors. Actually we don't recommend performing changes to this object, but if you want to try - please use dev-instance or local instance.
This error indicated that you are forbidden to insert into the object. This usually happens, when the user, whose login details you are using to connect does not have rights to write to the indicated object.
Please double check the rights for the object per user you are authenticating with.
If this won't help. please contact our support at support@bpmonline.com, since it's hard to say what's wrong with the request as we don't see the request body and the request headers. Please, use Fiddler as a proxy and send us a full text of the request from Fiddler. This way we will be able to find the cause of issue.
The business process cannot be triggered after the direct update in the database. That is done on purpose. You can create another process that would do the update for you, the updates made by the business process trigger other business processes. However, we do not recommend you to do this for large batches of records.
Thanks for your answer, but I don't need to create a query anymore since I am using already a detail, is there any property under it that can sort the list by column
I want to create a PAGE, this page can add record but instead of adding one record at a time I want its behavior like in adding product in order page (all products were listed already, you can enter multiple records and save).