Si deseamos controlar en acceso por usuario en Dynamics Ax y que un usuario solo tenga abierta una sesión y una licencia, impidiendo que un usuario tenga dos instancias de Dynamics AX abiertas a la vez, podemos realizar la siguiente modificación en la clase Info, método StartupPost
void startupPost(){int cuentaSesionActiva =0;
UserId IdUsuario;
SysClientSessions _SysClientSessions;
;
IdUsuario =curuserid(); // Capturamos el id del usuariowhileselect RecId from _SysClientSessions order by login_time descwhere _SysClientSessions.userId==curuserid()&& _SysClientSessions.Status==1{if(_SysClientSessions.RecId)
cuentaSesionActiva = cuentaSesionActiva +1; //Acumula el número de logins activos del usuario en el sistemaelse
cuentaSesionActiva =0;
}if(cuentaSesionActiva >1){
infolog.shutDown(false);
}}
En algunas ocasiones, nos interesa exportar el contenido de una tabla de Axapta al Excel.
A continuación os dejo un Job, que pasando el TableId, nos exportará y abrirá la información de la tabla de Axapta en Excel, mostrando la cabecera de cada campo y su contenido.
staticvoid DAXExport(TableId tableId){
DictTable dt;
DictField df;
Common c;
CommaIO cio;
Container con, conSkip;
int field, counter;
str line, fieldName;
str fileName;
;
StartLengthyOperation();
//Access Table based on TableId
dt =new DictTable(tableId); //For Table schema
c = dt.makeRecord(); //To access records
c.selectForUpdate(false);
//Create temporary file
fileName =strFmt('%1\\ax_%2.csv', WinAPI::getTempPath(), dt.name());
cio =new CommaIO(fileName,"W");
if(cio){
cio.outFieldDelimiter(';');
//Column header
line ="";
for(field =1; field <= dt.fieldCnt(); field++){//Skip System Columnsswitch(dt.fieldName(dt.fieldCnt2Id(field))){case'modifiedDateTime':case'dEL_ModifiedTime':case'modifiedBy':case'modifiedTransactionId':case'createdDateTime':case'dEL_CreatedTime':case'createdBy':case'createdTransactionId':case'dataAreaId':case'sequenceNum':case'recVersion':case'unionAllBranchId':case'rowNumber':case'RecId':case'TableId':
conSkip =conins(conSkip,maxint(), field);
break;
default:
con =conins(con,field,dt.fieldName(dt.fieldCnt2Id(field)));
}}
cio.writeExp(con);
con =conNull();
//Table recordswhileselect c
{
line ="";
for(field =1; field <= dt.fieldCnt();field++){if(0==confind(conSkip, field))
con =conins(con, field, c.(dt.fieldCnt2Id(field)));
}
cio.writeExp(con);
con =conNull();
counter++;
}}
EndLengthyOperation();
info(strfmt("%1 registros de la tabla '%2' exportados", counter, dt.name()));
//Open CSV file in registered app
WinAPI::shellExecute(fileName);
}
En alguna ocasión, aunque no es nada recomendable, necesitamos ejecutar sentencias SQL directamente contra la base de datos desde Axapta sin pasar por el framework que utiliza Dynamics para ello.
Es posible que por ejemplo tengamos que hacer un drop table o algo parecido, para ello, crearemos en la clase Global, el siguiente método:
serverstaticvoid DAXExecuteSQL(str _sql){/* Método para ejecutar directamente sql sobre base de datos - www.dynamicsax.es */str ddl ='';
SqlStatementExecutePermission ssep;
Statement statement;
Connection connection;
;
ddl = _sql;
connection =new Connection();
connection.ttsbegin();
ssep =new SqlStatementExecutePermission(ddl);
ssep.assert();
statement = connection.createStatement(ResultSetType::Dynamic, ResultSetConcurrency::Updatable);
// BP deviation documented
statement.executeUpdate(ddl);
connection.ttscommit();
}
Para utilizar el método desde cualquier parte de Axapta, simplemente tendremos que usar la siguiente llamada:
DAXExecuteSQL('Delete custTableTmp');
Esta llamada borrará la tabla CustTableTmp, igual que si lo ejecutáramos desde la consola de SQL Server
Microsoft acaba de publicar en la Partner Source y Customer Source, los objetos para adaptar al 347 según la nueva normativa, también adjunto la hoja de producto con los objetos que se crean nuevos y los objetos que se modifican del estándar.
Microsoft lleva un par de semanas dando información sobre las modificaciones necesarias para instalar el 349, a continuación o s paso una serie de links donde explica el proceso.
Como punto de partida existe la pagina web AX Vat 2010 Landing Pane a la cual se accede desde este link
Luego tenemos los siguientes enlaces para descargar los objetos según la versión Dynamics que tengamos