Error al agregar Anexos con la DI API

Elabore un programa con el SDK para agregar anexos a los Datos Maestros de Articulo, usando los objetos Attachments2 y Documents(Items), la mayoria de los casos el programa funciona bien, pero en ocasiones me deja un error: image

-5002: Source file does not exist, y me marca la ruta de donde se selecciona el archivo, pero el archivo si existe, es decir la ruta la obtiene porque de ahi se seleccionó. ¿Cual puede ser la causa, tal vez estoy haciendo algo mal?

                                oATT.Lines.FileExtension = System.IO.Path.GetExtension(NombreArchivo).Substring(1);         
                                oATT.Lines.SourcePath = System.IO.Path.GetDirectoryName(NombreArchivo);                     
                                oATT.Lines.Override = SAPbobsCOM.BoYesNoEnum.tNO;                                           
                                oATT.Lines.Add();
                                int AttachmentEntry = (int)oRecordSet.Fields.Item(1).Value; 
                                if (oATT.Add() != 0)
                                {
                                    MessageBox.Show("Error: ");
                                }
                                else
                                {
                                    if (AttachmentEntry == 0) 
                                    {
                                        AttachmentEntry = int.Parse(globals_Renamed.oCompany.GetNewObjectKey());   
                                        oATT.GetByKey(AttachmentEntry);
                                        oItems.GetByKey(ItemCode);
                                        oItems.AttachmentEntry = AttachmentEntry;
                                        oItems.Update();
}

Hola @Fernando7
Ya hiciste la prueba por DTW? te genera el mismo error?

Andres Ramirez Jaramillo :colombia:

Hola @andresramirez

Funciona bien, y haciendolo directamente desde SAP también. Lo que he notado es que ese error aparece cuando intento agregar un “Anexo” a un Item que ya tenia un Anexo anteriormente y muy antiguo por ejemplo:

Mi articulo 5 tiene un anexo del 2018 guardado. Intento subir uno nuevo y me sale el error.
Mi articulo 20 no tiene ningun anexo y funciona bien.
Mi articulo 30 tiene un anexo que se subio hace 3 días, y funciona bien.

Lo que hace el programa es recuperar el AtcEntry que es el Primary Key de la tabla ATC1 (Anexos), y se la asigna al AttachmentEntry de la tabla OITM, si no existe, crea uno nuevo.

¿Puede ser que el problema sea la ruta de origen, si se usa una con ese AtcEntry, se tiene que usar siempre la misma?

Porque mas adelante quisiera realizar estas operaciones a traves de un web service y eso sería un problema.

1 me gusta

hola, ¿solo te ocurre con anexos viejos?, que pasa si a un item intentas adjuntar otro anexo mas (que tenga dos o tres anexos)

1 me gusta

Intenta usando:

oATT.Lines.Override = SAPbobsCOM.BoYesNoEnum.tYES;
2 Me gusta

@Alex_Neira_J Así es solo me ocurre con antiguos.

@juliancab Lo intenté pero no funcionó.

No lo pude solucionar pero lo que hice fue que cuando de el error (-5002), tomar todos los anexos que ya estaban agregados y volverlos a agregar con un NewObjectKey, y luego pasar ese Key al oItems.AttachmentEntry, y al momento de intentar agregar un nuevo Anexo, ya me lo permite.

O sea básicamente copio todos los archivos para crear un nuevo registro y actualizar el de oItems con ese nuevo. No se me ocurrió otra forma.

a mi me quedan un par de dudas de que porque tienes la logica así, me explico, porque actualizas el anexo cuando falla el intentar agregar un documento (el else), mas aun es el hecho de que GetNewObjectKey(), va a traer el ultimo objeto creado, que en este caso no necesariamente es un adjunto, debido a la misma lógica que tienes (esta debajo del else, significa que fallo la creación del anexo) , intenta realizando este cambio oATT.Lines.Add(), como primera linea antes de asignar los demás valores, y bueno revisar lo que esta en el else. esta bien confuso eso

1 me gusta

@Alex_Neira_J Lo que pasa es que primero intento jalar el AttachmentEntry de OITM, y si es 0 significa que no existe y por eso genero un nuevo AbsEntry, que luego se lo paso al objeto oItems.

Si esta un poco confuso la verdad es que estuve aprendiendo SDK y SAP sobre la marcha. Acepto consejos :sweat_smile:

Como tendría que ser la lógica para el manejo del GetNewObjectKey.

Puede que el error este ahi.
Primero realiza el cambio que te mencione, moviendo el

oATT.Lines.Add()

como primera linea, luego verificar que el objeto oItems.AttachmentEntry sea distinto de 0, si no tu logica del else se va a caer, una vez que se asigna un AttachmentEntry al documento es el mismo identificador para todos los adjuntos que se sumen

si se cumple esto tu lógica que tienes ahí no aplica (solo funciona para cuando el documento no tiene adjuntos)

1 me gusta

He cambiado un poco el programa, ahora antes de hacer cualquier cosa primero verifica si el AtcEntry existe,

 int AttachmentEntry = (int)oRecordSet.Fields.Item(1).Value;                                 //Obtiene el AtcEntry del Item Seleccionado.
                                if (AttachmentEntry == 0)
                                {
                                    oATT.Lines.FileName = System.IO.Path.GetFileNameWithoutExtension(NombreArchivo);            //Obtiene nombre
                                    oATT.Lines.FileExtension = System.IO.Path.GetExtension(NombreArchivo).Substring(1);         //Obtiene Extension
                                    oATT.Lines.SourcePath = System.IO.Path.GetDirectoryName(NombreArchivo);                     //Obtiene path
                                    oATT.Lines.Override = SAPbobsCOM.BoYesNoEnum.tYES;
                                    if (oATT.Add() == 0)
                                    {
                                        int newEntry = Convert.ToInt32(globals_Renamed.oCompany.GetNewObjectKey());
                                        oItems.GetByKey(ItemCode);
                                        oItems.AttachmentEntry = newEntry;
                                        oItems.Update();
                                        MessageBox.Show("Se agregó");
                                    }
                                    else
                                    {
                                        MessageBox.Show("Error: " + globals_Renamed.oCompany.GetLastErrorCode() + " " + globals_Renamed.oCompany.GetLastErrorDescription());
                                    }
                                }
                                else
                                {
                                    oATT.GetByKey(AttachmentEntry);
                                    oATT.Lines.Add();
                                    oATT.Lines.FileName = System.IO.Path.GetFileNameWithoutExtension(NombreArchivo);            //Obtiene nombre
                                    oATT.Lines.FileExtension = System.IO.Path.GetExtension(NombreArchivo).Substring(1);         //Obtiene Extension
                                    oATT.Lines.SourcePath = System.IO.Path.GetDirectoryName(NombreArchivo);                     //Obtiene path
                                    oATT.Lines.Override = SAPbobsCOM.BoYesNoEnum.tYES;
                                    int returnCode = oATT.Update();
                                    if (returnCode == 0)
                                    {                                       
                                        MessageBox.Show("Se agregó");
                                    }
                                    else if (returnCode == -5002)
                                    {
                                        GenerarNuevoKey(AttachmentEntry, ItemCode, NombreArchivo);
                                    }
                                    else
                                    {
                                        MessageBox.Show("Error: " + globals_Renamed.oCompany.GetLastErrorCode() + " " + globals_Renamed.oCompany.GetLastErrorDescription());
                                    }
                                }

Creó que así quedo mejor el código, pero me siguió dando el error (-5002), entonces en el otro método hago que busque todos los registros de ese AbsEntry y los vuelvo agregar a nuevo AbsEntry. Y ya me deja añadir mas archivos. Ahí fue cuando me di cuenta de que algunos archivos de los que estaban anexados, ya no existían en la carpeta, aunque aún no me consta que esa sea la razón de ese error.

desconozco como es el proceso en SAP, es muy probable que al actualizar la linea, efectivamente SAP valide que todos los documentos aun siguen existiendo, hay una ruta para los anexos en SAP, no deberían borrar documentos de ahí, lo que se hace es primero borrar el anexo del documento y luego borrar el archivo físico, así no queda la tabla apuntando a un archivo que no existe, el cual te podría estar causando el problema actual

1 me gusta

Este tema se cerró automáticamente 7 días después de la última publicación. No se permiten nuevas respuestas.