Transferencia de stock con Ubicación DI API

Que tal Alex, de hecho ya había probado eliminar todos los setCurrentLine y no pasa nada. Todo el código lo tengo dentro de un try-catch para manejar los errores, aun así probé el código que me propones pero no hay error. También intenté agregando el cardCode y sigue igual.
Respecto a los almacenes origen y destino, es el mismo porque solo quiero mover mercancía entre ubicaciones. Aun así probé quitar esas lineas, no marca error pero tampoco hace nada.

Alguna otra idea?

Gracias.

cuando atrape el error en el catch coloca el ultimo error devuelto por sap

throw new Exception(oCompany.GetLastErrorDescription().ToString());

o coloca el codigo asi
if( sttrans.Add() != 0){
throw new Exception(oCompany.GetLastErrorDescription().ToString());
}

1 me gusta

Ya con eso pude ver el error, gracias Alex. Primero me marcaba que no estaba especificando el BaseLine del Lote, corregí eso y ahora tengo el siguiente error :S
image

1 me gusta

coloca el codigo, que colocaste en baselinenumber?

8 corresponde al campo BaseLineNum en OIBT del lote que estoy seleccionando. En la parte de la ubicacion que recibe da igual que tenga o no tenga BaseLineNum, no marca error.

            StockTransfer sttrans = oCompany.GetBusinessObject(BoObjectTypes.oStockTransfer);
                            
            sttrans.DocDate = DateTime.Now;
            sttrans.FromWarehouse = "001";
            sttrans.ToWarehouse = "001";
            //sttrans.CardCode = "C1111111";

            //sttrans.Lines.SetCurrentLine(0);
            sttrans.Lines.ItemCode = "110-14804";
            sttrans.Lines.FromWarehouseCode = "001";
            sttrans.Lines.WarehouseCode = "001";
            sttrans.Lines.Quantity = 762;

            //sttrans.Lines.BatchNumbers.SetCurrentLine(0);
            sttrans.Lines.BatchNumbers.BatchNumber = "1508";
            sttrans.Lines.BatchNumbers.Quantity = 762;
            sttrans.Lines.BatchNumbers.Add();

            //sttrans.Lines.BinAllocations.SetCurrentLine(0);
            sttrans.Lines.BinAllocations.BinActionType = BinActionTypeEnum.batFromWarehouse;
            sttrans.Lines.BinAllocations.BaseLineNumber = 8;
            sttrans.Lines.BinAllocations.BinAbsEntry = 1;
            sttrans.Lines.BinAllocations.Quantity = 762;
            sttrans.Lines.BinAllocations.Add();
            
            //sttrans.Lines.BinAllocations.SetCurrentLine(1);
            sttrans.Lines.BinAllocations.BinActionType = BinActionTypeEnum.batToWarehouse;
            //sttrans.Lines.BinAllocations.BaseLineNumber = 8;
            sttrans.Lines.BinAllocations.BinAbsEntry = 3;
            sttrans.Lines.BinAllocations.Quantity = 762;
            sttrans.Lines.BinAllocations.Add();

            sttrans.Lines.Add();
            
            sttrans.Comments = "Transfer de prueba Sistemas";
            sttrans.Add();
            if (sttrans.Add() != 0)
            {
                throw new Exception(oCompany.GetLastErrorCode() + " " + oCompany.GetLastErrorDescription().ToString());
                //System.Runtime.InteropServices.Marshal.ReleaseComObject(sttrans);
                //System.GC.Collect();
            }

coloca
sttrans.Lines.BinAllocations.BaseLineNumber = 0;

descomenta
//sttrans.Lines.BinAllocations.BaseLineNumber = 8;
y dejalo en cero
sttrans.Lines.BinAllocations.BaseLineNumber = 0;

Si lo intenté, pero marca invalido el baseline
image

revisa el lote esta mal .

despues de esta linea agrega tanto en el origen como en el destino
transfer.Lines.BinAllocations.SerialAndBatchNumbersBaseLine = 0;

2 Me gusta

Pues me parece que el lote es correcto, mira lo que tengo en la tabla.

Da el mismo error. Para descartar un problema con mi equipo probé en otra maquina pero obtengo el mismo error. Pudiera pensar que ya no es error en de “código”, ya que este error lo cacho en el “catch” y no en la validacion if (sttrans.Add() != 0), porque al mostrar oCompany.GetLastErrorCode() es 0. Por eso fue que decidí probar en otro equipo.

image

Buen día @thormex, cuando quiero realizar una transferencia a mi me solicita cuatro líneas:

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

oDocuments.Lines.BatchNumbers.SetCurrentLine(int.Parse(dr["NumLineaLote"].ToString()));
oDocuments.Lines.BatchNumbers.BatchNumber = dr["Lote"].ToString();
oDocuments.Lines.BatchNumbers.ManufacturerSerialNumber = dr["SysNumber"].ToString();
oDocuments.Lines.BatchNumbers.Quantity = double.Parse(dr["Cantidad"].ToString());

Has intentado agregar el SysNumber en los parámetros del lote?
No utilizas números de serie verdad?

Cuando colecto el mensaje de error lo hago así:

catch (Exception ex)
    error = "Error al crear transferencia: " + ex.Message;

Y recuerdo que en el mensaje detallaba un poco más donde estaba el problema, podrías intentar a ver si te cambia el error?

Espero que te sea de ayuda, saludos cordiales.

2 Me gusta

Hola Luis, no manejo número de serie. Si intente agregar el SysNumber pero el error sigue igual. También hago lo que tu en el catch. El Message en realidad me da una versión resumida del mismo error.
Gracias.

En ese caso lo último que te podría recomendar es que replicaras exactamente el ejemplo que intentas pero en el SAP, y luego obtuvieras el XML de ese documento para ver línea por línea lo que requieres declarar y qué tantos parámetros el DI API te solicita para hacer el movimiento correctamente.

Yo hice una breve función que lo genera, por si te es de utilidad, sólo debes conectarte al objeto oCompany y pasarle el DocEntry al método:

        private void SaveAsXML(int DocEntry)
        {
            if (oCompany == null || !oCompany.Connected)
                this.ConectarCompany();

            Documents xml = oCompany.GetBusinessObject(BoObjectTypes.oQuotations);

            xml.GetByKey(DocEntry);
            xml.SaveXML(@"C:\xml\xml_" + DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss") + ".xml");
        }

Nadamas se requiere que cambies el tipo de documento a StockTransfer, y personalizar la ruta del archivo.
Espero que puedas resolverlo. Saludos cordiales.

4 Me gusta

Buenos días

Excelente idea @l.villarreal, con esto se cerciora que no falta dato alguno tanto a nivel encabezado como a nivel linea.

Saludos

1 me gusta

Gracias por la sugerencia Luis, ya he generado el XML de una transferencia y estoy analizando que pudiera faltar. Espero con esto poder solucionarlo y regresas con el código final.
Saludos.

1 me gusta

Hola, finalmente logre hacerlo. Me pasaron un código de ejemplo y en resumen tenía los mismos campos, pero creo que la diferencia fue algo que había mencionado @alexnavarrova SerialAndBatchNumbersBaseLine. Es extraño porque ya lo había probado, pero entre tantas cosas que estuve probando posiblemente lo probé con alguna otra linea que no debería ir. Gracias a todos fueron de gran ayuda. Dejo aquí el código básico para hacer una transferencia de stock entre ubicaciones como a mi me funcionó.
Saludos.

            StockTransfer sttrans = oCompany.GetBusinessObject(BoObjectTypes.oStockTransfer);

            sttrans.DocDate = DateTime.Now;
            sttrans.FromWarehouse = "001";
            sttrans.ToWarehouse = "001";
            
            sttrans.Lines.ItemCode = "001-10002";
            sttrans.Lines.FromWarehouseCode = "001";
            sttrans.Lines.WarehouseCode = "001";
            sttrans.Lines.Quantity = 8;

            sttrans.Lines.BatchNumbers.BatchNumber = "0001";
            sttrans.Lines.BatchNumbers.Quantity = 8;
            sttrans.Lines.BatchNumbers.Add();

            sttrans.Lines.BinAllocations.BinActionType = BinActionTypeEnum.batFromWarehouse;
            sttrans.Lines.BinAllocations.SerialAndBatchNumbersBaseLine = 0;
            sttrans.Lines.BinAllocations.BinAbsEntry = 1;
            sttrans.Lines.BinAllocations.Quantity = 8;
            sttrans.Lines.BinAllocations.Add();

            sttrans.Lines.BinAllocations.BinActionType = BinActionTypeEnum.batToWarehouse;
            sttrans.Lines.BinAllocations.SerialAndBatchNumbersBaseLine = 0;
            sttrans.Lines.BinAllocations.BinAbsEntry = 6;
            sttrans.Lines.BinAllocations.Quantity = 8;
            sttrans.Lines.BinAllocations.Add();

            sttrans.Lines.Add();

            sttrans.Comments = "Transfer de prueba Sistemas";
            
            if (sttrans.Add() != 0)
            {
                throw new Exception(oCompany.GetLastErrorCode() + " >>" + oCompany.GetLastErrorDescription().ToString());
            }
2 Me gusta

Excelente @thormex que bueno que pudiste solucionarlo. No olvides marcar la respuesta que más te haya sido de utilidad para ayudarte en tu consulta.

Un saludo desde Monterrey!

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