domingo, octubre 28, 2012

Axapta 2012: Migrar archivo de etiquetas



Si tiene un archivo de etiquetas .ALD, puede crear una entrada apropiada desde el AOT utilizando Crear desde archivo en el menú del contexto del nodo Label Files en el AOT.


De esta forma podemos realizar la migración de nuestro archivo de etiquetas de versiones anteriores de Microsoft Dynamics AX.

viernes, octubre 05, 2012

Dynamics AX 2012: Problema al actualizar tabla derivaba.


La nueva característica de tabla Derivada y tabla Base que se implementó AX 2012 puede ocasionar en ciertos casos problemas si no se entiende correctamente el concepto y su ventaja para utilizarlo.




Ejemplo:
CompanyInfo  companyInfo;

Select forupdate organizationType from  companyInfo;
companyInfo. organizationType = “Financiero”;
companyInfo.doUpdate();

Error al actualizar Tabla derivada

Error: Seguimiento de pila

Causa: Al no seleccionar explícitamente un campo específico de una tabla derivada que va ser posteriormente actualizado automáticamente por la tabla Base se produce el siguiente error.




Detalle del problema: El problema se presenta debido a que no se realiza la declaración explícita de un campo que está siendo a actualizarse en un proceso de la tabla Base DirPatyTable. Debido a que CompanyInfo es una tabla derivada de la tabla Base DirPartyTable, al momento de realizar la selección de los campos a actualizar se debe tomar en cuenta cuales son los campos que necesita la tabla Base o bien hacer una selección abierta de todos los campos de la tabla Derivada.

Solución: Para solucionar el problema podemos utilizar dos formas, tomando en cuenta cual es la que se adapta de mejor manera a la solución del negocio.

CompanyInfo  companyInfo;
Select forupdate  companyInfo;
companyInfo. organizationType = “Financiero”;
companyInfo.doUpdate();
o bien
CompanyInfo  companyInfo;
Select forupdate organizationType, Name from  companyInfo;
companyInfo. organizationType = “Financiero”;
companyInfo.doUpdate();

Dynamics AX 2012: Secuencia numérica manual

Para establecer una secuencia númerica de forma manual podemos utilizar el siguiente código:


NumberSeq                   numberSeq,NumberSeqVoucher;
NumberSequenceReference     _NumberSequenceReference;
Num                         Number;
Voucher                     voucher;
NumberSequenceReference    _voucherSequenceReference
;

numberSeq = new NumberSeq();

//Realizar las busquedas de las secuencias numéricas configuradas para utilizar como número de asiento
_voucherSequenceReference = NumberSeqReference::findReference(extendedTypeNum(SalesInvoiceVoucher));
    // mejor utilizar SalesParameters::numRefSalesInvoiceVoucher()

//Realizar las busquedas de las secuencias numéricas configuradas para utilizar como número del documento
_NumberSequenceReference    =   NumberSequenceReference::findByDatatypeAndScope(extendedTypeNum(SalesCreditNoteId));

//Instanciar la clase de secuencias numéricas para establecer el número de factura (documento)que se va utilizar
NumberSeq = numberSeq::newGetNumFromCode(NumberSequenceTable::find(_NumberSequenceReference.NumberSequenceId).NumberSequence);

//Instanciar la clase de secuencias numéricas para establecer el número de asiento que se va utilizar
NumberSeqVoucher= numberSeq::newGetNumFromCode(NumberSequenceTable::find(_voucherSequenceReference.NumberSequenceId).NumberSequence);
 
 
Number = numberSeq.num();
 
//Es necesario establecer un nivel de transacción mayor a 1 para que se pueda generar una secuencia numerica
ttsbegin;
if (_voucherSequenceReference && !_voucherSequenceReference.AllowSameAs)
{
    voucher=NumberSeqVoucher.num();
}
else
{
       voucher = Number;
}
ttscommit;

//Establecer el numero de documento y asiento   
numberSeq.setNumVoucherLec(Number,voucher);


EL código especificado anteriormente puede ser utilizado dentro de la clase NumberSeq como un método publico estatico para que pueda ser invocado desde cualquier parte del desarrollo.