Monday, 1 July 2013
Get Current Company in AX 2009
Todays date in ax 2009 report
To Get the todays date in the Ax 2009 report write the following code in display method of the report
display public str ABC_TodaysDate()
{
return date2Str(today(), 123, DateDay::Digits2, DateSeparator::Slash, DateMonth::Digits2, DateSeparator::Slash, DateYear::Digits4);
}
Sunday, 24 February 2013
passing parameters between forms in AX
In dynamics AX, working with forms, there are times when you need to pass some information from current form to the opened form, so the question arrived is that what’s the best way to open the new form and pass information.
Args class (Argument)
Some important methods are
Caller | Gets or sets the instance of the object that created this instance of the Args class. |
name | Gets and sets the name of the application object to call. |
parm | Gets or sets a string that specifies miscellaneous information for the called object. |
parmEnum | Gets or sets the enumeration value of the enumeration type that is specified in the parmEnumType method. |
parmEnmType | Gets or sets the ID value of any enumeration type. |
ParmObject | Gets or sets an instance of any object to pass to the called object. |
record | Gets and sets the record from the table on which the caller object is working. |
- The parm method – to pass strings
- The parmEnum and parmEnumType method – to pass enumeration values
- The parmObject method – to pass an object of any type.
Examples:
Use the same approach for creating the button
{
Args args;
FormRun formRun;super();
args = new Args(formstr(FormName));
args.parm(<string value>);
args.parmObject(<object>);
args.parmEnumType( EnumNum( <EnumName>) );
formRun.init();
formRun.run();
formRun.wait();
formRun.detach();
parenttable_ds.refresh(); // Refreshing parent table DataSourceTable
parenttable_ds.executeQuery(); // Refreshing Parent DataSourceTable
}
{
args = element.args();
<string> = args.parm();
if( element.args().parmEnumType() == EnumNum( <EnumName>) )
{
<enum contol/variable> =( element.args().parmEnum() );
}
Argument Passing between Forms in Dynamics Ax 2009
Steps:
1) Create two Forms named FormA and FormB
2)Use the EmplTable as the Datasource of both forms
3)Design FormA with one Grid and add 4 data fields to the Grid(EmplId,DEL_Name,Grade,EmplStatus…..)
4)Assign the datasource for the grid and the data fields
5)Add a Button in FormA
6)Override the Clicked() method and write the below code:
void Clicked()
{
Args _args;
FormRun _formRun;
EmplId _empId;
;
_empId = EmplTable.EmplId; // Selected employee id in the Grid is assigned to the variable which is pass to the next form
_args = new Args(); // creating a object for args class
_args.name(formstr(VA_FormB)); // Form Menuitem
_args.caller(this); // Form Caller(Current Form is mentioned as this)
_args.parm(_empId); // Employee Number is passed to next form[but parm() is not a best practise]
_args.record(EmplTable); // Table name is passed
_formRun = ClassFactory.formRunClass(_args); //new FormRun(_args); // Creating object for FormRun
_formRun.init(); // Form Initialization for Load
_formRun.run(); // Form Run for process
_formRun.wait(); // Form Wait for Display
}
7) Open the Second Form – FormB
8) Add one Grid Control and set the Data Source is EmplTable
9) Add 4 data fields as same in the Form A
10)Now Override the Init() of Form
public void init()
{
parmid _parmId;
EmplTable _EmplTable;
// DictTable _dictTable; FormBuildDataSource _ds; FormBuildGridControl frmGrid; // These are for dynamicForm creation so leave it
_parmId = element.args().parm(); // Getting the argument value from the Caller
//info(int2str(element.args().record().TableId));
if(!element.args().caller()) // Check the form is called by caller or directly, if directly it throw error
throw error(“Cant Run Directly”);
if(element.args().record().TableId == tablenum(EmplTable)) // check if the sent Table and the Current form table are equal or not
{
// _EmplTable = element.args().record(); // Assign the Received Table name to Local Variable
//_dictTable = new DictTable(element.args().record().TableId); // leave it , is used for Dynamic Form Creation
//_ds = form.addDataSource(_dictTable.name()); // leave it , is used for Dynamic Form Creation
//_ds.table(_dictTable.id()); // leave it , is used for Dynamic Form Creation
//frmGrid = form.addControl(FormControlType::Grid, “Grid”); // leave it , is used for Dynamic Form Creation
//frmGrid.dataSource(_ds.name()); // leave it , is used for Dynamic Form Creation
//info(strfmt(“%1 %2″,_EmplTable.EmplId,_EmplTable.DEL_Name));
//frmGrid.addDataField(_ds.id(),fieldnum(EmplTable, DEL_Name)); // leave it , is used for Dynamic Form Creation
// EmplTable_EmplId.dataSource(_EmplTable); // leave it , is used for Dynamic Form Creation
// EmplTable_EmplId.dataField(fieldnum(EmplTable,EmplID)); // leave it , is used for Dynamic Form Creation
// EmplTable_DEL_Name.dataSource(_EmplTable); // leave it , is used for Dynamic Form Creation
// EmplTable_DEL_Name.dataField(fieldnum(EmplTable,EmplId)); // leave it , is used for Dynamic Form Creation
// EmplTable_DEL_Email.dataSource(_EmplTable); // leave it , is used for Dynamic Form Creation
// EmplTable_DEL_Email.dataField(fieldnum(EmplTable,EmplId)); // leave it , is used for Dynamic Form Creation
super(); // Form Initialization
}
else
{
info(“DataSet Not Received”); // throw error
}
}
11)Override the Init() of the DataSource
public void init()
{
switch(element.args().dataset())// get the table id sent by caller
{
case tablenum(EmplTable): // check the table if matches with this tableid
{
_EmplID = element.args().parm(); // get the argument value
query = new Query(); queryBuildRangeProj = query.addDataSource(tablenum(EmplTable)).addRange(fieldnum(EmplTable,EmplId)); // query build for the form to display
queryBuildRangeProj.value(_emplId); // Criteria for the form
EmplTable_ds.query(query); // execution of the query
break;
}
}
super(); //datasource initialization on the form based on the criteria
}
12) Save it, and create two menu items for each.
13) It is important to change the runon property of the FormB as CalledFrom.
14)Run the FormA and select an Employee Record and click the button.
15)The FormB opens with the Related information of the Selected Employee on form.
Passing values between forms
For passing parameters from one form to another a special class Args is usually used.
Example:
The code of button click event of FormA which calls FormB and passes some parameters to that form.
void clicked()
{
// Args class is usually used in Axapta for passing parameters between forms
Args args;
FormRun formRun;
// Our custom made class for passing complex set of parameters
FormBParams formBParams = new FormBParams();
Array items = new Array( Types::String );
int i;
;
args = new args();
// Our values which we want to pass to FormB
// If we want pass just simple string we can use 'parm' method of 'Args' class
args.parm( strValue.text() );
// We also can pass enum value to FormB
args.parmEnum( NoYesEnumValue.selection() );
args.parmEnumType( EnumNum( NoYes ) );
// and also can pass a cursor pointing to some record (in our case it is EmplTable )
args.record( EmplTable );
// If we want pass more complex set of parameters we can develop our own class
// just for passing our parameters.
formBParams.parmSomeDate( someDate.dateValue() );
formBParams.parmSomeTime( someTime.value() );
for( i=0; i<ListBox.items(); i++ )
{
items.value( i+1, ListBox.getText( i ) );
}
formBParams.parmItems( items );
// Pass our object to FormB
args.parmObject( formBParams );
// Run FormB
args.name( formstr( FormB ) );
formRun = classFactory.formRunClass( Args );
formRun.init();
formrun.run();
formrun.wait();
if( formrun.closedOk() )
{
answerFromFormB.text( args.parm() );
}
super();
}
The code of init method of FormB
public void init()
{
EmplTable emplTableRecord;
FormBParams formBParams;
Array items;
int i;
;
super();
// Check for passed arguments
if( element.args() )
{
// get string parameter
strValue.text( element.args().parm() );
// get enum parameter
if( element.args().parmEnumType() == EnumNum( NoYes ) )
{
NoYesEnumValue.selection( element.args().parmEnum() );
}
// get object parameter
if( element.args().parmObject() )
{
formBParams = element.args().parmObject();
items = formBParams.parmItems();
for( i=1; i<=items.lastIndex(); i++ )
{
ListBox.add( items.value(i) );
}
someDate.dateValue( formBParams.parmSomeDate() );
someTime.value( formBParams.parmSomeTime() );
}
// get record parameter
if( element.args().record() && element.args().record().TableId == TableNum( EmplTable ) )
{
emplTableRecord = element.args().record();
emplName.text( emplTableRecord.Name );
}
}
}
The code of ok button click event of FromB
void clicked()
{
super();
element.args().parm( strAnswer.text() );
element.closeOk();
}
The above code is cut out from a demo which you can download here.
For passing parameters from one form to another a special class Args is usually used.
Example:
The code of button click event of FormA which calls FormB and passes some parameters to that form.
void clicked()
{
// Args class is usually used in Axapta for passing parameters between forms
Args args;
FormRun formRun;
// Our custom made class for passing complex set of parameters
FormBParams formBParams = new FormBParams();
Array items = new Array( Types::String );
int i;
;
args = new args();
// Our values which we want to pass to FormB
// If we want pass just simple string we can use 'parm' method of 'Args' class
args.parm( strValue.text() );
// We also can pass enum value to FormB
args.parmEnum( NoYesEnumValue.selection() );
args.parmEnumType( EnumNum( NoYes ) );
// and also can pass a cursor pointing to some record (in our case it is EmplTable )
args.record( EmplTable );
// If we want pass more complex set of parameters we can develop our own class
// just for passing our parameters.
formBParams.parmSomeDate( someDate.dateValue() );
formBParams.parmSomeTime( someTime.value() );
for( i=0; i<ListBox.items(); i++ )
{
items.value( i+1, ListBox.getText( i ) );
}
formBParams.parmItems( items );
// Pass our object to FormB
args.parmObject( formBParams );
// Run FormB
args.name( formstr( FormB ) );
formRun = classFactory.formRunClass( Args );
formRun.init();
formrun.run();
formrun.wait();
if( formrun.closedOk() )
{
answerFromFormB.text( args.parm() );
}
super();
}
The code of init method of FormB
public void init()
{
EmplTable emplTableRecord;
FormBParams formBParams;
Array items;
int i;
;
super();
// Check for passed arguments
if( element.args() )
{
// get string parameter
strValue.text( element.args().parm() );
// get enum parameter
if( element.args().parmEnumType() == EnumNum( NoYes ) )
{
NoYesEnumValue.selection( element.args().parmEnum() );
}
// get object parameter
if( element.args().parmObject() )
{
formBParams = element.args().parmObject();
items = formBParams.parmItems();
for( i=1; i<=items.lastIndex(); i++ )
{
ListBox.add( items.value(i) );
}
someDate.dateValue( formBParams.parmSomeDate() );
someTime.value( formBParams.parmSomeTime() );
}
// get record parameter
if( element.args().record() && element.args().record().TableId == TableNum( EmplTable ) )
{
emplTableRecord = element.args().record();
emplName.text( emplTableRecord.Name );
}
}
}
The code of ok button click event of FromB
void clicked()
{
super();
element.args().parm( strAnswer.text() );
element.closeOk();
}
Wednesday, 26 December 2012
SSRS Report Configuration
The Following Images Shows :
1.1) Configuration Id = MSSQLSERVER
1.2) ReportServer
servername = MTSD-01 ( system name)
server instance name = MSSQLSERVER.
1.3) Reporting Server URL:
1.1) Report Manager URL :http://systemname/Reports
1.2) Web service URL : http://systemname/ReportServer
1.4) Click on Validate Setting
1.5) if it is success
2. start–>adminstratot tools–>power shell
type this:
Publish- AXReport –Id <SSRSCONFIG-ID> -ReportName *, Prescription, SOReport..
Monday, 17 December 2012
Simple UI Builder Class
This UI Builder class is simple class with less code and less effort. UI Builder Class is needed when you want to customize your dialog which pop ups when you open a Report. UI Builder Class helps you to add run time lookups and other controls on the dialog form.
Step1 : Your Class must extends SrsReportDataContractUIBuilder
class SimpleDemoUIBuilder extends SrsReportDataContractUIBuilder
{
DialogField dialogEmplId;
DialogField dialogName;
boolean enable;
SimpleDemoContract contract;
}// two fields emplId and Name will reflect in the lookup in dialog form at the time of report opening.
Step2 : Override the build method
public void build()
{
contract = this.dataContractObject();
dialogEmplId = this.addDialogField(methodStr(SimpleDemoContract, parmEmplId),contract);
}// this method used for adding the field which is from contract class.
Step3 : Write this below code to get lookup
private void emplIdLookup(FormStringControl emplIdlookup)
{
Query query = new Query();
QueryBuildDataSource qbds_EmplTable;
SysTableLookup sysTableLookup;
// Create an instance of SysTableLookup with the current calling form control.
sysTableLookup = SysTableLookup::newParameters(tableNum(FilterDemo), emplIdlookup);
// Add fields to be shown in the lookup form.
sysTableLookup.addLookupfield(fieldNum(FilterDemo,EmplId));
sysTableLookup.addLookupfield(fieldNum(FilterDemo,Name));
qbds_EmplTable = query.addDataSource(tableNum(FilterDemo));
sysTableLookup.parmQuery(query);
// Perform the lookup
sysTableLookup.performFormLookup();
}
Step4 : Override this method
public void getFromDialog()
{
contract = this.dataContractObject();
super();
}
Step5 : Override this method
public void initializeFields()
{
contract = this.dataContractObject();
}
Step6 : Override this method
public void postBuild()
{
super();
dialogEmplId = this.bindInfo().getDialogField(this.dataContractObject(),methodStr(SimpleDemoContract,parmEmplId));dialogEmplId.registerOverrideMethod(methodStr(FormStringControl, lookup),
methodStr(SimpleDemoUIBuilder,emplIdLookup), this);dialogEmplId.lookupButton(2);
}
the Contract Class code and DP class have already been added to the blog. please check it for further reference but one important part has to be added to the contract class i.e in class declaration, the following part has to be updated.
[DataContractAttribute,SysOperationContractProcessingAttribute(classstr(SimpleDemoUIBuilder))]
Thursday, 13 December 2012
Print Date Time on Report
{;
return strfmt(element.design().lookupLabel(literalstr("@SYS10092")),
element.startDate(),
time2str(element.startTime(),-1,-1),
element.page());
}
Thursday, 6 December 2012
Simple RDP Class with Contract Class in AX 2012
2. Use this Contract class in RDP class as parameter.
3. [DataContractAttribute]
public class FilterDemoContract
{
EmplId emplId;
}
4 . [DataMemberAttribute("EmplId")]
public EmplId parmEmplId(EmplId _emplId = emplId)
{
emplId = _emplId;
return emplId;
}
5 . Now Declare Table buffers in the Class declaration of RDP Class including Temp Table Buffer.
[SRSReportParameterAttribute(classstr(FilterDemoContract))]
class ContractDemoClass extends SRSReportDataProviderBase
{
TempFilterDemo tempFilterDemo;
FilterDemo filterDemo;
}
6. [SRSReportDataSetAttribute("TempFilterDemo")]
public TempFilterDemo getTempFIlterDemo()
{
select * from tempFilterDemo;
return tempFilterDemo;
}
7. public void insertTmpTable()
{
tempFilterDemo.EmplId = filterDemo.EmplId;
tempFilterDemo.Name = filterDemo.Name;
tempFilterDemo.Salary = filterDemo.Salary;
tempFilterDemo.Gender = filterDemo.Gender;
tempFilterDemo.insert();
}
8. [SysEntryPointAttribute(false)]
public void ProcessReport()
{
EmplId emplId;
FilterDemoContract contract;
;
contract = this.parmDataContract() as FilterDemoContract;
emplId = contract.parmEmplId();
select * from filterDemo where filterDemo.EmplId == emplId;
this.insertTmpTable();
}.
9. Now you left with SSRS part, in the report, one Dialog Box will popped up, there, you would enter the emplid value and report will show you that particular record.
Simple SSRS Report by RDP Class
2. It Requires one Temp Table, if the table contains more than 1000 records then Table Property
3. Firstly, Create one class which extends
4. you can see the sample code below:
5. class EmpRdpClass extends SRSReportDataProviderBase
{
TempFilterDemo tempFilterDemo;
FilterDemo filterDemo;
}
6. [SRSReportDataSetAttribute("TempFilterDemo")]
public TempFilterDemo getFilterDemo()
{
select * from tempFilterDemo;
return tempFilterDemo;
}
7. private void insertTmpTable()
{
whileselect * from filterDemo
{
tempFilterDemo.EmplId = filterDemo.EmplId;
tempFilterDemo.Name = filterDemo.Name;
tempFilterDemo.Salary = filterDemo.Salary;
tempFilterDemo.Gender = filterDemo.Gender;
tempFilterDemo.insert();
}
}
8 . [SysEntryPointAttribute(false)]
public void ProcessReport()
{
this.insertTmpTable();
}
9. Now you left with SSRS part.