Error -4014 Transferencia de Stock - DI API

Buenas expertos, estoy haciendo unas pruebas en .net con un código que genera una transferencia de stock usando DI API, toma la información de un GridView cargado con un DataTable como el siguiente:

Aquí especifico el código del artículo, la cantidad total de la línea, lotes, etc. En la mayoría de los casos funciona correctamente y genera el documento sin problema, pero hay ciertos artículos que me generan un error en la selección de lotes por manejar una unidad de medida alternativa.
Me explico, el problema en concreto lo tengo con unas cajas de tubería, en donde el código del artículo representa un tramo de tubería, pero al activar la unidad alternativa, por cada “caja” se toman “x” cantidad de tramos, como en el siguiente ejemplo:

Al querer generar una transferencia de stock con esa información me aparece el siguiente error:
Error: Cannot add row without complete selection of batch/serial numbers | Código de error: -4014

Estuve buscando en las propiedades que tiene el grupo “Lines” y “BatchNumbers” pero no encuentro la solución. Agrego también el fragmento del código en C# que construye las líneas por si puede aportar algo al caso:

foreach(DataRow dr in Shared.lotesTransferencia.Rows)
{
    if(i != 0)
        nuevaTransferencia.Lines.Add();

    nuevaTransferencia.Lines.SetCurrentLine( Int32.Parse( dr["NumLineaArticulo"].ToString() ) );
    nuevaTransferencia.Lines.ItemCode = dr["Articulo"].ToString();
    nuevaTransferencia.Lines.Quantity = double.Parse(dr["Total"].ToString());
    nuevaTransferencia.Lines.WarehouseCode = ddlAlmacenDestino.SelectedItem.Text;

    // Prueba para unidad de medida
    nuevaTransferencia.Lines.UseBaseUnits = BoYesNoEnum.tNO;
    nuevaTransferencia.Lines.MeasureUnit = dr["UnidadMedida2"].ToString();

    nuevaTransferencia.Lines.BatchNumbers.SetCurrentLine( Int32.Parse( dr["NumLineaLote"].ToString() ) );
    nuevaTransferencia.Lines.BatchNumbers.BatchNumber = dr["Lote"].ToString();
    nuevaTransferencia.Lines.BatchNumbers.Quantity = double.Parse( dr["Cantidad"].ToString() );
    nuevaTransferencia.Lines.BatchNumbers.Add();

    i++;
}

¿Alguien ha tenido algún problema similar? Agradezco de antemano cualquier comentario u orientación que puedan brindarme.

Saludos cordiales.

por que en esta parte del código seteas la linea y al final agregas una nueva?, esta parte debe quedar igual que mas arriba, solo en caso de que vayas a trabajar con una segunda linea o mas vas agregando antes de setiar la linea.

no estoy seguro del error pero me da la impresión de que va por hay el problema, me comentas.
ejemplo de como deberia ser cuando agregues lotes.

if (nuevaTransferencia.Lines.BatchNumbers.BatchNumber != string.empy)
    nuevaTransferencia.Lines.BatchNumbers.Add();
nuevaTransferencia.Lines.BatchNumbers.SetCurrentLine(nuevaTransferencia.Lines.BatchNumbers.Count - 1);
//y vamos picando codigo

PD: No se si el código esta bien como lo puse ya que lo escribí directo desde aquí.
PD: Este fragmento de código lo creaste para mostrarlo en el foro? o es asi en tu app?, por que no necesariamente todos los códigos deverian tener lote, algunos podrían ser seriados o simplemente no tener, deberías tener una validación antes de llegar a ese punto.

1 me gusta

Hola que tal @Panxulo gracias por tu respuesta,

En ocasiones al hacer la transferencia de stock se maneja un sólo lote por artículo, pero también pudieran ser varios lotes de un mismo artículo, ese dato lo seteo leyendo la info del GridView.

Así tal cual como lo agregué es como lo tengo en la aplicación, debido a que laboro en una empresa de manufactura, y todos los artículos sin excepción manejan lote (y no utilizan serial).
Actualicé el código a como tu me sugeriste, y cambié esta parte:

// Prueba para unidad de medida
nuevaTransferencia.Lines.UseBaseUnits = BoYesNoEnum.tNO;
nuevaTransferencia.Lines.MeasureUnit = dr["UnidadMedida2"].ToString();

if(nuevaTransferencia.Lines.BatchNumbers.BatchNumber != string.Empty)
    nuevaTransferencia.Lines.BatchNumbers.Add();

nuevaTransferencia.Lines.BatchNumbers.SetCurrentLine(nuevaTransferencia.Lines.BatchNumbers.Count - 1);
nuevaTransferencia.Lines.BatchNumbers.BatchNumber = dr["Lote"].ToString();
nuevaTransferencia.Lines.BatchNumbers.Quantity = double.Parse( dr["Cantidad"].ToString() );

Pero me marcó el mismo error. Cabe aclarar que este problema lo tengo únicamente cuando el artículo tiene varias unidades de medida, y el documento se elabora en la medida “alternativa” no en la principal o la que está por defecto, si tiene sólo una unidad de medida, el programa funciona bien y no marca errores.

Crees que haya alguna otra cosa que pueda intentar? Gracias de antemano por tu tiempo.

De la forma que planteas el error desconozco el origen, pero estoy seguro haber visto alguna ves ese mensaje y tiene directa relacion con las lineas setiadas y como vas trabajando sobre estas, también prueba setiando las lineas de articulo de la misma forma que lo haces con el lote

if(nuevaTransferencia.Lines.ItemCode != string.Empty)
    nuevaTransferencia.Lines.Add();

nuevaTransferencia.Lines.SetCurrentLine(nuevaTransferencia.Lines.Count - 1);

el otro ejercicio que puedes hacer es crear manualmente el documento con la misma data que estas ingresando y después hacer una transferencia inversa de la operación, esto te ayuda a ver toda la información que se ingresa de forma automática, revisa el detalle de cada linea haciendo doble click sobre ella en SAP.

PD: si problema persiste, envíame un mp y te puedo ayudar a solucionarlo de forma remota y después podemos publicar la solución.

Buen día @Panxulo, intenté como me sugeriste en esta última ocasión pero el error persiste, creo que el problema está en que la línea la seteo con unidad de medida de “caja” por ejemplo, pero el inventario lo tengo que tomar en la unidad base, que es “pieza”. Me huele a que va por ahí el problema, entré a los detalles de las líneas pero no encuentro nada que no haya configurado ya en el código.

P.D. se va a escuchar muy bobo, pero no encuentro opción para mandarte un MP :sweat_smile: espero no estar abusando de tu apoyo. Cómo te podría contactar si es que tienes oportunidad?

Mil gracias por tu tiempo.

El error se originaba, al no seleccionar dentro del detalle, el id de unidad de medida que se quería utilizar, por lo que al tener medidas diferentes, las cantidades no cuadraban en SAP y este no sabia distinguir de cantidad 1 a 1, como era el caso que una cantidad equivalía a 36 en el lote por ejemplo, por lo que asignando el id de la unidad de medida se corrige el error, @l.villarreal, favor enviar pantallazo de la parte del código que hacia falta.

1 me gusta

Buen día, antes que nada muchas gracias @Panxulo por tu ayuda y tu valioso tiempo, y efectivamente el problema se pudo corregir modificando las siguientes líneas del código donde se especifica la cantidad, la unidad de medida y el lote del artículo:

oDocuments.Lines.SetCurrentLine(0);
oDocuments.Lines.ItemCode = "Articulo";
oDocuments.Lines.Quantity = 1;
oDocuments.Lines.UoMEntry = 4; //Esta era la línea faltante
oDocuments.Lines.UseBaseUnits = BoYesNoEnum.tNO;

oDocuments.Lines.BatchNumbers.SetCurrentLine(0);
oDocuments.Lines.BatchNumbers.BatchNumber = "Lote";
oDocuments.Lines.BatchNumbers.ManufacturerSerialNumber = "130";
oDocuments.Lines.BatchNumbers.Quantity = 76;

De esta forma se pudo crear el documento con éxito, lo dejamos por aquí por si a alguna persona le sirve en el futuro. Saludos cordiales.

1 me gusta

Este tema se cerró automáticamente 7 días después del último post. No se permiten nuevas respuestas.