lunes, 28 de enero de 2019

Quitar carácter especial en consulta SQL Server


Tuve por varios días un problema que surgió por una comilla simple que SQL Server traducía como caracter especial las cuales venían de un sistema auxiliar de SAP y que cargaba por DTW, esto hacia que no pudiera hacer un Join pues las descripciones eran distintas entre un sistema y otro, como no hallaba la solución a través de alguna función o de forma nativa desde SQL Server para eliminarla y ante mi carga de trabajo que me impedía seguir buscando, decidí darle rienda suelta a mi imaginación y pues aquí les dejo mi solución, si tienen una mejor, no sean malos déjenla en los comentarios.

Utilizando el CHARINDEX y el SUBSTRING creo nuevas descripciones uniformes dentro de una tabla creada a partir de una subconsulta la cual uno con otra subconsulta con las tablas de SAP, para ya sin el caracter especial hacer el match.

select * from (
 select NOM_GEN_POL as [Nombre Poliza Sistema Aux], replace(Ref1,'Pól','Pól')  as [Nombre Poliza SAP], FECHA_GEN_POL as [Fecha Poliza], [Importe Poliza SAP]  , [Importe Poliza Sistema Aux]
from (
select CONVERT(Decimal(15,2),SUM(c.IMPORTE),2) as [Importe Poliza Sistema Aux]
,CASE when b.NOM_GEN_POL like '%PEÑ%' then SUBSTRING(b.NOM_GEN_POL,0, CHARINDEX('PEÑ', b.NOM_GEN_POL) + 2) + SUBSTRING(b.NOM_GEN_POL,CHARINDEX('PEÑ', b.NOM_GEN_POL) + 3, 20) else b.NOM_GEN_POL end as NOM_GEN_POL, b.FECHA_GEN_POL
from Sistema_Aux.dbo.RH_ENC_POL  b
inner join  Sistema_Aux.dbo.RH_POLIZA_NOMINA a on a.CLA_GEN_POL = b.CLA_GEN_POL
inner join  Sistema_Aux.dbo.RH_DET_POL_IND c on a.NUM_NOMINA = c.NUM_NOMINA
and c.TIPO_CAR_CRE = 2
and c.CLA_PERIODO = a.CLA_PERIODO
and b.FECHA_GEN_POL > '20180531'
group by b.NOM_GEN_POL, b.FECHA_GEN_POL) Tabla_Sistema_Aux
left join (
select  CONVERT(Decimal(15,2),sum(Loctotal),2) as [Importe Poliza SAP], TransCode
, CASE when Ref1 like '%PEÃ%' then SUBSTRING(isnull(Ref1,''),0, CHARINDEX('PEÃ', isnull(Ref1,'')) +2) + SUBSTRING(isnull(Ref1,''),CHARINDEX('PEÃ', isnull(Ref1,'')) + 4, 20) else Ref1 end as ref1--, RefDate
from OJDT
where  TransType = 30 and TransCode in ('NO01','FN01')
and RefDate >  '20180531'
group by transcode, Ref1)--, RefDate)
Tabla_SAP On (replace(replace(Tabla_SAP.Ref1,'Pól','Pól'), ' - [', '- [') = replace(Tabla_Sistema_Aux.NOM_GEN_POL COLLATE Modern_Spanish_CS_AS, ' - [', '- [')
 )
 ) Consulta where isnull([Importe Poliza SAP],0) <> isnull([Importe Poliza Sistema Aux],0)
order by [Fecha Poliza]

Nota: mi versión de SQL Server es 2008 R2.

TN - Validar campo de horas y minutos en SAP


Como programador descubrí el poder de las expresiones regulares y como estas te pueden salvar la vida 😅, les mostrare algo que seguramente en algún momento necesitaran ocupar, es un ejemplo de lo que se puede hacer con las expresiones regulares en SQL Server, para esto necesitaremos ocupar el operador Like.

Si requieren validar los datos de hora y minutos que ingresan sus usuarios al momento de realizar alguna transacción, esto lo pueden hacer a través del Transaction Notification, les dejo abajo el script (la parte en negrita es lo que hace la magia), espero les sea de provecho.

Saludos!.


if @object_type = '23' and @transaction_type in ('U','A')
BEGIN
if EXISTS(select DocEntry from OQUT
where Docentry = @list_of_cols_val_tab_del
and (U_Observaciones <> ''
and U_Observaciones not like  '[2][0-3]:[0-5][0-9]'
and U_Observaciones not like '[0-1][0-9]:[0-5][0-9]')
OR DATEDIFF(MINUTE,U_destino,U_Observaciones) < 0
and Series in ('16'))
begin

Set @error = 60003
Set @error_message = 'Verifique el dato a ingresar'
end
END 

Importe de reconciliación debe ser inferior a saldo vencido para esta transacción


¿Que tal?, estoy de vuelta con un caso que me surgió la semana pasada el cual a las personas que usen SAP 9.2 PL 8 o mas recientes ya no lo presentarán, ya que es un bug de SAP el cual ya fue resuelto a partir de esa versión, el mensaje de error generalmente sucede cuando se cancela un pago en dolares de una factura en dolares, esta al querer volver a generar el pago efectuado nos arroja el siguiente error: "Importe de reconciliación debe ser inferior a saldo vencido para esta transacción", buscando en Internet me encontré que lo que se tiene que hacer es informar a SAP para que nos realice un update a nuestra BD, esto nos puede demorar hasta 5 días en promedio esto si ya cubren todos los requisitos que SAP solicita, ellos se demoran hasta dos días en enviar la solución que se tiene que realizar primero en ambiente de pruebas, pero esto es posible evitarlo realizando el pago directo a cuenta a nombre del Socio de negocio y después reconciliando este con la factura, de esta forma el saldo del socio de negocio queda en cero y el pago es cubierto en su totalidad.

Espero les sea de ayuda esta solución para evitar todo el proceso con SAP, Saludos!.