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.
miércoles, 1 de septiembre de 2010
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.
* 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.
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.
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.
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.
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.
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
{
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.
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.
http://www.microsoft.com/global/dynamics/en/us/RichMedia/demoHTML/demo-ax-capabilities.html
Saludos.
Suscribirse a:
Entradas (Atom)