Monday, 5 January 2015

How to consume C# code in AX using Custom service?

1. Create table named SampleAIFTbl with 3 fields (Name, AddressCity, PhoneMobile),
one Class named SampleAIFServiceClass which have one method (getSampleList())
2. In this, I will consume data in to the DAX application with a simple
Example.
3. Create table named SampleRecvTbl with 3 fields (Name, AddressCity,
Email), one Class named SampleAIFRecvClass which have one method setSampleData()

//code

[SysEntryPointAttribute(true)]

public void setSampleData(str name,str addr,str email)
{
sample.Name = name;
sample.AddressCity = addr;
sample.Email = Email;
sample.insert();
}

4. setSampleData() method set field data and insert into table object but it is
called from C# by AIF Web Service through WSDL Port.
5. Create Service from AOT node and select the class created in previous
step in property node, select add operation node, add the method of
class SampleAIFRecvClass and select ok.
6. Create Service Group from AOT node, right click Service Group & select
“New Service Node Reference”, select auto deploy to yes and deploy the
service.
7. Open Company/System administration/Area page/Inbound Ports, select
the created service which is successfully deployed and copy the URI (wait)
8. Open visual studio, create project and select Console Application, once it
opens, open the solution explorer, right click on it & select Add project to AOT.
9.Once project added to AOT, Select Add Service Reference, paste URI and
click Go, give appropriate name so press ok.

10. We can use that service as per requirement, as I am just displaying those
data at console.

Note: Whenever you made modification in AX, deactivate the service, generate CIL
Generation & deploy the service again and in VS, update service reference to avoid errors.
C# code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SampleRecvConsoleApp.SampleAIFRecvServiceRef;
namespace SampleRecvConsoleApp
{
class Program
{
static void Main(string[] args)
{
string name, address, email;
SampleAIFRecvServiceClient client;
CallContext cc;
Console.WriteLine("Enter name");
name = Console.ReadLine();
Console.WriteLine("Enter address");
address = Console.ReadLine();
Console.WriteLine("Enter Email");
email = Console.ReadLine();

try
{
client = new SampleAIFRecvServiceClient();
cc = new CallContext();
cc.Company = "ussi";
client.setSampleData(cc, name, address, email);
Console.Out.WriteLine("Data is Migrated to AX");
Console.ReadLine();
}
catch (Exception e)
{
Console.Out.WriteLine(e.ToString());
Console.ReadLine();
}



}
}
}
You can code it, debug it, run it, see the output and modified it as you want.

How to Consume AX code in C# using Custom Service?

1. I will demonstrate now, how to expose AIF Web Service out of the AX.

2. In this, I will expose AX Data out of the application with a simple Example.

3. Create table named SampleAIFTbl with 3 fields (Name, AddressCity,
PhoneMobile), Class named SampleAIFServiceClass which have one
method (getSampleList()).

//code
[SysEntryPointAttribute(true),
AifCollectionTypeAttribute('return', Types::String)]
//return denotes the parameter type and String specifies
//the type of data the collection will hold

public List getSampleList()
{
SampleAIFTbl sampleAIFTbl;
List list = new List(Types::String);
//select all rows
while select * from sampleAIFTbl
{
//add name in the list
list.addEnd(sampleAIFTbl.Name);
//list.addEnd(" ");
}
return list;
}
4. getSampleList() method takes Name field data and insert into List object
of type String and return it C# by AIF Web Service through WSDL Port.

5. Create Service from AOT node and select the class created in previous
step in property node, select add operation node, add the method of
class SampleAIFServiceClass and select ok.

6. Create Service Group from AOT node, right click Service Group & select
“New Service Node Reference”, select auto deploy to yes and deploy the
service.
7. Open Company/System administration/Area page/Inbound Ports, select
the created service which is successfully deployed and copy the URI (wait).

8. Open visual studio, create project and select Console Application, once it
opens, open the solution explorer, right click on it & select Add project to
AOT
9. Once project added to AOT, Select Add Service Reference, paste URI and
click Go, give appropriate name so press ok.

10. We can use that service as per requirement, as I am just displaying those
data at console.

Note: Whenever you made modification in AX, deactivate the service, generate CIL
Generation & deploy the service again and in VS, update service reference to avoid errors.

C# code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Channels;
using SampleAIFConsole.SampleAIFServiceReference;

namespace SampleAIFConsole
{
class Program
{
static void Main(string[] args)
{

SampleAIFServiceReference.SampleAIFServiceClient client;

try
{

SampleAIFServiceReference.CallContext cc = new
SampleAIFServiceReference.CallContext();
client = new SampleAIFServiceClient();
cc.Company = "ussi";
foreach (string s in client.getSampleList(cc))
{
Console.Out.WriteLine("the values are " + s);
}

Console.ReadLine();

}
catch (Exception e)
{

Console.Out.WriteLine(e.ToString());
Console.ReadLine();
}

}
}
}
You can code it, debug it, run it, see the output and modified it as you want.

Monday, 1 July 2013

Get Current Company in AX 2009

static void curExtExample(Args _arg)
{
    str curCompany;
    ;
 
    // Sets curCompany to the extension of the current company.
    curCompany= curExt();
    print "Current extension is " + curCompany;
    pause;
}

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);
}

Wednesday, 20 March 2013

Passing Args from Form to Class in Dynamics Ax 2012

In this post, i will demonstrate on how to pass Args from Form to Class in Dynamics Ax.


This post will helpful for those who are keen to learn about Args which is very much fruitful concept in Dynamics Ax.

The Scenario is when I select multiple grids in Form , those records will be passed to Class and once you received those records in Class and you can use it as per your Requirement.

Firstly, make one form from which you will pass the arguments and drag your table to the datasource, then drag the fields to the grid of design node, also drag one button adn override the clicked method.

write the following code in clicked method.
void clicked()
{
int recordsCount;
SampleTbl _SampleTbl;
container con;
Args args;
str multiSelectString;
;

args = new Args();
recordsCount = SampleTbl_ds.recordsMarked().lastIndex(); // gets the total records selected
_SampleTbl = SampleTbl_ds.getFirst(1);

while (_SampleTbl)
{
// storing recid of selected field in container
con = conIns(con,1,_SampleTbl.RecId);

// converting container to string with comma separated
multiSelectString = con2Str(con,',');

_SampleTbl = SampleTbl_ds.getNext(); // moves to next record
}
// passing string
args.parm(multiSelectString);
// calling menu item
new MenuFunction(identifierstr(SampleTest), MenuItemType::Action).run(args);


}

first
make one class and write the following code in main method of it.
public static void main(Args args)
{
SampleTbl _SampleTbl;
container con;
int i;
str multipleRecords;
;
multipleRecords = args.parm();
info(strFmt('%1',multipleRecords));
// i am just here an infolog of recids but you can do as per requirement once you got multiple records
}


thanks and your feedback will be appreciated

Passing Multiple Records from one form to another through Args in Dynamics Ax 2012


In my last post, i posted on how to pass Record from one Form to another Form. Now i will pass multiple Record from one Form to another through Args.


The Scenario is when I select multiple grids in Form A, those records will be passed to FormB and there FormB will received the all those records and filter it and will show.

Step 1: Make one SampleTable which has three fields named (SIno, name, AddressCity).
Step 2: Make FormA with datasource as SampleTable and drag the datasource fields into the design Grid.
Step 3: Drag one button and override the click method and write the following code.
step 4: Make one Display menuitem of FormB.


void clicked()
{

int recordsCount;
SampleTable _sampleTable;
container con;
Args args;
str multiSelectString;
;


args = new Args();
recordsCount = SampleTable_ds.recordsMarked().lastIndex(); // gets the total records selected
_sampleTable = SampleTable_ds.getFirst(1);

while (_sampleTable)
{
// storing recid of selected field in container
con = conIns(con,1,_sampleTable.RecId);

// converting container to string with comma separated
multiSelectString = con2Str(con,',');

_sampleTable = SampleTable_ds.getNext(); // moves to next record
}
// passing string
args.parm(multiSelectString);
// calling menu item
new MenuFunction(menuitemDisplayStr(FormBMenuItem), MenuItemType::Display).run(args);
}


first

step 5: Make FormB with datasource as same table for which you take for Form A i.e., SampleTable and drag the fields in to the
Grid of design part.
step 7: write the following code in to the init method of FormB.


public void init()
{
container con;
int i;
str multipleRecords;
super();
// getting string value from caller
multipleRecords = element.args().parm();

// string to container
con = str2con(multipleRecords,",");

// for sorting
for(i = 1;i<= conLen(con) ;i++)
{
SampleTbl_ds.query().dataSourceTable(Tablenum(SampleTbl)).addRange(fieldNum(SampleTbl,RecId)).value(SysQuery::value(conPeek(con,i)));
}

}


thanks and your feedback will be appreciated.

Tuesday, 19 March 2013

Passing Args from one Form to another Form in dynamics Ax 2012

Args concept in dynamics ax is awesome. one can easily pass arguments from one Form to another Form with very less effort. Here, i am going to demonstrate how to pass Arguments from Form to Form. The Scenario is when I select one grid in Form A, that record will be passed to Form B and there Form B will received the whole record and filter it and will show.

Step 1: Make one SampleTable which has three fields named (SIno, name, AddressCity).
Step 2: Make FormA with datasource as SampleTable and drag the datasource fields into the design Grid.
Step 3: Drag one button and override the click method and write the following code.

void clicked()
{
Args args;
FormRun formRun;
;
super();
args = new args(formstr(FormB)); // sending Args(record) to FormB
args.record(SampleTable);
formrun = classfactory.formrunclass(args);
formrun.init();
formrun.run();
formrun.wait();
formrun.detach();

}



first

step 4: Make FormB with datasource as same table for which you take for Form A i.e., SampleTable and drag the fields in to the
Grid of design part.

step 5: write the following code in to the init method of FormB.

public void init()
{
SampleTable _sampleTable;
super();
_sampleTable = element.args().record();
SampleTable_ds.query().dataSourceTable(Tablenum(SampleTable)).addRange(fieldNum(SampleTbl,RecId)).
value(SysQuery::value(_sampleTable.Recid));
}

Note: You can pass only one Record with this Code, if you want to pass multiple grids,i will cover in next post.


thanks and your feedback will be appreciated.