miércoles, 1 de septiembre de 2010

Mantener Personalizaciones de Usuarios al Cambiar Dominio

Hola, en ocasiones se debe copiar o restaurar Dynamics Ax en otro dominio y tenemos problemas cuando existe una lista grande de usuarios y se debe volver a importar esta, perdiendo la personalizacion de cada usuario.
Para evitar esto, se debe cambiar los campos NETWORKDOMAIN y SID en la tabla USERINFO de la BD de Dynamics AX, para saber el nuevo SID de la lista de usuarios podemos usar lo sgte:

1.- Abrimos un block de notas
2.- Copiamos este codigo:

Option Explicit
Dim objExcel, i, strCompu, objWMIUserAccount , colUserAccount , objUserAccount
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = True
objExcel.Workbooks.Add
i = 1
strCompu = "."
Set objWMIUserAccount = GetObject _
("winmgmts:\\" & strCompu & "\root\cimv2")
Set colUserAccount = objWMIUserAccount.ExecQuery _
("Select * From Win32_UserAccount")
For Each objUserAccount in colUserAccount
objExcel.Cells(i, 1) = objUserAccount.Name
objExcel.Cells(i, 2) = objUserAccount.SID
i = i + 1
Next

3.- Guardamos el archivo como *.vbs (ej. miSID.vbs)
4.- Damos doble click al archivo creado y nos muestra la información en un archivo excel.

//------------------------------------------------------------------------------\\

Otra forma sería creando el sgte. job dentro del AX:

static void TestSID(Args _args)
{
sid userSid;
Microsoft.Dynamics.IntegrationFramework.Util util;
userinfo userinfo;
str usuarioX;
str dominioX;
;
dominioX = "dominio";
while select userinfo
{
usuarioX = userinfo.networkAlias; // Usuario
util = new Microsoft.Dynamics.IntegrationFramework.Util();
userSid = util.GetUserSid(dominioX, usuarioX);
CodeAccessPermission::revertAssert();

info(usuarioX);
info(userSid);
}
}

Saludos.

lunes, 16 de agosto de 2010

Ventanas dentro del Workspace

A partir de la version 2009 las ventanas se abren fuera del workspace, para algunos usuarios esto les parece molestoso. Con este codigo podremos volver al estilo de las anteriores versiones:
* Agregar el siguiente codigo en el método Init de la clase SysSetupFormRun

public void init()
{
//CODIGO AGREGADO
if(this.form().design().windowType()==FormWindowType::Standard)
this.form().design().windowType(FormWindowType::Workspace);
//CODIGO AGREGADO

super();
SysSecurityFormSetup::loadSecurity(this);
this.dimensionFieldCtrls();
this.inventStorageDimFieldCtrls();

if (this.isWorkflowEnabled())
{
workflowControls = SysWorkflowFormControls::construct(this);
workflowControls.initControls();
}
}

Saludos.

viernes, 13 de agosto de 2010

Utilizar campo create/modifiedDateTime de las tablas

Hola, mediante este código podremos utilizar los campos create/modifiedDateTime de las tablas.

static void CapturaCreatedDateTime(Args _args)
{
PurchTable ptable;
purchid id;
;
id = "000007";
Select ptable Where ptable.PurchId == id;

print DateTimeUtil::date(purchtable::find(ptable.PurchId).createdDateTime);
pause;
}

Saludos.

martes, 10 de agosto de 2010

Ejecutar directamente sentencias T-SQL desde Dynamics AX

Hola, bueno no es muy recomendable hacer esto, pero es un camino más que nos podria servir para resolver algún problema:

Vamos a crear un metodo en la clase Global:
server static void DAXExecuteSQL(str _sql)
{
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();
}

Luego para utilizar este metodo, tenemos que poner esto:
DAXExecuteSQL('Cualquier Consulta T-SQL');

Saludos.

Ocultar mensaje de ajuste de reporte

Hola, me imagino que se han topado con esta clase de mensaje: "Informe se ha definido en xx por ciento para ajustarlo a la página". Bueno esto es normal cuando el reporte contiene mucha informacion y se tiene que ajustar al reporte.
Si queremos evitar este mensaje simplemente tendremos que poner este codigo en el init del reporte.
element.printJobSettings().SuppressScalingMessage(true);

Saludos.

lunes, 9 de agosto de 2010

Envío de varios parámetros a la vez mediante args

Hola con este pequeño desarrollo, se podrá enviar varios parámetros de distintos tipos a un reporte ó formulario, mediante args y parmobject, para esta demostración enviaré dos parámetros a un reporte para que haga un filtro.

Paso1: creamos la clase “ParametrosReporte”, que recibirá todos los parámetros que necesitamos.
class ParametrosReporte
{
str para1;
str para2;
}
public str parm1( str _para1 = para1 )
{
;
if (!prmisdefault( _para1 ))
{
para1 = _para1;
}
return para1;
}
public str parm2( str _para2 = para2 )
{
;
if (!prmisdefault( _para2 ))
{
para2 = _para2;
}
return para2;
}

Paso 2: la mayoría de veces se tendrá que poner este código en un botón, pero por motivo de explicación lo he realizado en un job.
static void ParametrosVarios(Args _args)
{
Args args = new Args();
ReportRun reportRun;
ParametrosReporte parametrosReporte = new ParametrosReporte();
;
parametrosReporte.parm1( "1101" ); //código de cliente
parametrosReporte.parm2( "1102" ); //código de cliente
args.parmObject( parametrosReporte );
args.name(reportstr(Parametros));
reportRun = classFactory.reportRunClass(args);
reportRun.init();
reportrun.run();
}

Paso 3: creamos el reporte “Parametros”, con el datasource custtable y agregamos algunos campos al diseño del formulario. Luego en el método init() ponemos:
public void init()
{
ParametrosReporte parametrosReporte;
;
super();
if( element.args().parmObject() )
{
parametrosReporte = element.args().parmObject(); //recuperamos parametros
}
element.query().dataSourceName('CustTable').addRange(fieldnum(Custtable, accountNum)).value(parametrosReporte.parm1() + ".." +parametrosReporte.parm2());
this.query().userUpdate(false);
}

Saludos.

miércoles, 21 de julio de 2010

Leer registros de un archivo excel desde MS Dynamics AX

Hola, bueno para que este codigo funcione, es necesario tener una clase llamada ExcelImportADO, la cual MS Dynamics AX no la tiene :S, pero les dejo el link donde la puedan bajar:
http://www.axaptapedia.com/Image:ExcelImportADO.zip
----------------------------------------------------------------------------
Counter cnTotal = 0;
ItemId itemId;
ItemName itemName;
AmountCur price;
Filename strFilename;
container conSheets;
ExcelImportADO xlImport;
;
strFilename = @"c:\import.xls"; // nombre del archivo
xlImport = new ExcelImportADO(strFilename);
try
{
// abre la primera hoja por default
if(!xlImport.openFile())
throw error(strfmt("Error opening Excel file «%1»", strFilename));
if(xlImport.getFieldsCount() < 3)
throw error(strfmt("Too few columns in the recordset:" +
" found %1, expected at least %2",
xlImport.getFieldsCount(), 3));
while(!xlImport.eof())
{
itemId = xlImport.getFieldValue(1);
itemName = xlImport.getFieldValue('ItemName');
price = xlImport.getFieldValue('ItemPrice', false);
// process data...
cnTotal++;
xlImport.moveNext();
}
xlImport.finalize();
Box::info(strfmt("%1 registros leidos", cnTotal));
}
catch(Exception::Error)
{
xlImport.finalize();
}
---------------------------------------------------------------------------
Este codigo me pareció muy interesante porque me ayudo a leer un excel donde se guardaban varios registros contables y luego con las clases respectivas registrarlas y contabilizarlas.
Saludos.

viernes, 18 de junio de 2010

Llamar un stored procedure mediante Dynamics AX

static void llamaStoredProcedure(Args _args)
{
LogInProperty Lp = new LogInProperty();
OdbcConnection myConnection;
Statement myStatement;
ResultSet myResult;
;

LP.setServer("NombreSrv");
LP.setDatabase("NombreBD");

try
{
myConnection = new OdbcConnection(LP);
}
catch
{
info("Check usuario/password.");
return;
}

myStatement = myConnection.createStatement();
//stored procedure
myResult = myStatement.executeQuery('EXEC [custtablesp]');
custtablesp --- contiene la sentencia --- select * from custtable
while (myResult.next())
{
print myResult.getString(1);
}
pause;
}

Saludos

lunes, 17 de mayo de 2010

Nuevo Editor X++

Hola, navegando por la web me encontre algunos pantallazos de como se verá el nuevo editor de X++ de MS Dynamics 6 (2011).
Vincent's Blog - Dynamics AX6 – The new X++ editor
Algunas nuevas características:
* Numeración de líneas y marcado
* Soporta multiples tipos de letras y estilos (los comentarios son en el tipo de
letra italic)
* Coloración de operadores(=,&&)

Saludos.

martes, 30 de marzo de 2010

Presentación Dynamics AX 2009

Hola, navegando por internet me encontre con esta presentación que me pareció realmente interesante, les dejo el link para que lo vean

http://www.microsoft.com/global/dynamics/en/us/RichMedia/demoHTML/demo-ax-capabilities.html

Saludos.