Вы находитесь на странице: 1из 12

Blog
Artículos y noticias relacionadas con el mundo AX3 group

HOME | MICROSOFT DYNAMICS AX 2012

Publicaciones etiquetadas ‘microsoft dynamics ax 2012’

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.

1.- Tipos comunes de demandas y suministros

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.

2.- Tipos de demandas y suministros opcionales basadas en políticas máster

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.

3.- Tipos adicionales para escenarios “lean” o de fabricación de proyectos

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.

LEER MÁS SIN COMENTARIOS

Twittear Like 0

Alternativa para buscar objetos


que contienen determinado
código en Ax2012
Escrito por Andrés Mota el septiembre 16, 2015. Posteado en Artículos

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;

for (i = conlen(source); i; i--)


{
if (match(searchTerm, conpeek(source, i)))
{
info(xUtilElements::parentName(_utilElements)+"\"+_utilElements.Name);
break;
}
}
}

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

Acceder a un método de una


clase ListPageInteraction desde
un formulario
Escrito por Miriam Morales el junio 26, 2015. Posteado en Artículos

/
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:

La forma correcta de llamar al

método sería con las siguientes líneas de código:


Object object;
FormObjectSet set;
smmContactsListPageInteraction pageInteraction;

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

Unit Test Framework en


Microsoft Dynamics Ax 2012
Escrito por Andrés Mota el junio 11, 2015. Posteado en Artículos

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;
}

Después necesitamos crear la clase que va a ejecutar los testeos: Creamos


AX3CalculatorClassTestCase que hereda de la clase estándar SysTestCase
[SysTestTargetAttribute( "AX3CalculatorClass" ,UtilElementType::Class)]
public class AX3CalculatorClassTestCase extends SysTestCase
{
AX3CalculatorClass calculatorClass;
}

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();
}

Por último, los métodos de testeo propiamente dichos:


[SysTestMethodAttribute]
public void testSum()
{
this.assertEquals( 5 ,calculatorClass.sumValues( 3, 2));
}

Una vez compilada la clase, la ejecutamos utilizando el menú contextual del objeto, Add-Ins, Ejecutar

tests: Se procesará el testeo satisfactoriamente, ya que el

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));
}

Guardamos, compilamos y volvemos a ejecutar la prueba, y recibiremos un error indicando más


información sobre éste:

/
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

En la siguiente entrada me centraré en el uso de las dimensiones nancieras en los diarios de


contabilidad.
LEER MÁS

Twittear Like 0

Obtener dimensiones nancieras


de una entidad en Ax 2012
Escrito por Andrés Mota el abril 18, 2013. Posteado en Artículos

Antes de nada, quería presentarme, mi nombre es Andrés Mota y me he incorporado AX3


recientemente, con muchas ganas de abordar nuevos retos y aportar todo lo que pueda en este
equipazo. Llevo trabajando con Ax (aka Axapta) más de 10 años, sobretodo en el ámbito técnico, y
liderando la parte tecnológica en varias implantaciones de este producto. Tengo bastante experiencia
además en otras tecnologías como Sharepoint, SQL Server, Analysis Services, Reporting, y .NET, soy
un auténtico apasionado de las nuevas tecnologías y siempre intento estar a la última en conocerlas.
Este es mi per l de linkedin por si quereis verlo en más detalle: http://goo.gl/Va8S2 Como primer
post, algo sencillo, detallar como obtener los valores de dimensiones nancieras en Ax 2012,
basándonos en una entidad (En este caso, un cliente) ya que es algo que cambia bastante respecto a
versiones anteriores y todos los que nos dedicamos a esto debemos conocer muy bien. Para ello, he
creado un job en el que se especi can dos maneras de obtener la información, la primera mediante el
uso de la clase DimensionAttributeValueSetStorage y la segunda mediante el uso de la vista
defaultDimensionView, que es usable también desde TSQL. Este es el ejemplo de código, realizado en
AX 2012 R2.

/
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

Copyright © 2019 AX3 group | Prysma | Aviso Legal

Вам также может понравиться