BUG Modelos producto con Graficos

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

El siguiente fallo del estándar, solo nos afecta a instalaciones de Dynamics Ax 4.0, en este caso tenemos un error del estándar que afecta a modelos de producto que estén configurados con opciones de gráficos, y estemos utilizando un idioma diferente al Ingles,

En estos casos el sistema fallará.

Esto es debido a un bonito error de traducción, para arreglarlo, editaremos la clase Classes\PBAFrontEndControlWin\run() y sobre la línea 58 haremos la siguiente modificación:

Donde pone:

graphicControl = element.design().controlName

Pondremos:

graphicControl = element.design().controlName("@SYS40661");

Una vez realizado este cambio tendremos que compilar todos los modelos de producto para volver a generar sus clases.

NoteNota

Es importante utilizar etiquetas en nuestros desarrollos

Sleep en Product Builder

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

Nuestros amigos del TEAM Dynamics Ax 2009, son tan amables que nos han puesto un bonito Sleep(50), para que podamos leer correctamente la barra de progreso del Product Builder.

Podemos ver el código en el método Classes\PBAExecuteLine\InitVar

Método Sleep

Copiar menu favoritos

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

Desde la versión 4 de Dynamics Ax, los usuario tienen la opción de tener un menú de favoritos, donde poder arrastrar todos aquellos accesos a formularios, informes que usan de forma habitual, así como poner accesos a un mismo formulario con filtros predefinidos.

Uno de los problemas que nos podemos encontrar dentro de un mismo departamento, es tener varios usuarios que realizan la misma tarea, y querer copiar el menú de favoritos de un usuario a otro, para no tener que volver a crearlo, para ello utilizaremos el siguiente Job.

UserA = Uusuario Origen

UserB = Usuario destino

server static void FavoritesJob(Args _args)
{
 
	SysPersonalization 		FromSysPersonalization;
	SysPersonalization 		ToSysPersonalization;
	UserId 					FromUserId	='UserA';
	UserId 					ToUserId  	='UserB';
	;
 
	ttsbegin;
 
	// Paso 1 - Borramos el menu de favoritos del usuario destino (UserB)
 
	while select forupdate ToSysPersonalization
		  where ToSysPersonalization.ElementType==UtilElementType::UserMenu
			 && ToSysPersonalization.UserId==ToUserId
	{
		ToSysPersonalization.doDelete();
	}
 
	// step 2 - Copiamos el menu de favoritos del ususario A al usuario B
 
	while select FromSysPersonalization
		  where FromSysPersonalization.UserId==FromUserId
			 && FromSysPersonalization.ElementType==UtilElementType::UserMenu
	{
		ToSysPersonalization.data(FromSysPersonalization);
		ToSysPersonalization.UserId=ToUserId;
		ToSysPersonalization.doInsert();
	}
 
	ttscommit;
}

Crash global Axapta 3.0 en x64

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

Cuando realizamos una compilación global sobre Axapta 3.0 y un sistema de x64, se produce un error mostrando un mensaje que indica GridEx20.ocx.

Solución:

1. Descarga y extrae la nueva versión del OCX, en la retu \cliente\bin\GridEx20.ocx, sobre escribiendo la anterior

2. Registra el OCX con el siguiente comando:  regsvr32 gridwx20.ocx

Ejecutar procesos externos desde Axapta

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

En algunas ocasiones, nos encontramos con la necesidad de poder ejecutar ficheros externos desde Axapta, ya se un fichero .exe o de cualquier otra extensión.

Desde la introducción de Dynamics Ax 2009, la ejecución de estos ficheros desde el servidor, ha sido modificada para agregar políticas de seguridad, a todo aquello que ejecutemos en procesos Batch, por lo cual si queremos ejecutar un fichero desde el servidor, tendremos que utilizar el siguiente método:

Donde _process, es el nombre del ejecutable que queremos ejecutar, como por ejemplo ‘Notepad.exe’.

static server int executeOnServer(str _process = 'notepad.exe',str _arguments)
{
	InteropPermission          perm = new InteropPermission(InteropKind::ClrInterop);
	System.Diagnostics.Process p;
	int                        exitCode;
	;
 
	perm.assert();
	p = System.Diagnostics.Process::Start(_process,_arguments);
	p.WaitForExit();
	exitCode = p.get_ExitCode();
 
	return exitCode;
}