X++ code to create a customized lookup on form
Override the lookup method on Formdatasource field(on which you want to show lookup) , and copy the following code to your method.
Comment the super() method in the lookup.
public void lookup(FormControl _formControl, str _filterStr)
{
SysTableLookup sysTableLookup; // systemclass to create //customlookup
Query query;
QueryBuildDataSource qbd;
;
sysTableLookup = SysTableLookup::newParameters(tablenum(InventTable),_formcontrol);
// Construct query on the table,
// whose records you want to show as lookup.
query = new Query();
qbd = query.addDataSource(tablenum(InventTable));
qbd.addRange(fieldnum(InventTable,ItemType)).value(SysQuery::value(enum2str
(ItemType::Item)));
// add the fields to the lookup list
sysTableLookup.addLookupfield(fieldnum(InventTable,ItemId));
sysTableLookup.addLookupfield(fieldnum(InventTable,ItemName));
// pass the query as parameter
// system will show the records in the lookup
// as per your query
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
public void lookup(FormControl _formControl, str _filterStr)
{
SysTableLookup sysTableLookup; // systemclass to create //customlookup
Query query;
QueryBuildDataSource qbd;
;
sysTableLookup = SysTableLookup::newParameters(tablenum(InventTable),_formcontrol);
// Construct query on the table,
// whose records you want to show as lookup.
query = new Query();
qbd = query.addDataSource(tablenum(InventTable));
qbd.addRange(fieldnum(InventTable,ItemType)).value(SysQuery::value(enum2str
(ItemType::Item)));
// add the fields to the lookup list
sysTableLookup.addLookupfield(fieldnum(InventTable,ItemId));
sysTableLookup.addLookupfield(fieldnum(InventTable,ItemName));
// pass the query as parameter
// system will show the records in the lookup
// as per your query
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
}
Building Lookups - Using a form for lookup building
In numerous situations, standard, automatic, or even dynamic runtime lookups cannot display the required data. For example, it might be a lookup with tab pages or a search field. In such cases, Dynamics AX offers the possibility to create an AOT form and use it as lookup.
In this recipe, we will demonstrate how to create a lookup using an AOT form. As an example, we will modify the standard customer account lookup to display only active customers.
How to do it...
-
-
2. Change the form's following design properties:
Property Value
Frame Border
WindowType Popup
-
-
4. Add a new StringEdit control to the grid:
Property Value
Name AccountNum
DataSource CustTable
DataField AccountNum
AutoDeclaration Yes
-
5. Add another StringEdit control to the grid, right after AccountNum:
Property Value
Name Name
DataSource CustTable
DataField Name
-
6. Add one more StringEdit control to the grid, right after Name:
Property Value
Name Phone
DataSource CustTable
DataField Phone
-
-
-
9. Override the form's run() with the following code:
public void run()
{
FormStringControl callingControl;
boolean filterLookup;
;
callingControl = SysTableLookup::getCallerStringControl(
element.args());
filterLookup = SysTableLookup::filterLookupPreRun(
callingControl,
AccountNum,
CustTable_ds);
super();
SysTableLookup::filterLookupPostRun(
filterLookup,
callingControl.text(),
AccountNum,
CustTable_ds);
}
-
10. Finally, override init() of the CustTable data source with the following code:
public void init()
{
Query query;
QueryBuildDataSource qbds;
QueryBuildRange qbr;
;
query = new Query();
qbds = query.addDataSource(tablenum(CustTable));
qbr = qbds.addRange(fieldnum(CustTable, Blocked));
qbr.value(queryvalue(CustVendorBlocked::No));
this.query(query);
}
-
- 2. Change the form's following design properties:
Property Value Frame Border WindowType Popup
- 4. Add a new StringEdit control to the grid:
Property Value Name AccountNum DataSource CustTable DataField AccountNum AutoDeclaration Yes
- 5. Add another StringEdit control to the grid, right after AccountNum:
Property Value Name Name DataSource CustTable DataField Name
- 6. Add one more StringEdit control to the grid, right after Name:
Property Value Name Phone DataSource CustTable DataField Phone
- 9. Override the form's run() with the following code:
public void run() { FormStringControl callingControl; boolean filterLookup; ; callingControl = SysTableLookup::getCallerStringControl( element.args()); filterLookup = SysTableLookup::filterLookupPreRun( callingControl, AccountNum, CustTable_ds); super(); SysTableLookup::filterLookupPostRun( filterLookup, callingControl.text(), AccountNum, CustTable_ds); }
- 10. Finally, override init() of the CustTable data source with the following code:
public void init() { Query query; QueryBuildDataSource qbds; QueryBuildRange qbr; ; query = new Query(); qbds = query.addDataSource(tablenum(CustTable)); qbr = qbds.addRange(fieldnum(CustTable, Blocked)); qbr.value(queryvalue(CustVendorBlocked::No)); this.query(query); }
-
12. Locate the extended data type CustAccount in AOT, and change its property:
Property Value
FormHelp CustLookup
- 12. Locate the extended data type CustAccount in AOT, and change its property:
Property Value FormHelp CustLookup
The newly created CurrencyLookup form will replace the automatically generated customer account lookup. It is recommended to append text Lookup to the end of the form name, so that lookups can be easily distinguished from other AOT forms.
In order to make our form lookup looks exactly like a standard lookup, we have to adjust its layout. So, we set form design Frame and WindowType properties respectively to Border and Popup. This removes form borders and makes the form lookup like a true lookup. By setting the grid property ShowRowLabels to No, we hide grid row labels, which are also not a part of automatically generated lookups. Then, we create a grid with four controls, which are bound to the relevant CustTable table fields.
Next, we change the data source properties. We do not allow any data change by setting AllowEdit, AllowCreate, and AllowDelete properties to No. Security checks should be disabled by setting AllowCheck to No. To increase performance, we set OnlyFetchActive to Yes, which will reduce the size of the database result set to only the fields that are visible. We also set the data source index to improve lookup performance.
Now, we need to define which form control will be returned as a lookup value to the calling form upon user selection. We need to specify it manually in the form's init() by calling element.selectMode() with the name of the AccountNumcontrol as argument.
In the form's run(), we simulate standard lookup filtering, which allows user to user * symbol to search for records in the lookup. For example, if the user types 1* into the Customer account control, the lookup will open automatically with all customer accounts starting with 1. To achieve that, we use the filterLookupPreRun() and filterLookupPostRun() methods of the standard SysTableLookup class. Both methods requires calling a control, which we get by using getCallerStringControl() method of SysTableLookup. The first method reads user input and returns true if a search is being performed, otherwise, false. It must be called before the super() in the form's run() and accepts four arguments:
-
1. The calling control on the parent form.
-
2. The returning control on the lookup form.
-
3. The lookup data source.
-
4. An optional list of other lookup data sources.
The filterLookupPostRun() must be called after the super() in the form's run() and also accepts four arguments:
-
1. A result value from previously called filterLookupPreRun().
-
2. The user text specified in the calling control.
-
3. The returning control on the lookup form.
-
4. The lookup data source.
The code in the CustTable data source's init() replaces the data source query created by its super() with the custom one. Basically, here we create a new Query object, add a range to show only active customers, and set this object as the new CustTable data source query. This ensures that there are no dynamic links from the caller form's data source.
- 1. The calling control on the parent form.
- 2. The returning control on the lookup form.
- 3. The lookup data source.
- 4. An optional list of other lookup data sources.
- 1. A result value from previously called filterLookupPreRun().
- 2. The user text specified in the calling control.
- 3. The returning control on the lookup form.
- 4. The lookup data source.
This post will be very useful to us....i like your blog and helpful to me....nice thoughts for your great work..
ReplyDeletePersonalised Phone Covers
Ripping code out of Mindy's Ax development cook book word for word.
ReplyDeletePlagiarism at its worst.
Ripping code out of Mindy's Ax development cook book word for word.
ReplyDeletePlagiarism at its worst.
How Mr Benjamin Lee service grant me a loan!!!
ReplyDeleteHello everyone, I'm Lea Paige Matteo from Zurich Switzerland and want to use this medium to express gratitude to Mr Benjamin service for fulfilling his promise by granting me a loan, I was stuck in a financial situation and needed to refinance and pay my bills as well as start up a Business. I tried seeking for loans from various loan firms both private and corporate organisations but never succeeded and most banks declined my credit request. But as God would have it, I was introduced by a friend named Lisa Rice to this funding service and undergone the due process of obtaining a loan from the company, to my greatest surprise within 5 working days just like my friend Lisa, I was also granted a loan of $216,000.00 So my advise to everyone who desires a loan, "if you must contact any firm with reference to securing a loan online with low interest rate of 1.9% rate and better repayment plans/schedule, please contact this funding service. Besides, he doesn't know that am doing this but due to the joy in me, I'm so happy and wish to let people know more about this great company whom truly give out loans, it is my prayer that GOD should bless them more as they put smiles on peoples faces. You can contact them via email on { 247officedept@gmail.com} or Text through Whatsapp +1-989 394 3740.
Useful lookup
ReplyDelete