Ejecución de código SQL directo a tablas de Dynamics en x++

29.12.2013 00:26
 

 

Dynamics AX permite a los desarrolladores construir declaraciones X + + SQL lo suficientemente flexibles para adaptarse a cualquier proceso de negocio. Sin embargo, en varios casos, el uso de X + + de SQL o bien no es eficaz o no es posible en absoluto.
Uno de los casos es cuando ejecutamos tareas de actualización de datos durante una actualización de la versión de la aplicación.
La aplicación estándar contiene un conjunto de tareas de actualización de datos para ser completadas durante la actualización de la versión. Si la aplicación es altamente personalizable, lo más probable es que  las tareas estándar tengan  que ser modificadas para reflejar las personalizaciones de diccionario de datos o incluso un nuevo conjunto de tareas tengan  que ser creadas para asegurarse de que los datos se manejan correctamente durante la actualización.
Normalmente, en esta etapa, las sentencias SQL son tan complejas que sólo se pueden crear utilizando SQL y ejecutarlas directamente en la base de datos.
Además, ejecutando  declaraciones SQL directamente aumenta drásticamente el rendimiento de actualización de datos, porque la mayor parte del código es ejecutado en el servidor de base de datos donde reside toda la información. Esto es muy importante durante el trabajo con grandes volúmenes de datos.
Otro caso en el que tendríamos que utilizar las instrucciones SQL directas es cuando queremos conectar a una base de datos externa mediante el controlador ODBC.
En este caso, X + + SQL no está soportado en absoluto.
El siguiente código demostrará cómo ejecutar instrucciones SQL directas . Vamos a conectar con la base de datos de Dynamics AX actual directamente, mediante una conexión adicional y recuperar  la lista de las cuentas de proveedores.

  1. Abrir AOT, y crear  una nueva clase llamada  vendTableSql

    :

class VendTableSql

{

}

server static void main(Args _args)

{

UserConnection userConnection;

Statement statement;

str sqlStatement;

SqlSystem sqlSystem;

SqlStatementExecutePermission sqlPermission;

ResultSet resultSet;

DictTable tblVendTable;

DictField fldAccountNum;

DictField fldName;

DictField fldDataAreaId;

DictField fldBlocked;

;

tblVendTable = new DictTable(tablenum(VendTable));

fldAccountNum = new DictField(

tablenum(VendTable),

fieldnum(VendTable,AccountNum));

fldName = new DictField(

tablenum(VendTable),

fieldnum(VendTable,Name));

fldDataAreaId = new DictField(

tablenum(VendTable),

fieldnum(VendTable,DataAreaId));

fldBlocked = new DictField(

tablenum(VendTable),

fieldnum(VendTable,Blocked));

sqlSystem = new SqlSystem();

sqlStatement = 'SELECT %2, %3 FROM %1 ' +

'WHERE %4 = %6 AND %5 = %7';

sqlStatement = strfmt(

sqlStatement,

tblVendTable.name(DbBackend::Sql),

fldAccountNum.name(DbBackend::Sql),

fldName.name(DbBackend::Sql),

fldDataAreaId.name(DbBackend::Sql),

fldBlocked.name(DbBackend::Sql),

sqlSystem.sqlLiteral(curext(), true),

sqlSystem.sqlLiteral(CustVendorBlocked::No, true));

userConnection = new UserConnection();

statement = userConnection.createStatement();

sqlPermission = new SqlStatementExecutePermission(

sqlStatement);

sqlPermission.assert();

resultSet = statement.executeQuery(sqlStatement);

CodeAccessPermission::revertAssert();

while (resultSet.next())

{

info(strfmt(

"%1 - %2",

resultSet.getString(1),

resultSet.getString(2)));

}

}

Ejecutando la clase , obtenemos la lista de vendedores directamente desde la base de datos