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

Pila llamada en X++

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

En alguna ocasión, nos puede interesar saber por X++, la pila de llamada que se tiene, al llegar a un método, para ello podemos utilizar la siguiente sentencia:

 xSession::xppCallStack()

Esta sentencia nos devuelve la pila de llamadas, en un container, el cual podemos tratar o guardar en un campo de nuestra base de datos, para futuros análisis.

Error al compilar datetimetostr()

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

En alguna ocasión nos podemos encontrar que utilizando Dynamics Ax 2009, de repente se nos abra el debug de Axapta y nos muestre el siguiente error:

Error executing code: Wrong argument type for function.

Este problema está causado, por que el cliente está utilizando una versión diferente al servidor por ejemplo:

Cliente tiene Ax 2009 RTM (5.0.593.xxx) y la aplicación está en 2009 SP1 (5.0.1000.52)

Visualizar container sin usar Debug

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

En algunas ocasiones, nos puede ser interesante visualizar el valor que tenemos en un container, sin tener que lanzar el debug de Axapta.

Para ello existe una función en la clase Global que no permite realizar esto:

Global::conView([nombre del container])

Al llamar la función por código, se nos abrirá una pantalla, la cual nos mostrará el contenido del container