Posted: Thu Mar 23, 2006 11:26 pm Post subject: Usar 2 unidades de medida en las Ventas
//**********************************************************
// Tipo : Implantación/Consultoría
// Titulo : Usar dos unidades en las ventas
// Codigo : TC0004
// Keywords : Configuración, Consultoría, Axapta 3.0
// Sub-keywords : Conversión Unidades, Ventas, Múltiples unidades,
// Inventario
//**********************************************************
Antes de empezar nos gustaría aclarar que hemos decidido publicar este
truco en el apartado de consultoría aunque tenga cierto contenido de
programación, debido a dos razones:
1. El contenido de programación es de un nivel muy básico.
2. El simple hecho de conocer la posibilidad de usar este truco
puede entenderse como herramienta de un implantador para decidir un
camino más o menos complicado para solucionar un posible caso real.
Usar 2 unidades en ventas
Axapta ofrece la posibilidad de determinar distintas unidades para un
mismo artículo en función de el contexto en el que se este tratando este
artículo. De esta forma disponemos de unidad de Compra, unidad de
Inventario y unidad de Venta.
Esto nos es muy útil por ejemplo :
Imaginemos que vendemos refrescos : Los compramos en cajas de 50
latas, el inventario lo controlamos a nivel de lata y los vendemos en
packs de 5.
Pues bien, definiendo todo esto en la solapa cantidades de la ficha de
artículos Axapta nos ayuda a automatizar la tarea de la compra, la venta
y el control de stock.
Esto está muy bien, pero … vamos a complicarlo
Vamos a imaginar que vendemos Jamones: Los compramos y vendemos
por unidades, pero los pagamos/cobramos por peso, en cambio el
inventario lo llevamos por unidades.
Bueno, vamos a tener que hacer alguna “trampa” pero eso no nos va a
asustar ahora, no?
El primer problema que nos encontramos es que nos interesa definir las
unidades de nuestro artículo como sigue :
Unidad de compra : Kg
Unidad de inventario : Ud
Unidad de Venta : Kg
Resulta que Axapta se queja (con razón) de que no tenemos definida una
conversión de unidades de “Ud” a “Kg” o viceversa.
Tenemos varias opciones :
1.- La menos recomendable : “Retocar” el método validate de estos
campos para que no se queje. Mmmm esta no me gusta mucho.
2.- Definir una conversión a nivel global
(Base/Configurar/Unidades/Conversión de Unidades) de “Ud” a
“Kg” 1 = 1. Mmmm esta me gusta más que la anterior pero sigue siendo
radical.
3- Definir una conversión de unidades para nuestro artículo particular
(jamón) 1=1 simplemente para que no se queje al definir nuestro
artículo. Mmmm esta parece la menos agresiva
Perfecto, ya tenemos definido el artículo. ¿ Y ahora que ?
Como suponemos (que no tiene porqué), que en esta empresa no
venderemos únicamente jamones, pero estos requieren de un
tratamiento especial… vamos a duplicar el formulario SalesTable (NOTA: en este ejemplo solo vamos a tratar las ventas, las compras se
tratarían de forma muy similar, pero eso ya os lo dejamos a vosotros ).
Al nuevo formulario lo vamos a llamar “SalesTableJamones”.
Haremos los siguientes cambios:
• Le vamos a añadir el campo QtyOrdered en el grid de las líneas, y
vamos a cambiarle el label por “Unidades”.
• Al campo SalesQty le cambiamos el label por “Peso”
• Eliminamos el campo “SalesUnit” del grid (ya que siempre serán kilos)
• En el campo SalesPrice : label = “Precio x Kilo”
Más o menos nos debería quedar así :
Sigamos, ahora vamos a abrir el formulario y a crear un pedido…
Ohhh !!!!!!, cuando entramos las unidades nos recalcula el peso y
viceversa en la curiosa proporción 1 = 1
Bien, aquí es donde hacemos la intervención más agresiva del truco.
Cabe destacar que vamos a hacerla un poco “a saco” sin tener en cuenta
que en esta empresa se pueden vender otros productos en los que quizá
necesitemos realizar conversión entre unidad de venta y unidad de
inventario, pero lo hacemos así para no complicar el ejemplo.
Vamos a modificar el método CalcQtyOrdered de la tabla Salesline :
x++:
InventQty calcQtyOrdered(Qty salesQty = this.salesQty) { //return this.SalesPurchLine::calcQtyOrdered(salesQty); return this.QtyOrdered; // TrucosAxapta.com : No queremos que realice la conversión de unidades }
Tambien modificaremos el método bufferSetTransQtyUnit de la
clase InventMovement:
x++:
staticvoid bufferSetTransQtyUnit(Common buffer) {
InventMovement movement = InventMovement::construct(buffer);
Para que esta modificación fuese menos agresiva deberíamos marcar las
líneas de venta creadas desde nuestro formulario SalesTableJamones con
alguna marca que nos permita diferenciar si debemos o no realizar la
conversión en estos métodos. O bien crear una lista (tabla) de artículos a
los que no debemos aplicar la conversión. O añadir una marca en la ficha
del artículo…. son muchas las opciones.
Con esto ya funcionan las entregas totales, pero … ¿ y si realizo una
entrega parcial ?
Existen unos campos en la solapa cantidad de las líneas de los pedidos en
los que podemos especificar la cantidad que vamos a entregar, ya que no
tiene porque ser la cantidad total del pedido (Campo “entregar ahora”).
Es decir, un pedido podemos entregarlo en varias partes (varios
albaranes).
Para que funcione con nuestro parche debemos corregir alguna cosilla :
• En la solapa cantidad de las líneas de venta, añadimos el campo
InventDeliverNow y cambiamos el label a “Ud. a entregar”.
• Cambiamos el label del SalesDeliverNow a “Kg. a entregar”
Ahora solo nos falta tocar una función de la tabla Salesline que se llama
SetInventDeliverNow(). Queda así :
x++:
void setInventDeliverNow() {/* TrucosAxapta.com - No queremos que convierta las cantidades de "Entregar ahora"
this.inventDeliverNow = UnitConvert::qty(this.salesDeliverNow,
this.salesUnit,
this.inventTable().inventUnitId(),
this.itemId);
*/ }
Y la otra función que se llama igual pero está en la SalesParmLine (es por
si informamos de la entrega parcial desde Contabilizar/Albaran en lugar
de desde el pedido)
/* trucosAxapta.com - No queremos que convierta las unidades
salesLine = this.salesLine();
this.inventNow = UnitConvert::qty(this.deliverNow,
salesLine.salesUnit,
salesLine.inventTable().inventUnitId(),
this.itemId);
*/ }
Con esta modificación, el usuario deberá especificar cuantos jamones
entrega y cuanto pesan. Quizá se podría incluir algún tipo de validación,
para evitar que nos dejen una de las dos unidades a 0, en el método
validateWrite de la clase SaleslineType, pero eso ya lo dejamos para
vosotros
Bien, ya podemos vender jamones por piezas y cobrarlos por kilos
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
Axapta y Dynamics Ax son marcas registradas de Microsoft corporation. Todos los logos y marcas son propiedad de sus respectivos propietarios. Excepto trucosAx.com que este si que es mio :-). (c) 2005 by Manel Querol (Mkz) TrucosAx.com no pertenece ni está asociada a Microsoft corporation. Los fragmentos de código y proyectos importables que aquí se muestren están realizados sobre bancos de pruebas. No nos hacemos responsables de cualquier daño o pérdida de datos que se pudiera originar del hecho de instalar alguno de estos ejemplos en un sistema productivo. Es responsabilidad del usuario ser consciente del impacto que puede ocasionar en sus aplicaciones el uso del código que de aquí extraiga.