Transferencia de stock con Ubicación DI API

Buenos días compañeros,
Estamos desarrollando un sistema con DI API para realizar las trasferencias de stock entre ubicaciones del almacén. Ya logramos hace una transferencia entre almacenes sin involucrar ubicaciones, pero no hemos podido realizar la transferencia entre ubicaciones. Aquí les dejo el código, no marca ningún error, pero no realizar nada.
Si alguien pudiera orientarme en que me falta o algún ejemplo de como realizar esto, se lo agradecería.
Saludos.

StockTransfer sttrans = oCompany.GetBusinessObject(BoObjectTypes.oStockTransfer);
                sttrans.DocDate = DateTime.Now;
                //sttrans.FromWarehouse = "001";
                sttrans.Lines.ItemCode = "110-14804";
                sttrans.Lines.Quantity = 762;
                //sttrans.Lines.WarehouseCode = "021";
                //sttrans.Lines.WarehouseCode = "001";
                sttrans.Lines.BatchNumbers.BatchNumber = "1508";
                sttrans.Lines.BatchNumbers.Quantity = 762;

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

                sttrans.Lines.BinAllocations.BinActionType = BinActionTypeEnum.batToWarehouse;
                sttrans.Lines.BinAllocations.BaseLineNumber = 0;
                sttrans.Lines.BinAllocations.BinAbsEntry = 3;
                sttrans.Lines.BinAllocations.Quantity = 762;
                sttrans.Lines.BinAllocations.Add();

                sttrans.Comments = "Transfer de prueba Sistemas";
                sttrans.Add();

Que tal @thormex, Buenos días

Si he trabajado con DI API, NO así con Ubicaciones, sin embargo, lo que yo haría es …
1.- Dentro del Sistema SAP (con el cliente), detectar que diferencia existe entre manejar ubicaciones y cuando no se manejan, para detectar que información adicional requiere.
2.- La idea del punto anterior, es identificar las tablas/campos adicionales en caso de aplicar, y en base a las algunas palabras clave, intentar encontrar en los objetos de DI API, los que aplican para plasmar dichas ubicaciones (SAPBobsCOM), y de alguna manera saber si la versión que tienes ya los contempla, esa es otra situación.

voy a buscar información, y de encontrar algo te la hago llegar.

Espero alguien más de nuestros compañeros pueda apoyarte puntualmente con el problema.

Saludos
SAP B1, v9.2 PL03
México

1 me gusta

Otro comentario, la idea de comparar lo que hace el cliente de SAP con lo que estás haciendo en tu código (DI API), es para tratar de determinar si te hace falta plasmar alguna otra información.

Observación, según yo, la segunda linea del siguiente código, no es necesaria, porque en teoría toda primer linea no necesita un “Add()”, así que, la primer linea con dicho código es para adicionar la siguiente ubicacipón, sería buena que descartaras esa situación.

NOTA: En teoría no debería afectar, sin embargo, no está demás cerciorarse, na sea que DI API interprete que se pretende adicionar otra linea y ésta no tiene información (es una mera especulación).

Hola, intenta agregar las siguientes lineas que estan en negrita

Hola Chavalito, gracias por tus comentarios. En cuanto a identificar objetos y campos, el único que no aparece en el objeto OWTR es ToBinCode.
Y respecto a la linea de código que mencionas, si no la pongo marca un error al intentar fijar la ubicación destino.

Que tal Alex,
Encontre otro ejemplo en internet y mi código ahora esta de la siguiente forma. Solo faltaba agregar transfer.Lines.Add(); Pero aun con eso sigue sin funcionar.
Gracias por tus comentarios.

            StockTransfer sttrans = oCompany.GetBusinessObject(BoObjectTypes.oStockTransfer);
                            
            sttrans.DocDate = DateTime.Now;
            sttrans.FromWarehouse = "001";
            sttrans.ToWarehouse = "001";
            
            
            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.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.BinAbsEntry = 3;
            sttrans.Lines.BinAllocations.Quantity = 762;
            sttrans.Lines.BinAllocations.Add();

            sttrans.Lines.Add();
            
            sttrans.Comments = "Transfer de prueba Sistemas";
            sttrans.Add();

No veo el por qué intentas referirte a la linea CERO (primer linea), esto aplicaría en caso de una actualización (Update); inténtalo sin ésta linea.

Saludos

Una disculpa, tampoco había visto esta otra linea, que te parece si intentas sin éstas lineas (SetCurrentLine)

Saludos

elimina todos los SetCurrentLine eso se utiliza cuando se va a modificar una linea en este caso queremos es agregarla

En mi caso obliga a utilizar el cardcode el cual coloco el nit de la empresa
transfer.CardCode = “C1111111”;

Agrega este codigo para que verfique si se esta insertando y obtega el error
if (transfer.Add() != 0)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(transfer);
System.GC.Collect();
string error = ConexionSAP.Conexion.compania.GetLastErrorCode() + " " + ConexionSAP.Conexion.compania.GetLastErrorDescription();
}

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