Skip to main content

Using ADO for interfacing AX with an external database

If we need to interface any external database with Dynamics AX, we can achieve this task by using ADO and its AX available classes: CCADOConnection, CCADORecordSet, CCADOFields, CCADOField and CCADOCommand. Here an example:


static void ADOTestJob(Args _args)
{
CCADOConnection ccConnection;
CCADOCommand ccCommand;
CCADORecordSet ccRecordset;
CCADOFields ccFields;
str st;
str data1;
int data2;
;

ccConnection = new CCADOConnection();

// Setting the connection string
ccConnection.connectionString(StrFmt('Provider=SQLOLEDB.1;Persist Security Info=False;User ID=%3;Password=%4;Initial Catalog=%2;Data Source=%1'
, 'servername' // Server's IP or name
, 'database' // Database or catalog
, 'user' // Username
, 'pwd' // Password
));

// Open the connection
ccConnection.open();

// Preparing the query
st = "SELECT * FROM mytable";

// Recordset object creation
ccRecordset = new CCADORecordSet();

// Executing the query
ccRecordset.open( st, ccConnection );

// Reading data
while (!ccRecordset.EOF())
{
ccFields = ccRecordset.fields();

// We can access fields either by name or by Index
data1 = ccFields.itemName("FIELD1").value();
data2 = ccFields.itemIdx(1).value();

info(strfmt("Data %1, %2", data1, data2));

// Read next record
ccRecordset.moveNext();
}

// Closing the connection
ccRecordset.close();
ccConnection.close();
}

If we need to execute something (an UPDATE, DELETE, etc.), we can use the CCADOCommand:


void ExecuteSQLExt(str sql)
{
// Creating the ADO Command object
ccCommand = new CCADOCommand();

// Associate it with an existing opened connection
ccCommand.activeConnection(ccConnection);

// Executing the command
ccCommand.commandText(SQL);

ccCommand.execute();
}

Popular posts from this blog

Dynamics Axapta: Sales Orders & Business Connector

Well, again folllowing my same idea of writting close to nothing and pasting code, I'll paste in some code to create a sales order from some basic data and the invoice it. I'll try to explain more in the future. AxaptaObject axSalesTable = ax.CreateAxaptaObject("AxSalesTable"); AxaptaRecord rcInventDim = ax.CreateAxaptaRecord("InventDim"); AxaptaRecord rcCustTable = ax.CreateAxaptaRecord("CustTable"); rcCustTable.ExecuteStmt("select * from %1 where %1.AccountNum == '" + MySalesOrderObject.CustAccount + "'"); if (MySalesOrderObject.CurrencyCode.Trim().Length == 0) MySalesOrderObject.CurrencyCode = rcCustTable.get_Field("Currency").ToString().Trim(); string sTaxGroup = rcCustTable.get_Field("taxgroup").ToString().Trim(); //set header level fields axSalesTable.Call("parmSalesName", MySalesOrderObject.SalesName.Trim()); axSalesTable.Call("parmCustAccount", M

Passing values between form and class

Class name is EmplDuplication and Form is EmplTable . void clicked() {    MenuFunction mf;    args args = new Args();    ;     args.record(EmplTable);     mf = new menufunction(identifierstr(EmplDuplication), MenuItemType::Action); mf.run(args); } Meanwhile, in the main() method of the EmplDuplication class, we need to put this Axapta x++ code to get the datasource: static void main(Args args) {     EmplDuplication EmplDuplication; EmplTable localEmplTable; ;     if(args.record().TableId == tablenum(EmplTable)) localEmplTable = args.record();     ... }