Ayuda SAP

DI API GetByKey Problema Ofertas Compra

Buen día amigos!
Espero que todo les salga de maravilla.
Quisiera pedir su apoyo en un tema de la DI API, lo que sucede es que tengo problemas al buscar algunos DocEntry de la base de datos(Hana) ya que algunos documentos son encontrados pero otros no un ejemplo de esto es el DocEntry 81 este se encuentra en la base de datos pero al utilizar GetByKey del lado de la DI API no existe. alguien sabe porque sucede esto?

image

image

1 me gusta

Asegurate que estes trabajando con el objeto correcto de documento.

Hola @juliancab Gracias por tu apoyo!
fijate que si estoy trabajando con el tipo de objecto correcto(540000006)

image

Buenas tardes

En lo personal, hasta el momento nunca he tenido problemas para encontrar documentos por el DocEntry con el método “GetByKey”, por qué no nos muestras tu código, para ver si notamos algo.

Como comentario, lo que comenta @juliancab, es uno de los errores comunes, sobre todo cuando copias código de un proceso a otro, en donde haces referencia a documentos diferentes.

Saludos
SAP B1, v9.2 PL03
México

2 Me gusta

Hola @chavalito, Gracias por tu respuesta!!!
Te comparto mi codigo!

public void Replica()
        {
            int iret = 0;
            ocompany.Server = "xxxxxx";
            ocompany.LicenseServer = "xxxxxxxxx";
            ocompany.CompanyDB = "xxxxxxx";
            ocompany.UseTrusted = false;
            ocompany.DbUserName = "SYSTEM";
            ocompany.DbPassword = "xxxxx";
            ocompany.UserName = "xxxxxxx";
            ocompany.Password = "xxxxx";
            ocompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANADB; 
            int ret = ocompany.Connect(); 
            string error = ocompany.GetLastErrorDescription(); 
            int code = ocompany.GetLastErrorCode(); 
            if (ret == 0)
            {
                try
                { 
                    SAPbobsCOM.Documents Cotizacion = (SAPbobsCOM.Documents)ocompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseQuotations);
                    try
                    {
                        int docEntry = Int32.Parse(docEntry_txt.Text);
                        String valor = GetByItem(ocompany,docEntry.ToString()).ToString();
                        MessageBox.Show("Documento Encontrado? " + valor + " Entry " + docEntry);  
                        Cotizacion.Comments = "New Comment";   //Update the Remarks
                        Cotizacion.Lines.SetCurrentLine(int.Parse(currentLine_txt.Text));    //Set Line to VisOrder = 1
                        Cotizacion.Lines.Quantity = double.Parse(quantity_txt.Text);   //Update the Quantity of the line
                        iret = Cotizacion.Update();
                    }catch (Exception e){
                        MessageBox.Show("ERR " + e.Message);
                    }

                }
                catch (Exception e)
                {
                    MessageBox.Show("ERR " + e.Message);
                } 
                if (iret == 0)
                    MessageBox.Show("Se creó con éxito la cotización: " + ocompany.GetNewObjectKey());
                else
                    MessageBox.Show("Error al crear la cotización, " + ocompany.GetLastErrorDescription());
            }
            else
            {
                respuesta.Text = "Error " + error + "  " + code;
            }
            ocompany.Disconnect(); 
        }

Ese es el codigo que utilizo veras lo que sucede es que algunos documentos no son encontrados y no se porque pues estos fueron creados con la DI API pero otros si son reconocidos y no existe problema alguno.

mis pruebas los eh estado realizando con el que mas me ha llamado la tencion que es el numero 81 pues este es uno de los que no estoy encontrando el tipo de objeto es el 540000006 que es el mismo que utilizo en la DI API

Buen día @Victor_Sergio, una duda, si cambias el GetByItem por GetByKey sigues obteniendo el mismo error?

Si vas al detalle del mensaje de error, te dice explícitamente que el documento que buscas no existe?

Te pregunto esto porque nunca había visto ese problema al utilizar este método.

Saludos cordiales.

1 me gusta

Es correcta la observación de @l.villarreal no me había fijado de eso.

Perdonen compañeros tienen razón subí mal el código este fue una de las pruebas que estaba realizando y había olvidado eliminar pero era GetByKey perdonen.

Imagen

Codigo:

public void Replica_()
        {
            int iret = 0;
            ocompany.Server = "xxxxxxxxxxxxxx";
            ocompany.LicenseServer = "xxxxxxxxxxxxxxx";
            ocompany.CompanyDB = "xxxxxxxx";
            ocompany.UseTrusted = false;
            ocompany.DbUserName = "xxxxxxx";
            ocompany.DbPassword = "xxxxxxxx";
            ocompany.UserName = "xxxxxxxxxxx";
            ocompany.Password = "xxxxxxxxxx";
            ocompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANADB;
            int ret = ocompany.Connect();
            string error = ocompany.GetLastErrorDescription();
            int code = ocompany.GetLastErrorCode();
            if (ret == 0)
            {
                try
                {
                    SAPbobsCOM.Documents Cotizacion = (SAPbobsCOM.Documents)ocompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oPurchaseQuotations);
                    try
                    {
                        int docEntry = Int32.Parse(docEntry_txt.Text);
                        bool resultado = Cotizacion.GetByKey(docEntry);
                        MessageBox.Show("Documento Encontrado? " + resultado + " Entry " + docEntry);
                        Cotizacion.Comments = "New Comment";
                        Cotizacion.Lines.SetCurrentLine(int.Parse(currentLine_txt.Text));
                        Cotizacion.Lines.Quantity = double.Parse(quantity_txt.Text);
                        iret = Cotizacion.Update();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show("ERR " + e.Message);
                    }

                }
                catch (Exception e)
                {
                    MessageBox.Show("ERR " + e.Message);
                }
                if (iret == 0)
                    MessageBox.Show("Se creó con éxito la cotización: " + ocompany.GetNewObjectKey());
                else
                    MessageBox.Show("Error al crear la cotización, " + ocompany.GetLastErrorDescription());
            }
            else
            {
                respuesta.Text = "Error " + error + "  " + code;
            }
            ocompany.Disconnect();
        }

Muchas gracias por la ayuda muchachos!

Buenos días

Yo veo que el código es correcto.

Te sugiero que la primera vez que arranques el proceso, la primera oferta que intentes actualizar sea una de las te causa problemas, por ejemplo la 81, con esto podemos descartar que en un momento dado, no limpie los objetos, aún cuando me queda claro que termina el proceso.

Saludos
SAP B1, v9.2 PL03
México

Buenos días

Lo que puedes hacer es liberar todos los objetos (Cotización, ocompany), después de cerrar la Conexión de la base de datos, entiendo que al terminar el proceso debería ocurrir eso aunque no lo hagas de forma expresa, sin embargo, no está demás realizarlo, por si eso le causa ruido en ciertos momentos.

Saludos
SAP B1, v9.2 PL03
México

Hola a todos… algunas aclaraciones :man_office_worker: (off-topic).

@Victor_Sergio, por favor lee cómo formatear código en el foro.

También te voy a pedir por favor que pases por #presentaciones y crees tu tema.

@chavalito recuerda presionar el botón de “…” (que está debajo de tu mensaje), luego el lápiz, para editar tu mensaje, y que quede organizado todo, así no queda un mensaje detrás de otro (seguidos, yo ahora los he “unido”).

Gracias, mantengamos entre todos más organizado el foro :+1:

haz intentado pasar el ID como un String en vez de Int? Por lo que vi en una búsqueda rápida de la documentación del SDK, el método GetByKey varía según el tipo de objeto.

Hola @rcortes gracias por tu ayuda!

te comento que en el objeto solo recibe un integer como parametro y no me es posible enviar un String.

Lo que si me he dado cuenta luego de revisar tantos ejemplos es el que este parametro varia en mi caso es docEntry pero en otros ejemplos noto que usan DocNum o en otros casos usan el CardCode esto afectara de alguna manera?

Saludos y Muchas gracias por el apoyo!!!.

Enterado, gracias @SidV

Saludos.

Quizá obteniendo el mensaje completo de la excepción podamos saber más a detalle la causa del problema, en vez de e.Message intenta con e.toString() para ver el stack trace completo de la excepción, y ver si con eso podemos determinar qué lo ocasiona.

Espero que eso sea de utilidad. Saludos cordiales.

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