lunes, 5 de diciembre de 2022

Formato "yyyy-MM-ddT15:00:00.000Z" en DateTime

Al consumir una API  el response me devolvía estatus 200 pero no me devolvía la información que necesitaba, ¿el problema?... el formato de fecha que estaba enviando para filtrar la información, la API solicitaba cumplir con el siguiente formato:  "2022-12-05T15:00:00.000Z", la solución fue formatearla de esta manera con el tipo de dato DateTime:

DateTime.Today.AddDays(-1).ToString("yyyy'-'MM'-'ddTHH':'mm':'ss'.00Z'")

Lo subrayado aquí arriba es lo importante, y Vualá!! mi información apareció!.

A continuación dejo la liga para ver más formatos en la documentación de Microsoft: Hours documentation format

¡Saludos!

miércoles, 16 de noviembre de 2022

Ejemplo de Inner join con SOQL de Salesforce

Después de buscar documentación y ver algunos videos, acabe terminando la relación de mi inner join yo mismo en el lenguaje de consultas de Salesforce (SOQL). 

Les dejo el ejemplo claro de como realizarlo:

SELECT Id, ProductCode,Quantity,UnitPrice,Description,Discount,                                  Product2.Marca__c
FROM OpportunityLineItem
WHERE OpportunityLineItem.OpportunityId = '006DS00000HoKhYYAV' 
AND IsDeleted = false
AND OpportunityLineItem.Product2Id IN (select id FROM Product2)

¡Saludos!

martes, 1 de noviembre de 2022

The remote certificate is invalid according to the validation procedure

Probando un Endpoint desde Postman de un proyecto API que estaba corriendo desde Visual Studio, al momento de querer utilizar la clase MemoryStream para posteriormente deserializar un response a formtato json, me marco el siguiente error:

The remote certificate is invalid according to the validation procedure

Después de buscar por que sucedía esto encontré la siguiente línea de código que nos ayuda a validar nuestro certificado, en mi caso una url alojada en mi propio ambiente local, espero les pueda ayudar:

ServicePointManager.ServerCertificateValidationCallback += delegate { return true; };

Les dejo también parte de la documentación que nos explica como funciona esta propiedad y el enlace a la página oficial de Microsoft:

"Una aplicación puede establecer la ServerCertificateValidationCallback propiedad en un método que se usará para la validación personalizada por parte del cliente del certificado de servidor. Al realizar la validación personalizada, el sender parámetro pasado a RemoteCertificateValidationCallback puede ser un nombre de cadena de host o un objeto derivado de WebRequest.

Cuando no se usa la validación personalizada, el nombre del certificado se compara con el nombre de host usado para crear la solicitud. Por ejemplo, si Create(String) se pasó un parámetro de "https://www.contoso.com/default.html", el comportamiento predeterminado es para que el cliente compruebe el certificado con www.contoso.com.

Más información: ServicePointManager.ServerCertificateValidationCallback Propiedad

martes, 25 de octubre de 2022

DI API - Definciones de Objetos, Funciones y Atributos.

¿Cómo están?, está entrada la estaré alimentando con definiciones de los objetos (O), método (M) o atributos (A) que podemos encontrarnos con el uso del DI API y que al ser principiantes con la dll pueden desconocer para que sirve o bien necesitan implementar y desean conocer como poder hacerlo con DI API, les voy dejando la lista:

  1. (M) - GetNewObjectKey(): Devuelve la última entrada de documento agregado por DI API de tu desarrollo, por ejemplo, al agregar cualquier objeto comercial dentro de tu desarrollo, recibirás la última llave agregada desde tu conexión.
  2. (M) - GetByKey(docEntry): Si se encuentra el objeto con la clave que especificaste, el método devuelve True y las propiedades del objeto se completarán con los datos del objeto. Si no se encuentra el objeto con la clave que especificaste, el método devuelve False y las propiedades del objeto permanecen sin cambios.
  3. (M) - GetLastError(out int, out string): Función del objeto Company, devuelve el error inmediato de tu sesión en dos variables, una de tipo int y otra de tipo string, la primera para describir el código y la segunda para describir el mensaje.

jueves, 13 de octubre de 2022

Mantemiento/Reducción de logs SQL Server

El siguiente script es básico para el mantenimiento de nuestras bases de datos, la reducción de los logs nos ahorrara mucho espacio en nuestro disco:

 use NUESTRA_BD 
ALTER DATABASE NUESTRA_BD
SET RECOVERY SIMPLE;
GO
--Reducimos el log de transacciones a  1 MB.*/
DBCC SHRINKFILE(NUESTRA_BD_log, 1);
GO
-- Cambiamos nuevamente el modelo de recuperación a Completo.*/
ALTER DATABASE NUESTRA_BD
SET RECOVERY FULL;
GO

Ver tamaño de las bases de datos en SQL Server

¿Queremos evitar estar viendo los files de cada base de datos para conocer su tamaño?, les dejo una consulta en SQL Server que les dará el tamaño del archivo mdf y ldf, de cada base de datos de su instancia, ejecútenla sobre la BD Master:
 
with fs
as
(
select database_id, type, size * 8.0 / 1024 size from sys.master_files
)
select name,
(select sum(size) from fs where type = 0 and fs.database_id = db.database_id) DataSizeMB,
(select sum(size) from fs where type = 1 and fs.database_id = db.database_id) LogSizeMB,
((select sum(size) from fs where type = 0 and fs.database_id = db.database_id)+ (select sum(size) from fs where type = 1 and fs.database_id = db.database_id))
TotalDatabaseSizeMB
from sys.databases db
order by TotalDatabaseSizeMB DESC

¡Saludos!.

Schema-binding Objects Check / Schema bounding objects found in database

 Tenia programado un upgrade con un cliente a un servidor en la nube para su ambiente de pruebas, todo marchaba bien, pero algo paso en el transcurso, el asistente marco un error, error que como saben mientras persista nos impedirá realizar el upgrade.

Lo bueno de todo esto es que el error nos indicaba leyéramos la siguiente nota que a continuación les dejo tal cual, al final les diré que hice con las vistas (en mi caso) para que me dejará continuar con el upgrade.

 Please find the original document at https://launchpad.support.sap.com/#/notes/ 1343075

Symptom

During a run of the SAP Business One Upgrade / Setup Wizard, in the pretest step, you may receive the following error message:

Schema bounding objects found in database

Cause

There are schema bouding objects with a dependency on SAP Business One tables. When there is a dependency between the tables and objects defined as schema-bound (For example, CREATE VIEW/FUNCTION ... WITH SCHEMABINDING), the upgrade fails due to a failure to drop/alter SAP Business One tables. The following script can find all schema-binding objects in the database: SELECT 'schema_bound object ' + OBJECT_NAME ( object_id ) + ' found in DataBase!' FROM sys.sql_modules where is_schema_bound = 1

 Solution

To enable the upgrade, consult your database administrator and drop all schema-binding objects. For more information, see the Microsoft SQL Server document and consult your database administrator. We recommend generating a database backup before dropping any objects from the company database.

Pues bien, tal como lo dice la nota, al ejecutar la consulta SELECT 'schema_bound object ' + OBJECT_NAME ( object_id ) + ' found in DataBase!' FROM sys.sql_modules where is_schema_bound = 1, me arrojó los objetos del esquema que tienen en su estructura la sentencia marcada en negritas:

CREATE VIEW dbo.vwName 

WITH SCHEMABINDING AS 

SELECT T1.ID, T1.FirstName, T1.LastName, T2.Address, T2.Phone 

FROM dbo.Table1 AS T1 

INNER JOIN dbo.Table2 AS T2 ON T1.Id = T2.Id GO

Lo que note es que estos objetos no son nativos de SAPB1, si no de desarrollos hechos por el mismo cliente, por lo que sintiéndolo mucho, modifique sus vistas quitándole esa sentencia SQL, no es necesario eliminar las vistas, solo borrando la sentencia.

Con esto podrán continuar su upgrade, si tienen alguna otra duda sobre este tema, con gusto lo vemos. ¡Saludos!

miércoles, 12 de octubre de 2022

Artículo ya definido en nivel superior en árbol producto [Lista de materiales: Componentes - Código de componente]

 ¡Hola!, ¿Cómo están?, ¿han tenido este problema en SAP B1 al querer crea una lista de materiales cuando aparentemente todo está en orden?: Artículo ya definido en nivel superior en árbol producto [Lista de materiales: Componentes - Código de componente][line: 1] , 'número de línea matriz 1' [Mensaje 3566-12].

Lo primero que hacemos es asegurar que efectivamente no exista ya una lista de material donde el código que queremos tener como hijo sea ya el padre del código que deseamos que sea el padre (podría pasar que alguien administrador se nos adelanto e hizo lo contrario de lo que queremos hacer ahora).

Si lo anterior no es así, surge la duda del porque entonces nos arroja este error.... pues hay una causa más que lo puede estar provocando, a continuación les explico:

Se quiere crear la siguiente lista de material, el código terminación -018 se requiere sea el producto creado a partir del terminación -017, pero marca el error aún cuando ya hemos asegurado que no existe una lista de material que haga lo contrario.


Para poder crearla debemos de verificar si no existen ordenes de producción abiertas en las que hallan hecho también lo contrario, para eso les dejo una consulta en la que podrán identificar si existen, de ser así, deben de cancelar o cerrar todas las ordenes de fabricación que estén de esa forma y entonces les dejará crear la lista de materiales deseada.


¡Saludos!

jueves, 23 de junio de 2022

Bancos - Asociar facturas con su pago recibido

Me he topado un sin fin de ocasiones con la mala asociación de tablas en reportes que buscan unir las facturas de clientes con su pago recibido, por eso les dejo está consulta simple pero muy utilizada y que por lo mismo debemos asegurarnos este correcta:

FROM ORCT E
LEFT JOIN RCT2 T1 ON T1.DocNum=E.DocEntry
LEFT JOIN OINV T2 ON T2.DocEntry=T1.DocEntry
WHERE E."DocEntry"= {?DocKey@};

¡Saludos!

miércoles, 22 de junio de 2022

Gestión - Tiempos de timbrado en Integration Framework B1if

En esta consulta podremos ver los tiempos en que se genero el documento en SAP B1 y en el que el PAC (México) nos devolvió el timbrado con el Integration Framework.

SELECT T0.[DocNum], T0.CardName, T0.[DocEntry], T0.[CreateDate], T0.[CreateTS], T1.[CreateTS], T1.[U_B1SYS_FechaTimbr] , t1.ReportID, t2.U_NAME
FROM OINV T0 left JOIN ECM2 T1 ON T0.[DocEntry]= T1.[SrcObjAbs] AND  T0.[ObjType]= T1.[SrcObjType] 
INNER JOIN OUSR T2 ON T1.UserSign = T2.INTERNAL_K 
WHERE T0.[CreateDate]='20210512'
order by DocNum

¡Saludos!

Gestión - Tablas Query Manager, Búsquedas formateadas, Modelos de Autorización y Reportes/Layouts Crystal Report

Les comparto en esta publicación las 4 tablas generalmente más demandadas en los procesos de las compañías (ojo no en todas) que debería correr cualquier consultor que este migrando SAP B1 SQL a HANA, para de esta manera saber a lo que se está enfrentando en una o más bases de datos:
  1. Query Manager
  2. Busquedas Formateadas
  3. Modelos de Autorización
  4. Reportes y Layouts Crystal Report
Las siguientes consultas son el script básico, pueden adornarlas como a ustedes mejor les convenga:

Query Manager
select T0."CatName", T1."QName"  from OQCN T0
inner join OUQR T1 on T0."CategoryId" = T1."QCategory"
where CatName not in ('SAP_DASHBOARD_002_DAB012_QUERY','Sistema','KPI_MOBILE_HANA','KPI_MOBILE')
and CatName not like ('SAP_DASHBOARD_%')
Order by T0."CatName"
 
Busquedas formateadas
Select CASE FormID when 133 then 'Factura Deudores' 
when 134 then  'Socio de Negocios'
when 804 then 'Catalogo de cuentas'
when 179 then 'Nota de Crédito' 
end FORM, ItemID,  QName
from CSHS a
inner join OUQR b on a.QueryId = b.IntrnalKey
 
Reportes y Layouts Crystal Report
select DocCode, DocName from RDOC
where Author not in ('System')
and TypeCode = 'RCRI'
 
Modelos de autorización
select a.Name 'Nombre Modelo', a.Remarks 'Descripción Modelo', c.Name as 'Nombre Etapa' , c.Remarks as 'Descripción Etapa'
,  e.U_NAME as  'Autorizador', c.MaxReqr as 'Autorizaciones requeridas', c.MaxRejReqr as 'Rechazos requeridos'
from OWTM a
inner join WTM2 b on a.WtmCode = b.WtmCode
inner join OWST c on b.WstCode = c.WstCode
inner join WST1 d on c.WstCode = d.WstCode
inner join OUSR e on d.UserID = e.USERID
where a.Active = 'Y'
order by [Nombre Modelo] , Autorizador,
[Nombre Modelo] , Autorizador 

¡Saludos!