1 Caracteristicas que debe cumplir un SGA
Entre las caracteristicas que debe implementar un sistema de SGA se encuentra:
- El Slotting permite diseñar dinámicamente los lugares de almacenamiento en la zona de recogida, basándose en el análisis de información combinada como la rotación de productos, las frecuencias y tipos de recogida, los volúmenes y la disposición de los almacenes.
- La triangulación aumenta la productividad de los operadores al optimizar las rutas de los almacenes.
- Picking Cluster permite elegir varios pedidos al mismo tiempo y colocarlos en diferentes contenedores por pedido: en lugar de llevar a cabo varias misiones, puede elegir un grupo de pedidos en una sola misión.
- El Cluster de Almacenamiento le permite almacenar múltiples SKUs durante una sola misión, basándose en lógicas de selección predeterminadas.
- El pre-envío le permite construir un pedido virtualmente antes de recogerlo, calculando el peso y la cantidad de todas las paletas multi-SKU que contiene.
- Trazabilidad en tiempo real mediante sistemas de alerta automática para cada fase (recepción, almacenamiento, preparación, envío), la funcionalidad permite detectar cuellos de botella y acontecimientos inesperados tan pronto como se producen, antes de que puedan repercutir en la productividad del almacén, permitiendo una gestión dinámica mediante el reajuste de las prioridades de la misión y la asignación de recursos.
- La gestión de muelles/patios permite sincronizar las operaciones de almacenamiento con los eventos de los muelles, por ejemplo, programando los espacios de transporte en función de la planificación de la disponibilidad de los patios y los flujos de carga y descarga.
2 Conceptos básicos
Menus: Setup > Inventory > Inventory Status Setup > Inventory > Item Groups Setup > Inventory > Physical dimension groups Setup > Work > Work Templates Setup > Work > Custom work types Setup > Work > Work policies Setup > Work > Work exceptions Setup > Work > Location directive failures Setup > Work > Work classes Setup > Work > Work pools Setup > Work > Work audit template Setup > Warehouse > Sites Setup > Warehouse > Warehouses Setup > Warehouse > Locations Setup > Warehouse > Location setup wizard Setup > Warehouse > Location Formats Setup > Warehouse > Location Profiles Setup > Warehouse > Location Types Setup > Warehouse > Zone Groups Setup > Warehouse > Zones Setup > Warehosue > Unit Sequence Groups Setup > Warehosue > Pack size categories Setup > Warehosue > License plates Setup > Warehosue > Fixed locations Setup > Replenishment > Replenishment types Setup > Replenishment > Replenishment Templates Setup > Cycle Counting > Cycle Count Thresholds Setup > Cycle Counting > Cycle Count Plans Setup > Dimension Groups – Storage Dimensions Setup > Dimension Groups – Tracking Dimensions Setup > Mobile Device > Disposition Code Setup > Mobile Device > Cluster Profiles Setup > Location Directives. Setup > Work User > Worker Outbound Waves > Work details Work > All work Work > Work inventory transactions Work > Work report Work > Closed work report Packing and containerization > Containers Packing and containerization > Packing Cycle counting > Open cyclecount work Replenishment > Replenishments Replenishment > Load demand replenishment
{ "whLoc":"2000", "clientId":"1", --> client_code "itemNo":"00067449", --> item_code "variant":"00000", --> variant "numBquWqu":"1.0", "gow":"2000", --> Goods owner "ibdLine":"0", "baseQty":"+4.0", --> Cantidad en unidades base "dualQty":"+0.0", --> Cantidad dual en productos que lo soporten "luId":"600040933", "stoLocId":"CUBY-05-LEVEL-28-SHUTTLE-01", --> Ubicación "stockGroupId":"DISP", "availability":"STORED" } Inbound: { "clientId":"1", "ibdNo":"2220-000927", "systemPartner":"HOST", "whLoc":"2000", "ibdTypeId":"SUMI", "deliveryNoteNo":"0075904540", "deliveryNoteDate":"20220120", "priority":"5", "mainState":"ACTIVE", "laExchange":"NOT_NEEDED", "IBDLUACK00007":{ "systemPartner":"HOST", "ibdNo":"2220-000927", "clientId":"1", "luId":"600013639", "loadAidId":"TUB4", "cubatureId":"TUB", "grossWeight":"3.59", "grossWeightUnit":"kg", "weightKind":"CALCULATED" }, "IBDLUDETAILACK00007":{ "ibdSystemPartner":"HOST", "systemPartner":"HOST", "ibdNo":"2220-000927", "ibdlvNo":"2220-000927", "no":"3", "clientId":"1", "itemNo":"00112178", "variant":"00000", "luId":"600013639", "numBquWqu":"1.0", "stockGroupId":"DISP", "gow":"2000", "batch":"8115591", "bbDate":"20230930", "ibdLine":"110", "baseQty":"5.0", "dualQty":"0.0", "grossWeight":"190.0", "grossWeightUnit":"g" } }
Estructura de almacenes
2.1 Almacén
Por tradición, en Axional ERP el concepto de almacén es un concepto virtual que clasifica el stock pero no determina la estructura física de un edificio donde almacenar mercancía. Por ello, en el ERP se tuvo que construir una superestructura para poder agrupar las particiones lógicas y poder definir a qué almacén físico correspondía. A esto se le llamó "recinto".
En una estructura más moderna como la de WMS, esta diferenciación no debe copiarse ya que tenemos muchos métodos alternativos para separar el stock de forma lógica.
Por ello, el concepto "almacén" en WMS corresponderá al edificio o localización física en donde podemos guardar mercancía.
Tradicionalmente se le denomina de distintas formas:
- Warehouse Location (whLoc o whLocId): It refers to the identifier of the warehouse location
- Simplemente Location
En nuestro caso lo referiremos simplemente como almacén y dispondrá de un código: wh_code.
Cada almacén debe tener una ubicación de recepción por defecto (Default receipt location) y una ubicación de salida por defecto (Default issue location). Estas son las ubicaciones a las que irá el stock cuando se recuenta un producto en entradas (aparece el stock) y a partir de ahi, todo son movimientos de entrada-salida
2.2 Ubicaciones (Bins or locations)
Una ubicación es un "hueco" en donde podemos tener existencias de productos. En un sistema SGA, toda la gestión de existencias se basa en la asignación de las mismas a ubicaciones.
A las ubicaciones se les puede dar varios nombre en ingles: bins, storage locations (stoLocId) o simplemente locations.
- Aisles: The space between two racks is referred to as an aisle
- Rack: A rack consists of various shelves. The shelves correspond to storage compartments.
- Storage Compartments: A storage compartment is the next smallest unit within a rack and is located between two vertical rack up-rights. Storage compartments can be further divided into individual storage locations,
- Storage Locations: A storage location is a space where a loading unit (LU)
- Single Storage Locations: A single storage location is defined in a compartment. The storage location volume is equal to the compartment volume. The storage location is considered occupied if one loading unit is posted to it.
- Multiple Storage Locations: At a multiple storage location two or more loading units can be stored. Usually capacity is meassured in occupied width in the storage location.
Documentacion sobre el esquema de ubicaciones dentro del almacen:
https://innovation-product-documentation.azurewebsites.net/AWHS-WarehouseSetup.html
Notas:
The algorithm will calculated summary for only one of dimension-width. If our profile will have width 900mm and we will make a grouping for slot, for 3, we have 2700mm to use, and we will do a simple math only for units that have width more than 900mm. We do a division the unit width by usable width of location from location profile with roundup. If we have unit-width 2000mm, 2000/900=2,22 round up to 3. We need all three non-occupied locations in group. If we have unit-width 1700mm, 1700/900=1,88 round up to 2. We need non-occupied locations in group which are neighbors. One of them must have another as before or after.
In case of pallets stacking, algorithm also checks Usable location height but only for occupied location with exactly the same Item and unit. Not aloud putting on different items.
2.2.1 Fixed Bins
2.2.2 Floating Bins
2.2.3 Content Bin
Es una subtabla (tabla hija) de la ubicación y refleja el contenido de la misma. En cuanto una ubicación flotante se queda sin contenido, los registros de esta tabla desaparecen.
Si la ubicación es fija, entonces el contenido está siempre presente e indica el articulo o articulos que puede contener la ubicación.
- Ubicación
- Artículo
- Unidad de medida: Por ejemplo unidades o cajas. En una ubicació podemos tener un stock en cajas y otro en unidades
- Cantidad. Es la cantidad en la ubicación de unidades de medida (por ejemplo cantidad de cajas o unidades)
- Cantidad base. Siempre representa la cantidad en unidades para facilitar la gestión real del stock en unidades.
- Cantidad disponible para picking:
2.2.4 User locations
each warehouse user becomes a location with a location profile that is taken from the warehousing parameters. This location is created behind the scenes when you create warehouses workers.
Why do we need such a location? When the warehouse worker is between a PICK and a PUT, the inventory is located in this user location. (You may consider the user location to be the forklift the user drives.) A little surprising maybe, but it makes sense and it normally works fine. See below for a few of those user locations, created automatically. The location ID is the worker ID. Notice the field “Location profile” with the value “Use.” This came from the warehouse parameters.
What can go wrong with this? One could easily make a mistake in timing. When we want to be proactive and enthusiastically create warehouse users before we have entered a user default location profile in the warehousing parameters, we have created an unworkable situation. The warehouse worker will not be able to do anything. The user logs into the mobile client, goes through the steps of scanning data and clicking OK, and everything looks fine; but when the mobile step gets to the point of the PICK, the system will send the error:
License Plate Specified on a non-license plate controlled location. Update has been cancelled.
Most of us have seen this error before, and normally, this is easy to fix. We take the message literally and correct that checkbox on the location profile. But we can’t take any action now. The physical warehouse location I am using for the pick is license plate controlled.
What the system is really complaining about is that secret user location – and that user location has no location profile! The system is really saying the following:
I can’t find the location profile for the user location of the user that is currently logged in on the mobile client, so I have no idea whether that location is license plate controlled or not.
NOTE: The profile of the user location in this parameter has to have ‘yes’ specified for license plate tracking.
Now that we know what caused the error, we can easily fix the problem by going to Location profiles, as pictured above. We can easily find the location associated with our warehouse worker and update his location profile. Now we are back in business, we can ship and receive again.
What the system should do to prevent the problem is to warn the user when warehouse workers are created while there is no location profile set up yet in the parameters for the user location. This would be consistent with the functionality when creating locations interactively. The location profile is then a mandatory field.
Las ubicaciones de usuario, podrian autogestionarse (sin ser creadas en wmx_bin). Podriamos pensar que podriamos identificar la ubicación con el codigo de usuario y con el id del trabajo, pero esto puede crear algunos inconvenientes ya que en operaciones agrupadas como los cluster, podriamos tener operaciones agrupadas de put de todos los articulos del cluster. Esto no está razonado, asi que hay que pensar si la ubicación intermedia del trabajo es simplemente el código de usuario (USER1) o la suma del código de usuario + id de trabajo (USER1-8736382223). Otro inconveiente de usar esta ultima ubicación es que si el codigo de usuario es grande, puede que no tengamos un tamaño suficiente en el codigo de ubicación para poner el stock correctamente. De momento, nos podemos quedar con poner simplemente en el stock el codigo de usuario como ubicación y la matricula del trabajo y del stock nos determinará el trabajo al que pertenece un determinado stock.
2.3 Stock Status
- Código
- Inventory status: Indica si este estado del stock representa que el produto está disponible o bloqueado.
- Work template: El work template permite indicar si para gestionar este estado, queremos utilizar un sistema de dos fases en las que ponemos el producto en staging y despues ya lo mandamos a una ubicacion definitiva.
- Return disposition code
En las tablas de configuracion de la RF, podemos definir valores por defecto para cada uno de los menus de la RF. En el caso del Status de Stock, Podemos definir que para la pantalla de recepciones, si el almacen es XX o nulo para todos y/o si la ubicación es XX o nula, el valor es "Disponible".
Como ya podemos advertir, tendremos una pantalla de valores por defecto que nos permitirá elegir entre distintos campos/valores y configurar para el almacen y ubicación el valor que queremos que tenga por defecto.
<table name="wmx_invent_status"> <column name='invstat_code' type='varchar' size='15' required='y' info='The ID describing the status of the inventory' /> <column name='invstat_name' type='varchar' size='60' info='Name of inventory status' /> <column name='invstat_available' type='char' size='1' default='Y' required='y' info='Inventory in this status is available?' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_invent_status' columns='invstat_code' /> </table>
2.4 Item Batch
El lote es un identificador que permite categorizar el stock. Generalmente va unido a la fecha de caducidad (best before date) aunque hay algunos tipos de negocio que solamente requieren lote, pero no tienen fecha de caducidad.
"batch":"8115591", "bbDate":"20230930",
En la fecha de caducidad no hacemos una validación de fechas. Si la fecha de caducidad es por meses podemos poner 20230900, si la fecha es por años 20230000 y si la fecha es por dias 20230930
No admitimos nulos, porque son campos que deben registrarse siempre. Por ello, si no los usamos, deberiamos dejarlos en "", pero no podemos 'evitgarlos'
<table name="wmx_item_batch"> <column name="batch_id" type="serial" required="y" /> <column name="client_code" type="varchar" size="10" required='y' /> <column name="item_code" type="varchar" size="16" required='y' info='Identify item'/> <column name='batch_code' type='varchar' size='20' required='y' info='Batch Code' /> <column name='batch_name' type='varchar' size='60' info='Description of the batch' /> <column name='batch_expdate' type='date' info='Expiration date' /> <column name='batch_bbdate' type='date' info='Best Before date' /> <column name='batch_proddate' type='date' info='Production date' /> <column name='batch_country' type='varchar' size='20' info='Country of origine' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_item_batch' columns='batch_id' /> <unique name='u1_wmx_item_batch' columns='item_code, client_code, batch_code' /> </table> Field Type Configuration key Description DispositionCode String Identifying batch disposition code
2.5 Handling Unit
Tambien se las conoce como LPN (License Plate Number) o como cubeta (Tote)
En Axional WMS se trata de unidades temporales que agrupan el destino de tareas de almacén. Aunque generalmente todas las operaciones de un trabajo tienen como destino la misma HU (handling Unit) Se registra a nivel de tarea, para permitir realizar operaciones anidadas.
Se trata de un contenedor virtual, que en un momento determinado se convertirá o se trasladará su contenido a un Packaging o unidad de transporte.
https://www.avantiico.com/license-plates-and-warehouse-management-in-dynamics-ax-2012r3-series-2/
https://www.sonata-software.com/blog/dynamics/inventory-movement-using-advance-warehouse-dynamics-365
2.6 Clasificacion de ordenes de almacén
Las ordenes son el punto de origen de cualquier tarea del almacén. Aunque puede haber tareas o trabajos de almacen relacionados que provengan de otros trabajos/tareas, por lo general, el inicio de cualquier operación de almacén viene dado por las ordenes, que podemos clasificar en:
- Ordenes de entrada (Inbound)
- Ordenes de salida (Outbound)
- Ordenes de movimiento (Transfer Orders)
2.6.1 Ordenes de entrada
Las ordenes de entrada o "Inbound" están relacionadas con pedidos, albaranes o previsión de entrada de producto que nos puede venir de un ERP o interface externo.
La recepción de abonos o devoluciones de clientes, podría tambien pasar por aquí aunque tenemos pendiente de analizar si lo hacemos por aquí o implementamos un circuito específico de RMA
2.6.2 Ordenes de salida
Las ordenes de salida o "Outbound" están relacionadas con pedidos, albaranes o ordenes de envio de terceros que nos puede venir de un ERP o interface externo.
Las abonos o devoluciones a proveedores podría ser tambien un tipo de orden de salida de producto (Analizar)
Combinar multiples ordenes en un único envio
https://www.youtube.com/watch?v=U03h9ygAwaw
2.6.3 Ordenes de movimiento
Las ordenes de movimiento o transfer orders son operaciones que ordenan la generación de tareas para mover stock de un lugar a otro en al almacén. Un ejemplo de uso de este tipo de ordenes son las operaciones de reposición del almacén.
3 Slotting
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/warehouse-slotting
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/anchoring
4 Movimientos de inventario
Nos permiten mover stock de un lugar a otro del almacén, fuera de lo que son procesos de picking, inbound o replenishment.
Hay que pensar si los movimientos de inventario queremos que generen trabajos y los autocompleten (esto facilitaria estadisticas unificadas de operaciones), o si queremos que generen directamente movimientos de transferencia de stock en el almacén.
4.1 Movimientos manuales
Esta opción de menu de RF que permite escanear una ubicación, escanear un articulo o LP, confirmar cantidad y escanear la ubicación destino.
4.2 Movimientos guiados
Los movimientos guiados por plantilla. Se define una plantilla del trabajo y una directiva de localización, el operador escanea una ubicación origen y mediante la directiva de localización el sistema determina la ubicación destino a la que debe ir la mercancia y las tareas a realizar para hacerlo.
Algunos usos de esta opción podrian ser si traemos a una mesa de recuento unos determinadas cajas para realizar tareas de verificación, recuento o calidad. Una vez completada la operación podemos usar este método para devolver esta caja o paleta al almacén.
Tambien puede servir para devolver a la ubicación de almacén un pallet que ha tenido que bajarse a una playa para poder hacer picking sobre el mismo. Por ejemplo, cuando alguien baja un palet le puede poner un postit y cuando se hace el picking el postit se quita y esto es la marca para que un operario pueda usar esta función para devolver el pallet de la playa a las ubicaciones de almacenaje.
Otro uso menos ortodoxo, es que en el proceso de recepciones, al recontar el producto se pone en una ubicación de staging, pero no se crean trabajos para la ubicación final. Los operarios manualmente, puede coger un artículo o una ubicación de staging y solicitar mediante este proceso que les proponga las ubicaciones destino y realizar el movimiento/transferencia de almacén.
4.3 Reposición / Replenishment
In our warehouse we use the warehouse app for order picking. When starting the work on the device, it states a replenishment is needed on Product A. Needed for the order are 12 on hand in location X1 are 9 so a replenishment for 3 is needed. After the replenishment is done. the warehouse employee is asked to visit the same location twice. once for the 9 of product A that were on hand and once for the 3 replenished. We would prefer that after replenishment the work lines for product A are consolidated, making the work line stating pick 12 of product 9 at location X1? How can we accomplish this?
Sounds like you are hitting a problem related to wave demand replenishment (I think). I have noticed that, when work is linked to a replenishment, you can get one Work line for the quantity in the location, and a second line for the quantity that is to be replenished, even though that quantity will be picked from the same location.
I do not know a way to get a single work line in this scenario, but I think this idea describes your problem; no harm in voting it up. Replenishment - unexpected work splitting by the System
It is possible, with wave demand replenishment, to configure the replenishment to go to a different location than the picking location. For example, you could configure it to create a replenishment to the loading bay. In your example, the warehouse worker would pick 6 from location X1, and then the remaining 3 could be found in the loading bay, ready to go.
However, I can see that this idea might not suit many organisations, so another idea is to get the warehouse app to group the two pick lines in to one pick instruction for the worker. The only way to do this in standard is to use Cluster Picking. You could create a cluster with a single work header. Cluster Picking would automatically merge any work lines on the Work Id (which have the same item/location) in to one instruction.
Unfortunately, in standard, 'Clusters' have to be created manually, so this too is not a perfect solution.
https://www.youtube.com/watch?v=70xtjW6tNLY
5 Work control
Las plantillas de tareas (work templates) determinan como se debe realizar un trabajo para cada proceso en el almacén. Enlazando una plantilla de tareas (work template) con una directiva de ubicación (location directive), puede garantizar que tipos de trabajo se ejecutan en cada area especifica del almacén.
Por ejemplo, en los almacenes con armarios de picking directo, puedes llegar a configurar que se hace picking por cubetas qye puede ser agrupado posteriormente en pickings por carros o individuales.
-
https://docs.oracle.com/cd/E18727_01/doc.121/e13433/T211976T430466.htm
5.1 Work templates
Las plantillas de tareas permiten definir las operaciones que deben realizarse en el almacén. Generalmente, las operaciones consisten en un movimiento de stock en el almacén recogiendo un stock disponible "on-hand" en una ubicación y depositandolo en otra ubicación.
Las plantillas de tareas, consisten en una cabecera y sus lineas asociadas. Cada plantilla tiene asociada un tipo de orden de trabajo
Many work order types are associated with source documents, such as purchase or sales orders. However, other work order types represent separate warehouse processes, such as cycle counting The work pool ID lets you organize work into groups.
Use la configuración en la definición de la cabecera para determinar cuándo se debe crear un nuevo trabajo. Por ejemplo, puede configurar un número máximo de lineas y un tiempo máximo esperado para el picking. Entonces, si la tarea de un pedido de venta excede cualquiera de estos valores, el trabajo/tarea se romple en dos o más elementos.
Use la definición de roturas en la cabecera del trabajo para definir las condiciones en las que el sistema debe crear nuevas cabeceras de trabajo. Por ejemplo, para crear una cabecera de trabajo para cada número de pedido, añada el campo de "Número de pedido" a las condiciones de rotura.
Las lineas de la plantilla representan las tareas físicas que se requieren para ejecutar el trabajo. Por ejemplo, en un proceso de salida, podemos tener una linea para recoger los articulos del almacén y otra linea para depositarlos en una zona de trabajo (staging area) . Además podemos tener una linea adicional para recoger los elementos de la zona de trabajo y ponerlos en el camión como parte del proceso de carga. Puede configurar una directiva en las lineas de la plantilla, El código de la directiva se vincula con una directiva de ubicación y de esta forma ayuda a segurarnos que el trabajo en el almacén es realizado en las ubicaciones correctas del almacén.
Puede configurar unas condiciones de consulta para controlar cuando se usa una determinada plantilla de tareas. Por ejemplo, puede configurar limites a que una determinada plantilla pueda ser usada exclusivamente en un determinado almacén. O tambien, puede teener muchas plantillas que creen tareas para realizar los procesos de expedición de pedidos de venta, dependiendo del origen o tipo de los pedidos. El sistema usa un número de secuencia para deteminar el orden en el que las plantillas de tareas disponibles son evaluadas.Por lo tanto, si tiene una consulta muy específica para una plantilla de trabajo en particular, debe darle un número de secuencia bajo. Luego, esa consulta se evaluará antes que las otras consultas más generales.
A continuación un mecanismo de rotura de una tarea compleja en subtareas:
To stop or pause a work process, you can use the Stop work setting on the work line. In that case,
the worker who is performing the work won't be asked to perform the next work line step.
To move on to the next step, that worker or another worker must select the work again.
You can also separate the tasks within a piece of work by using a different work class ID on the work template lines.
Desde mi punto de vista es mas adecuado, agrupar cada subtarea con un identificador secuencial en lugar de usar un campo de rotura. Tambien hay que pensar como agrupamos tareas globales (movber un pallet o una cubeta) con tareas individuales. Aunque hemos encontrado un modelo operativo, hay que pensarlo más para hacerlo más simple si cabe.
table name="wmx_work_template"> <column name='wtem_transtype' type='smallint' required='y' info='The type of work order for which a location directive is defined' /> <column name='wtem_seqnum' type='smallint' required='y' info='Position of the rule'/> <column name='wtem_code' type='varchar' size='15' required='y' info='The unique code for the work template' /> <column name='wtem_name' type='varchar' size='60' info='A description of what the work template is used for' /> <column name='wtem_site' type='varchar' size='10' required='y' info='Site code'/> <column name='wtem_wh' type='varchar' size='10' info='Identify the warehouse'/> <column name='wtem_priority' type='smallint' required='y' info='The generated work priority number' /> <column name="wtem_workpool_id" type="serialref" info='The unique identifier for the work pool' /> <column name='wtem_enabled' type='char' size='1' required='y' default='Y' info='Is the work template valid?' /> <column name='wtem_filter_adv' type='varchar' size='255' info='Filter used for the qualification of work template' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_work_template' columns='wtem_code' /> <unique name='u1_wmx_work_template' columns='wtem_transtype, wtem_seqnum' /> </table> Field Type Description WorkTemplateErrorText String Brief description of transaction AutoExecute Enum Automatically process the work created with this template BatchAllocationStrategy Enum How batches will be allocated. Filtra el trabajo si no cumple estos limites ================================================================= MaxQty Real The maximum quantity MaxUnitId String The maximum unit. MaxVolume Real The maximum volume MaxWeight Real The maximum weight that the location can hold UsePackingQty Enum Specify whether the packing quantity should be used Rompe el trabajo siguiendo estos limites ================================================================= Maximum estimated pick time Enter the maximum estimated pick time. The work header will be split when the total estimated time for the initial work pick line has reached the specified value. Labor standard lines with a Labor standards measurement type set to Work unit will not be accounted for when calculating the pick time. Maximum number of pick lines Enter the maximum number of pick lines. The work header will be split when the number of initial work pick lines reaches the specified value. Maximum total inventory quantity Enter the maximum total inventory quantity. The work header will be split when the inventory work quantity has reached the specified quantity. Maximum total volume Enter the maximum total volume. The work header will be split when the total volume of the work header has reached the specified value. Maximum total weight Enter the maximum total weight. The work header will be split when the total weight of the work header has reached the specified value.
Template lines
<table name="wmx_work_template_line"> <column name='wteml_transtype' type='smallint' required='y' info='The type of work order for which a location directive is defined' /> <column name='wteml_code' type='varchar' size='15' required='y' info='The unique code for the work template' /> <column name='wteml_linenum' type='smallint' required='y' info='Identification of line' /> <column name='wteml_workclass' type='varchar' size='15' required='y' info='The unique identifier for the work class' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_work_template_line' columns='wteml_code, wteml_transtype, wteml_linenum' /> </table> Field Type Description Freeze Enum Specify whether this should be frozen LocDirHintCode String The unique identifier for the directive code Mandatory Enum Make the work line mandatory WorkStop Enum Stop the transaction for the specified work line WorkType Enum The type of work WorkTypeCustomCode String The code for the custom work type
5.2 Work pool
El work Pool es un categorizador de tareas a nivel macro. Por ejemplo, si queremps categorizar las tareas de almacen, separando las entregas normales de las entregas de pedidos recibidos en la tienda online,
Otra posible categorización es agrupar todas las tareas correspondientes a productos peligrosos, las taras pueden ser multiples, pero las agrupamos en un único Pool
Por lo tanto, el work pool es un mecanismo de categorización de tareas.
Otro ejemplo:
I’m particularly interested in the Outbound workload visualization feature, because I’m currently involved in a warehouse implementation project, where we are about to discuss how to monitor daily work progress in the warehouse. So the hope is that this new feature will close a couple of gaps.
In my project we plan to use the work pool to group pick work per receiving country. Work is grouped per country because there’s different cut-off times for different countries. The workers therefore knows that e.g. UK work pool has to be picked before e.g. US and other work pools.
So I tried setting up a visualization combining work pool id and work status (open, closed or in process). You can see the result below.
https://www.youtube.com/watch?v=0vYIbl8HgbU
You can use work pools to organize work into groups. For example, you can create a work pool to classify work that occurs in a particular warehouse location. For all work types except counting, you can assign a work pool to a work template. For cycle counting, you can assign a work pool to the following:
- Cycle count plans
- Cycle count threshold
- Cycle count work by location
- Cycle count work by item
When you use work templates to create work, the work pool is automatically assigned to the work. You can also manually assign work pools to work using the Location directives form. After a warehouse worker defines the menu items that will be used to perform work on a mobile device, the worker can scan the work pool ID. The work that is related to the work pool ID is then automatically assigned to the work user on the mobile device until all work is completed.
5.3 Dependent Work
A lo largo de la planificación de una oleada, podemos encontrar que tenemos tareas que requieren de otras tareas para que se puedan ejecutar. Poe wjwmplo, para hacer un picking de un pallet que se encuentra en una ubicación que no permite picking directo (por ejmplo un pallet en altura), necesitamos que un operador de transpaleta nos baje el pallet para poder realizar el picking.
Otro caso que podemos tener es la creación de una tarea de picking sobre una zona que no hay suficiente stock pero sobre la que creamos una tarea de reposición que nos traerá stock desde la zona de reposición a la zona de picking para que la podamos pickear.
La primera premisa es que las taras deben poder ejecutarse sin tener que mirar cada vez si tenemos tareas dependientes o no, por lo que en lugar de tener la problematica en cada ejecución de cada linea de tarea "task_id", la trasladamos de forma centralizada en la creación de la oleada o a nivel de "work_id"
Por eso, tanto una tarea de bajada/subida de pallet, como un picking en una zona donde no hay stock y requiere de la ejecución de un reaprovisionamiento, podemos tratarlo de forma similar como si se tratara de tareas dependientes. En el primer caso, dependemos de la bajada del pallet y en el segundo, dependemos de que se realice el aprovisionamiento.
Si un operario intenta ejecutar una tarea y no tiene stock suficiente (por ejemplo, todavía no le han bajado el pallet, o no se ha reaplizado o planificado una reposición), marcaremos el campo work_repldemand (Petición de reaprovisionamiento) para indicar que tenemos lineas pendientes de que alguien realice el reaprovisionamiento. y que el gestor del almacen pueda priorizar las tareas de reaprovisionamiento que tienen otras tareas pendientes.
Supongamos que tenemos una orden de trabajo que tiene dos tareas de picking de productos que están en dos pallets en altura.
Caso 1: Por oleada:
Creamos un trabajo con dos tareas que requieren bajar el pallet a una zona de playa que permita picking
Id WorkID Wave Tipo Zon.Origen Ubic.Origen HU.Origen Contenedor.Ori Zona.Dest Ubic,Dest HU.Dest Conten.Dest Articulo Canbt 1 7 19 PICK PLAYA-1 PAL-1 CUB-1 A-01 1 2 7 19 PICK PLAYA-1 PAL-2 CUB-2 A-07 1 Y tenemos otros trabajo con dos tareas para bajar los pallets: 3 8 19 BAJAR RESERVA PAL-1 PLAYA-1 PAL-1 4 9 19 BAJAR RESERVA PAL-2 PLAYA-1 PAL-2 Y por ultimo otro trabajo para devolver los pallets a la zona de reserva: 5 10 19 SUBIR PLAYA-1 PAL-1 RESERVA PAL-1 6 11 19 SUBIR PLAYA-1 PAL-2 RESERVA PAL-2
Cuando lancemos la oleada, los operarios que bajan pallets, se deberán encargar de bajar todos los pallets necesarios en la oleada.
El terminal de RF tendrá una opción de menú para ejecutar consecutivamente tareas de tipo "BAJAR" e iran bajando los pallets
Supongamos que los operarios solamente ejecutan la tareas de bajar el palet PAL-1 y el PAL-2 se queda arriba, entonces cuando un operador vaya a ejecutar el trabajo 7, odrá hacer la primera linea del PAL-1 pero la segunda linea no podrá porque el pallet no está en su sitio y se le pondrá la marca de que está pendiente de reposición.
Caso 2: Por tarea:
En el mismo caso anterior, cuando un operario intente ejecutar el trabajo 7, el sistema verificará la existencia de stock suficiente para ejecutar todas las tareas del trabajo. Si hay alguna falta de stock, entonces marcará las lineas pendientes y notificará al operario que no puede ejecutar ese trabajo porque no hay stock suficiente
Necesitaremos una configuración que nos indique que si no hay suficente stock para una tarea, que queremos hacer:
- Anular toda la linea y continuar con la siguiente.
- Ejecutar con la cantida que haya y anular el resto
- Posponer la ejecución de la linea para despues
- No permitir empezar el trabajo si hay lineas con falta de stock
Como además del pallet podemos tambien estar a la espera de una reposición, pero al igual que el pallet, no sabemos si la reposición esta planificada previamente o no, podriamos hacer split de la linea por la parte faltante, marcarla como pendiente de reposición y priorizarla al final (sumandole 100000 al orden. Un proceso independiente que se ejecuta automaticamente cada 5 minutos se encargará de verificar las tareas pendientes de ejecución con el campo work_repldemand activado, para planificar las tareas de reposición o bajadas de pallet o ver si ya existen y priorizarlas respecto a otras tareas o poner una incidencia para que el gestor del almacen pueda verlo y priorizar/ejecutar manualmente estas tareas de reposición.
5.4 Work Split y Task Split
Task split es el procedimiento por el que una tarea (linea), puede romperse en dos con las mismas características. Este procedimento mantiene a la linea separada en la misma oleada, la carga y el trabajo.
Por ejemplo, una tarea de picking que no podemos completar por que no hay suficiente stock pero que no queremos perder la cantidad que nos falta por completar y que rompemos en dos: una tarea para completarla en este momento y otra que completaremos más tarde. Por ejemplo, haciendo picking desde otra ubicación.
El Task Split mantiene todas las caracteristicas de la linea original y mantiene el codigo de oleada, el codigo de carga, etc. etc.
El proceso de split puede realizarse de forma automática porque en la configuración hemos indicado que si no podemos completar la cantidad de una tarea se haga split automático o manualmente.
Por las caracteristicas del split, este se puede realizar en cualquier momento, aunque la tarea este a medias. E incluso si la tarea esta completada podriamos hacer un split por la cantidad pendiente.
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/work-split
Work split
Un caso de uso es cuando un operario tiene un trabajo muy grande o con muchos articulos, o el trabajo no le va a caber en el palet o en la cubeta asignada y necesita otro palet o cubeta. En definitiva, si las tareas de picking del trabajo no le caben en la LPN a las que se han asignado y debe ejecutar parte de las tareas, llevar los produtos a su destino final y volver a empezar con el resto de productos (tareas)
Work split o work detach romple una linea de tarea en dos, pero "separa" (detach) la parte separada y permite que se vincule con otra oleada, carga e incluso tarea independiente.
El botón de Detach no estaría disponible si se producen alguna de las siguientes condiciones:
- El trabajo tiene un estado distinto a "Abierto" o "En proceso".
- El trabajo esta asociado a un contenedor (container_id) (Vamos a pensar que un contenedor no se puede separar parcialmente. al porque requiere acciones manuales).
- El trabajo está vinculado a un Cluster (cluster_id).
- El trabajo ya se está rompiendo por otro usuario.
A new work blocking reason, Split work, indicates when the work ID is in the process of being split. It's shown both on the Split work page and in the Warehouse Management mobile app if a user tries to run the work. When blocking reasons are used, the name of the Blocked wave field from the work ID is changed to Blocked.
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/work-split
https://community.dynamics.com/ax/b/microsoftoperationsscmguide/posts/d365-warehouse-management-more-about-work-split-work
Ejemplo de uso en aplicación móvil
https://www.youtube.com/watch?v=YFw-dBIEzN8
6 Outbound Packing
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/outbound-sorting
Put to Wall
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/put-to-wall-put-to-store
https://blog.bhsolutions.com/d365-wave-2-sorting-and-pallet-building
7 Containerization
License plates and containers. Good reading:
https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/06/20/use-of-license-plates-associated-with-a-container-type-to-drive-warehouse-management-processes/
Other documents focused in containers only:
https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/07/26/introduction-to-containerization-automated-packing-process-in-microsoft-dynamics-ax-2012-r3/
https://www.sikich.com/insight/how-to-set-up-dynamics-365-containerization/
https://gfeaxblog.wordpress.com/2019/08/17/msdyn365fo-containerization/
In addition to the manual packing functionality that was introduced in my previous post, the new Warehouse management system also provides a feature, Containerization, which supports an automated or guided packing process. In this process, containerization assists the user by:
Automatically calculating required containers for the outbound shipment based on product and container physical dimensions. Optimizing packing structure according to a set of rules configured by the user. Generating picking work based on the calculated container structure. By using this feature, you will not only have an overview of the quantity and types of containers that are going to be used for packing prior to the picking of goods, but you’ll also have work created in a way that the work lines are split into quantities that fit the containers. This allows and guides the warehouse workers to pick the items directly into the chosen container. Compared to the manual packing process, tasks such as creating containers, assigning items, closing containers are automated by the system.
The containerization logic is integrated into waves as an optional process and when enabled, it is executed as part of the processing of the wave. During the processing of a wave, containerization is performed prior to the creation of work. This allows the system to utilize the generated container structure information to guide the work creation process. You can also configure wave templates to automate the wave process so that containerization is executed upon release of the source orders.
Currently, this feature is primarily aimed at assisting the user with the planning of container structure and work in the packing process. We do not support any manual packing operations on the containers created by the system or modification of the container structure, which you are able to do in the manual packing flow on the containers created by the user. For example, you cannot delete, re-open or change item quantity inside the container. Right now, there is also no support on the Mobile device implemented for the warehouse workers to validate things such as item quantity, product configuration, or physical dimensions as they actually pack goods into containers.
8 Métodos de picking
Generalmente el picking se hace por orden (pedido) Order picking El picking de fede (por cubetas y carros) se denomina "Cluster Picking"
Cluster picking allows the user to specify which orders they will pick. The users generate a cluster and then pick everything in their cluster in one efficient picking route. Cluster picking is a great way to improve efficiency in the warehouse.
En el menu de RF, tendremos 2 opciones: "Cluster Pick create" y "Cluster picking"
Documentación auxiliar:
http://help.sap.com/saphelp_45b/helpdata/en/37/1939516e36d1118b3f0060b03ca329/content.htm
https://docs.oracle.com/cd/E16582_01/doc.91/e15119/setup_inv_mgmnt_system.htm#EOAIM00207
https://www.consolut.com/en/s/sap-ides-access/d/s/doc/F-$SCWM$TO_CREATE_MOVE_HU/
https://www.tutorialspoint.com/sap_ewm/sap_ewm_quick_guide.htm
https://help.sap.com/viewer/57574d15fa1d414792d74047b66c3e41/7.0.4/en-US/6fcbcb53ad377114e10000000a174cb4.html
https://www.linkedin.com/pulse/d365-warehouse-management-outbound-operations-picking-ali-danish
Ejemplo AX de picking FF:
https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/08/27/combining-wave-containerization-work-break-and-cluster-picking-to-support-a-piece-picking-operation-ax2012r3/
Different ways to pick to a box:
https://blog.bhsolutions.com/picking-into-a-box-in-microsoft-ax
8.1 Cluster picking
Generalmente picking a un contenedor (bin) o a un carro (cart), normalmente conteniendo cubetas (totes) más pequeñas.
Útil para producción en lotes (batches)
Cada workId tiene su propio número de identificacion de destino (License Plate o Handing Unit) que corresponde al contenedor (cubeta) de destino. Pero además en cada cluster, se designa un identificador auxiliar con la posición de la cubeta en el carro.
Cada workID destina su picking a un contenedor independiente
Permite a los trabajadores hacer picking de multipes articulos de una ubicacion para multiples ordenes de trabajo al mismo tiempo. Por ejemplo, si nos encontramos con 2 tareas de tipo "Pick" de dos trabajos distintos que van a la misma ubicación y ogen el mismo artículo, el interfase del terminal, puede solicitarnos una operación de recogida con las cantidades sumadas y despues que pontamos cada unidad en la posición del cluster que corresponda. Esto debería ser configurable, ya qye en entornos de alta productividad, puede interesarnos no agrupar la recogida de producto y hacer que coja y ponga en la cubeta y coja otra vez el mismo y lo ponga en la otra cubeta.
.
Cluster picking example: https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/08/27/combining-wave-containerization-work-break-and-cluster-picking-to-support-a-piece-picking-operation-ax2012r3/?source=dynamicsaxscm
https://blog.mazars.us/increased-warehouse-efficiency-for-small-order-operations-via-system-directed-cluster-picking/
https://www.linkedin.com/pulse/system-directed-cluster-picking-dynamics-365-finance-supply-nolting
Two order lines means two shipment lines, and each shipment line will have separate Work lines; it's not possible to consolidate these on to one Work line.
However, if you use Cluster picking, the work lines with the same item/location will be combined into a single instruction on the hand held. Since you are not really wanting to use the Cluster picking function for it's true purpose, you should try configuring it as simply as possible; a cluster of a single work header, automatic Cluster Ids, don't utilise different cluster picking positions.
https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/251276/consolidate-identical-order-lines-when-work-is-created/701170
.
https://www.youtube.com/watch?v=0rJdewByQX0
8.1.1 Simply Picking
https://www.youtube.com/watch?v=3-tNQKk1SuE
8.1.2 Cluster template
Tendremos lo que se denominan cluster templates, que nos dirá el número maximo de "posiciones" (cubetas - totes) que podemos agrupar para hacer picking
Por ejemplo, podemos tener dos tipos de carros: Uno para cubetas de plastico retornables con 9 posiciones y otros para cajas de carton con 4 posiciones. Podemos tener dos plantillas de picking en cluster: carros de cubetas y carros de cajas y dependiendo del "profile" elegido, el sistema nos tiene que pedir fabricar un carro de un tipo u otro y obtener workd_id s correspondientes a cajas de carton o los correspondientes a cubetas de plastico.
Como en el caso de Fede, a veces el concepto de carro ya incluye un codigo de barras en cada posición, por lo que a la hora de construir el cluster picking, simplemente tendriamos que indicar el carro y este ya nos generaria un cluster picking con las posiciones y matriculas (Codigos de barras o LPNs) correspondientes
Vease: Generally cluster picking is performed in sectioned trolleys, which could have each slot bar-coded with a License plate. My proposal is that the concept of a trolley is introduced. The trolley will have a number of slots, each of which is associated with the relevant license plate. System directed cluster picking could then prompt the user the scan a Trolley ID and then automatically associate the license plate for the relevant slot to the Target license plate for the slot. Hence the picker would need to perform one scan instead of up to 30 prior to starting the pick.
.
https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/set-up-cluster-picking
8.1.3 Trolley - Carro
Otro mecanismo para generar un cluster es utilizar un "carro" (Trolley) que nos indicará automáticamente el número de posiciones, y el alias de cada una de las posiciones.
En el caso de fede, la asignación de las matriculas de verificación puede ser manual, pero en otros casos, por usar un concepto de carro nos puede asignar automáticamente las matriculas e incluso podria asignar automáticamente los trabajos a asignar a cada posición.
Podemos considerar un cluster picking por carro, cuando las posiciones e identificación del carro están siempre preestablecidas. Por ejemplo, un carro que ya tiene cajas de plastico que siempre son las mismas y que tienen un código de barras que es siempre el mismo.
Otro ejemplo real de carro en el caso de fede son los carros de recepciones que son carros que tienen unas cubetas preestablecidas, aunque tambien se pueden considerar ubicaciones agrupadas. En este caso, seria algo similar, tal y como vamos recepcionando mercancia, vamos generando trabajos de ubicación(putaway) y asignandolos a posiciones de un cluster que corresponden a cada una de las cubetas disponibles. Despues ejecutaremos un "picking" en cluster que realmente lo que hace es vaciar la cubeta y poner la mercancia en la ubicación final. En este caso el cluster finaliza al terminar el trabajo, mientras que generalmente los cluster picking de ventas finalizan en la operación pick (o sea al alcanzar un put en cada trabajo).
Como el caso de cluster picking lo tenemos resuelto, antes de implementar los carros, debemos pensarlo bien y estar seguros.
8.1.4 Manual Cluster Picking Workflow
A continuación una secuencia de creación de un cluster manual:
A cluster is created, and the two work IDs that you created earlier are attached. If you created more than two work IDs, only the first two are added to the cluster. Notice that the work IDs are added to the cluster in ascending order, as you specified in the query setup. Note The new cluster is automatically created only if enough additional work IDs were previously created. Otherwise, the following message is shown: "Not enough work can be found for cluster." After you select the menu, the first pick screen appears. The system aggregates all matching pick lines from the two work IDs and directs you to visit the pick location one time, so that you can satisfy both orders by using one pick. This process is done in the same way as the process for user-directed cluster picking. Confirm the first picking location and item by selecting OK. The quantity of the pick will be the total of the item displayed on the sales orders in the cluster. Enter the position name (Numeric or Alphabetical) to confirm that the item quantity picked for the position were put in the correct position. Repeat this process until all item quantities have been picked and put in the correct position. The last step on the mobile device is to Put the cluster in the final location. Select OK When the put operation is confirmed, the cluster is closed and broken, based on the value that you set for the Break cluster at field in the cluster profile. Work IDs are also closed.
Una vez ya no hay tareas pendientes de realizar el en cluster, aparecerá el mensaje: "No hay más tareas"
El operador, deberá ejecutar el último paso en el dispositivo RF que es poner el cluster en la ubicación final.
Una vez confirmada la operación, el cluster se romple
8.1.5 Break cluster
El proceso de romper un cluster, separa un trabajo del cluster para liberarlo y dejarlo disponible para que pueda continuarse con las tareas que ya no deben realizarse a nivel e cluster.
Para romper un cluster, borramos el cluster_id del trabajo y las tareas, una vez un trabajo ha llegado a la condición de "rotura de cluster" se desacoplará automaticamente del cluster y si no ha finalizado se podrá continuar operando con el de forma convencional.
Otra posibilidad, es que como tenemos el cluster_id a nivel de tarea, en el momento de vincular un trabajo a un cluster, solamente incorporemos al cluster las operaciones que deben realizarse en modo cluster y el resto de tareas se dejen conel cluster_id a nulo. De esta forma no debemos realizar ningún proceso ni mecanismo para desvincular un trabajo del cluster. Como mucho, si ya no quedan tareas por procesar para el cluster, podriamos quitar el cluster_id del trabajo para saber que ya está completado. No perderiamos trazabilidad porque el trabajo siempre queda enganchado con el cluster original a través de las lineas de cluster: wmx_workcluster_line
Los cierres pueden hacerse al llegar al primer put, al llegar a un segundo pick, o al completar el trabajo. Un trabajo con tareas pick, pick, put, pick, put con cierre en el primer put, integraria las primeras dos lineas de picking en el cluster, con cierre en el segundo pick integraria los dos pickings y el put en el cluster y al completar trabajo, integraria todas las tareas en el cluster.
Select the action that will break up the cluster. You can break a cluster when either the picking or put away work is completed.
8.2 Batch or Consolidated Picking
AKA Consolidated or Grouped Wave picking
Tradicionalmente denominado por nosotros picking en dos fases.
Tipicamente usado para operaciones con un gran numero de pedidos de venta o SKUs para ser pickeadas
Multiples pedidos de distintos clientes y artículos pueden ser combinados en una única "picking list". O sea , tareas de distintas ordenes se agrupan en un único trabajo.
El mismo numero de destino (License Plate o Handing Unit) para todas las workID
El picking se coloca en un unico contenedor para todos los pedidos y posteriormente se hace un proceso de separación por cliente
(Wave picking with Group pick) Permite a los operarios (workers) recoger un producto de una vez en una misma ubicación (location) y en una misma operación, para las distintas lineas de picking individuales que encajen/cumplan con las mismas condiciones.
A la hora de agrupar las lineas de las ordenes en trabajos, el criterio de agrupación es simplemente el de ubicación y no se tiene en cuenta la orden de salida, por lo que se pueden mezclar en un mismo trabajo lineas de distintas ordenes.
Por ejemplo, en FF se generaría un trabajo por cada cubeta juntando distintas ordenes de distntos clientes. Con el group picking, aunque tengamos 8 trabajos con el mismo artículo y ubicación, el picking se realiza de forma conjunta por el total como si realmente solamente tuvieramos un único trabajo. Una vez completado el trabajo, se llevan los productos a una ubicación de Procesamiento "Dispatch". Un proceso posterior permite hacer el packing de las unidades según la orden individual de cada cliente.
https://www.sikich.com/insight/consolidated-picking-for-warehouse-management-in-dynamics-365/
https://www.youtube.com/watch?v=jZYyiOeDdIA
8.3 Put to Wall Picking
En el caso de fedefarma, es el picking de multizonas en 2 fases.
The Put to wall - put to store functionality lets you handle scenarios where you must consolidate a product to a prepack staging area, based on configurable criteria. Because this functionality allows for picking to a single target license plate and can use more put positions than cluster picking, companies that ship to stores or handle small items will benefit from decreased picking time.
The workflow for this functionality directs picked product to a sorting location for distribution into various types of containers. Generally, each sorting location includes multiple sort positions. Each sort position is assigned according to the criteria that are set by the business process. Typical criteria are the final destination, shipment, or load. After a product arrives, it's distributed to each sort position, based on the quantity that is associated with the order, destination, shipment, or load. When a container is full or complete, it's moved to a staging location or a shipping location for further handling, depending on the business process.
This warehousing functionality is also referred to by other names, such as put-to-light and break opens.
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/put-to-wall-put-to-store
8.4 Zone Picking
Cada zona tiene un operario o grupo de operarios asignados.
El picking se hace por pedido, pero puede agrupar productos de distintas zonas.
Por ejemplo, La lista de picking va primero a la zona 1 (por ejemplo robot) y de ahi pasa a la zona 2 que es un picking de pequeño producto, por lo que el trabajo se desasigna del operario "robot" y queda libre para que el operario de la zona 2 pueda continuar con el picking y así sucesivamente puede ir saltando entre distintas zonas hasta completar el trabajo.
En fede esto se complica un poco más, ya que el trabajo no se nunca de una orden completa, sino de una cubeta o de producto etiquetas. Y una vez la cubeta formada, puede tener lineas de distintas zonas (por ejemplo, robot y manual). O sea, una vez formado el trabajo, se comporta de la forma explicada, pero siempre hay una "rotura" previa de trabajos por volumen y numero de lineas para formar las cubetas.
8.5 Order Picking
Un operario realiza el picking de una orden de salida completa.
Consideraciones: La orden de salida, no debe haber sido lanzada previamente, por lo que se genera automaticamente un trabajo con todas las tareas de picking de las lineas de la orden y se asigna el trabajo al operario.
Como pueden haber tareas de picking que el prier operario no pueda completar (por requerir equipos o estar en zonas no accesibles para él), un trabajo se puede dejar a mitad de realizar y "desapuntarse" dejando el trabajo libre para que otro operario lo pueda recoger y completarlo.
8.6 short Picking
Short picking se denomina al evento en el cual, cuando se nos ordena el picking de una cantidad, no encontramos dicha cantidad en la ubicación. En este caso debemos introducir un motivo por el que no se ha podido hacer el picking de la cantidad faltante y dependiendo del motivo elegido se producirá una busqueda automatica de más stock o simplemente se cancelará la cantidad faltante.
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/tasks/set-up-short-picking-item-reallocation
http://kashperuk.blogspot.com/2015/07/tutorial-short-pick-goods-on-mobile.html
https://www.youtube.com/watch?v=eEpZC0xE80Y
https://www.youtube.com/watch?v=sZM7d0GOrlI
<table name="wmx_workexception"> <column name='workexcep_code' type='varchar' size='15' required='y' info='The unique code for the work exception' /> <column name='workexcep_name' type='varchar' size='60' info='Brief description of exception' /> <column name='workexcep_type' type='smallint' default='0' required='y' info='The type of exception: Receiving, Work, Short Pick' /> <!-- 0 Work 1 Receiving 2 Short pick --> <column name='create_cyclecount' type='char' size='1' default='N' required='y' info='Automatically create a cycle count for the location' /> <column name='adjust_inventory' type='char' size='1' default='Y' required='y' info='Adjust the inventory' /> <column name='adjust_type_code' type='char' size='10' info=' The default adjustment type code: Adjust Out, Remove Res Adj. Out' /> <column name='item_reallocation' type='char' size='1' default='N' required='y' info='None, Automatic, Automatic and Manual, Manual' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workexception' columns='workexcep_code' /> </table> AutoDecrementShipment Y/N Automatically decrement the associated shipment or load line
En la siguiente tabla se almacenará la información de todas las excepciones de ejecución de tareas:
<tabe name="wmx_workexception_log"> <column name="work_id" type="serialref" required="y" info='The work identification number'/> <column name="task_id" type="serialref" required="y" info='Identification of task line'/> <column name="order_id" type="serialref" info='The order number' /> <column name="orderline_id" type="serialref" info='The line number from the order' /> <column name="shipment_id" type="serialref" info='The shipment identification number (Expedición o en ERP: Albaran de venta)' /> <column name="load_id" type="serialref" info='The identification number for the load' /> <column name="work_transtype" type="smallint" info='The type of work order for which a location directive is defined' /> <column name="work_lpn" type="varchar" size='20' info='The target license plate Number for the work' /> <column name='workexcep_code' type='varchar' size='15' required='y' info='The unique code for the work exception' /> <column name='workexcep_type' type='smallint' required='y' info='The type of exception: Receiving, Work, Short Pick' /> <column name="message" type="varchar" size='80' info='A detailed message' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workexception_log' columns='wel_id' /> </table> Field Type Description Committed Enum Specify whether the record has been committed into the system UserId String The user for processing work
9 Shipment consolidation
https://axscm.wordpress.com/2019/10/17/reduce-warehouse-costs-using-shipment-consolidation/
https://axscm.wordpress.com/tag/warehouse/
https://axscm.wordpress.com/2019/10/17/reduce-warehouse-costs-using-shipment-consolidation/
I have a situation where the customers has 1 sales order, with multiple lines. Let's say there are 10 order lines, all different items. Line 1-5 are in stock, line 6-10 will be bought with a purchase order. Sales order is created on monday, the items of the purchase order will arrive on wednesday, delivery is for friday. The customer would like to start picking the items on stock on tuesday (work ID 001) and after picking put them on a temporary location. On wednesday the items of the purchase order are received and stalled in a special warehouse zone for reserved items (Location directive build with help of query: Order line reference number = !"") On thursday a new work ID is created (work id 002), this is for picking the items which have been received from the purchase order, those items will be Put at the packing location. Finally at the packing location, the warehouse employee needs to pack the items form work ID 001 and work ID 002 into a single container. What would be the best way of handling this situation, with the least amount of manual input? I know it would be possible to manual consolidate the 2 shipments into 1 and based upon the new shipment ID start the packing process, but I am looking for a method which doesn't need interference of an user.
This business case, should be treated by ERP and WMS functionality.
Axional WMS allows to create tasks based on WMS Orders and create the Delivery Notes afterwards.
Or prelink an WMS Order to a Delivery (Expedición) and later being able to add other orders to the same delivery.
10 Inbound
10.1 Receive sortation
Receive sortation functionality extends the put-away cluster functionality by sorting the inventory at the receiving dock. The sorted inventory is added to the put-away cluster profile prior to creating put-away clusters. Using this functionality, received items can be sorted by the destination location zone, handling equipment, or any other configurable criteria, and workers can move multiple license plates to different locations at the same time. It therefore provides enhanced efficiency to the put-away clusters functionality on the inbound side of warehouse processes.
Outbound sortation: https://dynamicsimpact.com/2020/05/10/dynamics-365-warehouse-sorting/
I have a client who sorts there items at receiving based off of the location the item is in. Locations are grouped to zones and that is how the items are sorted for efficient put away.
Goods are packed onto pallets sorted per zone. Each pallet has a license number assigned. Once sorted, it is put away on this palled id.
10.2 Cluster putaway
Los clusteres de ubicación o "Put-away clusters" es una funcionalidad que permite usar loa mecanismos de consolidación (clustering) tambien para los procesos de ubicación. Permite a los operarios arupar trabajos de ubicación en un cluster y tomar existencias de distintas matriculsa (cubetas) simultáneamente, de forma que se pueden ir ubicando multiples ordenes de trabajo a la vez. Esta característica es especialmente útil para almacenes de retail o en cualquier otro escenario donde se reciban unidades sueltas en lugar de cajas de origen o paletas completas.
Ofrece una gran eficiencia en el proceso de entrada de mercancias de un almacen ya que podemos montar carros con producto que debe se ubicado y despues podemos irlo ubicando todo el carro al avez, siendo esta una alternativa mucho más eficaz y rápida que la ubicación de una sola matrícula, donde el operario debería repetir el proceso para cada matrícula individualmente.
https://www.microsoft.com/videoplayer/embed/RE4f5aB
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/putaway-clusters
https://github.com/MicrosoftDocs/Dynamics-365-Unified-Operations-Public/blob/main/articles/supply-chain/warehousing/putaway-clusters.md
Recuento de entrada:
1- La terminal nos pregunta orden articulo + cantidad
adicionalmente podemos tener datos del articulo como el lote y caducidad, etc.
2. Generamos la entrada de existencias directamente en el almacen en una ubicación especial de recepciones. Por lo que el stock ya "está dentro" Podriamos hacer que esta ubicación dependiera del usuario que está realizando el recuento o fuera una ubicación de usuario ya que esto nos daria algunas facilidades adicionales
3. El sistema mira el stock que hay en en la ubicación de usuario y mira si se tiene que ubicar directamente o se tiene que hacer mediante carro. Una vez decidido que va a ser mediante carro, generamos las tareas de ubicación (putaway) correspondientes y las vinculamos a posiciones de cluster que corresponden a cada una de las cubetas en las que el operador debe dejar la marcancia. Notese que nos pueden recontar una cantidad que necesite dos posiciones en el carro o que al ir a poner el articulo no quepa y el operador debe hacer un split del trabajo en dos para poner parte del producto en otra ubicación. Podemos poner en el trabajo, una matricula igual al identificador de la posición del cluster o una "auto-matricula" ya que el cluster ya tiene la posición del carro.
4. Una vez sabemos las posiciones en el carro de ubicación, le indicamos al operador que deposite las cantidades en la cubeta
5. Es verdad que en este momento no sabemos que cantidades estan pendientes de ubicar porque estan en posiciones de un carro, pero Analizandos los cluster "open" con posiciones generadas, podemos identificar las ordenes pendientes de ejecutar de tipo "putaway"
6. Una vez queremos empezar a hacer el putaway, simplemente ejecutamos el cluster con las correspondientes tareas. La unica consideración es que en este caso el cluster no termina con el put sino con la finalización del trabajo. O sea, el operador irá ejecutando los trabajos y completandolos, pero en orden de ubicación destino. Por ello, en cada vez se ejecutarán todas las tareas del trabajo:
Tipo Art, Ubic Cant. Pick A RECEP 8 Put A 0801005 8
La única cosa un poco extraña es el mecanismo para saber que un carro (que es algo que no existe como tal) a no ser que creemos una entidad para ello, no se puede utilizar más de una vez. O sea como decir que una plantilla de cluster solamente se puede usar una vez simultáneamente. Esto que no está previsto, podemos empezar haciendolo a mano en la RF. Posteriormente un mecanismo podría ser crear un maestro de carros y vincular la plantilla de cluster al carro. De esta forma sabemos que esta plantilla de cluster solamente es para un determinado carro y que no se puede reusar dos veces.
No me parece adecuado de momento, bloquear el carro cuando ya hemos empezado a usarlo ya que esto puede llevar a inconsistencias. Por lo tanto, centremonos en el procediminento y que funcione rápida y fácilmente y después ya lo expandiremos.
Otra posibilidad es hacer un trabajo más complejo que mueva el stock de recepción o de la ubicación de usuario a una ubiación que corresponda a la cubeta del carro, y que ahi pare y una segúnda fase que es la que ejecutará el cluster picking similar al procedimiento que hemos descrito anteriormente:
Tipo Art, Ubic Cant. Pick A RECEP 8 Put A 7211 8 Pick A 7211 8 -> STOP Put A 0801005 8
Esto nos da la ventaja de que si tenemos un segundo registro de ubicación del mismo producto podemos saber el volumen ocupado en la ubicación y por lo tanto saber la cantidad adicional que nos cabría. Por lo tanto me quedo con este segúndo mecanismo que tendremos que verificar
10.3 Disposition codes
Disposition codes applies to the inbound receiving process. Disposition codes are a collection of rules that are used when damaged items are received. For example, when a work user uses a mobile device to receive items that were damaged, the user must scan a disposition code for damaged items. This disposition code is used to generate an inventory status and a work template, and then searches for the location directive with the same disposition code to determine where to put away the returned items.
Disposition codes only applies to the receiving process
<table name="wmx_disposition"> <column name='disp_code' type='varchar' size='15' required='y' info='The disposition code' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <primary name='p_wmx_disposition_code' columns='disp_code' /> </table> InventStatusId String The ID describing the status of the inventory ReturnDispositionCodeId String Identification of the disposition code. WorkTemplateCode String The unique code for the work template
11 Cargas y rutas predefinidas
El termino load o carga (load_id) corresponde a los productos que van a ser transportadas en un camión, un contenedor o una empresa externa. Generalmente agrupa productos de varios pedidos hasta completar los límites de volumen, anchura o altura que cabe en el profile o esquema de carga vinculado.
Por ejemplo, si tenemos un pedido de 1000 unidades y tenemos que servirlo en contenedores de 5 metros en los que solo caben 500 unidades, la linea de pedido, deberá romperse en dos lineas distintas de 500 unidades cada una en una "carga" distinta. (las 500 unidades puede corresponder a 10 pallets distintos)
Del mismo modo, pedidos distintos de varios clientes que van en el mismo camión, pueden ir a la misma carga.
A la hora de crear las cargas automaticamente,el profile puede tener en cuenta separar las cargas por rutas predefinidas. Las rutas predefinidas pueden definir los distintos destinos que serán asignados a la ruta predefinida y a la vez esta ruta puede ser un criterio de rotura a la hora de generar las cargas.
Caso especial: en el caso de FF, la ruta puede venir como un campo auxiliar en la orden y simplemente ser un criterio de rotura a la hora de generar las cargas. No haría falta que volvieramos a definir los criterios de rutas predefinidas tambien en el WMS.
https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/create-or-modify-an-outbound-load
We can group sales orders which will be delivered with one vehicle in a Load. That is, per delivery vehicle, we generate a Load which consists of the orders the vehicle will deliver.
Per load we can have useful info like total weight and volume (not to exceed vehicle's capacity), millage (haven't used this feature yet), etc.
Therefore, Load planning workbench gives good visibility on sales order lines so we can decide how to group them in Loads. Also it provides visibility of the status of the loads.
We have a Load template for each delivery vehicle. That's how we assign Loads to vehicles.
Load template - load template contains information about equipment and measures such as height, width, depth, and volume of the load. It use to define the capacity of a container that carry goods. System also update if defined template capacity less than the carrying goods.
Load Planning workbench - Load planning workbench basically provide a platform where we can create a load for inbound and outbound process.
we can use Load for inbound process when we use our own transportation services for pick the goods from a vendor in that case we use our own load template / vehicle and load planning process for complete inbound execution of process.
.
https://www.youtube.com/watch?v=XIzP6UUP2fs
12 Cycle Counting (Recuentos)
https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/perform-cycle-counting-in-a-warehouse-location
Se genera un registro de recuento que está vinculado a un trabajo. O sea los recuentos van vinculados a trabajos igual que las tareas. De hecho, a partir de una tarea en un trabajo, se puede generar un proceso de recuento debido a un faltante.
Una tarea de recuento est´s viculada a una tarea y es de ahi de donde coge la ubicación, Pero hay que analizarlo...
<table name="wmx_workcyclecount_line"> <column name="work_id" type="serialref" required="y" info='The work identification number'/> <column name="task_id" type="serialref" required="y" info='Identification of task line'/> <column name="client_code" type="varchar" size="10" required='y' /> <!-- Client WMS. Diferent clients can hace items with same code being distinct products --> <column name="item_code" type="varchar" size="16" required='y' /> <!-- codart: Identify item --> <column name="item_dimid" type="varchar" size="15" /> <!-- Identification of dimensions for the item. --> Field Type Configuration key Description QtyCounted Real The quantity counted QtyExpected Real The quantity expected AcceptReject Enum Specify whether this was accepted or rejected AdjustmentWorkId String The adjustment work ID CycleCountCounted Enum Confirm whether cycle counting was completed CycleCountReconcile Enum Reconcile the discrepancy in the inventory count </table>
12.1 Cycle count thresholds
Permite introducir las condiciones que deben cumplir los articulos y/o ubicaciones determinadas para que se inicie un recuento en la ubicación
Por ejemplo, cuando una ubicación se quede con stock 0, queremos que se realice un recuento confirmando que hay 0.
https://www.youtube.com/watch?v=4s5uqx6XVz4
<table name="wmx_cyclecount_thres"> <column name="cct_code" type="varchar" size="15" required="y" info="The unique identifier for the cycle counting threshold" /> <column name="cct_name" type="varchar" size="50" required="y" info="Brief description of transaction" /> <column name="cct_daysbetween" type="smallint" required="y" default="0" info="The number of days before counting a location again" /> <column name="cct_immediate" type="char" size="1" required="y" default="Y" info="Process the cycle counting work as soon as the threshold is reached" /> <column name='cct_uom_code' type='varchar' size='10' info='Unit symbol'/> <column name="cct_workpool_id" type="serialref" info="The unique identifier for the work pool"/> <column name="cct_qty" type="decimal" size="14,4" info="The threshold quantity used to determine when cycle count work should be created " /> <column name="cct_percent" type="decimal" size="14,4" info="The threshold percentage for items in a location for which cycle counting work is created" /> <column name='location_filter' type='varchar' size='255' info='Filter used in the qualification with location data' /> <column name='item_filter' type='varchar' size='255' info='Filter used in the qualification with item data' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> </table>
13 Ajustements (Ajustes de inventario
Permite generar DPOS y DNEG (Incrementos o Decrementos de stock)
https://organicax.com/2016/02/15/wms-parameters-default-adjustment-type-code/
14 Move inventory with associated work
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/move-inventory-associated-work
inventory Reservation and pick work creation.
I have warehouse setup with two Zones and one zone is blocked for pick work creation and the other Zone is our Picking and work creation zone.
now i am getting work created with no Pick location.
additionally could use the inquiries 1 Work exceptions log 2 Work creation history log 3 Temporary work history along with location directive and directive code
Are you expecting work creation to fail in this scenario? Or are you expecting that you cannot reserve if there is not enough stock in the picking zone?
https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/270688/put-locations-is-blank-in-work-line?pifragment-96834=1#responses
15 Locations
Blocking locations for inbound or outbound operations:
https://community.dynamics.com/365/financeandoperations/b/howtodynamics365/posts/how-to-block-inventory-location-for-transaction-in-dynamics-365
15.1 Location directives
Remember reservation is the first step to warehousing and there can be no work started in AX till you have reservation done however having reservation done and finding the pick location are two different things.
Check your sales order and you will find in the transactions as reserved physical. The reason why you are not getting a pick locations is issue with you location directive setup and that too for the pick one.
Another thing is that you have allowed th algoritm to create work despite location directive failing to find a pick location as you have kept the "stop work on location directives failures" unchecked for sales orders and this tells AX to go ahead and create a work if pick and put locations are not determined and AX creates a work with blank locations.
Worker has to determine the location manually and input in the mobile device.
Check you location directive setup again and the location where the stock is there should have its profile added in the query. Do share screenshots for allowing us to dig deeper.
https://sumitnarayanpotbhare.wordpress.com/2020/06/15/different-type-of-staging-locations-retail-warehouse-blueprint-approach-to-d365-for-commerce-with-adv-wh-mgmt/
15.1.1 Location directive picking aging
This topic explains how to use first in, first out (FIFO) and last in, first out (LIFO) location directive strategies during picking. These strategies work in conjunction with the aging dates that are recorded for locations to track when inventory first entered the warehouse. The Location directive inventory picking aging feature uses the date on the location to determine aging. The Warehouse location status feature updates the date on the location, based on the date from the license plate.
You can use FIFO and LIFO strategies to ship both batch-tracked items and non-batch-tracked items, based on the date when the inventory entered the warehouse. This capability can be especially useful for non-batch-tracked inventory, where an expiration date isn't available to use for sorting.
When inventory is first received or created in the warehouse, the system updates the relevant license plate so that the current date is shown as the aging date. This date is then used by the location directive strategies to identify the oldest or newest inventory in the warehouse. If inventory is moved to a location that isn't tracked by license plate, the location itself is updated with aging information, and this information will then be used by the strategies.
We need to add aging date to inventory location wmx_bin:
Aging date – The date when the inventory in the location was brought into the warehouse. This value is calculated based on the aging date of the license plate. It's accurate for locations that are license plate–tracked, but it might not be accurate for locations that aren't license plate–tracked.
16 Docking profiles
http://kashperuk.blogspot.com/2016/08/tutorial-anchoring-and-dock-management.html

Dock Management
https://community.dynamics.com/ax/f/microsoft-dynamics-ax-forum/229336/wms-dock-management-not-working
17 Trabajos y Tareas
En SGA 1 se trataria de las tablas wms_inhouse_stkmov_head y wms_inhouse_stkmov_line.
https://www.avantiico.com/ax-2012-r3-warehouse-work-template-configuration-and-purpose/
https://ellipsesolutions.com/dynamics-365-quick-observations-warehouse-work-templates/
17.1 Tareas pendientes de reaprovisionamiento
https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/11/04/processing-work-that-is-awaiting-demand-replenishment/
17.2 Saltarse una tarea
Saltarse una tarea puede ser un caso individual de saltarse muchas tareas. Un caso general es cuando un operario, tiene que hacer picking en un pasillo al que no puede acceder en este momento y decide continuar en el siguiente, saltandose las tareas de picking de ese pasillo.
Técnicamente es una operación sencilla, pero debemos pensar en el detalle de la implementación en el interface de RF. Se nos ocurren distintos casos que debemos cumplir:
- Saltarse una/s tarea/s y poder decidir cuando reemprenderlas.
- Saltrase una/s tarea/s y ejecutarlas al final
- Saltrase una/s tarea/s y solamente ejecutarlas si lo indicamos explicitamente (aunque sea respondiendo a una pregunta o con una opción del menú).
Además, si la tarea es opcional (una marca que deberiamos poner a nivel de tarea, tambien deberiamos poder anular una tarea y no volverla a ejecutar más
Si anulamos la tarea, la aplicación deberia marcar la tarea como "terminada" y además activar el indicador de "tarea no realizada" (skipped flag) para las estadísticas. La cantidad pendiente de realizar se quedará con la cantidad original, indicando que realmente la tarea no se ha realizado, pero como tenemos el indicador (skipped flag) sabremos que es porque el operario no ha querido.
17.3 Suspender y Resumir un trabajo
Un operario puede suspender un trabajo si es necesario. Si el trabajo es interrumpido, puede ser completado más tarde por otro operario, a menos que todo el trabajo haya sido asignado a un operario concreto. En este caso, solo este operario va a poder resumir el trabajo más tarde.
Para poder cumplir con este requerimiento, tenemos el campo: user_assigned_lock que indica si al suspender un trabajo, podemos quitar el usser_assigned y dejarlo a nulo otra vez para que otro operario pueda completar el trabajo, o si debemos mantener el usuario ya que ha sido forzado manualmente y solamente este operario puede resumir el trabajo.
Por este mismo motivo, debemos guardar a nivel de tarea el operario que ha ejecutado la tarea, ya que en un mismo trabajo mediante la suspensión y resumén, un mismo trabajo podría ser realizado por varios operarios.
Implementación:
Cuando asignamos un trabajo a un opeerario, ponemos el código del operario en el trabajo, campo user_assigned y (si nos interesa a nivel de SQL en las tareas en el campo user_id). Asumimos que un trabajo puede cambiar de operario y por lo tanto, en el trabajo siempre tenemeos el operario activo en este momento, mientras que en las tareas tenemos el usuario que efectivamente ha realizado la operación.
En el momento de suspender una tarea:
- Si user_assigned_lock = 'Y' la marcamos como suspendida, pero no tocamos nada de los usuarios
- Si user_assigned_lock = 'N' la marcamos como suspendida, ponemos el usuario del trabajo (user_assigned) a nulo, y ponemos a nulo todos los user_id de las tareas que no se hayan completado. Cuando un operario resuma la tarea, o un administrador la asigne a otro, pondremos los campos que hemos pasado a nulo con el código del nuevo operario, pero a nivel estadístico, en las tareas tendremos realmente los dos operarios, cada uno con las tareas que ha ejecutado físicamente.
No podemos permitir suspender un trabajo a mitad de una tarea. Se puede suspender un trabajo, pero no una tarea.
17.4 Work / LPN Consolidation
http://kashperuk.blogspot.com/2016/11/tutorial-license-plate-consolidation-in_71.html
17.5 Reverse Work
Reverse work o “Reverse license plate” es un proceso por el cual, un trabajo que esta "in process", lo cancelamos y ejecutamos las tareas correspondientes para devolver a las ubicaciones origen el stock que tenemos activo en el trabajo (Ubiación-usuario + LPN) y lo devolvemos a las ubicaciones de almacén origen o a otras en caso de que ya no pueda ir alli.
La idea, además de devolver el producto que tenemos en la cubeta, es que no conste en la orden ni en la expedición ni en la carga como producido. O sea se devuelve la cantidad coo pendiente ya que el trabajo original se cancela.
17.6 Cancel Work
Solamente se puede cancelar un trabajo que está pendiente de empezar, básicamente se anula el trabajo y se modifica la orden o expedición origen para que no conste como que ya tenemos trabajos pendientes de picking.
Además debemos implementar un proceso especial de cancelación física del trabajo para resolver circunstancias excepcionales. Vease: https://docs.microsoft.com/es-es/dynamics365/supply-chain/warehousing/cancel-warehouse-work
17.7 Asignación de matrícula a trabajos
Cuando vamos a empezar a realizar un trabajo, si el trabajo no tiene matrícula hay que asignarle una. Si la matrícula se entra manualmente o se genera automaticamente es algo que deberia ser configurable.
Supongamos que tenemos tres posibilidades de asignar una matrícula: automática, manual, referencia
En el método automático, simplemente tenemos en el almacen una secuencia de numeros para las matrícula que genera un numerador y lo asigna al trabajo
En el método manual, tenemos que poner un código de matrícula manualmente. En este momento, tenemos que verificar que no hay ningún otro trabajo abierto que tenga la misma matrícula ya que no podemos repetir la matrícula en dos trabajos abiertos. Si el otro trabajo está cerrado no pasa nada ya que puede tratarse de cubetas de picking que estamos reutilizando.
En el método referencia es exactamente igual que el método manual, pero permitimos dejar la matrícula en blanco y que el sistema nos genere una nueva automáticamente como si fuera un metodo automático.
.
Siempre que se asigna una matricula a un trabajo hay que verificar que no hay otro trabajo "no cerrado" que tenga esta misma matricula
Queda pendiente pensar la implementación de cómo indicamos que la generación de una nueva matricula por el secuenciador debe generar o no una etiqueta con el codigo de barras de la matricula o incluso con datos ya del destino.
17.8 Cálculo de tiempos en trabajos y tareas
Tanto a nivel de trabajos como de tareas tenemos dos campos de tiempo previsto y tiempo real que nos ofrecerán estadisticas de productividad a nivel de operario.
17.8.1 Tiempo estimado
El calculo del tiempo estimado, requiere un analisis y estudio de las operaciones del almacén y la introducción de los estandares de tiempo para cada tipo de operación según el tipo de producto, zona de almacen, etc. etc.
Cuanto más exhaustivo sea el analisis de tiempos estadisticos de las operaciones, más ajustado podrá ser el cálculo del tiempo estimado.
Sin embargo, el cálculo para cada trabajo y tarea del tiempo estimado puede requerir un coste en tiempo de operación del sistema. Y por lo tanto, debemos tener un método para activar o desactivar dicho cálculo. Pondremos en el maestro de almacenes un campo que nos indique si tenemos que realizar cálculos de tiempo estimado o no.
A labor standard is a formula used to calculate the estimated time it should take to perform a given class of work. Labor standards are derived from timestudies of associates actually performing the work. A timestudy is used to calculate statistically valid estimates for each element of a given class of work. An “element” is a step a worker performs when doing a job. For example, in picking there is an element for “Scan location” to confirm that the picker picked from the right location.
Once the timestudy is complete, as a result, we are getting out estimated times for executing a task, for example, 13.29 seconds for every line the user picks and 3.57 seconds for every unit he picks.
We can support two variables per standard (One for the Pick and one for the Put).
Case study:
The warehouse worker based on our timestudy needs 36 seconds in total to drive to a selected location (about 20 sec) and then, after picking, to the dock to deliver the goods (about 16 sec). At the picking location, he needs about 9 seconds per case to pick it up from the location and put it on the pallet on the forklift.
The shipping clerk, who does the loading, needs about 7.5 minutes per pallet that he needs to load on the truck.That is based on the volume of the pallet stacked with cases.
http://kashperuk.blogspot.com/2015/03/tutorial-using-labor-standards-in-new.html
https://www.linkedin.com/pulse/manage-labour-standards-using-warehouse-management-d365-sagar-suman/
<table name="wmx_labor_standard"> <column name='laborstd_code' type='varchar' size='15' required='y' info='The unique code for the labor standard definition' /> <column name='laborstd_name' type='varchar' size='60' info='A description of the labor standard' /> <column name='laborstd_type' type='smallint' required='y' info='The type of work order' /> <column name='item_query' type='varchar' size='255' info='The item query filter' /> <column name='location_query' type='varchar' size='255' info='The location query filter' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <primary name='p_wmx_labor_standard' columns='laborstd_code' /> </table> <table name="wmx_labor_standard_line"> <column name='laborstd_code' type='varchar' size='15' required='y' info='The unique code for the labor standard definition' /> <column name='laborstd_ordnum' type='smallint' required='y' info='The sequence number for labor standards' /> <column name='laborstd_workclass' type='varchar' size='15' required='y' info='The unique identifier for the work class ' /> <column name='laborstd_worktype' type='varchar' size='15' required='y' info='The work type of the specified work line: pick, put, ...' /> <!-- 0 Pick 1 Put 2 Pick and put --> <column name='laborstd_measurement' type='smallint' required='y' info='The type of measurement to use for calculating the estimated time for completing the specified work line ' /> <!-- 0 Unit 1 Work units 2 Transactions 3 Volume 4 Weight --> <column name='laborstd_workperhour' type='decimal' size='14, 2' required='y' info='The estimated amount of work that can be completed per hour' /> <column name='laborstd_uom' type='varchar' size='15' required='y' info='The unit to use for calculating the completion time of estimated work' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <primary name='p_wmx_labor_standard_line' columns='laborstd_code, laborstd_ordnum' /> <foreign name='f_wmx_labor_standard_line1' columns='laborstd_code' references='wmx_labor_standard' refcols='laborstd_code' /> </table>
item_query y location_query son expresiones JavaScript en las que se sustituyen valores seleccionados: P.E. "'${codfam}'.match(/(FAM1|FAM2|FAM3/) || '${tipart}' == 'ESTUPE'". Debemos documentar los "metacampos" que podemos usar en la expresiones de filtrado y documentar ejemplos de expresiones para que cualquier implantador pueda configurar un filtro.
17.8.2 Tiempo real
Tareas
A nivel de tarea disponemos de tres campos que nos permitiran calcular el tiempo real de ejecución de cada tarea: task_start_dt, task_finish_dt y actual_time
Cuando el terminal empieza una tarea y muestra al opeario la ubicación a ir, marca la hora en el campo task_start_dt, una vez el operario ha completado la ejecución de la tarea se marca la hora en el campo task_finish_dt y se calcula el tiempo transcurrido entre el inicio y el final de la tarea y se guarda en segundos en el campo actual_time. (El tiempo minimo de ejecución es de 1 segundo (independientemente de task_start_dt y task_finish_dt) a no ser que la tarea se haya completado de forma automática o se cumplan algunos casos especiales que indicaremos a continuación.
No podemos distinguir el tiempo de trabajo del tiempo de viaje. El tiempo de viaje o traslado es el tiempo que a un opeario le lleva moverse de la posición en la que está en el momento de empezar una tarea a la ubicación en la que tiene que ejecutar dicha tarea. Si hiciera falta, esto sería tan sencillo como añadi otro campo timestamp en el que pudieramos guardar la hora en la que el opeario nos ha confirmado la ubicación. si no nos la requieren podemos continuar sin esta estadistica.
Caso especial: picking agrupado
Si agrupamos varias tareas en una única operacion del terminal (porque la ubicación, articulo, lote, etc. son iguales), los campos de hora inicio y fin, se actualizan como si se tratara de tareas individuales pero a la hora de calcular el campo actual_time, solamente se calcula para la primera de las tareas, dejando a 0 el resto de tareas agrupadas.
Caso especial: ejecución automática
Si una tarea se ejecuta automáticamente, se introduce en los campos de hora inicio y hora fin la hora en la que se ejecutado la tareas, y el campo de tiempo de ejecución queda a 0.
Trabajos
El cálculo del tiempo real de ejecución de un trabajo es un poco más complejo de calcular, ya que pueden haber bloques pick-put en los que se detenga el trabajo y despues se continue por otro operario. Por ejemplo, cuando tenemos un picking y despues la carga de los articulos en el camión en el mismo trabajo, pero que se ejecutan en momentos del tiempo distintos.
Por lo tanto, el tiempo real calculado a nivel de trabajo no es exactamente la suma de los tiempos calculados a nivel de tarea.
El tiempo a nivel de trabajo, analiza los bloques pick-put y para cada bloque toma el tiempo de inicio (que debe coincidir con el tiempo de inicio mas antiguo de la tarea pick) y el tiempo de finalización de la tarea put. La diferencia en segundos se acumula en el tiempo real del trabajo. Despues se hace lo mismo para otros bloques pick-put. Los tiempos transcurridos entre la tarea put y la siguiente tarea pick no se computan.
Supongamos que tenemos un trabajo que no tiene operaciones pick-put sino que solamente tiene tareas de recuento o de cambio de estado (fuera de un bucle pick-put). Para este tipo de tareas, el tiempo real del trabajo acumula directamente el tiempo real usado en la tarea.
Si tenemos un recuento en medio de un bucle, pick-put se sigue el algoritmo inicial ya que el tiempo entre la primera tarea pick y la tarea put enblobaria la ejecución de la tarea de recuento.
18 Estructuras de datos (work in progress)
18.1 Trabajos y Tareas
La unidad mínima tarea es el trabajo (work_id), que representa una operación de picking como por ejemplo:
Para un determinado cliente, toma una caja de aspirinas y dos cajas de paracetamol, las pones en una caja de cartón y cuando hayas acabado, pones la caja en el muelle de transporte.
Que se traduce en un registro en wmx_worktask_head
, dos registros de picking en
wmx_worktask_line
(uno para cada producto) y otro registro de "put" ara poner la caja
de cartón en el muelle.
El número de tareas que se vinculan a un único trabajo depende de las plantillas de configuración vinculadas con el tipo de tarea a realizar.
Son las tablas de RF que permiten realizar las operaciones de picking, putting, etc. Lista de tablas WHS https://docs.microsoft.com/en-us/previous-versions/dynamics/ax-2012/reference/XXhh272172(v=ax.60) For more details on Cluster picking, go to https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/warehousing/set-up-cluster-picking. For more details on Wave picking, go to https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/warehousing/tasks/configure-wave-processing. More about wave picking: https://docs.microsoft.com/en-us/dynamicsax-2012/appuser-itpro/create-a-wave-template Otros documentos teoricos: https://docs.microsoft.com/en-us/previous-versions/dynamicsnav-2013r2/XXhh997397(v=nav.71) Cluster picking profile https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/set-up-cluster-picking https://ellipsesolutions.com/dynamics-365-thing-called-cluster-picking/ https://dynamics-tips.com/location-directives-and-work-templates-explained/ Work Pools: https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/change-work-pool-on-work <table name="wmx_worktask_head"> <column name="work_id" type="serial" required="y" /> <!-- bulkid: The work identification number --> <column name="order_id" type="serialref" /> <!-- The order number (Orden de picking o pedido) --> <column name="shipment_id" type="serialref" /> <!-- The shipment identification number (Expedición o en ERP: Albaran de venta)- --> <column name="wave_id" type="serialref" /> <!-- The unique identifier for the wave --> <column name="load_id" type="serialref" /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh) --> <column name="container_id" type="serialref" /> <!-- Container identification number (determines container structure) (Nuestro handling unit) --> <column name="workpool_id" type="serialref" /> <!-- The unique identifier for the work pool --> <column name='wh_code' type='char' size='10' required='y' /><!-- Identify the warehouse --> <column name="work_transtype" type="smallint" info='The type of work order for which a location directive is defined' /> <!-- Name Value Description None 0 None Purch 1 Purchase orders Sales 2 Sales orders Invent 3 Inventory movement CycleCount 4 Cycle counting Replenishment 5 Replenishment TransferIssue 6 Transfer issue TransferReceipt 7 Transfer receipt WorkCancel 8 Canceled work ReturnOrder 10 Return orders --> <column name="work_priority" type="integer" /> <!-- The work priority number --> <column name="work_status" type="smallint" default='0' required='y' /> <!-- The status of work --> <!-- Value Description 0 Open 1 In process 2 Pending review 3 Skipped 4 Closed 5 Canceled 6 Combined --> <column name="work_lpn" type="varchar" size='20' /> <!-- The target license plate Number for the work --> <column name="estimated_time" type="integer" /> <!-- Estimated time (seconds) to complete the task --> <column name="actual_time" type="integer" /> <!-- The actual (seconds) time it took the task to complete --> <column name="user_assigned" type="varchar" size='15' /> <!-- LockedUser - The user who locked this record (responsible to execute the work) --> <column name="user_assigned_lock" type="char" size='1' default='N' required='y' /> <!-- Y/N User is manually assigned/forced to execute this work (see suspend/resume analysis) --> <column name="block_reason" type="char" size='1' /> <!-- VSC: --> <!-- Split work: An Split work process has been started, --> <!-- Blocked wave: The wave this work pertains has been blocked --> <!-- Stock still not available: for dependant works --> <column name='work_inprocess' type='datetime' size='year to second' /> <!-- The date and time the work was in process --> <column name='work_closed' type='datetime' size='year to second' /> <!-- The date and time the work was closed --> <column name='user_canceled' type='varchar' size='20' /> <!-- The user who cancelled the work --> <column name='date_canceled' type='datetime' size='year to second' /> <!-- The date and time the work was cancelled --> <column name='work_text' type='varchar' size='60' info='Text describing the transaction' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_worktask_head' columns='work_id' /> </table> If the Work is Locked by a user, but the first work line still has the Work status = In progress, then there is a function that you can access from the Load which you can use to change who the Work is assigned to. The function is actually designed for changing the Put locations of the Work, but it can be used to change the User the Work is Locked by. Note that it might change the User of any Work attached to the Load (which is not Complete), so I would really only suggest to use this function as a last resort. From the Work form, you can do Related information > Load > Change work location. AutoExecute Enum Automatically process the work created with this template CombinedWorkId String The work ID this work was combined with Frozen Enum Indicate whether the specified wave has been processed but not released InventJournalId String Identification of the journal. WorkBuildId String The work build identification number WorkCountError String The work error message WorkManuallyCompletedBy String The AX user who manually completed the work WorkTemplateCode String The unique code for the work template CycleCountPlanOverview Int64 Reference field in a different table <!-- =========================================================== --> <!-- TASKS --> <!-- =========================================================== --> <table name="wmx_worktask_line"> <!-- Podemos crear tablas alternativas para guardar las tareas históricas --> <!-- ya procesadas para quitarlas de las tablas de trabajo--> <!-- Datos historicos de tareas ya realizadas: p.e. wmx_workdone_line o wmx_workhist_line--> <!-- Una tarea se encargará de ir moviendo los trabajos ya terminadas --> <!-- de esta tabla a la tabla historica --> <column name="task_id" type="serial" required="y" /> <!-- seqno --> <column name="work_id" type="serialref" required="y" /> <!-- bulkid: --> <column name="order_id" type="serialref" /> <!-- The order number (Orden de picking o pedido) --> <column name="orderline_id" type="serialref" info='The line number from the order' /> <column name="shipment_id" type="serialref" /> <!-- The shipment identification number (Expedición o en ERP: Albaran de venta)- --> <column name="cluster_id" type="serialref" /> <!-- proid: Serialref al proceso --> <column name="wave_id" type="serialref" /> <!-- The unique identifier for the wave --> <column name="load_id" type="serialref" /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh) --> <column name="container_id" type="serialref" /> <!-- Container structure (Nuestro handling unit) --> <column name="work_class" type="varchar" size="15" /> <!-- The unique identifier for the work class --> <column name="task_type" type="smallint" default="0" required="y" /> <!-- tipo: The type of work --> <!-- 0 None 1 Pick 2 Put 3 Counting 4 Print 5 Adjustments 6 Quarantine 7 License plate building 8 Status change 9 Custom --> <column name="linenum" type="integer" /> <!-- orden: Identification of line --> <column name="sortcode" type="integer" /> <!-- antiguo priori ???? Es el orden con el que debemos hacer --> <column name="client_code" type="varchar" size="10" required='y' /> <!-- Client WMS. Diferent clients can hace items with same code being distinct products --> <column name="item_code" type="varchar" size="16" required='y' /> <!-- codart: Identify item --> <!-- Debemos reintroducir la dimension en los articulos o dejarlo unicamente en item_code ???? --> <!-- Puede la dimension, incluir tambien lote y caducidad ?? o lo ponemos en batchid como hasta ahora --> <column name="item_dimid" type="varchar" size="15" /> <!-- Identification of dimensions for the item. --> <column name="batchid" type="serialref" /> <!-- Identification of the source item lot --> <column name="gow" type="varchar" size="15" /> <!-- Source Inventory Goods Owner --> <column name="item_uom" type="varchar" size="15" /> <!-- Unit of meassure --> <!-- La unidad de medida, permite el tratamiento de cajas de origen o blisters --> <!-- Internamente, la tarea siempre va en unidades base, pero si el picking se hace en cajas de 25 y tenemos 50 unidades en qtywork --> <!-- En el interface de usuario podemos mostrar tanto "2 CAJAS" como "25 Unidades (Caja)" --> <!-- El factor de conversión para el primer caso lo obtenemos de las tablas de definición de unidades de medida de articulos --> <!-- Podriamos pensar que para no tener que ir haciendo cálculos cada vez que mostramos una tarea, podriamos almacenar tambien en esta tabla --> <!-- La relación entre la cantidad base y la cantidad en el almacen (de la unidad de medida). Por ejemplo, para mostrar las cajas no haria --> <!-- falta ir a la tabla de unidades de medida para dividir, sino simplemente coger este valor y dividir la cantidad base --> <column name="relbquwqu" type="decimal" size="14,4" default='1' required='y' /> <!-- Relation Base Quantity vs Warehouse Quantity --> <!-- It defines the number of base quantity units for the warehouse quantity as a factor. --> <column name="qtywork" type="decimal" size="14,4" default='0' required='y' /> <!-- The work quantity --> <column name="qtyremain" type="decimal" size="14,4" default='0' required='y' /> <!-- The quantity remaining --> <column name="task_zone" type="varchar" size="10" /> <!-- The ID for the source zone --> <column name="tssk_bin" type="varchar" size="20" /> <!-- Location in a warehouse. --> <column name="task_lpn" type="varchar" size="20" /> <!-- The license plate ID that is located for the work --> <!-- El hecho de que usemos un numero de contenedor y no directamente una ubicación, es que el numero de contenedor nos --> <!-- permite hacer estructuras dependientes más complejas: P.E. la caja 0912 que está dentro de el contenedor 1234 que está en el pallet PA45 --> <column name="avail_physical" type="decimal" size="14,6" /> <!-- Physical quantity available Used in Counting tasks --> <column name="user_id" type="varchar" size='15' /> <!-- The user for processing work / or has processed the work --> <column name="estimated_time" type="integer" /> <!-- Estimated time (seconds) to complete the task --> <column name="actual_time" type="integer" /> <!-- The actual time (seconds) it took the task to complete --> <column name='task_start_dt' type='datetime' size='year to second' /> <!-- horini: The date and time of work started--> <column name='task_finish_dt' type='datetime' size='year to second' /> <!-- Horfin: The date and time of closed work --> <column name="task_status" type="smallint" default='0' required='y' /> <!-- estado: The status of work --> <!-- 0 Open 1 In process 2 Pending review 3 Skipped 4 Closed 5 Canceled 6 Combined --> <column name="task_skipped" type="char" size='1' default='N' required='y' /> <!-- Y/N This task was skipped --> <column name="task_repldemand" type="char" size='1' /> <!-- Y/N The allocation line failed to find a location and is eligible for replenishment --> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_worktask_line' columns='task_id' /> <foreign name='f_wmx_worktask_line1' columns='work_id' references='wmx_worktask_head' refcols='work_id' /> </table> <!-- Tenemos que hacer un circuito con operaciones de reposición de las que dependen pickings. Otros conceptos por si los necesitamos Por ejemplo isanchored solamente seria util para evitar el coste de tener que mirar si tengo que ir a mirar ubicaciones alternativas o no en caso de no poder poner/sacar el producto de la ubicación indicada en la tarea. is_anchored Enum Specify whether the object is anchored to a location Por ejemplo, podemos tener un trabajo con una tarea que baje un pallet y otra tarea que haga el picking sobre el pallet. Podriamos hacer que la rotura se estableceria por work_type Pero supongamos que tenemos 3 lineas 1. Work class: PAL Task: Bajar Palet 2. Work class: OPE Task: picking 3. Work class: PAL Task: Subir palet Podriamos asumir que al cambiar de work_class paramos, pero tambien podriamos usar un indicador para decir cuando un operario termina su parte de la tarea y tiene que pasar a otro operario, dejando libre el usuario asignado de la tarea mediante este indicador. El hecho de asumir que los tipos de tarea siempre fuerzan una parada, es algo "incorrecto" ya que nos restringe, por lo que acabaremos poniendo el indicador para definir cuando queremos parar. work_stop Stop the transaction for the specified work line LoadLineRefRecId Int64 Reference field in a different table AskForNewLicensePlate Enum The work line requires a new license plate. Mandatory Enum Make the work line mandatory WorkTemplateLineRecId Int64 Reference field in a different table Otra cosa a considera, si necesitamos poder buscar trabajos cuya primera tarea a ejecutar sea de una clase determinada, igual necesitamosguardarnos en el trabajo el ID de la proxima tarea a ejecutar, lo que nos permitirá hacer este calculo fácilmente. Por contra, nos obliga a modificar el trabajo siempre que completemos una tarea (Analizar) -->
18.1.1 Work Pools
-------------------------------------- WORK ORDER POOL -------------------------------------- Puede usar "work order pool" para agrupar tareas que tienen algo en común. A continuacion se muestran algunos ejemplos de uso;<p> Puede crear un "work pool" para clasificar tareas que ocurren en una determinada localización, o para clasificar tareas por la hora del dia en que se tienen que ejecutar: mañana, tarde, noche, Puede asignar un work pool en una plantilla de tareas Setup > Work > Work pools <table name='wmx_workpool'> <column name="workpool_id" type="serial" default="0" required="y" /> <!-- bulkid: The work pool id --> <column name='workpool_code' type='varchar' size='15' required='y' /><!-- Realmente no hace falta porque vamos siempre por ID, pero es como una descripción corta --> <column name='workpool_name' type='varchar' size='40' required='y' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workpool' columns='workpool_id' /> </table>
18.1.2 Work Class
<table name='wmx_workclass'> <column name='workclass_code' type='varchar' size='15' required='y' /> <column name='workclass_name' type='varchar' size='40' required='y' info='Brief description of transaction'/> <!-- Ponemos este campo para filtrar las clases de tareas dependiendo de si son para pedidos de compra, venta, recuentos, reposición, etc. --> <!-- Correpondería con el campo work_transtype de la tabla de trabajos --> <column name='workclass_transtype' type='smallint' default='0' required='y' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workclass' columns='workclass_code' /> </table> Name Value Description None 0 None Purch 1 Purchase orders Sales 2 Sales orders Invent 3 Inventory movement CycleCount 4 Cycle counting Replenishment 5 Replenishment TransferIssue 6 Transfer issue TransferReceipt 7 Transfer receipt WorkCancel 8 Canceled work ReturnOrder 10 Return orders
Work Class Valid Location Types: Permite definir los tipos de ubicación en los que la clase de tarea puede ejecutarse. De este modo una clase de tarea de tipo, mover palet, solamente puede ejecutarse en ubicaciones de palets.
<table name='wmx_workclass_loctype'> <column name='wcl_workclass_code' type='varchar' size='15' required='y' info='The work class'/> <column name='wcl_location_type' type='varchar' size='15' required='y' info='The type of location' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workclass_loctype' columns='wcl_workclass_code, wcl_location_type' /> <foreign name='f1_wmx_workclass_loctype' columns='wcl_workclass_code' references='wmx_workclass' refcols='workclass_code'/> </table>
<table name='wmx_location_type'> <column name='wlt_code' type='varchar' size='15' required='y' info='Location/Bin type'/> <column name='wlt_name' type='varchar' size='60' required='y' info='Description of type' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <primary name='p_wmx_location_type' columns='wlt_code' /> </table>
18.1.3 Usuarios / Operarios
Debemos crear esta tabla que es la de operarios.
-------------------------------------- OPERARIOS -------------------------------------- <table name="wmx_workuser"> <column name="user_code" type="varchar" size='15' required='y' info='User idenrification'/> <column name="user_name" type="varchar" size='60' required='y' info='Full name of the user'/> <column name="user_passwd" type="varchar" size='25' required='y' info='User password'/> <column name="user_disabled" type="char" size='1' required='y' default='N' info='Disabled user?'/> <column name="user_menuname" type="varchar" size='20' info='name of the RF menu'/> <column name="user_defaultwh" type="varchar" size='10' info='default warehouse for the user'/> <column name="loc_override_pick" type="char" size='1' required='y' default='N' info='Allow the user to override the pick location during the work'/> <column name="loc_override_put" type="char" size='1' required='y' default='N' info='Allow the user to override the put location during the work'/> <column name="can_move_reserved" type="char" size='1' required='y' default='N' info='Allow the user to move reserved inventory'/> <column name="workcount_isadmin" type="char" size='1' required='y' default='N' info='Indicate whether the user is a cycle count supervisor'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_workuser' columns='user_xosw' /> </table> WorkCountMaxPercent Real The maximum percentage limit WorkCountMaxQty Real The maximum quantity limit WorkCountMaxValue Real The maximum value limit Worker Int64 The warehouse worker <table name="wmx_workuser_warehouse"> <column name='user_id' type='varchar' size='15' required='y' info='User idenrification'/> <column name='user_wh' type='varchar' size='10' required='y' info='Identify the warehouse'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_workuser_warehouse' columns='user_id, user_wh' /> <foreign name='f1_wmx_workuser_warehouse' columns='user_id' references='wmx_workuser' refcols='user_id'/> </table>
18.1.4 Gestion de existencias
Las tareas de tipi pick o put (al menos estas dos), siempre mueven las existencias entre dos posiciones
La tarea pick, mueve de las posiciones en la tarea a una ubicación automática (denominada "ubicación de usuario") correspondiente al usuario que está ejecutando la tarea y la matricula (LPN) correspondiente al trabajo.
La tarea put, mueve de la ubicación automática del usuario. Las existencias origen están en esta ubicación y a partir de ahi podemos filtrar LPNs, artículos, etc. para llevarlos a la ubicación destino de la tarea.
Las tareas, pueden congelar stock correspondiente al movimiento de la propia tarea y las tareas de pick y put moveran el stock a través de una tabla de "movimiento de existencias" que se detalla a continuación.
Una buena explicqción de como gestionar el inventario o existencias "on-hand", puede leerse aqui
http://kashperuk.blogspot.com/2018/10/tutorial-reading-on-hand-information.html
wmx_work_invent_trans ================================================== Field Type Configuration key Description WorkId String The work identification number LineNum Real Identification of line. InventTransIdFrom String El ID de la transacción de inventario que reduce el inventario InventTransIdTo String El ID de la transacción de inventario que establece el inventario InventTransDateTime DateTime Time when the transaction was processed. ItemId String Identify item. InventTransIdParent String Identification of the item origin. (InventTransOrigin) /********* The InventTransOrigin table contains information about the inventory transaction originators. When the order lines, such as sales order lines or purchase order lines, are created, they generate related records in the InventTransOrigin and InventTrans tables. The records in these tables represent the flow of material that goes in and out of the inventory. **********/ InventDimIdFrom String The dimension ID of the removing transaction InventDimIdTo String The dimension ID of the replacing transaction InventQty Real Number of units InventQtyRemain Real Quantity not marked WorkHasReservation Enum Allow reservation for work <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> No no **** wmx_work_trans *** No No wmx_invent_trans - Inventory Transaction =================================================== The inventTrans table is what I like to call the parent table of all transactions. NO matter what is performed a record will be written to this table when posting occurs. The wmx_invent_trans table represents a flow of inventory transactions as data leaves and enters a company for example. If a product is ordered a status field will be set to ordered. If a item is transferred from one warehouse to another warehouse the status will then be set to transfer. The inventory transactions table is typically used for very detailed inventory reports. InventSum classes are used to find the on-hand information of a certain item at a certain date. The InventOnHand class is used to find the current on-hand information. InventMovement class validates and prepares data that will be used to generate inventory transactions. All the classes related to the inventMovement class will be prefixed with InvMov For instance the InvMove_Transfer preps data for inventory transfer journals The InventUpdate classes are used to insert and update inventory transactions. Whenever a transaction should be posted, the updateNow() method in the correct InventUpdate subclass will execute. The super class in the hierarchy is the InventUpdate class, and the other classes in the hierarchy are prefixed ‘InventUpd_’. For example, InventUpd_Estimated is used whenever an item line is entered in the system that will most likely generate a physical transaction in the future. A good example can be a sales order line that has the on-order sales status. When a line like this is entered or generated in AX, the InventUpd_Estimated is triggered so that the inventory transactions will reflect that the item is on-order can is taken into consideration when the same item is ordered. <table name='wmx_invent_trans'> <column name='trans_id' type='serial' required='y' /> <!-- La mayoría de movimientos provienen de una tarea --> <!-- Registramos los enlaces con la tarea origen --> <column name='work_id' type='serialref' /> <column name='task_id' type='serialref' /> <!-- Podemos obtener el usuario directamente desde la tarea -------------------------------------------------------- <column name="user_code" type="varchar" size='15' info='The user for processing work (IS this field required??)'/> --> <column name='trans_origin' type='serialref' /><!-- Join with source document - line --> <column name='trans_date' type='date' required='y' default='today' info='Date when the transaction was processed'/> <column name='trans_client' type='char' size='10' required='y' /> <column name="trans_item" type="varchar" size="16" required='y' /> <column name='trans_itemdim' type='serialref' required='y' default='0' /> <column name='trans_batchid' type='serialref' required='y' default='0' /> <column name='trans_owner' type='varchar' size='12' required='y' /> <!-- El lote y fecha caducidad, deberian ir en la tabla de itemdim ?? --> <!-- Si hacemos esto el problema es el GUI como permitiremos buscar un lote concreto ??--> <!-- <column name='trans_batch' type='char' size='12' /> <column name='trans_bbdate' type='date' /> --> <column name='trans_wh' type='varchar' size='10' required='y' /> <column name='trans_bin' type='varchar' size='16' required='y' /> <column name='trans_lpn' type='varchar' size='20' info='LPN for the work'/> <column name='trans_qty' type='decimal' size='14,3' required='y' default='0' /> <column name='trans_uom' type='char' size='6' required='y' /> <column name='trans_dualqty' type='char' size='6' required='y' default='0' /> <column name='trans_status' type='char' size='4' required='y' info='status of the inventory'/> <column name='row_disabled' type='char' size='1' required='y' default='N' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_invent_trans' columns='trans_id' /> </table> Field Type Description ParentLicensePlateId String The parent license plate ID for the transaction
Inventario o stocks
Todas las existencias se obtienen a partir de la tabla de existencias (inventory onhand)
Una explicación interesante de como las ordenes y los trabajos utilizan las reservas de stocks la podemos ver aqui: https://axscm.wordpress.com/2016/05/10/understanding-on-hand-and-reservations-for-wms-controlled-items/
Un blog bueno sobre transfer orders y gestion del inventario puede encontrarse aqui: https://daxwhse.wordpress.com/category/microsoft-dynamics-ax/warehouse-management/page/2/
Big Larsen Blog:
https://axscm.wordpress.com/
Los conceptos que debemos terminar obteniendo en cualquier informe sobre existencias son los siguientes:
Column | Description |
---|---|
Physical inventory | The physical quantity that is available in inventory. |
Physical reserved | The total quantity that was physically reserved. |
Available physical | The available (not reserved) quantity that is available in physical inventory. Available physical is a calculated field. The value equals the Physical inventory value minus the Physical reserved value. |
Available physical on extra dimensions | The available physical quantity for all the dimensions that are shown in the grid. |
Ordered in total | The total quantity that is included on inbound orders or that has a positive quantity in various inventory journals. |
On order | The total quantity that is included on outbound orders or that has a negative quantity in various inventory journals. |
Ordered reserved | The total quantity that is reserved on ordered receipts. The value in this field represents the total quantity of items in outbound transactions that have a status of Ordered reserved. Items that are reserved as ordered aren't physically available in inventory. Therefore, they can't be directly picked and delivered. |
Available for reservation | The total quantity of on-hand inventory that can be reserved. Note: If the Reserve ordered items check box is selected on the Inventory and warehouse management parameters page, the value in this field includes expected receipts. If the check box is cleared, the value excludes expected receipts. |
Total available | The total available quantity. Total available is a calculated field. The value equals the Available physical value plus the Ordered in total value minus the On order value. |
Quantity on Order - how many units are currently listed on purchase orders, but haven't been received and added to inventory. Basically, units that are on the way. Quantity Available - how many units remain to be sold. Quantity Allocated - how many units are currently listed on work orders as allocated work order products. Quantity on Hand - sum of quantity available and quantity allocated. Basically, unsold units.
wmx_inventory - Inventory Onhand (InventOnhandTmp) =================================================== <table name='wmx_inventory'> <column name='invent_wh' type='varchar' size='10' required='y' /> <column name='invent_bin' type='varchar' size='16' required='y' info='Location in a warehouse'/> <column name='invent_client' type='varchar' size='10' required='y' /> <column name="invent_item" type="varchar" size="16" required='y' /> <column name='invent_itemdim' type='serialref' required='y' default='0' info='Identification of dimensions for the item'/> <column name='invent_batchid' type='serialref' required='y' default='0' info='Batch dimension'/> <column name='invent_owner' type='varchar' size='12' required='y' info='Inventory owner'/> <column name='invent_serial' type='varchar' size='20' required='y' default='-' info='Serial Number'/> <column name='invent_lpn' type='varchar' size='20' required='y' default='-' info='The license plate identification number'/> <column name='invent_status' type='char' size='4' required='y' info='status of the inventory'/> <column name='ordered' type='decimal' size='14,3' required='y' default='0' info='Units currently listed on inbound orders, but haven't been received'/> <column name='physical' type='decimal' size='14,3' required='y' default='0' info='Physical quantity available'/> <column name='reserv_ordered' type='decimal' size='14,3' required='y' default='0' info='Quantity reserved on quantity ordered'/> <column name='reserv_physical' type='decimal' size='14,3' required='y' default='0' info='Quantity reserved of the physical quantity'/> <column name='physical_dual' type='decimal' size='14,3' required='y' default='0' info='Physical quantity dual available'/> <!-- Atencion: Queda pendientes la unidad de medida --> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_inventory' columns='invent_wh, invent_bin, invent_client, invent_item, invent_itemdim, invent_batchid, invent_owner, invent_serial, invent_lpn, invent_status' /> </table> Field Type Description InventSiteId String Identify the site WMSPalletId String Unique ID for the pallet (Serial Shipping Container Code) ConfigId String Descriptive name of configuration Received Real Physical quantity received, but not posted Deducted Real Quantity that has been physically deducted, but not posted. InventColorId String Descriptive name of color InventSizeId String Descriptive name of size InventStyleId String Descriptive name of style ORIGENES DE DOCUMENTOS/TRANSACCIONES (trans_origin) ================================================== origin_id serialref Summary number ID for transactions attached to the same inventory transaction. Ref_category smallint Specify the module that generated the transaction. (Invent_transtype) Ref_code String docser del documento adjunto (Para facilitar busquedas y mejorar visualización ref_cabid serialref Reference field in a different (transtype) table ref_linid serialref Reference field in a different (transtype) table Party Int64 Reference field (tercero - no es realmente necesario, solo para facilitar busquedas y mejorar visualización) ItemId String Identify item. ItemDimId serialref Identification of dimensions for the item. El itemid e itemdimid no son necesarios, hay que evaluar si realmente vale la pena ponerlo como referencia o no hacen falta Ref_category: Posibles tablas origen del documento. Puede ser smallint o simplemente un varchar Name Value Description Sales 0 Sales order Production 2 Production Purch 3 Purchase order WHSWork 201 Work WHSQuarantine 202 Quarantine WHSContainer 203 Container Dimensiones de inventario ================================================== Field Type Configuration key Description inventDimId String Identification of dimensions for the item. configId String Descriptive name of configuration inventBatchId String Batch dimension. InventColorId String Descriptive name of color InventSiteId String Identify the site InventLocationId String Identify the warehouse. LocationId String Location in a warehouse. inventSerialId String Serial number dimension. InventSizeId String Descriptive name of size InventStyleId String Descriptive name of style wMSPalletId String Unique ID for the pallet (Serial Shipping Container Code) MD5Hash o SHA1 String Hash code uniquely identifying this subset of inventory dimensions
18.1.5 Cambio de estado del inventario
Mediante las tareas tambien debemos de poder mover o cambiar el estado del inventario
Este modelo está pendiente de analizar en detalle, pero la primera aproximación es tener en cada tarea un estado origen y un estado destino. Dependiendo de la plantilla del trbajo, podriamos tener un tipo de linea de plantilla "Cambio de estado" y en este caso que preguntara el estado destino y reasignara en el stock el estado.
Esta operación podria realizarse tanto al mismo tiempo que se mueve el stock o sin mover el stock y cambiando simplemente el estado.
La linea de la plantilla del trabajo, es la que nos determinará qué es lo que preguntará el interface de RF y lo que será imprescindible confirmar y los campos que se podrán saltar o no conrirmar.
Como explica el ejemplo externo, el problema es cuando debemos de permitir que el operario nos diga a que estado quiere pasar el inventario.
En el ejemplo mostrado a continuación, se definen unas operaciones de cambio de estado que indirectamente determinan para un estado origen que estado destino se va a quedar.
Esta es otra aproximación al algoritmo: Definimos un único campo que nos indique el tipo de operacion de cambio de estado y este tipo de operación nos moverá el stock.
Por ejemplo, supongamos que tenemos una ubicación con 40 unidades: 10 disponibles y 30 en cuarentena. Y se derrama liquido por encima y queremos bloquear las 40 unidades, podriamos hacer un trabajo que para 40 unidades de la ubicación XX, ejecutara el cambio de estado de tipo "Bloquear", esto pasaría las disponbiles a "bloqueadas" y las de cuarentena a "cuarentena bloqueada", aunque la acción elegida por el usuario es siempre la misma inpendientemente del estado original del stock ¿Se entiende?
WHS Work status change code
You'd need to have at least 2 Pick/Put pairs on the work template.
- Pick
- Put with directive code = QMS (for example)
- Status change
- Pick, Stop work = true, probably also a different work class ID here and next line
- Put
Then you'd define the Work status change codes, and tie them to a specific inventory status - let's say, "Blocked".
Then on the work template line you'd link that to that status. There's no lookup, but the description will get populated if you typed in the value right :)
Then you'd define a corresponding location directive with Directive code = QMS, so items are moved to an inspection area.
With that setup, when you execute the first Pick/Put pair for the purchase order putaway, the status of the line will be automatically changed to Blocked.
However, this functionality does not work well, and with a high likelihood will be removed in future releases, so I wouldn't put my money on it :)
18.2 Oleadas - Waves
https://docs.oracle.com/cd/E26401_01/doc.122/e48830/T211976T536591.htm
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/wave-processing
.
Generalmente, el origen de cualquier operación de almacén son las ordenes o las notas de entrega (shipments). La generación del lanzamiento por oleadas, nos permite la asignación de las operaciones a una oleada, y la posibilidad de generar tablas temporales y agrupación de operaciones sin temor a que haya otro proceso que simultaneamente nos este cogiendo las misma ordenes o notas de entrega y las esté procesando en paralelo. O sea nos permite asegurarnos que no habrá concurrencia y que se generararán trabasjos en paralelo para una misma orden.
Create, process, and release a wave to create picking work for a load, shipment, or production order.
Use shipping waves to include lines from sales orders. When a sales order is released to the warehouse, the sales order lines can be included in the wave.
For sales orders and kanban orders, inventory must be reserved before the order is released to the warehouse. Otherwise, the items or allocation lines can't be processed in a wave.
Create and process a wave
The following diagram shows the flow for how shipping waves are created, processed, and released. The numbers correspond to the sections later in this section.
Wave Processing
After a wave has been created and contains all of its required lines, you are ready to process it to create the corresponding picking work.
Release the wave to the warehouse to start picking and packing
You must process a wave before you can release it. When you release the wave, the picking work is available in the warehouse. You can cancel a wave after it is released, and add more lines, but you can't change the lines.
<table name="wmx_wave_head"> <column name="wave_id" type="serial" default="0" required="y" /><!-- The unique identifier for the wave --> <column name='description' type='varchar' size='60' /><!-- Brief description of transaction --> <column name='wave_status' type='char' size='1' /><!-- The status of the wave --> <column name='wave_execute' type='char' size='1' /><!-- Specify whether the wave should be processed --> <column name='wave_date' type='date' /><!-- Date when wave is created or should be processed --> <column name='wh_code' type='char' size='10' required='y' /><!-- Identify the warehouse --> <column name='date_executing' type='datetime' size='year to second' /> <!-- The processing date and time --> <column name='date_released' type='datetime' size='year to second' /> <!-- The date and time it was released --> <column name='date_completed' type='datetime' size='year to second' /> <!-- The completion date and time --> <column name='date_held' type='datetime' size='year to second' /> <!-- The date and time held --> <column name='numwork_created' type='integer' /> <!-- The number of work headers that have been created --> <column name='numwork_remaining' type='integer' /> <!-- The number of work headers remaining. --> <column name='wave_attrib_1' type='varchar' size='30' /> <!-- The wave attribute 1--> <column name='wave_attrib_2' type='varchar' size='30' /> <!-- The wave attribute 2 --> <column name='wave_attrib_3' type='varchar' size='30' /> <!-- The wave attribute 3 --> <column name='wave_attrib_4' type='varchar' size='30' /> <!-- The wave attribute 4 --> <column name='wave_template' type='varchar' size='15' /> <!-- The name of the wave template used to create this wave --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_wave_head' columns='wave_id' /> </table> DemandWaveId String The source wave of the demand <table name="wmx_wave_line"> <column name="wave_lineid" type="serial" default="0" required="y" /><!-- The unique identifier for the line--> <column name="wave_id" type="serialref" required="y" /><!-- The unique identifier for the wave --> <column name="order_id" type="serialref" /> <!-- The order number (Orden de picking o pedido) --> <column name="shipment_id" type="serialref" /> <!-- The shipment identification number (Albaran de venta)- --> <column name="load_id" type="serialref" /> <!-- The identification number for the load. Contents of a vehicle. En FF, seria el contenido de una ruta (similar a gtra_envunidh) --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_wave_line' columns='wave_lineid' /> <foreign name='f_wmx_wave_line1' columns='wave_id' references='wmx_wave_head' refcols='wave_id' /> </table> WWorkTransType Enume The type of work order for which a location directive is defined <table name="wms_wavetemplate_head"> <column name='wave_template' type='varchar' size='15' required='y' /> <!-- The name of the wave template used to create this wave --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wms_wavetemplate_head' columns='wave_template' /> </table> ------------------------ EN ANALISIS ------------------------ <table name="wms_wavetemplate_line"> <column name='wave_template' type='varchar' size='15' required='y' /> <!-- The name of the wave template used to create this wave --> <column name='wave_step' type='integer' required='y' /> <!-- The sequence number in which the method is called --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wms_wavetemplate_line' columns='wave_template' /> </table> Field Type Configuration key Description PostMethodName String The name of the method to be called WaveStepCode String The code to determine how wave step will be treated WaveTemplateName String The name of the wave template <table name="wms_wave_postmethod"> <column name='wpm_name' type='varchar' size='15' /> <!-- The name of the method to be called --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wms_wave_postmethod' columns='wave_template' /> </table> Field Type Configuration key Description OptionalMethod Enum Specify whether the method is optional PostMethodName String PostMethodPos Integer The position in which the method will be called RepeatableStep Enume Make the method repeatable for the wave template WaveTemplateType Enum The type of wave template
18.3 Cargas - Unidades de envio y Rutas (Loads & Routes)
ANALISIS EN CURSO - NO IMPLEMENTAR
<table name="wms_load_head"> <column name="load_id" type="serial" default="0" required="y" info="The identification number for the load " /> <column name='load_reference' type='varchar' size='20' info='The external reference number on the load ' /> <column name='route_code' type='varchar' size='20' info='The unique identifier for the planned freight route' /> <column name='load_sched_ship_dt' type='datetime' size='year to second' info='The scheduled shipping date and time for the load' /> <column name='load_ship_confirm_dt' type='datetime' size='year to second' info='The date and time the load was ship confirmed' /> <column name='load_arrival_dt' type='datetime' size='year to second' info='The arrival date and time of the load' /> <column name='reauired_sail_dt' type='datetime' size='year to second' info='The date and time the vessel is required to sail' /> <column name='load_status' type='char' size='1' info='The status of the load' /> <column name='late_ship_reason' type='char' size='1' info='The reason the shipment is late' /> <column name='loader' type='varchar' size='20' info='Person responsible for loading' /> <column name='car_number' type='varchar' size='20' info='The identifier for a car' /> <column name='tractor_number' type='varchar' size='20' info='The unique identifier for the tractor' /> <column name='trailer_number' type='varchar' size='20' info='The unique identifier for the trailer' /> <column name='vessel_name' type='varchar' size='20' info='The name of the vessel' /> <column name='voyage_number' type='varchar' size='20' info='The unique identifier for a voyage' /> <column name='inspection_seal' type='varchar' size='20' info='The unique seal for the inspection' /> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' info='The date and time the record was last updated' /> </table> Field Type Configuration key Description AccountNum String The vendor account number for the purchase order, or the customer account number for the sales order BillOfLadingId String The bill of lading identification number BookingNum String The unique booking number for a load BrokerCode String The unique identifier for the broker who booked the transportation CarrierCode String The unique identifier for the shipping carrier CarrierGroupCode String The unique identifier for the carrier group CarrierServiceCode String The unique identifier for the carrier service CustVendRef String Either a customer reference or vendor reference number CutOffUTCDateTime UtcDateTime The cut off date and time DestinationHubCode String The unique identifier for the hub master DestinationName String The description of the object DestinationPostalAddress Int64 Reference field in a different table ETA UtcDateTime The items estimated time of arrival ETD UtcDateTime The estimated time of departure for the item FinalDestination Enum The final destination for the load. HouseBill String The unique identifier for the house bill Invalid Enum Indicates if the load is invalid. InventLocationId String Identify the warehouse. InventSiteId String Identify the site LastUpdateUTCDateTime UtcDateTime The date and time the record was last updated LateShipReasonCode String The reason the shipment is late LoadArrivalUTCDateTime UtcDateTime The arrival date and time of the load LoadDirection Enum The direction of the record for the load LoadFloorStack Enum Specify if the load floor is stacked LoadPaysFreight Enum Specify whether the load will write off freight charges LoadReferenceNum String The external reference number on the load LoadSchedShipUTCDateTime UtcDateTime The scheduled shipping date and time for the load LoadShipConfirmUTCDateTime UtcDateTime The date and time the load was ship confirmed LoadStatus Enum The status of the load LoadTemplateId String The load template ID LoadTipVolume Real The load tip volume LoadTipWeight Real The load tip weight LoadTypeId String The load type LoadUserDef1 String User defined field 1. LoadUserDef2 String User defined field 2. LoadUserDef3 String User defined field 3. ActualGrossWeight Real The actual gross weight ActualNetWeight Real The final weight of an object ActualTareWeight Real The actual tare weight LoadNetWeight Real The net weight of the load LoadWeight Real The weight of the load LoadWidth Real The width of the load LoadHeight Real The height of the load LoadDepth Real The depth of the load MaxFreightPieces Integer The maximum number of freight pieces allowed ModeCode String The unique identifier for the mode OrderNum String The order number OriginHubCode String The unique identifier for the hub master OriginName String The description of the object OriginPostalAddress Int64 Reference field in a different table ProNum String The pro number SailUTCDateTime UtcDateTime The Sail UTCdate time for the route. SealNum String The seal number SystemTareWeight Real The system generated tare weight TransportationTemplateId String The unique identifier for the transportation template <table name="wms_load_line"> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> </table> Field Type Description LoadId String The identification number for the load Invalid Enum Indicates if the load line is invalid ItemId String Identify item. InventDimId String Identification of dimensions for the item. InventQty Real The quantity in the lowest unit InventTransId String Identification of the item lot. InventTransType Enum Specify the module that generated the transaction. LoadClosedUTCDateTime UtcDateTime The date and time the load was closed LoadDirection Enum The direction of the record for the load LoadInProcessUTCDateTime UtcDateTime The date and time the load was in process LoadOpenUTCDateTime UtcDateTime The date and time the load was opened LoadReadyToShipUTCDateTime UtcDateTime The date and time the load was ready to ship OrderNum String The order number OverDeliveryPct Real The percentage by which the product receipt quantity is allowed to exceed the order quantity PackingQty Real Number of units ParentInventTransType Enum Specify the module that generated the transaction. ParentOrderNum String The order number PickedQty Real Quantity that has been picked QCQty Real The quantity in the inventory unit, currently in quality control location Qty Real Number of units QtyLeftToStructure Real The inventory quantity remaining to be structured ReleaseToWarehouseId String The unique identifier for the release to warehouse table ShipmentId String The shipment identification number TransportRequest Enum The load line is a transport request line UnderDeliveryPct Real The percentage by which the product receipt quantity is allowed to be less than the order quantity UOM String The unit or measure WorkCreatedQty Real The quantity that already has work created for it
<table name="wms_routes"> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> </table> Field Type Configuration key Description RouteCode String The unique identifier for the planned freight route Name String The description of the object ApptUTCDateTime UtcDateTime The appointment date and time CurrencyCode String Current currency code DeliveryUTCDateTime UtcDateTime The delivery date and time Description String Brief description of transaction InventLocationId String Identify the warehouse. InventSiteId String Identify the site Manual Enum Specify whether this is a manually created object RouteConfigCode String The unique identifier for the route configuration RouteGuideRecId Int64 The record ID for the route guide RoutePlanName String The description of the object RouteStatus WHSandTMS ShipUTCDateTime UtcDateTime The date and time the object was shipped TransportationOrderNum String The transportation order number
18.4 Cluster Picking
Una plantilla para la generación de picking en modo cluster, permite la generación automática o manual de pickings de trabajos de forma agrupada.
Los clusters de trabajos se pueden crear automaticamente o manualmente siguiendo una de las plantillas existentes
El campo position_verify permite indicar el método por el que se verificará la posición dentro del cluster en el que pondremos el producto.
Para explicar este campo pongamos como ejemplo un carro en el que ponemos cubetas o cajas de cartón y que tambien disponen de un código de barras en el frontal de cada posición para una mejor verificación.
Si el campo position_verify indica el valor "Position Scan" (Verifica posición), entonces quiere decir que el operador obligatoriamente deberá hacer una equivalencia entre el numero de cubeta y la posición en el carro. Para que de esta forma pueda verificar mediante el escaneo de la posición. En este caso, tanto el codigo de barras de la posición como el codigo de barras de la cubeta nos valdrian.
Si se pone "LPN Scan"(Verificar caja), lo que se indica es que no nos importan las posiciones en las que hemos puesto las cajas ya que pediremos que nos verifiquen el codigo de barras de la cubeta directamente
A la hora de hacer asignación automatica de trabajos a un cluster ya existente (System driven) el criterio puede ser que la orden mueva elementos de la misma zona
Esto en la version anterior era plausible, pero hora los trabajos pueden contener tareas que afectan a multiples zonas, por lo que no podemos hacer filtrado por zonas. Por lo tanto, tendremos que usar mecanismo más inteligentes como la primera y ultima ubicación de cada trabajo. Cuando generamos un cluster y obtenemos un trabajo aleatoriamente (el primero, mas prioritario, etc.), cuando el sistema deba adjudicar otro trabajo, buscará trabajos con la primara y ultima ubicación lo más cercana posible a la primera y ultima utibicación del cluster.
Otro método podria continuar vinculado a las zonas, pero esto nos obligaria a romper las zonas en elementos má pequeños y a partir de ahi, evaluar otros trabajos que tengan tareas en las mismas zonas que el cluster al que va a ser asignado. Hay que analizarlo, pero es posible que la busqueda por ubicaciones lo más "cercanas" posible a la ubicación minima del cluster pueda ser un buen algoritmo.
<table name="wmx_workcluster_head"> <column name="cluster_id" type="serial" default="0" required="y" info='A unique identifier for the cluster' /> <column name='clus_type' type='char' size='1' required='y' /><!-- [I]nbound/[O]utbound clusters --> <column name='clus_template' type='varchar' size='15' info='Code for the cluster template' /> <column name='clus_user_assigned' type='varchar' size='15' info='The user who locked this record' /> <column name='clus_status' type='smallint' default='0' required='y' info='The status of the work cluster'/> <!-- 0 Open, 1 In process, 2 Passed, 3 Closed --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workcluster_head' columns='cluster_id' /> </table> <table name="wmx_workcluster_line"> <column name="cluster_id" type="serialref" required="y" info='The cluster identification number' /> <column name="work_id" type="serialref" required="y" info='The work identification number' /> <column name='clus_position' type='varchar' size='15' required='y' info='The position within the work cluster' /> <!-- Se copia de wmx_cluster_template_line.ctl_position, se pide manualmente o se genera con una secuencia numerica --> <!-- dependiendo de la plantilla usada --> <!-- Es el identificador de la posición: String porque puede ser un código de barras prefijado en el carro --> <!-- En el momento de la creación, se vincula a un trabajo y por lo tanto ya tenemos, el codigo de barras de la posicion en el carro + el codigo de barras de la cubeta (LPN del trabajo) --> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_workcluster_head' columns='cluster_id, clus_position' /> <!-- No sé si tiene sentido un trabajo que acabe en varios clusters, pero lo que no puede ser es que el mismo trabajo se asigne dos veces al mismo cluster --> <unique name='u1_wmx_workcluster_head' columns='work_id, cluster_id' /> </table>
<table name="wmx_cluster_template_head"> <column name='cluster_code' type='varchar' size='15' required='y' /> <!-- Short template description --> <column name='cluster_name' type='varchar' size='80' /> <!-- The name of the cluster profile --> <column name='cluster_type' type='char' size='1' required='y' /> <!-- [I]nbound/[O]utbound clusters --> <column name='generate_cluster' type='char' size='1' required='y' default='N' /><!-- Generate a unique identifier for the cluster automatically --> <column name='positions_active' type='char' size='1' required='y' default='N' /><!-- Assign work units to specific positions during cluster picking or use LPN --> <column name='num_positions' type='smallint' required='y' default='1' /><!-- The maximum number of positions or work units that can be assigned to the cluster --> <column name='position_name' type='char' size='1' required='y' default='N' /><!-- The naming convention for cluster positions: Numeric / Alfanumneric / Others--> <!-- Select Position scan. This field determines whether the put-to-position step is verified. --> <column name='position_verify' type='char' size='1' required='y' default='N' /><!-- The type of verification that is performed when clustered work is sorted --> <!-- Select the action that will break up the cluster. You can break a cluster when either the picking or put away work is completed. --> <column name='break_cluster_at' type='char' size='1' /><!-- Put, Work Close --> <column name='assignment_timing' type='char' size='1' /><!-- --> <column name='assignment_rule' type='char' size='1' /><!-- --> <!-- Regla de asignación de clústeres: Manual, Sistema, Otros?? Este campo define si la asignación de clúster se debería determinar automáticamente por el sistema o hacer manualmente por el usuario. --> <column name='putaway_locate' type='char' size='1' /><!-- Receipt, Cluster close, User directed --> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_cluster_template' columns='cluster_code' /> </table> Generate cluster ID - Y/N. This option determines whether the cluster ID is automatically created by the system, or whether the user will create it at the start of picking. Activate positions - Y/N This option determines whether the position names are automatically generated based on the position name setup. If this option is set to No, the license plate Number for the position is used. Number of positions - This field determines the maximum number of positions that the cluster can have (that is, the maximum number of boxes, totes, and so on). Position name - If you Select Numeric positions are named by using continuous numbers. If you select Alphabetical, the positions are named in alphabetical order. Gracias a poder especificar individualmente los nombres de las posiciones, nos permite asimilar una plantilla de cluster como si fuera un carro (trolley). Cada carro tiene su plantilla, y cada posicion tiene su identificador unico (ctl_position) A la hora de validar la posicion, se puede hacer tanto por el numero de cubeta o LPN de la orden, como por el codigo de la posición indicado en esta tabla. <table name="wmx_cluster_template_line"> <column name='cluster_code' type='varchar' size='15' required='y' /> <!-- Template code --> <column name='ctl_sortnum' type='smallint' required='y' /> <!-- Sort order of position --> <column name='ctl_position' type='varchar' size='15' required='y' /> <!-- Position identification barcode--> <column name='user_created' type='varchar' size='20' default='user' required='y' /> <column name='date_created' type='datetime' size='year to second' default='current' required='y' /> <column name='user_updated' type='varchar' size='20' default='user' required='y' /> <column name='date_updated' type='datetime' size='year to second' default='current' required='y' /> <!-- INDEXES --> <primary name='p_wmx_cluster_template_line' columns='cluster_code, ctl_sortnum' /> </table>
18.5 Diseño de almacén
18.5.1 Almacenes
-------------------------------------- RECINTOS -------------------------------------- Original: InventSite <table name='wmx_site'> <column name='site_code' type='char' size='10' required='y' /> <column name='site_name' type='varchar' size='40' required='y' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_site' columns='site_code' /> </table> DefaultInventStatusId String The default inventory status ID on inventory transactions OrderEntryDeadlineGroupId String Order entry deadline group used for transfer orders TaxBranchRefRecId Int64 The identification number of the tax branch. Timezone Enum Time zone for the site -------------------------------------- ALMACENES -------------------------------------- Original: InventLocation Nuestro concepto de recinto, en otras instalaciones se les denomina "location" o "site", aunque otros WMS eluden directamente la abstraccion y les denominan "warehouse" para que sea más fácil de entender Warehouse - A location is a physical structure or place where inventory is received, stored, and shipped, potentially organized in bins. A location can be a warehouse, service car, showroom, plant, or an area in a plant. Bin/Location - A bin is a storage device designed to contain discrete parts. It is the smallest container unit Zone - bins can be grouped in zones to manage how the workflow of warehouse activities is directed. A zone could be a receiving zone or a stocking zone, and each zone can consist of one or several bins. Class - you can assign warehouse class codes to items, bins, and zones to control where different item classes are stored, such as frozen goods. You can divide a zone into several warehouse classes. For example, items in the receiving zone can be stored as frozen, hazardous, or other class. Client - Representa un "cliente" del almacen. Cada cliente puede tener sus propios articulos, pero tambien puede tener zonas o ubicaciones reservadas, aunque pueden haber otras comunes o compartidas ¿Debemos separar la clasificacion de zonas o ubicaciones reservadas del concepto general de zona de almacen? (Analicemoslo) <table name='wmx_warehouse'> <column name='wh_code' type='char' size='10' required='y' info='Identify the warehouse'/> <column name='wh_name' type='varchar' size='40' required='y' info='Description of the warehouse'/> <column name='wh_alias' type='varchar' size='15' info='Alias used in printed documents' /> <column name='wh_site' type='char' size='10' required='y' /> <column name='wh_printer_group' type='varchar' size='10' info='Group or printers to use in this warehose'/> <column name='wh_status' type='char' size='1' required='y' /> <!-- <column name='wh_address' type='nvarchar' size='60' /> <column name='wh_city' type='nvarchar' size='60' /> <column name='wh_country' type='varchar' size='60' required='y'/> <column name='wh_postcode' type='varchar' size='10' /> <column name='wh_region' type='varchar' size='60' /> <column name='wh_business_phone' type='varchar' size='15' /> <column name='wh_business_email' type='varchar' size='40' /> --> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <!-- INDEXES --> <primary name='p_wmx_warehouse' columns='wh_code' /> <foreign name='f1_wmx_warehouse' columns='wh_site' references='wmx_site' refcols='site_code' /> </table> Field Description ActivityType_RU String Activity type of department responsible for the warehouse. AllowLaborStandards Enum Allows labor standards to be used in the warehouse AllowMarkingReservationRemoval Enum Remove reservations if inventory status changes BranchNumber String Identification of a company unit. ConsolidateShipAtRTW Enum Consolidate similar sales orders CustAccount_HU String Customer account number if the warehouse is placed at a customer. CycleCountAllowPalletMove Enum Allow cycle counting to automatically move pallets located elsewhere in the warehouse DecrementLoadLine Enum Determine whether the load line quantity is decremented during the cancellation of shipping DefaultShipMaintenanceLoc String The default location inventory will be moved during shipment maintenance processes DefaultStatusId String The default inventory status ID on inventory transactions emptyPalletLocation String Location where empty pallets automatically are placed. FSHStore Enum Is this location a store? InventCountingGroup_BR Enum Specify warehouse location. InventLocationId String Identify the warehouse. InventLocationIdGoodsInRoute_RU String Warehouse used to store items shipped with postponed passing of property. InventLocationIdQuarantine String Identify the warehouse. InventLocationIdReqMain String Warehouse to refill from when activating refilling InventLocationIdTransit String Warehouse used to identify and handle items in transit. InventLocationLevel Integer Level in relation to the main warehouse where the warehouse is located. InventLocationType Enum Warehouse type InventProfileId_RU String Inventory profile. InventProfileType_RU Enum Kind of activity. InventSiteId String Identify the site Manual Enum Are all items in the warehouse coverage planned manually (that is no planned orders, transactions and on-hand)? maxPickingRouteTime Integer Maximum time per picking route maxPickingRouteVolume Real Maximum volume per picking route Name String Description of the warehouse. NumberSequenceGroup_RU String Group for allocation of different number sequences to different customers/vendors. pickingLineTime Integer Time for pick of 1 line (picking route transit time) PrintBOLBeforeShipConfirm Enum Print the bill of lading before confirming the shipment ProdReserveOnlyWhse Enum Indicate whether to reserve production raw materials to the warehouse level and ignore the rest of the inventory dimensions on the bill of materials line RBODefaultInventProfileId_RU String The inventory profile that is applied to retail transactions RBODefaultWMSLocationId String The warehouse location used for retail transactions. (This field applies only to the following version(s): Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2 (SYS), Microsoft Dynamics AX 2012 Feature Pack (SYS)) RBODefaultWMSPalletId String The default pallet ID for retail transactions. (This field applies only to the following version(s): Microsoft Dynamics AX 2012 R3, Microsoft Dynamics AX 2012 R2 (SYS), Microsoft Dynamics AX 2012 Feature Pack (SYS)) RemoveInventBlockingOnStatusChange Enum Remove inventory blocking when the inventory status changes ReqCalendarId String Work-days calendar. When no coverage group is specified, used to calculate order date, requirement date, and preferred delivery date. ReqRefill Enum Refill as per requirement via planned transfer from the main warehouse? ReserveAtLoadPost Enum Run inventory reservations during load posting UniqueCheckDigits Enum Use unique check digits for the warehouse useWMSOrders Enum Use setting from item model group or overrule the setting for this warehouse. VendAccount String Vendor account number if the warehouse is placed at a vendor. WarehouseAutoReleaseReservation Enum Reserve inventory when the periodic job that releases to the warehouse is used WHSEnabled Enum Indicate that the warehouse is controlled by processes defined for warehouse management and the use of reservation hierarchy WMSlocationIdDefaultIssue String Location proposed for inventory issues of sales orders, production lines, etc. when nothing else is specified WMSLocationIdDefaultReceipt String Location proposed for inventory receipts of purchase orders, productions, etc. when nothing else is specified WMSLocationIdGoodsInRoute String Location used to register items shipped and stocked in the warehouse. -------------------------------------- ZONAS DE ALMACEN -------------------------------------- Original: wms_wh_zonlog y wms_wh_subzon Estas tablas no deberian tener parametrización de tipos de ubicación, orden de picking, etc ya que esto tiene que estar en otras tablas que hagan referencia a zonas u a otros elementos del almacen como pasillos, etc. The zone group is meant as a group of physical zones in a warehouse. The location type should reflect the purpose of the locations. <table name="wmx_zonegroup"> <column name='zg_code' type='varchar' size='10' required='y' /> <column name='zg_name' type='varchar' size='40' /> <column name='zg_whcode' type='varchar' size='12' required='y' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_zonegroup' columns='zg_code' /> </table> <table name="wmx_zone"> <column name='zone_code' type='varchar' size='10' required='y' /> <column name='zone_name' type='varchar' size='40' /> <column name='zone_whcode' type='varchar' size='12' required='y' /> <column name='zone_group' type='varchar' size='10' required='y' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_zone' columns='zone_code' /> </table> -------------------------------------- PASILLO -------------------------------------- <table name="wmx_aisle"> <column name='aisle_wh' type='varchar' size='12' required='y' /> <column name='aisle_num' type='smallint' required='y' /> <column name='aisle_name' type='varchar' size='60' /> <column name='sortnum' type='integer' /> <column name='sortdescending' type='smallint' default='1' required='y' info='1: Ascending, -1: Descending'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> </table>
18.5.2 Ubicaciones
Esquema de ubicaciones
-------------------------------------- UBICACIONES -------------------------------------- <table name="wmx_bin"> <column name='bin_wh' type='varchar' size='12' required='y' /> <column name='bin_code' type='varchar' size='15' required='y' /> <column name='bin_name' type='varchar' size='30' info='Manual update of location name' /> <column name='bin_zone' type='varchar' size='10' required='y' /> <!-- En el futuro podriamos añadir una o dos zonas adicionales para poder realizar operaciones sobre ubicaciones usando distintos criterios de agrupación en zonas Additional Zone 1 field, select PICKZONE1. Additional Zone 2 field, select WEBSHOP1. --> <column name='bin_check_txt' type='varchar' size='10' info='Check text for location: for voice picking or easy alias'/> <column name='location_type' type='varchar' size='15' info='Location type - Use of location'/> <column name='location_profile' type='varchar' size='15' info='Location profile'/> <column name='sortnum' type='integer' info='Sort order of locations'/> <column name='sortdescending' type='smallint' required='y' default='1' info='1: Ascending, -1: Descending'/> <column name='sortmanual' type='char' size='1' required='y' default='N' info='Manual update of sort code. Preserve Sort Num'/> <!-- A rack usually contains all locations between two standing poles, a level is a shelf or a horizontal beam, a bin is a position on the shelf or beam. --> <column name='bin_aisle' type='smallint' required='y' info='Aisle in a warehouse'/> <column name='bin_rack' type='smallint' required='y' info='Rack in an aisle in a warehouse'/> <column name='bin_level' type='smallint' required='y' info='Shelf in a rack in a warehouse'/> <column name='bin_position' type='smallint' required='y' default='0' info='Bin position for location in a shelf'/> <column name='bin_volume' type='decimal' size='12,2' info='Volume of the location'/> <column name='bin_depth' type='decimal' size='12,2' info='Depth of the location'/> <column name='bin_width' type='decimal' size='12,2' info='Width of the location'/> <column name='bin_height' type='decimal' size='12,2' info='Height of the location'/> <column name='bin_abs_height' type='decimal' size='12,2' info='Height above ground level'/> <column name='bin_max_volume' type='decimal' size='12,2' info='Maximum volume that can be stored on the location'/> <column name='bin_max_weight' type='decimal' size='12,2' info='Maximum weight that can be stored on the location'/> <column name='bin_max_lpn' type='smallint' info='Maximum number of License Plates possible on the location'/> <column name='storage_area' type='varchar' size='10' info='Inbound area code in the location system'/> <column name='picking_area' type='varchar' size='10' info='Picking area code in the location system'/> <column name='input_block_cause' type='varchar' size='10' info='Reason why a location has been blocked for storage'/> <column name='output_block_cause' type='varchar' size='10' info='Reason why a location has been blocked for picking'/> <column name='last_counted' type='datetime' info='The date and time when the location was last counted'/> <column name='last_activity' type='datetime' info='The date and time when the location had last activity'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin' columns='bin_wh, bin_code' /> </table> <!-- Renombado a bin_max_lpn --> <column name='bin_max_container' type='smallint' info='Maximum number of containers possible on the location'/> <column name='bin_container_tgroup' type='varchar' size='10' info='Name for group of pallet types allowed in location'/> inputLocation Destination location, normally the location itself. Este campo se usa para vincular dos ubicaciones como si dueran la misma. Por ejemplo, cuando un pallet mas grande de lo normal se pone en una ubicacion, está bloqueando tambien la ubicación colindante, en este caso, la ubicación colindante, tiene que actuar como si fuera la ubicación del pallet y ya no tiene que dejar poner otro pallet. O sea, momentaneamente, mientras el pallet esté alli, la ubicación colindante no existe y actua como la ubicación principal (Analizar esto y si el mecanismo propuesto tiene sentido o no) ReservationPriority Integer Locations of a higher reservation priority will be utilized first. locationStatus – The status of the location. There are four possible values: Undetermined – The location profile can't track status. Therefore, the current status is unknown. Empty – There is currently no inventory in the location. Picking – Outbound transactions have been performed against the location since it was last empty. Storage – Only inbound transactions have been performed against the location since the location was last empty. -------------------------------------- UBICACIONES - MOTIVOS DE BLOQUEO -------------------------------------- <table name="wmx_bin_block_cause"> <!-- Reason why a location has been blocked. -> <column name='cause_code' type='varchar' size='10' required='y' info='Blocking Cause Id Code'/> <column name='cause_name' type='varchar' size='40' required='y' info='Blocking Cause Id Name'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_block_cause' columns='cause_code' /> </table> -------------------------------------- UBICACIONES - AREAS DE ALMACENAMIENTO -------------------------------------- <table name="wmx_bin_store_area"> <!-- Groups of locations in the inventory -> <column name='area_code' type='varchar' size='10' required='y' info='Storage Area Code'/> <column name='area_name' type='varchar' size='40' required='y' info='Area Name'/> <column name='area_type' type='smallint' required='y' info='Type - 0:Input, 1: Pick'/> <column name='area_handling' type='smallint' required='y' info='Handling - 0:Online, 1: Robotics, 2: Paper-Document'/> <column name='area_refill' type='char' size='1' required='y' default='N' info='Automatic creation and activation of refill transports'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_store_area' columns='area_code' /> </table> <!-- <table name="wmx_storezone"> <column name='sz_whcode' type='varchar' size='12' required='y' /> <column name='sz_code' type='varchar' size='10' required='y' /> <column name='sz_name' type='varchar' size='40' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> </table> <table name="wmx_storezonearea"> <column name='sz_code' type='varchar' size='10' required='y' info='Zone of areas in the inventory'/> <column name='area_code' type='varchar' size='10' required='y' info='Storage Area Code'/> </table> --> -------------------------------------- UBICACIONES - FORMATOS -------------------------------------- <table name="wmx_bin_format"> <column name='binf_code' type='varchar' size='10' required='y' info='The type of location'/> <column name='binf_name' type='varchar' size='50' required='y' info='Description of type'/> <column name='binf_format' type='varchar' size='20' required='y' info='Bin Format mask: #3a-#2r#2l#2p#ck (Aisle, Rack, Level, Position, Check digit if allowed'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_format' columns='binf_code' /> </table> -------------------------------------- UBICACIONES - TIPOS -------------------------------------- <table name="wmx_bin_type"> <column name='bint_code' type='varchar' size='10' required='y' info='The type of location'/> <column name='bint_name' type='varchar' size='50' required='y' info='Description of type'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_type' columns='bint_code' /> </table> -------------------------------------- UBICACIONES - PERFILES -------------------------------------- <!-- https://dynamics-tips.com/location-profiles/ --> <!-- Also on the profile is the usable volume percentage. This allows you to configure a 'fudge factor'. Your location might be 10 x 20 x 30, but product that's also 10 x 20 x 30 probably doesn't actually fit there. You can set the usable percentage to 90% and the system will consider 90% of the location volume as available for storage. Another note about using dimensions vs volume. When using dimensions, I'm pretty sure the system does not "spin" the product when determining if something will fit. So if your location is L40 x W48 x H50, and your product is L48 x W40 x H20, it will NOT put the product there. --> <table name="wmx_bin_profile"> <column name='binp_code' type='varchar' size='10' required='y' info='The unique identifier for the location profile'/> <column name='binp_name' type='varchar' size='50' required='y' info='The name of the location profile'/> <column name='binp_type' type='varchar' size='10' required='y' info='The type of location'/> <column name='binp_format' type='varchar' size='10' required='y' info='The location format'/> <column name='binp_dockmgmt' type='varchar' size='10' required='y' info='Dock management profile'/> <!-- binp_dockmgmt allows you to ensure that items from the same shipment, load, order, wave, or work order type are not placed in the same staging location or shipping dock location. This is useful if you have out bound staging lanes that you need to be organized or grouped in a particular way. Location directives will respect the dock management profile when evaluating and creating the work to be executed. --> <column name='binp_allowmixbatches' type='char' size='1' required='y' default='N' info='Allow storage of mixed inventory batches at all locations'/> <column name='binp_allowmixitems' type='char' size='1' required='y' default='N' info='Allow storage of mixed items at all locations'/> <column name='binp_allowmixstatus' type='char' size='1' required='y' default='N' info='Allow storage of items that have different inventory statuses at the same location'/> <column name='binp_allownegative' type='char' size='1' required='y' default='N' info='Allow negative inventory for work creation and picking at the location'/> <column name='binp_lpncontrolled' type='char' size='1' required='y' default='N' info='Use license plate tracking at the location'/> <column name='binp_cyclecountable' type='char' size='1' required='y' default='Y' info='Allow cycle counting at all locations'/> <column name='binp_checkdigit' type='char' size='1' required='y' default='Y' info='enerate a check digit for all locations'/> <column name='binp_ignorebatchrules' type='char' size='1' required='y' default='N' info='Override rules for batch days when inventory is located'/> <!-- binp_ignorebatchrules: On the warehouse management parameters the “Number of days to mix batches” parameter ensures that product cannot be put into a location that has a difference in expiration date greater than the number put into this field. However, on the location profile if you select the “Override rules for batch days” flag the system will ignore this parameter setting for locations associated to the location profile. --> <column name='binp_containertgroup' type='varchar' size='10' info='Allowed container type group'/> <column name='binp_capacitymethod' type='char' size='1' required='y' default='V' info='The method to calculate cpacity: Dimensions, Volume'/> <column name='binp_fillpercent' type='smallint' required='y' default='100' info='The volume percentage that can be utilized at the location '/> <column name='binp_storageuom' type='varchar' size='10' info='The unit for calculating volume of the location'/> <!-- binp_storageuom: if using volume, you can specify what UOM you want it to use when determining if the product fits in the location (storage unit). For example, in a bin each picking location, a case might not fit the location, but if you dumped out the contents of of the case, the volume of the eaches would fit. So you can set the profile to use the each dimensions when doing the math between the location dimensions and the product dimensions. --> <column name='binp_width' type='decimal' size='8,2' info='The real width of the location'/> <column name='binp_height' type='decimal' size='8,2' info='The real height of the location'/> <column name='binp_depth' type='decimal' size='8,2' info='The real depth of the location'/> <column name='binp_volume' type='decimal' size='8,2' info='The real volume of the location'/> <column name='binp_usablewidth' type='decimal' size='8,2' required='y' default='0' info='The real width of the location'/> <column name='binp_usableheight' type='decimal' size='8,2' required='y' default='0' info='The real height of the location'/> <column name='binp_usabledepth' type='decimal' size='8,2' required='y' default='0' info='The real depth of the location'/> <column name='binp_usablevolume' type='decimal' size='8,2' required='y' default='0' info='The real volume of the location'/> <column name='binp_maxweight' type='decimal' size='8,2' required='y' default='0' info='The maximum weight that the location can hold'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_profile' columns='binp_code' /> </table>
Directiva de ubicación
https://docs.microsoft.com/en-us/dynamics365/supply-chain/warehousing/create-location-directive
· After line item quantities are received in on a Purchase Order that received quantity becomes registered.
· A 2 step process for receiving in a Purchase Order is supported. Registering the inbound inventory is step 1 and the put away operation is step 2
· Location directives is how the system finds the inventory location for the put away.
· Work is created with Pick Put pairs in the Work Templates and you can have multiple pairs to support staging, packing, and shipping.
· Pick put pairs require a work class and these work classes help separate work between mobile device users.
· Stop flags in work templates can assist staging and packing operations.
.
Ejemplo de codigo en query para evaluar directiva de ubicación:
var bdi_filter = "o.codfam == 'F1' || o.codfam == 'F2'"; var f = new Function('o', 'return (' + bdi_filter + ')'); console.log(f({codfam : "F2"})); var bdi_filter = "codfam == 'F1' || codfam == 'F2'"; var f = new Function('obj', `for (v in obj) { this[v] = obj[v] }; return (${bdi_filter})`); console.log(f({codfam : "F2"}));
.
Location directives --------------------------------------------------------- <table name="wmx_bin_directive"> <column name="bdi_recid" type="serial" required='y' default='0' info='Serial to identify directive' /> <column name="bdi_transtype" type="smallint" required='y' info='The type of work order for which a location directive is defined' /> <!-- 0 None 1 Purchase orders 2 Sales orders 5 Transfer issue 6 Transfer receipt 7 Inventory movement 8 Canceled work 10 Cycle counting 11 Replenishment 12 Return orders --> <column name='bdi_seqnum' type='smallint' required='y' info='Position of the rule'/> <column name='bdi_name' type='varchar' size='60' required='y' info='The name of the ldirective'/> <column name='bdi_site' type='varchar' size='10' required='y' info='Site code'/> <column name='bdi_wh' type='varchar' size='10' info='Identify the warehouse'/> <column name="bdi_task_type" type="smallint" required='y' info=' The type of work' /> <!-- 0 None 1 Pick 2 Put 3 Counting 4 Print 5 Adjustments 6 Quarantine 7 License plate building 8 Status change 9 Custom --> <column name='bdi_hintcode' type='varchar' size='10' info='The unique identifier for the directive code'/> <column name='bdi_nultisku' type='char' size='1' required='y' default='N' info='Specify whether it is a multiple SKU Rule'/> <column name='bdi_filter' type='varchar' size='255' info='Filter used in the qualification' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_directive' columns='bdi_recid' /> <foreign name='f_wmx_bin_directive1' columns='bdi_hintcode' references='wmx_bin_directive_hint' refcols='bdh_code' /> </table> DispositionCode String The disposition code - Only for transtypes Purchase orders or Return orders Sequence number Enter the sequence in which the location directive is processed for the selected work type. You can also modify the sequence, if needed. Name Enter a name for the location directive. This field is required. Work type Select the type of work to be performed. The type of work available is based on the type of inventory transaction that you have selected in the Work order type field. Site Select the site in which the work should be completed. This field is required. Warehouse Select the warehouse location in which the work should be completed. This field is required. Directive code Select the directive code to associate to a work template or replenishment template. To configure a directive code with a work template, see Create a work template. Disposition code Optional: Select a disposition code to redirect the put away of the received items to a location. For more information, see Create disposition codes. This field is available only if you select Purchase orders or Return orders in the Work order type field. Location directive lines - This table holds the location directive details. --------------------------------------------------------- <table name="wmx_bin_directive_line"> <column name="bdl_recid" type="serial" required='y' default='0' info='Serial to identify directive line' /> <column name="bdl_refrecid" type="serialref" required='y' info='Serial relation to directive table' /> <column name='bdl_seqnum' type='smallint' required='y' info='Position of the rule'/> <!-- Campos de filtro --> <column name='bdl_fromqty' type='decimal' size='14, 2' required='y' default='0' info='The from quantity'/> <column name='bdl_toqty' type='decimal' size='14, 2' required='y' default='999999' info='The to quantity'/> <column name='bdl_uom' type='varchar' size='10' info='Unit of meassure'/> <!-- Campos de configuración --> <column name='bdl_restrict_byuom' type='char' size='1' required='y' default='N' info='Restrict the units of measure that are to be considered as valid'/> <column name='bdl_restrict_bypacking' type='char' size='1' required='y' default='N' info='Use the packing unit/quantity when locating'/> <column name='bdl_allow_split' type='char' size='1' required='y' default='N' info='Specify whether to allow the location directive to split units'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_directive_line' columns='bdl_recid' /> <foreign name='f_wmx_bin_directive_line1' columns='bdl_refrecid' references='wmx_bin_directive' refcols='bdi_recid' /> </table> LocateQty Enum The method of quantity to locate. 0 None 1 License plate quantity 2 Unitized quantity 3 Remaining quantity 4 Expected quantity Sequence number Enter the sequence in which the location directive is processed for the selected work type. You can also modify the sequence, if needed. The “From quantity” and “To quantity”, is really just a filter criterion that can be used to select a certain location directive line based on the released quantity. The “Unit” field is also more of a filter field. This field is often confused with the “Restrict by unit” field. For example, if I released an order with a unit of measure “EA” and my first location directive line “Unit” was “PL” (pallet) it would skip my first line and look for a line with a blank “Unit” field or one with “EA”. Locate quantity The “Locate quantity” field is a modifier for the “Unit” field. Select the method to calculate quantity that is used to check whether the quantity is in the range that is set in the From quantity and To quantity fields. If the location directive is for an inbound transaction, select one of the following options: License plate quantity ─ The license plate quantity. Unitized quantity ─ The unitized quantity from the specified inventory transaction. For example, in a warehouse if you can receive a quantity of 1000 and break it into 10 license plates of 100 each, you can use a quantity of 1000 items instead of the license plate quantity of 100. Remaining quantity ─ The quantity yet to be received that is specified on the purchase order line. Expected quantity ─ The total quantity that is specified on the purchase order line. Restrict by unit Select this check box to restrict the units of measure that are to be considered as valid selection criteria for the location directive lines. When units of measure have been specified, only those items with a unit that matches at least one unit defined for the unit sequence group will be considered as valid for the line selection. For example, say that the unit is restricted to pallets and the item is associated with a unit of measures sequence group that includes pallets. In this case the items will be considered a valid choice for the location directive. However, the Restrict by unit check box does not control the unit or units that are applied on work lines. The unit restriction only restricts the units that are made available via the unit sequence group. For example, say that an item is associated with a sequence group that includes both the Pallets and the Pcs units. A unit of measure has been defined with 1 pallet = 100 pcs and the location directive uses Restrict by unit for pallets only. Furthermore a work template has been defined that breaks the work header creation by 50 pcs. In this case work lines of 50 pcs will be created. To specify the unit of measure for restriction: Click Restrict by unit. This button is available only when you press Ctrl+S after you have selected the Restrict by unit check box. In the Unit field, select the unit of measure to restrict for the pick and put away process. Restrict by packing Locate packing quantity Select this check box if a packing unit quantity is specified in the Sales order form. If you select this check box, only the locations with this packing unit quantity are selected. Allow split Select this check box to split the quantity across multiple locations. Allow the reservation required to fulfill the sales order quantity to be done over multiple locations. In the case of sales order picking the “Allow split” option lets you spread the reservation across multiple locations. On “Put” location directives it allows you to put away to multiple locations. The “Immediate replenishment template” lets you tie the location directive line to a replenishment template and if the line cannot be allocated, the replenishment will occur immediately instead of after all lines of the location directive have been processed. The “Round up to unit” field option is used to indicate if the raw material picking should be rounded up to a multiple of the handling unit specified in the “Restrict by unit” selection. However, this only applies to raw material picking. Location directive Units Restriction - This table holds the restricted units for a location directive line. --------------------------------------------------------- <table name="wmx_bin_directive_line_uom"> <column name="bdu_recid" type="serial" required='y' default='0' info='Serial to identify directive uom restriction' /> <column name="bdu_refrecid" type="serialref" required='y' info='Serial relation to directive line' /> <column name='bdu_seqnum' type='smallint' required='y' info='Position of the rule'/> <column name='bdu_uom' type='varchar' size='10' info='The restricted unit'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_directive_line_uom' columns='bdu_recid' /> <foreign name='f_wmx_bin_directive_line_uom1' columns='bdy_refrecid' references='wmx_bin_directive_line' refcols='bdl_recid' /> </table> Location directive action --------------------------------------------------------- <table name="wmx_bin_directive_action"> <column name="bda_recid" type="serial" required='y' default='0' info='Serial to identify action' /> <column name="bda_refrecid" type="serialref" required='y' info='Serial relation to directive line' /> <column name='bda_seqnum' type='smallint' required='y' info='Position of the action'/> <column name='bda_name' type='varchar' size='60' required='y' info='The name, explaining the action'/> <column name='bda_location_query' type='varchar' size='255' info='The location query filter' /> <column name="bda_fixed_loc" type="smallint" required='y' info='Location directives should only use the fixed locations' /> <!-- - Fixed and non-fixed locations - Only fixed locations for the product - Only non-fixed locations for the product --> <column name="bda_strategy" type="smallint" required='y' info='The strategy used in locating' /> <!-- 0 None 1 Match packing quantity 2 Consolidate 3 FEFO batch reservation 4 Round up to full LP 5 Round up to the full LP and FEFO batch --> <column name='bda_allow_negative' type='char' size='1' required='y' default='N' info='Should this location directive allow locations to be picked negative?'/> <column name='bda_bsth_enabled' type='char' size='1' required='y' default='N' info='Specify whether batch strategies are enabled'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_directive_action' columns='bda_recid' /> <foreign name='f_wmx_bin_directive_action1' columns='bda_refrecid' references='wmx_bin_directive_line' refcols='bdl_recid' /> </table> “Fixed location usage” is where you can define if the location should be fixed, non-fixed, or only fixed locations. Fixed locations are when you have a fixed location for specific items. Fixed locations are a separate setup. “Allow negative inventory” to be honest I have never seen this used and would not recommend using negative inventory with advanced warehouse management. The “Batch enabled” flag indicates whether the line is used for batch enabled items. The “Strategy” used is dependent on several things including if the location directive is a “Pick” or a “Put”. Below is an explanation of the strategies: Match packing quantity – determines if the pick location has the specified packing quantity. Consolidate – consolidates items in a location where the item exists on-hand. FEFO batch reservation – reserves and allocates inventory based on first expiry first out principle according to the batch expiration date. Round up to full LP – is used to round up the inventory quantity to match the license plate (LP) quantity that is assigned to the items to be picked. This strategy is only be used for replenishment. Empty location with no incoming work – used to locate empty locations. The location is considered empty if it has no physical inventory and no expected incoming work. In the Sequence number field, the sequence in which the location directive is processed for the selected work type is displayed. You can modify the sequence, if needed. In the Name field, enter the name for the location directive action. Optional: Click Edit query to modify the filter for warehouse locations and other criteria. You can select the following additional settings for a location directive. Only fixed locations for the product Select this check box to include a fixed location for the item that is being put away. For more information about how to assign fixed locations to set up location directives, see the “Optional: Assign a fixed location to an inventory item” section in the Set up parameters to create a warehouse location topic. This field has been added as an option in a new field named Fixed location usage. In the field, two additional options are available: Fixed and non-fixed locations – The location directive will consider all locations. Only fixed locations for the product variant – The location directive will consider only fixed locations for product variants. Allow negative inventory Select this check box to allow negative inventory at the specified warehouse location. Batch enabled Select this check box to use batch strategies for the items that are batch enabled. In the Strategy field, select one of the strategies for the specified location directive. Consolidate This strategy is used in Microsoft Dynamics AX to consolidate items in a particular location when similar items are already available. Match packing quantity This strategy will find a location that contains a license plate that has the exact quantity required. It cannot be used with locations that are not license plate controlled. FEFO batch reservation This strategy is used when inventory is located using a batch expiration date and is allocated for batch reservation. You can only use this strategy for batch enabled items. FEFO batch reservation strategy is also used when inventory is located using a batch best before date in addition to the expiration date. Round up to full LP This strategy is used to round up the inventory quantity to match the license plate (LP) quantity that is assigned to the items to be picked. You can only use this strategy for replenishment. Empty location with no incoming work This strategy is used to locate empty locations. The location is considered empty if it has no physical inventory and no expected incoming work. Location directive failure --------------------------------------------------------- Field Type Description WorkTransType Enum The type of work order for which a location directive is defined LocDirFailWork Enum Stop work from being created if all location directives fail to find a location Loation directives hint code --------------------------------------------------------- <table name="wmx_bin_directive_hint"> <column name='bdh_code' type='varchar' size='10' required='y' info='Code the hint code'/> <column name='bdh_name' type='varchar' size='40' info='A description of what the directive code is used for'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_bin_directive_hint' columns='bdh_code' /> </table>
Location Stocking Limits
You can use the Location stocking limits page to control the load capacity at warehouse locations without having to use the more advanced processes for volumetric calculations of physical products.
The purpose of location stocking limits is to evaluate the maximum quantity that a location can contain. You can set up the feature on any of three levels, each of which has its own tab on the Location stocking limits page:
- In the Warehouse field, select the warehouse for which you want to define stocking limits.
- Select a location ID or a location profile ID.
- Select a pack size category ID or an item number. You can associate a pack size category ID with an item in the Released product details form on the Warehouse management FastTab.
- Select the Allow unlimited quantity check box to indicate that the location quantity is unlimited. If this check box is cleared, you need to specify the unit and quantity of the item to be stocked in the location.
- In the Unit field, select a unit of measure for the item that you are defining stocking limits for. If you don’t select a unit of measure, the quantity that you validate against is the item’s inventory unit.
- In the Quantity field, enter the quantity for the stocking limit in the selected unit of measure.
18.6 Otras tablas
Otras estructuras auxiliares que tenemos que confrontar con las estructuras actuales en Version 1:
------------------------------------- wmx_item - Productos ------------------------------------- <table name='wmx_item'> <column name="item_recid" type="serial" required='y' /> <column name="client_code" type="varchar" size="10" required='y' info='Client WMS'/> <column name="item_code" type="varchar" size="16" required='y' into='Identify item'/> <column name='item_name' type='nvarchar' size='255' /> <column name='item_rfdescription' type='nvarchar' size='50' info='Find fast name applying to the item' /> <column name='item_default_dim' type='smallint' required='y' default='0' info='Default dimensions'/> <column name='item_category' type='varchar' size='12' required='y' info='Item category - familia'/> <column name='item_part_no' type='varchar' size='25' info='product part number'/> <column name='item_status' type='char' size='1' required='y' /> <column name='item_ref1' type='varchar' size='30' /> <column name='item_ref2' type='varchar' size='30' /> <column name='item_type1' type='varchar' size='15' /> <column name='item_type2' type='varchar' size='15' /> <column name='item_type3' type='varchar' size='15' /> <column name='item_type4' type='varchar' size='15' /> <column name='item_uom_base' type='char' size='6' required='y' /> <column name='item_uom_aux' type='char' size='6' /> <column name='item_useauxuom' type='char' size='1' required='y' default='N' /> <column name='item_primary_vendor' type='varchar' size='25' info='Primary vendor for planned purchase order'/> <column name='item_manufacturer' type='varchar' size='12' /> <column name='item_brand' type='varchar' size='15' /> <column name='item_model' type='varchar' size='30' /> <column name='item_abcvalue' type='char' size='1' info='Items ABC-code for inventory value - A, B, C' /> <column name='item_height' type='decimal' size='12,2' info='Measurement conversion factor for the height dimension' /> <column name='item_depth' type='decimal' size='12,2' info='Measurement conversion factor for the depth dimension' /> <column name='item_width' type='decimal' size='12,2' info='Factor for the measurement dimension width' /> <column name='item_volume' type='decimal' size='12,2' info='Volume in cubic cm of an inventory unit' /> <column name='item_netweight' type='decimal' size='12,2' info=' Net weight of inventory item for one inventory unit' /> <column name='item_tareweight' type='decimal' size='12,2' info='The tare weight of the item for an inventory unit' /> <column name='item_enabled_at' type='date' required='y' default='today'/> <column name='item_disabled_at' type='date' /> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <index name='i_wmx_item1' columns='item_rfdescription' /> <index name='i_wmx_item2' columns='item_ref1' /> <index name='i_wmx_item3' columns='item_ref2' /> <primary name='p_wmx_item' columns='item_code, client_code' /> <unique name='u_wmx_item' columns='item_recid' /> </table> Field Type Configuration key Description <column name='item_uom_sales' type='char' size='6' /> <column name='item_uom_purchase' type='char' size='6' /> <column name='item_uom_ship' type='char' size='6' /> <column name='item_uom_receipt' type='char' size='6' /> ABCContributionMargin EnumABC Item's ABC-code for contribution margin ABCRevenue Enum Item's ABC-code for sales ABCTieUp Enum Item's ABC-code for inventory carrying cost AltItemId String Alternative inventory number is used for order entry. AltConfigId String Alternative configuration is used in order entry. AltInventColorId String Identification of alternative item color AltInventSizeId String Identification of alternative item size AltInventStyleId String Identification of alternative item style UseAltItemId Enum When should alternative item number be used? 0 Never 1 Nothing in inventory 2 Always TaxRate Real The tax rate that is used to calculate the approximate tax amount for the product BatchMergeDateCalculationMethod Enum Date calculation method to use when merging batches. 0 Manual 1 Earliest 2 Latest BatchNumGroupId String Group for automatic batch number allocation BOMCalcGroupId String Identification of the calculation group BOMLevel Integer Calculated BOM level on latest requirement calculation BOMManualReceipt Enum Manually enter material profit for this item for a production? BOMUnitId String BOM consumption unit CommissionGroupId String Commission group the item is attached to. CostGroupId String Cost group the item is included in on BOM calculations. CostModel Enum Update the item automatically with latest cost price? grossDepth Real Unit depth incl. packing grossHeight Real Unit height incl. packing grossWidth Real Unit width incl. packing Height Real Measurement conversion factor for the height dimension. Depth Real Measurement conversion factor for the depth dimension. Width Real Factor for the measurement dimension width. Volume Real Volume in cubic cm of an inventory unit NetWeight Real Net weight of inventory item for one inventory unit TareWeight Real The tare weight of the item for an inventory unit Density Real Measurement conversion factor for the density dimension. EPCManager Real RFID The EPC manager of the item. Intracode String Item commodity code IntrastatExclude NoYes If this check box is selected, the item is excluded from the Intrastat report IntraUnit Real Quantity of additional units per inventory unit, used for Intrastat. InventFiscalLIFOGroup Int64 Assign a group if this item must be included in a group average calculation. ItemBuyerGroupId String Identification of the buyer group. ItemDimCostPrice Enum Activate, use, and maintain cost prices for product variants. ItemPriceToleranceGroupId String Identification of item price tolerance group for accounts payable invoice matching ItemTaggingLevel RFIDTag Is item tagging mandatory? ItemType Enum Type determining how the item is administered. MarkupCode_RU String Identification of the charges MatchingPolicy Enum Default policy for PO lines. Three-way: PO, product receipt, and invoice. Two-way: PO and invoice. MinimumPalletQuantity Real Minimum quantity for pallets used for output transports NGPCodesTable_FR Int64 French national item code OrigCountyId String County of origin of the current inventory item OrigRegionId String Country/region of origin of the current inventory item OrigStateId String State of origin for the current item PackagingGroupId String Identification of the packing group PalletTagging Enum Is pallet tagging mandatory? PBAAutoStart Enum Autostart of configuration dialog when entering a modeling enabled item PBAHideApproval Enum Hide approval dialog after acknowledgement of configuration details PBAHideDialog Enum Hide dialog for automatic configuration based on default values PBAInventItemGroupId String Identification of the item product model group. PBAItemAutoGenerated Enum Generated item PBAItemConfigurable NoYes Can this item be modeled in the Product Builder? PBAMandatoryConfig Enum¡ Check item lines for complete configuration details PdsBaseAttributeId String Define the base attributes for the item PdsBestBefore Integer Number of days before expiration date. PdsCWWMSMinimumPalletQty Real Minimum CW quantity for pallets used for output transports. PdsCWWMSQtyPerLayer Real CW quantity per layer on a standard pallet. PdsCWWMSStandardPalletQty Real Standard CW order quantity on a pallet. PdsFreightAllocationGroupId String Freight allocation unique ID. PdsItemRebateGroupId String Group of item for which a rebate is applicable. PDSPotencyAttribRecording Enum Indicates whether the attribute value can be recorded from an RAF journal or entered using a quality order PdsShelfAdvice Integer Shelf advice for number of days. PdsShelfLife Integer Lead time life. PdsTargetFactor Real Target value for the batch attribute selected as the potency base attribute PdsVendorCheckItem Enum The type of validation that is done against the approved vendor list at the item level. Phantom Enum Propose item as phantom item in bills of materials? PmfPlanningItemId String Default planning formula. PmfProductType Enum Define production type of an item. PmfYieldPct Real Yield percentage of formula lines. ProdFlushingPrincip Enum Indicates when automatic BOM consumption is reported. ProdGroupId String Production group proposed when creating productions for the item ProdPoolId String Pool proposed when creating productions for the item Product Int64 Identification of the product prodCategoryId String Category that is used as a default. PropertyId String Necessary property when producing the item PurchModel Enum Update the item automatically with latest purchase price? ReqGroupId String Group that determines how a requirement is calculated for the item. SalesContributionRatio Real Contribution ratio to be used when calculating sales price SalesModel Enum Calculate sales price of the item by which model? SalesPercentMarkup Real Charges percentage to be used when calculating sales price SalesPriceModelBasic Enum Base price to be used when calculating sales price ScrapConst Real Constant scrap in BOM unit (used as default when inserting the item in BOMs) ScrapVar Real Variable scrap in percent (used as default when inserting the item in BOMs) SerialNumGroupId String Group for automatic serial number allocation sortCode Integer Sort order of items StandardConfigId String Product dimension proposal for variants on order and transaction entries StandardInventColorId String Product dimension proposal for variants on order and transaction entries StandardInventSizeId String Product dimension proposal for variants on order and transaction entries StandardInventStyleId String Product dimension proposal for variants on order and transaction entries standardPalletQuantity Real Standard order quantity on a pallet qtyPerLayer Real Quantity per layer on standard pallet StatisticsFactor Real Portion of the amount in hundredths WMSArrivalHandlingTime Integer Time used to arrival update per inventory standard order quantity WMSPalletTypeId String Standard pallet type for the item WMSPickingQtyTime Integer Time for pick of 1 package ---------------------------------------------------------- CONVERSIÓN DE UNIDADES DE MEDIDA (InventPackagingUnit) ---------------------------------------------------------- Contains information about units of measure that are used for packing material. <table name="wmx_item_packunit"> <column name='client_code' type='char' size='10' required='y' /> <column name='ipu_item_code' type='char' size='16' required='y' /> <column name='ipu_item_dim' type='smallint' required='y' default='0' info='Item dimensions. O: All dimensions'/> <column name='ipu_uom' type='varchar' size='10' required='y' info='Unit to convert from'/> <column name='ipu_factor' type='decimal' size='14,4' required='y' info='Conversion factor to the inventory unit'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_item_packunit' columns='ipu_item_code, client_code, ipu_uom, ipu_item_dim' /> </table> ------------------------------------- InventoryLocation - Almacenes ------------------------------------- https://github.com/MicrosoftDocs/Dynamics-365-Operations.es-es/blob/live/articles/supply-chain/warehousing/tasks/configure-locations-wms-enabled-warehouse.md Field Type Description ConsolidateShip Enum Consolidate similar sales orders CycleCountAllowPalletMove Enum Allow cycle counting to automatically move pallets located elsewhere in the warehouse DecrementLoadLine Enum Determine whether the load line quantity is decremented during the cancellation of shipping DefaultShipMaintenanceLoc String The default location inventory will be moved during shipment maintenance processes DefaultStatusId String The default inventory status ID on inventory transactions InventLocationemptyPallet String Location where empty pallets automatically are placed. InventLocationIdQuarantine String Identify the warehouse. InventLocationIdReqMain String Warehouse to refill from when activating refilling InventLocationIdTransit String Warehouse used to identify and handle items in transit. InventLocationLevel Integer Level in relation to the main warehouse where the warehouse is located. InventLocationType Enum Warehouse type 0 Default 1 Quarantine 2 Transit 101 Goods shipped 100 External inventory FSHStore NoYes Is this location a store? InventProfileId String Inventory profile. InventProfileType Enum Kind of activity. InventSiteId String Identify the site Manual Enum Are all items in the warehouse coverage planned manually (that is no planned orders, transactions and on-hand)? maxPickingRouteTime Integer Maximum time per picking route maxPickingRouteVolume Real Maximum volume per picking route NumberSequenceGroup_RU String Group for allocation of different number sequences to different customers/vendors. pickingLineTime Integer Time for pick of 1 line (picking route transit time) PrintBOLBeforeShipConfirm Enum Print the bill of lading before confirming the shipment ProdReserveOnlyWhse Enum Indicate whether to reserve production raw materials to the warehouse level and ignore the rest of the inventory dimensions on the bill of materials line RBODefaultInventProfileId_RU String The inventory profile that is applied to retail transactions RBODefaultWMSLocationId String The warehouse location used for retail transactions. RBODefaultWMSPalletId String The default pallet ID for retail transactions. RemoveInventBlockingOnStatusChange Enum Remove inventory blocking when the inventory status changes ReqCalendarId String Work-days calendar. When no coverage group is specified, used to calculate order date, requirement date, and preferred delivery date. ReqRefill Enum Refill as per requirement via planned transfer from the main warehouse? ReserveAtLoadPost Enum Run inventory reservations during load posting RetailWeightEx1 Real Retail The weight for allocating quantities by the replenishment rule. RetailWMSLocationIdDefaultReturn String Retail Set default return location RetailWMSPalletIdDefaultReturn String Retail Set default return pallet UniqueCheckDigits Enum Use unique check digits for the warehouse useWMSOrders Enum Use setting from item model group or overrule the setting for this warehouse. VendAccount String Vendor account number if the warehouse is placed at a vendor. WarehouseAutoReleaseReservation Enum Reserve inventory when the periodic job that releases to the warehouse is used WHSEnabled Enum Indicate that the warehouse is controlled by processes defined for warehouse management and the use of reservation hierarchy WMSAisleNameActive Enum Aisle is included in location name. WMSLevelFormat String Format for the part of the location name given by the shelf. WMSLevelNameActive Enum Shelf is included in location name. WMSlocationIdDefaultIssue String Location proposed for inventory issues of sales orders, production lines, etc. when nothing else is specified WMSLocationIdDefaultReceipt String Location proposed for inventory receipts of purchase orders, productions, etc. when nothing else is specified WMSLocationIdGoodsInRoute_RU String Location used to register items shipped and stocked in the warehouse. WMSPositionFormat String Format for the part of the location name given by the bin WMSPositionNameActive Enum Bin is included in location name. WMSRackFormat String Format for the part of the location name given by the rack WMSRackNameActive Enum Rack is included in location name. ------------------------------------- STOCKING LOCATION LIMIT ------------------------------------- Field Type Description InventLocationId String Identify the warehouse. WMSLocationId String Location in a warehouse. LocProfileId String Location profile ItemId String Identify item. PackSizeCateogryId String The pack size quantity identification UnitId String Unit symbol Qty Real Number of units AllowUnlimitedQty Enum Is it possible to specify an unlimited quantity on a location.

-------------------------------------- UNIDADES DE MEDIDA -------------------------------------- <table name="wmx_uom"> <column name='uom_code' type='varchar' size='10' required='y' info='Unit Code'/> <column name='uom_name' type='varchar' size='50' required='y' info='Description of unit'/> <column name='uom_class' type='smallint' required='y' info='Class of units'/> <column name='uom_decimals' type='smallint' required='y' default='0' info='Number of decimals for the value'/> <!-- 0 Quantity 1 Length 2 Area 3 Volume 4 Mass 5 Time --> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_uom' columns='uom_code' /> </table> https://cloudblogs.microsoft.com/dynamics365/no-audience/2014/07/26/introduction-to-containerization-automated-packing-process-in-microsoft-dynamics-ax-2012-r3/?source=dynamicsaxscm https://cloudblogs.microsoft.com/dynamics365/no-audience/2016/12/01/improved-packing-functionality-dynamics-365-for-operations-1611/ -------------------------------------- CONTAINER TYPES (PALLET, BOX, ETC.) -------------------------------------- <table name="wmx_container_type"> <column name='cont_code' type='varchar' size='15' required='y' info='The unique identifier for the container type'/> <column name='cont_name' type='varchar' size='40' info='Description of the container type'/> <column name='cont_width' type='decimal' size='12,2' info='Width of the container'/> <column name='cont_height' type='decimal' size='12,2' info='Height of the container'/> <column name='cont_depth' type='decimal' size='12,2' info='Depth of the container'/> <column name='cont_volume' type='decimal' size='12,2' info='Volume of the container excl. items'/> <column name='cont_weight' type='decimal' size='12,2' info='Tare weight: Weight of the pallet excl. items'/> <column name='cont_maxvolume' type='decimal' size='12,2' info='The maximum volume that the container can hold'/> <column name='cont_maxweight' type='decimal' size='12,2' info='The maximum weight that the container can hold'/> <!-- When selected, the volume depends on both the container volume and the inventory put on the container (open pallet). When cleared, the volume is considered fixed and doesn’t depend on what inventory is put into the container (fixed cage). --> <column name='cont_flexvolume' type='char' size='1' default='Y' info='the volume depends on both the container volume and the inventory put on the container (open pallet)'/> <!-- The unit of the container type is used as part of the stocking limit calculations where unit conversions between container types can be used as a ratio to calculate storage capacity within locations. E.g. use PL for pallets --> <column name='cont_uom' type='varchar' size='10' info='The unit for calculating volume of the location'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_container_type' columns='cont_code' /> </table> -------------------------------------- CONTAINER TYPE GROUPS -------------------------------------- <table name="wmx_container_tgroup"> <column name='ctg_code' type='varchar' size='10' required='y' info='Code of group of container types'/> <column name='ctg_name' type='varchar' size='40' info='Description of the container type group'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_container_tgroup' columns='ctg_code' /> </table> -------------------------------------- CONTAINER TYPE GROUPS MEMBERS -------------------------------------- <table name="wmx_container_tgroup_line"> <column name='ctg_code' type='varchar' size='10' required='y' info='Code of group of container types'/> <column name='ctg_type' type='varchar' size='15' required='y' info='Code of the container type'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_container_tgroup_line' columns='ctg_code, ctg_type' /> <foreign name='f_wmx_container_tgroup_line1' columns='ctg_code' references='wmx_container_tgroup' refcols='ctg_code' /> <foreign name='f_wmx_container_tgroup_line2' columns='ctg_type' references='wmx_container_type' refcols='cont_code' /> </table> https://www.linkedin.com/pulse/dynamics-365-wms-sorting-functionality-oleh-karnaukhov https://gfeaxblog.wordpress.com/2019/08/17/msdyn365fo-containerization/ -------------------------------------- LICENSE PLATE / TOTE / HANDLING UNIT -------------------------------------- <table name="wmx_licenseplate"> <column name='lpn_code' type='varchar' size='20' required='y' info='License plate identification number'/> <column name='lpn_parent' type='varchar' size='20' info='LPN identifier for the parent license plate '/> <column name='lpn_ldevel' type='smallint' required='y' default='0' info='The license plate level in the license plate hierarchy where zero is the lowest level'/> <column name='lpn_cont_type' type='varchar' size='15' info='Code for the container type'/> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> <primary name='p_wmx_licenseplate' columns='lpn_code' /> </table> -------------------------------------- LICENSE PLATE LABEL -------------------------------------- Contiene información para imprimir las etiquetas y adjuntarlas en los bultos Solamente tiene sentido en etiquetas que correspondan a bultos de expedición. <table name="wmx_licenseplate_label"> <column name="label_id" type="serial" required="y" default="0" info='The unique label ID' /> <column name='label_lpn' type='varchar' size='20' required='y' info='License plate identification number'/> <primary name='p_wmx_licenseplate_label' columns='label_id' /> </table> Field Type Configuration key Description AccountNum String Number identifying the account. AccountName String Name of account FromName String The from name AddressStreetFrom String Street of the address AddressCityFrom String City for ZIP/postal code AddressZipCodeIdFrom String Identify ZIP/postal code district AddressStateFrom String Identification of state ToName String The to name AddressStreetTo String Enter the street of the address AddressCityTo String City for ZIP/postal code AddressZipCodeIdTo String Identify ZIP/postal code district AddressStateTo String Identification of state BillOfLadingId String The bill of lading identification number CarrierCode String The unique identifier for the carrier ConfigId String Descriptive name of configuration ContainerId String The container identification number InventBatchId String Batch dimension. InventLocationId String Identify the warehouse. InventOwnerId_RU String Inventory owner. InventQty Real Quantity of the item in inventory unit InventSerialId String Serial number dimension. InventSiteId String Identify the site InventSizeId String Descriptive name of size InventStyleId String Descriptive name of style InventUnitId String Unit symbol ItemId String Identify item. ItemName String Description of the item. LabelFormat String The label format that will be used LabelReportName String The name of the label report LineNum Real Identification of line. CustPurchaseOrder String Customer requisition number OrderedQty Real The ordered quantity OrderNum String The order number PackingQty Real Number of units PrintedDate Date Transaction date PrintSettings Container Printer settings as defined by the user. Qty Real Number of units RemainingQty Real The remaining quantity ReportFileName String The report file name that will be used ShipmentId String The shipment identification number UCCCompanyPrefix String The GS1 company prefix used in license plate generation UnitOfMeassure String Unit symbol UserId String The user for processing work Weight Real Specification of weight. WMSLocationIdFrom String Location in a warehouse. WMSLocationIdTo String Location in a warehouse. WorkCenterLocationId String Location in a warehouse. WorkId StringThe work identification number WorkTemplateCode String The unique code for the work template WorkTransType EnumThe type of work order for which a location directive is defined ZoneIdFrom String The from zone ID ZoneIdTo String The to zone ID -------------------------------------- INVENTORY ITEMS -------------------------------------- The InventItem table contains information about items. ABCContributionMargin ABC Item's ABC-code for contribution margin ABCRevenue ABC Item's ABC-code for sales ABCTieUp ABC Item's ABC-code for inventory carrying cost ABCValue ABC Item's ABC-code for inventory value AlcoholManufacturerId_RU String Alcohol manufacturer AlcoholProductionTypeId_RU String The alcohol production type AlcoholStrength_RU Real The alcohol concentration as a percentage AltConfigId String Alternative configuration is used in order entry. AltInventColorId String Identification of alternative item color AltInventSizeId String Identification of alternative item size AltInventStyleId String Identification of alternative item style AltItemId String Alternative inventory number is used for order entry. ApproxTaxValue_BR Real The tax rate that is used to calculate the approximate tax amount for the product AssetGroupId_RU String identifier of FA group. AssetId_RU String Unique key for identification of fixed asset. BatchMergeDateCalculationMethod Enumeration Date calculation method to use when merging batches. BatchNumGroupId String Group for automatic batch number allocation BOMCalcGroupId String Identification of the calculation group BOMLevel Integer Calculated BOM level on latest requirement calculation BOMManualReceipt Enum Manually enter material profit for this item for a production? BOMUnitId String BOM consumption unit CommissionGroupId String Commission group the item is attached to. CostGroupId String Cost group the item is included in on BOM calculations. CostModel Enum Update the item automatically with latest cost price? CustomsExportTariffCodeTable_IN Int64 Select the export tariff code for the item. CustomsImportTariffCodeTable_IN Int64 Select the import tariff code for the item. dataAreaId String None DefaultDimension Int64 Default dimensions dEL_CreatedTime Integer None dEL_ModifiedTime Integer None Density Real Measurement conversion factor for the density dimension. Depth Real Measurement conversion factor for the depth dimension. EPCManager Real The EPC manager of the item. ExceptionCode_BR String Fiscal classification exception code ExciseTariffCodes_IN Int64 Excise tariff code for the item. EximProductGroupTable_IN Int64 Select the product group for the item. FiscalLIFOAvoidCalc Enum Exclude items from fiscal LIFO calculation. FiscalLIFONormalValue Real Normal value for the group or item FiscalLIFONormalValueCalc Enumeration Should normal value be calculated ForecastDMPInclude Enum Include in demand planning. grossDepth Real Unit depth incl. packing grossHeight Real Unit height incl. packing grossWidth Real Unit width incl. packing Height Real Measurement conversion factor for the height dimension. ICMSOnService_BR Enum ICMS tax applied on service item Intracode String Item commodity code IntrastatExclude NoYes If this check box is selected, the item is excluded from the Intrastat report IntrastatProcId_CZ String Code for the current statistical procedure. IntraUnit Real Quantity of additional units per inventory unit, used for Intrastat. InventFiscalLIFOGroup Int64 Assign a group if this item must be included in a group average calculation. InventProductType_BR String Product type classification. ItemBuyerGroupId String Identification of the buyer group. ItemDimCostPrice Enum Activate, use, and maintain cost prices for product variants. ItemId String Identify item. ItemPriceToleranceGroupId String Identification of item price tolerance group for accounts payable invoice matching ItemTaggingLevel Enumeration Is item tagging mandatory? ItemType Enumeration Type determining how the item is administered. MarkupCode_RU String Identification of the charges MatchingPolicy Enumeration Default policy for PO lines. Three-way: PO, product receipt, and invoice. Two-way: PO and invoice. MinimumPalletQuantity Real Minimum quantity for pallets used for output transports modifiedBy String None modifiedDateTime UtcDateTime None NameAlias String Find fast name applying to the item NetWeight Real Net weight of inventory item for one inventory unit NGPCodesTable_FR Int64 French national item code NRTaxGroup_LV String Group identifier. OrigCountryRegionId String Country/region of origin of the current inventory item OrigCountyId String County of origin of the current inventory item OrigStateId String State of origin for the current item PackagingGroupId String Identification of the packing group Packing_RU String Type of packing in a packing slip. PalletTagging Enum Is pallet tagging mandatory? Partition Int64 None PBAAutoStart Enum Autostart of configuration dialog when entering a modeling enabled item PBAHideApproval Enum Hide approval dialog after acknowledgement of configuration details PBAHideDialog Enum Hide dialog for automatic configuration based on default values PBAInventItemGroupId String Identification of the item product model group. PBAItemAutoGenerated Enum Generated item PBAItemConfigurable NoYes Can this item be modeled in the Product Builder? PBAMandatoryConfig Enum Check item lines for complete configuration details PDSBaseAttributeId String Define the base attributes for the item PdsBestBefore Integer Number of days before expiration date. PdsCWWMSMinimumPalletQty Real Minimum CW quantity for pallets used for output transports. PdsCWWMSQtyPerLayer Real CW quantity per layer on a standard pallet. PdsCWWMSStandardPalletQty Real Standard CW order quantity on a pallet. PdsFreightAllocationGroupId String Freight allocation unique ID. PdsItemRebateGroupId String Group of item for which a rebate is applicable. PDSPotencyAttribRecording Enumeration Indicates whether the attribute value can be recorded from an RAF journal or entered using a quality order PdsShelfAdvice Integer Shelf advice for number of days. PdsShelfLife Integer Lead time life. PDSTargetFactor Real Target value for the batch attribute selected as the potency base attribute PdsVendorCheckItem Enum The type of validation that is done against the approved vendor list at the item level. Phantom Enum Propose item as phantom item in bills of materials? PKWiUCode_PL String PKWiU code. PmfPlanningItemId String Default planning formula. PmfProductType Enum Define production type of an item. PmfYieldPct Real Yield percentage of formula lines. PrimaryVendorId String Primary vendor for planned purchase order ProdFlushingPrincip Enum Indicates when automatic BOM consumption is reported. ProdGroupId String Production group proposed when creating productions for the item ProdPoolId String Pool proposed when creating productions for the item Product Int64 Identification of the product projCategoryId String Category that is used as a default. PropertyId String Necessary property when producing the item PurchModel Enum Update the item automatically with latest purchase price? qtyPerLayer Real Quantity per layer on standard pallet ReqGroupId String Group that determines how a requirement is calculated for the item. SADRateCode_PL String Code of item group. SalesContributionRatio Real Contribution ratio to be used when calculating sales price SalesModel Enum Calculate sales price of the item by which model? SalesPercentMarkup Real Charges percentage to be used when calculating sales price SalesPriceModelBasic Enumeration Base price to be used when calculating sales price ScrapConst Real Constant scrap in BOM unit (used as default when inserting the item in BOMs) ScrapVar Real Variable scrap in percent (used as default when inserting the item in BOMs) SerialNumGroupId String Group for automatic serial number allocation ServiceCodeTable_IN Int64 Service code for the service item. SkipIntraCompanySync_RU Enum Disable intracompany synchronization for agreement line. sortCode Integer Sort order of items StandardConfigId String Product dimension proposal for variants on order and transaction entries StandardInventColorId String Product dimension proposal for variants on order and transaction entries StandardInventSizeId String Product dimension proposal for variants on order and transaction entries StandardInventStyleId String Product dimension proposal for variants on order and transaction entries standardPalletQuantity Real Standard order quantity on a pallet StatisticsFactor Real Portion of the amount in hundredths TaraWeight Real The tare weight of the item for an inventory unit TaxationOrigin_BR None Specifies the item's origin. TaxFiscalClassification_BR String Fiscal classification code of the item TaxPackagingQty Real Quantity of which packing duty is to be calculated. The quantity is stated per inventory unit. TaxServiceCode_BR String Fiscal classification applied for services UnitVolume Real Volume in cubic meters of an inventory unit UseAltItemId Enum When should alternative item number be used? Width Real Factor for the measurement dimension width. WMSArrivalHandlingTime Integer Time used to arrival update per inventory standard order quantity WMSPalletTypeId String Standard pallet type for the item WMSPickingQtyTime Integer Time for pick of 1 package <!-------- RF Additional Data --> dataAreaId String None FilterChanged Enum Specify whether an item filter changed since the last time a price update was run FilterCode[1] String Filter codes that are used to associate groups of records FilterCode[2] String Filter codes that are used to associate groups of records FilterCode[3] String Filter codes that are used to associate groups of records FilterCode[4] String Filter codes that are used to associate groups of records FilterGroup[1] String Grouping of filter codes FilterGroup[2] String Grouping of filter codes ItemId String Identify item. MaxPickQty Real The maximum quantity that can be picked for the specified unit sequence PackageClassId String The unique identifier for the package class PackSizeCateogryId String The pack size quantity identification Partition Int64 None PhysDimId String The ID of the physical dimension group PickWCNeg Enum Determines if this item will be picked negative against the work center when used in a production order. ProdQty Real The default production or receiving quantity RFDescription1 String The first line of the description displayed on the handheld device RFDescription2 String The second line of the description displayed on the handheld device UOMSeqGroupId String The ID of the unit sequence group <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> </table> -------------------------------------- FORKLIFT: TORITOS - TRANSPALETS -------------------------------------- <table name="wms_forklift"> <column name='fl_code' type='varchar' size='15' required='y' /><!-- Identification of the forklift --> <column name='fl_candoin' type='char' size='1' default='Y' required='y' /><!-- May the forklift carry out input transports? --> <column name='fl_candoout' type='char' size='1' default='Y' required='y' /><!-- May the forklift carry out output transports? --> <column name='fl_candorefill' type='char' size='1' default='Y' required='y' /><!-- May the forklift carry out refilling transports? --> <column name='fl_candorelocation' type='char' size='1' default='Y' required='y' /><!-- May the forklift carry out relocation transports? --> <column name='fl_maxheight' type='decimal' size='14, 2' /><!-- Maximum lifting height --> <column name='user_created' type='varchar' size='20' required='y' default='user' /> <column name='date_created' type='datetime' size='year to second' required='y' default='current' /> <column name='user_updated' type='varchar' size='20' required='y' default='user' /> <column name='date_updated' type='datetime' size='year to second' required='y' default='current' /> </table> WHSJourLoadTable - Unidades de envio
18.7 Más tablas
-------------- wmx_sales_line - additional fields for sales lines. -------------- Field Type Configuration key Description InventTransId String Identification of the item lot. OnWave Enum Specify whether this is on a wave OnWaveQty Real The quantity on waves PackingQty Real Number of units LeftToLoadQty Real The quantity to load on a line ReleasedQty Real The quantity released ----------- wmx_order ----------- Field Type Configuration key Description orderId String Identification of the inventory order order_type Enum Handling type customer String Customer code DeliveryPostalAddress Int64 Reference field in a different table dlvDate Date The date goods should be shipped on, in order to meet the requested receipt date. dlvMode String The means by which the order will be delivered dlvTerm String Unique identification of delivery terms FreightSlipType Enum Freight company freightZone String The UPS zone for the customer itemId String Identify item. InventDimId String Identification of dimensions for the item. toInventDimId String Identification of dimensions for the item. inventTransId String Identification of the item lot. inventTransRefId String The ID of the record that is the origin for the requirement transaction inventTransType Enum Specify the module that generated the transaction. CaseTagging Enum Is case tagging mandatory? ItemTagging Enum Is item tagging mandatory? PalletTagging Enum Is pallet tagging mandatory? optimizedPicking Enum Controls whether the shipment reservation can assign the line to a picking route utilizing guided picking. PdsCWQty Real Catch weight quantity. PdsCWQtyNoShipment Real CW quantity not yet selected for any shipment. PdsCWQtyRequested Real Original issue CW quantity requested based on issue reference line postTransfer Enum Post physical transactions in the inventory qty Real Quantity of the item in inventory unit qtyRequested Real Original issue quantity requested based on issue reference line qtyNoShipment Real Quantity not yet selected for any shipment shipmentGroupingRefId String The grouping reference number that can be used for joint shipments shipmentGroupingTransType Enum The grouping reference type that can be used for joint shipments status Enum Status of the inventory order