Академический Документы
Профессиональный Документы
Культура Документы
Blog
Artículos y noticias relacionadas con el mundo AX3 group
Tipologías de demandas y
suministros en Microsoft
Dynamics 365 for Operations (1ª
parte)
Escrito por Daniel Balaguer el mayo 17, 2017. Posteado en Noticias
/
Los cálculos de plani cación de cualquier empresa deben tener en cuenta diferentes tipos de
demandas y suministros. En algunos casos se deben contemplar órdenes de venta y pronósticos de
demanda, mientras que en otros deben aparecer escenarios de fabricación o distribución, donde los
inventarios y las órdenes de suministros deben estar plani cadas y actualizadas en tiempo real.
Tanto Microsoft Dynamics 365 for Operations como Dynamics AX 2012 R3 comparten la misma
funcionalidad para el control de demandas y suministros, así como la creación del master de
plani cación. En esta publicación desgranaremos en los diferentes tipos de demandas y suministros
que nos ofrece la herramienta de Microsoft.
Los cálculos de plani cación contemplan diferentes tipos de demandas y suministros, cada uno de
ellos se identi ca en los requisitos de un artículo y en el programa de suministro que este tiene. El
sistema permite identi car demandas y suministros tanto para entornos comunes como para los de
fabricación. De esta forma, podemos conocer las demandas actuales y enfrentarlas a la producción
real.
Los tipos opcionales permiten re ejar los casos especiales, como previsiones de oferta o
cotizaciones de ventas con una alta probabilidad para oportunidades relacionadas, solicitudes de
pedido o de material comprado.
/
Permite re ejar cotizaciones de ventas que nalmente se convierten en órdenes de
Permite incluir pronósticos de ofertas y de demanda para tener una previsión como estrategia de
empuje (como productos estacionales o productos alimenticios con una fecha de maduración
inherente) que requieren de unos tiempos especiales.
Incluye planes de continuidad como demandas. Algunos escenarios orientados a la venta al por
menor implican planes de continuidad que deben considerarse como demanda, como el envío
mensual recurrente de productos.
Considera la posibilidad de contar las solicitudes de presupuestos como suministros. Algunos
escenarios implican peticiones de oferta para materiales comprados que dan como resultado
una orden de compra.
Tiene en cuenta las solicitudes de compra como suministros. Algunos escenarios también
implican solicitudes de material comprado que siempre culminan en una orden de compra, por lo
tanto, no son un suministro como tal.
En ellos deben contemplarse además las demandas derivadas de órdenes de ventas de proyectos,
previsiones y requisitos de artículos. Los tipos adicionales se aplican a escenarios “lean” como
kanbans jos, programados y otras variaciones de estos.
Como ves, las posibilidades que ofrece la suite Microsoft Dynamics 365 para el control de
operaciones de suministros y demandas se adaptan a escenarios muy particulares y diversos. Pero
sus capacidades no acaban aquí, en un próximo artículo seguiremos desgranando más tipologías
que contemplan. No te olvides, suscríbete a nuestro blog y recibe en tu correo electrónico nuestras
nuevas publicaciones.
Twittear Like 0
Muchas veces nos encontramos en la necesitad de buscar un determinado texto en el código X++ y
hemos visto como en las últimas versiones de Ax la velocidad de la herramienta de búsqueda en el
/
AOT ha disminuido considerablemente. Una alternativa que utilizo muy a menudo es un simple job al
que añado ltros sobre la tabla (Vista) utilelements; -en este caso sobre métodos de tablas y clases
en la capa de desarrollo VAR-.
static void AX3CustomAOTSearch(Args _args)
{
UtilElements _utilElements;
int i;
container source;
TreeNode treeNode;
str searchTerm = 'AX3VendRef';
;
while select _utilElements
where (_utilElements.RecordType == UtilElementType::ClassInstanceMethod
|| _utilElements.RecordType == UtilElementType::ClassStaticMethod
|| _utilElements.RecordType == UtilElementType::TableInstanceMethod
|| _utilElements.RecordType == UtilElementType::TableStaticMethod)
&& _utilElements.UtilLevel == UtilEntryLevel::var
{
source = _utilElements.Source;
El resultado es una búsqueda bastante más rápida que la que provee la herramienta estándar,
mostrando en el infolog los objetos que contienen en su código los términos de búsqueda indicados.
Podemos mejorar el proceso para que permita ir al código directamente, o permitiendo búsqueda
también sobre otros tipos de objetos, tales como forms, en los que habría que utilizar otras clases
como TreeNodeTraverser, etc.
LEER MÁS SIN COMENTARIOS
Twittear Like 0
/
Alguna vez nos hemos encontrado con la necesidad de acceder a un método que proviene de un
formulario de tipo ListPage. Como en estos formularios no es posible crear métodos, es necesario
hacerlo en la clase asociada a dicho formulario. Por ejemplo, vamos a crear un método en la clase
ListPageInteraction correspondiente, que será el que llamemos posteriormente en el formulario.
class SmmContactsListPageInteraction extends ListPageInteraction
{
Common common;
}
public Common AX3getOrig(Common _common = common)
{
common = _common;
return common;
}
En el método init() es donde vamos a realizar la llamada al método creado anteriormente. Ahora
vamos a intentar llamar al método creado en el paso anterior. Si lo hiciésemos a partir del método
caller() no podemos ver el método y si, además, intentásemos abrir el formulario nos saldría el
siguiente error:
set = callerRecord.dataSource();
pageInteraction = set.formRun().pageInteraction() as smmContactsListPageInteraction;
common = pageInteraction.AX3getOrig();
Como podemos ver en la siguiente imagen, ya nos aparece nuestro método y si abrimos el
formulario no aparece ningún mensaje de error.
/
LEER MÁS
Twittear Like 0
Una funcionalidad muy interesante que suele pasar totalmente desapercibida en Ax, es el Unit Test
Framework. Imaginad que vamos a comenzar un desarrollo basándonos en ciertas especi caciones
del cliente; antes de empezar a picar podemos plantearnos crear un paquete de pruebas unitarias
para testear nuestras modi caciones durante su ciclo de vida y validar que no existan errores de
ejecución en cada cambio, así como para medir los tiempos de ejecución de nuestros objetos.
Vamos a realizar un ejemplo muy sencillo para entender el mecanismo de uso, Primero creamos una
clase muy sencilla con un método que va a ejecutar una suma de dos valores enteros:
class AX3CalculatorClass
{
}
public int sumValues( int a, int b)
{
return a+b;
}
el método setup, que va a con gurar la clase de pruebas e instanciar los objetos que van a ser
usados durante el testeo:
/
public void setUp()
{
// Crear una instancia de AX3CalculatorClass para utilizarla en la clase SysTestCase
calculatorClass = new AX3CalculatorClass();
super();
}
Una vez compilada la clase, la ejecutamos utilizando el menú contextual del objeto, Add-Ins, Ejecutar
los métodos con el pre jo Test, cumplen con los valores esperados.
Si modi camos el método testSum de la clase Testing de la siguiente manera, modi cando el valor
esperado por 10 en lugar de 5.
[SysTestMethodAttribute]
public void testSum()
{
this.assertEquals( 10 ,calculatorClass.sumValues( 3, 2));
}
/
El sistema nos está cantando que espera valor 10 y en esta ejecución devuelve el valor 5 por lo que
nuestra prueba unitaria es fallida. Con este ejemplo, podemos hacernos una idea de la sencillez de
manejo que tiene el framework y las posibilidades que puede darnos. Para más información, os
remito a la MSDN en el que se amplia la información sobre el UTF.
LEER MÁS
Twittear Like 0
Establecer dimensiones
nancieras de una entidad en Ax
2012
Escrito por Andrés Mota el mayo 24, 2013. Posteado en Artículos
Este el segundo de una serie de posts relacionados con las dimensiones nancieras de Ax 2012, en el
primer post vimos como obtener los valores de dimensiones nancieras por defecto en una entidad,
en este caso desglosamos dos maneras muy parecidas de modi car estos valores (Tener en cuenta
que la primera manera de hacerlo se encuentra comentada, para que se ejecute directamente la
segunda manera). Este es el ejemplo de código, realizado en AX 2012 R2, en el que se modi can los
valores del departamento y del centro de coste.
1 //AX3 AMA Generate default dimensions values in an entity (CustTable, f.e.) Begin
2 static void AX3_SetEntityDimensionValues(Args _args)
3 {
4 CustTable custTable;
5
6 Struct struct = new Struct();
7 int i;
8 //This values can be readen from any source
9 str department = '10000002';
10 str department2 = '10000001';
11 str center = '10050005';
12 str center2 = '00000001';
13
14 container ledgerDimensionContainer;
15
16 DimensionAttribute dimAttr;
17 DimensionAttributeSetItem dimAttrSetItem;
18 DimensionEnumeration dimensionSetId;
19 DimensionDefault dimensionDefault;
20 DimensionAttributeValue dimAttributeValue;
21
22 ;
23 /*
24 ttsBegin;
25
26 select FirstOnly FirstFast ForUpdate custTable;
27 //We suppose that CustTable record is created
28
/
29 struct.add(literalStr(Department),department);
30 struct.add(literalStr(Center), center);
31 ledgerDimensionContainer += struct.fields(); //First position of the container
32
33 //Following positions of the container are the names and the values of the dime
34 for(i=1;i<=struct.fields();i++)
35 {
36 ledgerDimensionContainer += struct.fieldName(i);
37 ledgerDimensionContainer += struct.valueIndex(i);
38 }
39 if(struct.fields())
40 {
41 //Format of the container:
42 //[2,literalStr(Department),'0000001',literalStr(Center),'0000001'];
43 custTable.DefaultDimension = AxdDimensionUtil::getDimensionAttributeValueSe
44 custTable.doUpdate();
45 }
46 ttsCommit;
47 */
48
49 //------ANOTHER WAY----- Begin. using AxdDimensionUtil class too//
50
51
52 ttsBegin;
53
54 select FirstOnly FirstFast ForUpdate custTable;
55
56 struct = new Struct();
57 ledgerDimensionContainer = conNull();
58
59
60 dimensionSetId = DimensionCache::getDimensionAttributeSetForLedger();
61 while select dimAttr
62 order by Name
63 where dimAttr.Type != DimensionAttributeType::MainAccount
64 join RecId from dimAttrSetItem
65 where dimAttrSetItem.DimensionAttribute == dimAttr.RecId &&
66 dimAttrSetItem.DimensionAttributeSet == dimensionSetId
67 {
68
69 if (dimAttr.Name == literalStr(Department)) //We can use BackEntityType field =
70 {
71 dimAttributeValue = AxdDimensionUtil::validateFinancialDimensionValue(dimAt
72 struct.add(dimAttr.Name, department2);
73 }
74 if (dimAttr.Name == literalStr(Center)) //We can use BackEntityType field == ta
75 {
76 dimAttributeValue = AxdDimensionUtil::validateFinancialDimensionValue(dimAt
77 struct.add(dimAttr.Name, center2);
78 }
79
80 }
81 ledgerDimensionContainer += struct.fields();
82
83 for (i = 1; i <= struct.fields(); i++)
84 {
85 ledgerDimensionContainer += struct.fieldName(i);
86 ledgerDimensionContainer += struct.valueIndex(i);
87 }
88 if(conLen(ledgerDimensionContainer) != 0)
89 {
90 dimensionDefault = AxdDimensionUtil::getDimensionAttributeValueSetId(ledgerDime
91
92 if (custTable.DefaultDimension)
93 {
94 custTable.DefaultDimension = DimensionDefaultingService::serviceMergeDe
95 }
/
96 else
97 {
98 custTable.DefaultDimension = dimensionDefault;
99 }
100
101 custTable.doUpdate();
102 }
103
104 ttsCommit;
105
106 //------ANOTHER WAY----- End.//
107
108 }
109 //AX3 AMA Generate default dimensions values in an entity (CustTable, f.e.) End
Twittear Like 0
/
1 //AX3 AMA Obtain default dimensions values from an entity (CustTable, f.e.) Begin
2 static void AX3_GetDimensionValuesFromEntity(Args _args)
3 {
4 CustTable custTable;
5 DimensionAttributeValueSetStorage dimStorage;
6 Counter counter;
7 DimensionAttribute dimAttribute;
8 DefaultDimensionView defaultDimensionView;
9
10 ;
11 select FirstOnly FirstFast custTable;
12
13 dimStorage = DimensionAttributeValueSetStorage::find(custTable.DefaultDimension );
14
15 info( strFmt("%1 method" ,classId2Name(classIdGet(dimStorage))));
16 info( "-----");
17
18 for (counter= 1 ; counter<= dimStorage.elements() ; counter++)
19 {
20 dimAttribute = DimensionAttribute::find(dimStorage.getAttributeByIndex(counter))
21 info( strFmt("DimName:%1 DimValue:%2" , dimAttribute.Name ,dimStorage.getDisplay
22 }
23 info( "-----");
24 info( strFmt("%1 method" ,tableId2name(defaultDimensionView.TableId)));
25 info( "-----");
26 while select defaultDimensionView
27 where defaultDimensionView.DefaultDimension == custTable.DefaultDimension
28 {
29 dimAttribute = DimensionAttribute::find(defaultDimensionView.DimensionAttrib
30 info( strFmt("DimName:%1 DimValue:%2" , dimAttribute.Name ,defaultDimensionV
31
32 }
33
34 }
35 //AX3 AMA End
LEER MÁS
Twittear Like 0
AX3 Group
Calle Manuel Luna 12, 28020 Madrid, España
INICIO EMPRESA
SERVICIOS SOLUCIONES /
BLOG CONTACTO