Algoritmia - We are geeks, after all ;)
  Crear una cuenta
Inicio Buscar Foros Chat Downloads Login
 [Login]
Foros
Ir a los foros 

Menú Trucos Ax
 Inicio(Noticias) :
 Inicio
 Enviar Noticias
 Archivo de noticias
 Buscar
 Temas

 Miembros :
 Lista de miembros
 Tu Cuenta(Regístrate)

 Comunidad :
 Chat

 Foros

 Links

 Downloads

 Estadísticas :
 Estadísticas
 Top 10
 Encuestas

 Otros Servicios :
 Publicidad


 Miscelanea :
Añadir a favoritos
Contactar


Hemos recibido

impresiones desde Diciembre 2005


 Enlázanos :
Copia el código siguiente en tu web para enlazarnos :


Trucos Ax


Mensajes rápidos

Sólo los usuarios registrados pueden escribir login o crear una cuenta.

Trucos
Ir a trucos programación
Ir a trucos consultoría

AxSearch

AxSearch
Es un motor de búsqueda
específico sobre temas
de Axapta (Dynamics Ax)

Anuncios



Mapa

¿De donde venimos?
Ubicación de visitantes de esta página

Webs Amigas
[axapta-links.com] - The startpage for Axapta
DaxGuy


Fred Shen

Comunidad Ax
Conunidad AX

Anuncios



Trucos Ax: Foros

Trucos Ax :: View topic - Usar 2 unidades de medida en las Ventas
 Forum FAQForum FAQ   SearchSearch   UsergroupsUsergroups   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Usar 2 unidades de medida en las Ventas

 
Post new topic   Reply to topic    Trucos Ax Forum Index -> Trucos configuración
View previous topic :: View next topic  

¿ Como valoras este truco (1/5) ?
5
75%
 75%  [ 3 ]
4
25%
 25%  [ 1 ]
3
0%
 0%  [ 0 ]
2
0%
 0%  [ 0 ]
1
0%
 0%  [ 0 ]
Total Votes : 4

Author Message
Manekaze
Site Admin
Site Admin


Joined: Dec 02, 2005
Posts: 384

PostPosted: Thu Mar 23, 2006 11:26 pm    Post subject: Usar 2 unidades de medida en las Ventas Reply with quote

//**********************************************************
// 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 Wink

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 Smile


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 Razz ).


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 Razz

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

static void bufferSetTransQtyUnit(Common  buffer)
{
    InventMovement  movement        = InventMovement::construct(buffer);

    UnitQty         qty;
    ;
    qty = movement.transQty();
    /*  TrucosAxapta.com - Que no convierta unidades
    qty   = UnitConvert::qty(movement.transQtyUnit(),
                             movement.transUnitId(),
                             movement.inventTable().inventUnitId(),
                             movement.itemId()
                            );
    */

    qty   = decRound(qty,InventTable::inventDecimals(movement.itemId()));
    movement.setTransQty(qty);

    qty   = decRound(movement.transQtyUnit(),Unit::decimals(movement.transUnitId()));
    movement.setTransQtyUnit(qty);
}


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)

x++:

void  setInventDeliverNow()
{
    SalesLine salesLine;
    ;

   /* 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 Razz



Bien, ya podemos vender jamones por piezas y cobrarlos por kilos Smile



Saludos,

Mkz.
Back to top
View user's profile Send private message Visit poster's website
Display posts from previous:   
Post new topic   Reply to topic    Trucos Ax Forum Index -> Trucos configuración All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©

 
Trucos Axapta 
Comunidad aprobada por :
Microsoft corp. MVP LogoVisit community


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.