Valor devuelto, no funciona en sub-modelos heredados

PBATableVariable.Vartype == PBAvartype::Datatype &&
PBATableVariable.Vartype &= PBAvartype::Datatype &&
PBATableVariable.Vartype == PBAvartype::Datatype &&
PBATableVariable.Vartype &= PBAvartype::Datatype &&
Si AX 4 está configurado en un idioma que no es inglés (yo lo he probado en castellano pero entiendo que funcionará de la misma manera en otros idiomas), al ejecutar un modelo de producto al que se hayan configurado opciones de gráfico, AX mostrará un error de ejecución. Es un error de traducción del estándar que ya está corregido en la versión 2009.
Para solucionarlo, editar el método de clase \Classes\PBAFrontEndControlWin\run(), en su línea #8, y modificar la línea:
graphicControl = element.design().controlName('Graphic');
por:
graphicControl = element.design().controlName("@SYS40661");
Después de este cambio será necesario compilar todos los modelos de producto para volver a generar sus clases.
dataSource.object(valueTmpBuildForm.activeField()).enabled(enabled); dataSource.object(valueTmpBuildForm.activeField()).mandatory(mandatory); dataSource.object(valueTmpBuildForm.activeField()).visible(visible);
if(dataSource.object(valueTmpBuildForm.activeField()).enabled() != enabled) dataSource.object(valueTmpBuildForm.activeField()).enabled(enabled); if(dataSource.object(valueTmpBuildForm.activeField()).mandatory() != mandatory) dataSource.object(valueTmpBuildForm.activeField()).mandatory(mandatory); if(dataSource.object(valueTmpBuildForm.activeField()).visible() != visible) dataSource.object(valueTmpBuildForm.activeField()).visible(visible);
class SysFileDeploymentFileJAEEIcon extends SysFileDeploymentFile { public Filename filename() { return 'jaestevan.png'; } //AOSRunMode::Server protected FilenameOpen sourcePath() { return "C:\\Archivos de programa\\Microsoft Dynamics AX\\50\\Application\\Share\\Include\\"; } //AOSRunMode::Client protected FilenameSave destinationPath() { return xInfo::directory(DirectoryType::Include); } }
static void JAEE_SysFileDeployment(Args _args) { container classes; SysFileDeployment sysFileDeployment; container classVersion; classId classId; ; classId = classNum(SysFileDeploymentCesserIcon); sysFileDeployment = classfactory.createClass(classId); classes += [[classId,sysFileDeployment.getServerVersion()]]; classVersion = conpeek(classes, 1); classId = conpeek(classVersion, 1); sysFileDeployment = classfactory.createClass(classId); sysFileDeployment.setServerVersion(conpeek(classVersion, 2)); sysFileDeployment.run(); }
Descarga
static void expandirLineaLMAT(Args _args) { TmpFrmVirtual tmpFrmVirtual; // Línea de la LMAT que se quiere expandir BOM tmpBOM = BOM::findRecId(5637146401, false); // Línea de venta desde la que expandir SalesLine auxSalesLine = SalesLine::find('00000003_050', 3, true); ; // Registro temporal que marca la línea a expandir tmpFrmVirtual.TableNum = tablenum(BOM); tmpFrmVirtual.RecordNo = tmpBOM.RecId; tmpFrmVirtual.write(); // Expande la LMAT y genera la línea de venta nueva (función estándar) auxSalesLine.expandBOM(tmpFrmVirtual, tmpBOM); // la nueva línea de venta puede necesitar modificaciones despues de este proceso }
Descarga
Sirva esta breve entrada como resumen de la interesantísima nueva funcionalidad de AX 6 publicada durante cuatro entregas en mfp's (1, 2, 3, 4).
La idea de Modelo es una nueva abstracción superior a las capas para agrupar objetos pertenecientes a un mismo objetivo y será un avance importantísimo a la hora de implantar soluciones en las diferentes instalaciones de AX que maneja una empresa de desarrollo o un cliente final.
Supone un avance en el actual sistema de capas ya que permitira el manejo, importación y exportación de objetos situados en los diferentes modelos situados cada uno en una capa, de manera que podrán convivir desarrollos realizados por diferentes empresas, clietnes, finales, etc.
La lectura es obligada para cualquier desarrollador de AX, y mfc la resume perfectamente en estos puntos:
Microsoft publicó hace unos dias un completísimo e interesante documento de 44 páginas explicando el pasado, presente y futuro de su producto Dynamics AX. Una lectura casi obligatoria para los que estamos dentro o esten pensando entrar en este mundo.
En el documento se analizan las soluciones ya implementadas recientemente en el SP1 de la version 2009 así como futuras funcionalidades de la próxima versión 6 y la dirección en la que se orientan las nuevas versiones sucesivas hasta 2018, así como los planes de mantenimiento y soporte actualizados.
Descargar desde PartnerSource (requiere login)
El pasado viernes Arijit Basu publicó en su blog un experimento, mediante el cual explicaba brevemente como utilizar el servicio web publicado por Microsoft de su producto BING para traducir cadenas de texto desde AX.
Este artículo me llevo a una idea propia de como sacarle utilidad a esa funcionalidad. Cuando uno trabaja en un entorno con varios idiomas, puede ser útil que al generar una etiqueta en nuestro idioma, se generen automáticamente el resto de idiomas ya traducidos.
Yo no he llegado tan lejos (todavía) pero he hecho una pequeña aproximación que paso a compartir, este es el resultado:
despues de ejecutar el Job:
/* JAEE - www.jaestevan.com @created 10/10/2009 tested in AX2009 SP1 */ static void MicrosoftTranslatorTest(Args _args) { MicrosoftTranslator msTrans = new MicrosoftTranslator(); ; msTrans.createLabel("Ahora axapta puede traducir etiquetas! (jaestevan.com)", "es"); }
Desde aquí (AX class is documented in english too) se puede descargar un fichero XPO con la clase que paso a comentar. En la construcción de la clase indicamos nuestro código de BING (el cual se solicita en su web de forma gratuíta e instantanea) así como una lista de los idiomas que queremos traducir, indicando el código de idioma de AX así como el código del idioma en BING (usualmente el mismo). Por ultimo y de manera opcional podemos indicar el fichero de etiquetas donde se generarán, aunque por defecto utilizaremos el módulo por defecto por lo que este parámetro es opcional. Este es el método en cuestión:
void new(LabelModuleId _modulo = SysLabel::defaultModuleId()) { // Axapta Label Module Id moduleId = _modulo; // Microsoft BING AppID - http://www.bing.com/developers appId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // List of languages to translate (AX lang, BING lang) (Idiomas a traducir) transLang = new Map(Types::String, Types::String); transLang.insert('de','de'); transLang.insert('ru','ru'); transLang.insert('en-us','en-us'); transLang.insert('fr','fr'); }
Esta es la manera de configurar la clase para su uso (si bien está construida para ser un ejemplo, no para servir de cualquier utilidad real).
El kit de la cuestión lo encontramos en el siguiente método, el cual genera la etiqueta (si no existe) en el idioma predeterminado y luego busca la traducción en BING para todos los idiomas configurados en la clase:
public void createLabel(str _txt, str _txtLang) { MapEnumerator langEnum; Label l; str res; LabelId labelId; SysLabelEdit labelEd = new SysLabelEdit(); SysLabel sysLabel = new SysLabel('es'); ; // Find or create the label (busca la etiqueta y si no existe la crea) labelId = labelEd.findLabel(_txtLang, _txt); if (!labelId) { sysLabel.insert(_txt, _txt, this.parmModuleId()); labelId = labelEd.findLabel(_txtLang, _txt); } //Log InfoLog.add(Exception::Info, strfmt("Traduciendo: (%1) %2", _txtLang, _txt)); // Update the label for each language (actualiza la etiqueta para cada idioma) langEnum = new MapEnumerator(this.parmLangs()); while (langEnum.moveNext()) { // Call to translate (función de traducir) res = this.strTranslate(_txt, _txtLang, langEnum.currentValue()); // Modify label with new translated text (modifica la etiqueta con el texto traducido) labelEd.labelModify(langEnum.currentValue(), labelId, res, _txt, SysLabelApplModule::None, true); // Log InfoLog.add(Exception::Info, strfmt("(%1) %2", langEnum.currentKey(), res)); } }
El trabajo de integrar esta funcionalidad con el editor de etiquetas estándar queda pendiente para otra entrega.
Enlaces
Descarga
Recientemente Microsoft ha actualizado los requisitos de sus productos Dynamics con respecto a la compatibilidad de sus diferentes compontentes con los nuevos sistemas Windows 7 y Windows Server 2008 y SQL Server 2008.
Es un buen momento para revisárselos, aquí dejo los artículos sobre AX 4 y AX 2009.
Publicaba en este blog el mes pasado que en la próxima versión de AX, el desarrollo de Enterprise Portal pasa a realizarse exclusivamente sobre Visual Studio. En la actual versión de AX, la 2009, ya podemos usar Visual Studio para desarrollar reports integrados en SQL Server Reporting Services, y desde varias versiones atrás AX publica cubos OLAP sobre servidores SQL Server Analysis Services. Lo que viene a confirmar la intención de integrar AX en el resto de sus productos de area empresarial, así como consolidar tecnologías concretas para trabajos concretos. Es inevitable mirar atrás y acordarse del "Proyect Green"
En otro paso mas en el acercamiento de la tecnología AX hacia .NET, hace unas semanas se publicó un video en Channel 9 mostrando el trabajo del equipo de desarrollo de AX orientado a la generación de código intermedio MSIL (Microsoft Intermediate Language). Si bien anuncian que este trabajo no se verá implementado en la próxima versión de AX, de llegar a completarse sería un avance importante en cuanto al rendimiento y a las posibilidades de integración de futuras versiones del producto.