domingo, 26 de marzo de 2023

Inventarios - Lotes en Transferencias de Stock, Facturas. Etc. (Histórico)

Hola Amigos, les traigo una consulta que les puede ser muy util cuando requieren obtener los lotes afectados en uno o varios documentos, estos pueden ser una salida, una entrega, una factura, una devolución, una nota de crédito, etc.

Para eso les haré un ejemplo con las transferencias de stock:

SELECT T5.DocEntry, T5.DocNum, t5.DocDate, T5.UserSign, T5.Filler, T5.ToWhsCode,  T5.Comments  
                , T6.FromWhsCod, T6.LineNum, t6.LineStatus, t6.unitMsr, t6.Quantity, T1.ItemCode 
                , T6.WhsCode, T2.DistNumber, T0.Quantity as QDistNumber 
                FROM OWTR T5  
                inner join WTR1 T6 on T5.DocEntry = T6.DocEntry  
INNER JOIN OITL T1 ON T5.DocEntry = T1.ApplyEntry  
INNER JOIN ITL1 T0 ON T0.LogEntry = T1.LogEntry                
                INNER JOIN OBTN T2 ON T0.ItemCode = T2.ItemCode AND T0.SysNumber = T2.SysNumber                 
                where T5.DocDate > '20230126' and T5.CANCELED = 'N' And T1.ApplyType = 67 and T0.Quantity > 0 

Espero les ayude para sus informes, ¡saludos!.

This SqlTransaction has completed; it is no longer usable

¿Qué tal?, les cuento que al realizar transacciones con SqlCommand, me surgía el siguiente error: This SqlTransaction has completed; it is no longer usable, mi tarea hacia inserción en tres tablas, una cabecera y dos de detalle, pero en la segunda inserción aparecía el error.

Si bien, la transacción se realizaba, pues note que los inserts si se realizaban en las tres tablas, la rutina marcaba una excepción y eso no me gustaba, por lo que decidí investigar y hacer pruebas para encontrar que lo provocaba, la respuesta fue que después de hacer un commit o un rollback en la transacción, debe inicializarse una nueva transacción de lo contrario estaremos "reutilizando" una que ya había llegado a su fin, para hacerlo solo debí como les dije inicializar de esta manera mi nueva transacción:

 SqlTransaction transaction = sqlConn.BeginTransaction();}

¡Saludos! 

lunes, 13 de marzo de 2023

Incorrect sintaxis near the keyword for

Hola!; ¿Qué tal?, 

Les traigo ahora un error "incorrect sintaxis near the keyword for" el cual se me presento al utilizar el SAPbobsCOM.Recordset, lo problemático de esto sucede por que en apariencia la consulta estaba bien y me corría perfectamente en SQL Server,  investigando supe que este objeto no reconoce la sintaxis tal cual la hacemos para el motor de la BD, en mi caso fue el punto y coma que estaba de màs, ejemplo: oRecordSet.DoQuery("SELECT * from OCRD;");

En conclusión veremos este error cuando algo en nuestra consulta no lo este interpretando de manera correcta el DoQuery, así que cuidado con eso.

¡Saludos!

domingo, 12 de marzo de 2023

Method not found: 'Void SAPConector.DTO.DTOIncomingPayments.set_ObjectType(SAPbobsCOM.BoObjectTypes)'

¿Cómo están?, les traigo el error siguiente que me dio por un rato dolor de cabeza: Method not found: 'Void SAPConector.DTO.DTOIncomingPayments.set_ObjectType(SAPbobsCOM.BoObjectTypes)'.

Este apareció una vez que mi aplicación la pase desde mi ambiente de desarrollo a mi ambiente de pruebas, este error se mostraba en tiempo de ejecución, a la mitad del proceso lo enviaba y no terminaba la tarea.

La solución después de investigar y ver varios portales que no me dieron la respuesta especifica pero si el camino a seguir para resolverlo fue esta:

ANTES Entremos en contexto:

Mi proyecto hace referencia a una dll que ocupa la misma dll que también ocupo en mi proyecto principal en mi caso la de SAP B1 SAPbobsCOM.

1er Error: Los tipos de datos de mi librería cambiaban a Object al hacer referencia a ella desde mi proyecto principal, tipos de datos que comentamos al inicio pertenecen a la dll SAPbobsCOM, de hecho el error muestra un ejemplo: SAPbobsCOM.BoObjectTypes.

  esto hacía que cuando llamaba la librería (dll) a mi proyecto principal los tipos de algunos atributos no se mantuvieran en su forma original si no que se convirtieran en tipos object por lo que mi proyecto principal no los reconocía y me marcaba error de compilación.

Solución al 1er error: Coloque en False Embed Interop Types en las propiedades de la referencia de mi proyecto de librería.


2do. Error: Los tipos ya son reconocidos en mi proyecto principal después de colocar en false la opción  ya no marca error en compilación pero al momento de ejecutar la solución principal en el servidor de pruebas marca un error en tiempo de ejecución: Method not found: 'Void SAPConector.DTO.DTOIncomingPayments.set_ObjectType(SAPbobsCOM.BoObjectTypes)'.

Solución al 2do error: De igual manera en que coloque Embed en Interop Types de mi librería, también debí colocarlo en false en mi proyecto principal:

3er. Error: al hacer esto me marcaba el siguiente error al ejecutar mi programa: Retrieving the COM class factory for component with CLSID {632F4591-AA62-4219-8FB6-22BCF5F60100} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)) .

Solución al 3er. Error: Debi quitar el check en Prefer 32-bit y tomar la opción de x64 en Platform target, esto por que inicialmente estaba chequeado y el target estaba en Any, cabe mencionar que el servidor donde ejecutaba mi solución era de 64 bits.


Por aquí les dejo el link para documentarse más sobre el tema de Type equivalence and embedded interop types en la página oficial de Microsoft.

Con esto mi solución trabajo sin contratiempos 😀. Saludos!.




jueves, 9 de marzo de 2023

Retrieving the COM class factory for component with CLSID {XXXX} Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

El siguiente error se me presento al pasar del ambiente de desarrollo (donde todo funcionaba correctamente) al ambiente de pruebas: Retrieving the COM class factory for component with CLSID {632F4591-AA62-4219-8FB6-22BCF5F60100} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Después de tanto buscar el error lo solucione quitando el siguiente check del proyecto en Visual Studio, ya que esto hacia que le diera preferencia a 32bits al compilar y donde llevaba mi desarrollo era a un ambiente de 64bits.


Consideren que si su proyecto hace referencia a otros proyectos, posiblemente también tengan que quitar este check en los demás proyectos. Espero les ayude.

Saludos.