Archiv para febrero, 2010

Acceso Axapta una instancia por usuario

1 Estrella2 Estrella3 Estrella4 Estrella5 Estrella (Sin calificar)
Cargando…
Escrito por René Roca el . Posteado en X++

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 usuario
 
	while select RecId from _SysClientSessions order by login_time desc
		  where _SysClientSessions.userId == curuserid() && _SysClientSessions.Status == 1
	{
		if (_SysClientSessions.RecId)
			cuentaSesionActiva = cuentaSesionActiva + 1; //Acumula el número de logins activos del usuario en el sistema
		else
			cuentaSesionActiva = 0;
	}
	 
	if (cuentaSesionActiva > 1)
	{
		infolog.shutDown(false);
	} 
}

Método para Exportar tabla a Excel

1 Estrella2 Estrella3 Estrella4 Estrella5 Estrella (Sin calificar)
Cargando…
Escrito por René Roca el . Posteado en X++

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.

static void 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 Columns
			switch(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 records
		while select 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);
}

Ejecutar sentencias SQL contra BBDD de forma directa

1 Estrella2 Estrella3 Estrella4 Estrella5 Estrella (Sin calificar)
Cargando…
Escrito por René Roca el . Posteado en X++

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:

server static void 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

347 Dynamics Ax

1 Estrella2 Estrella3 Estrella4 Estrella5 Estrella (Sin calificar)
Cargando…
Escrito por René Roca el . Posteado en Finanzas

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.

349 / IVA 2010 para Dynamics Ax

1 Estrella2 Estrella3 Estrella4 Estrella5 Estrella (Sin calificar)
Cargando…
Escrito por René Roca el . Posteado en Finanzas

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

Dynamics Ax 4.0 + Sp2

Dynamics Ax 2009

A continuación os dejo un link para poder descargar un pdf donde explica el proceso de instalación y un vídeo con el Live Meeting IVA 2010 / Informe 349