Buen día para todos, espero que se encuentren muy bien, quisiera en esta ocasión pedir su colaboración, ya que tengo desarrollado un servicio de windows, que se encarga de consumir un webservice para consultar información de unas facturas y posteriormente traer esa información, para actualizar unos campos definidos por usuario de la factura.
El servicio funciona muy bien, lo que sucede es que cuando lleva muchas horas ejecutándose, o días, empieza salir el siguiente error:
No se puede convertir el objeto COM del tipo ‘SAPbobsCOM.CompanyClass’ al tipo de interfaz ‘SAPbobsCOM.Company’. Ocurrió un error de operación debido a que la llamada QueryInterface en el componente COM para la interfaz con IID ‘{3BA8DAED-5B33-4CE4-A4B8-B4308D86E524}’ generó el siguiente error: Formato antiguo o tipo de biblioteca no válida. (Excepción de HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))…
realizo el System.Runtime.InteropServices.Marshal.ReleaseComObject(businessObject); después de que hago un update() en cada documento y cuando ya termino de procesar el bloque de facturas y no voy a usar más el objeto businessObject hago un
Tu sistema corre en un arquitectura x64 o x86, creo que a mi me apareció un error similar alguna ocasión, el sistema tiene guardados los objetos COM en alguna locación dependiendo de la arquitectura, yo lo que tuve que hacer para que mi programa corriera bien fue configurarlo para x86 aunque mi servidor fuera de x64.
Hola @Fernando7 gracias por tu respuesta, el servicio lo tengo como Any CPU, voy a intentar compilando solo en x86 para ver si resulta.
Utilidades tengo muchas, he realizado diferentes automatizaciones, procesos de picking, traslados, salidas, entradas de mercancías, envío de correos automáticos, pedidos de venta, facturas de deudores, addons para incluir funcionalidades a SAP…
Hay alguna forma en que pueda contactarte, creo que aquí en el foro no se pueden mandar mensajes privados, y quisiera intercambiar información contigo que eres SDK Developer.
Primero deberías probar con el tema de cambiar el proyecto a x86 y verifica que tengas la misma versión de los dll’s, y asegúrate de tener instalada siempre los dll’s tanto para x86, como para x64.
Después podrías tratar de ver específicamente en que dato es que sucede el error, por si se trata de algo de datos.
No es prescindible tener las dos, con que te asegures que arquitectura estas trabajando te recomiendo ponerla en el proyecto asi, me a pasado que con el ANY CPU marque errores. Creo por ahi va el problema la verdad.
OJO: tampoco te afecta tener las 2 APIS instaladas. Es como te acomodes mejor.
Muchas gracias por su ayuda, aún no se ha podido resolver el problema, compilé el programa en x86 e instalé el servicio de windows así en el servidor, pero después de 1 día de estar ejecutándose, me marca:
No se puede convertir el objeto COM del tipo ‘SAPbobsCOM.CompanyClass’ al tipo de interfaz ‘SAPbobsCOM.Company’. Ocurrió un error de operación debido a que la llamada QueryInterface en el componente COM para la interfaz con IID ‘{3BA8DAED-5B33-4CE4-A4B8-B4308D86E524}’ generó el siguiente error: Formato antiguo o tipo de biblioteca no válida. (Excepción de HRESULT: 0x80028019 (TYPE_E_UNSUPFORMAT))
No sé que otra cosa puedo hacer… hago GC.Collect() pero nada, hago también oCompany.Disconnect() pero no ayuda, antes se vuelve como más lento o pesado.
Yo tengo una clase llamada conexión, que hace como el inicio del objeto oCompany, para poder usar el objeto en cualquier parte del código, es como una clase compartida o publica de tipo (sealed), ella al parecer siempre queda como conectada así el servicio termine su ejecución, puede ser eso? les paso bien la arquitectura como lo estoy usando?
Claro que sí
Cuando inicia el servicio, hace esto:
En el evento OnTimer, Estructuras.Respuesta FacturasEnviadas = await Transacciones.EnviarFacturas.postFactura(compania);
En la Clase EnviarFacturas método postFactura me conecto de la siguiente manera:
List<Estructuras.Facturas> Documentos = await Data.EnviarFactura.getFacturas(ConfigurationManager.AppSettings.Get("TipoDb"),
BaseDatos);
if (Documentos.Count != 0)
{
try{
Conexion.Iniciar();
Conexion.oCompany.Server = ConfigurationManager.AppSettings.Get("Server");
Conexion.oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANADB;
Conexion.oCompany.CompanyDB = BaseDatos;
Conexion.oCompany.UserName = ConfigurationManager.AppSettings.Get("UserName");
Conexion.oCompany.Password = ConfigurationManager.AppSettings.Get("Password");
Conexion.oCompany.DbUserName =
ConfigurationManager.AppSettings.Get("DbUserName");
Conexion.oCompany.DbPassword =
ConfigurationManager.AppSettings.Get("DbPassword");
Conexion.oCompany.language = SAPbobsCOM.BoSuppLangs.ln_Spanish_La;
if (Conexion.oCompany.Connect() == 0)
{
SAPbobsCOM.Documents businessObject;
foreach (var doc in Documentos)
{
businessObject = (SAPbobsCOM.Documents)Conexion.oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oInvoices);
// aquí hago otros procesos con cada documento...
if (businessObject.GetByKey(doc.DocEntry))
{
businessObject.UserFields.Fields.Item("U_FEL_Respuesta").Value = respp2.Respuesta;
businessObject.UserFields.Fields.Item("U_FEL_Estado").Value = respp2.Estado;
if (businessObject.Update() == 0)
{
// otros procesos etc...
}
//Cada que hago un update ejecuto esto:
System.Runtime.InteropServices.Marshal.ReleaseComObject(businessObject);
}
}
// Cuando termino de recorrer el foreach, ejecuto lo siguiente:
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(businessObject);
GC.Collect();
}
Ven algo que pueda estar haciendo mal en el código? y perdón, corrijo, este error se me presenta tanto en SAP HANA como con SQL, no importa que motor de base de datos use, me pasa da el mismo error.
no veo nada que pudiera causar el error, probaste usando un start transaccion y usar el oCompany.Disconnect() pero no dentro del ciclo, solo cuando termines de ejecutar todo
De hecho algún tiempo tuve el error de que no podía realizar una acción en la DI API porque “Ya había una transacción en progreso”, y tienes que agregarle el rollback y el commit. Si no, no te deja intentar otra modificación.
Le hice una trampa al servicio sin saberlo y ya está funcionando, pero solo funciona para hana, porque para SQL da un error distinto y se detiene el servicio de windows, hice lo siguiente:
En la clase conexión, les había mostrado que tenía un método llamado Iniciar, pero añadí otro método llamado Finalizar así:
En el evento OnTimer del servicio, ejecuto el método Iniciar de esta clase, antes de ejecutar el método que llama la información de las facturas, para cuando termina de ejecutarse el método de las facturas y hacer su proceso completo, ejecuto el método Conexion.Finalizar();
En el visor de eventos me sale un error cada tanto tiempo, pero al menos el servicio se reinicia y continúa funcionando: