miércoles, 20 de febrero de 2019

Current user has no permissions for this operation

Si al intentar editar un reporte Crystal Report desde SAP B1 te surge el siguiente mensaje: "Current user has no permissions for this operation", es muy posible que el reporte sea del sistema y por lo tanto solo tienes permiso de solo lectura, puedes cerciorarte de ello desde el Manage Layout, el reporte de Crystal te dirá entre paréntesis si es así.




La única opción que nos queda es copiar este reporte abriéndolo y dándole en Guardar Como, para después importarlo desde el mismo Manage Layout, una vez cargado podrás editarlo cuanto quieras 😃.

jueves, 14 de febrero de 2019

Gestión - Autorizador por Modelo de Autorización en SAP

¿Necesitas saber quienes autorizan los modelos de autorización activos?, esta sencilla consulta te arroja esa informació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

Si además quieres saber los autores de cada Modelo de Autorización, ocupa también esta Query:

select a.Name as 'Nombre Modelo', a.Remarks as 'Descripción Modelo'
, e.U_NAME as 'Autor'
from OWTM a
inner join WTM1 b on a.WtmCode = b.WtmCode
inner join OUSR e on b.UserID = e.USERID
where a.Active = 'Y'
order by [autor], [Nombre Modelo]

miércoles, 6 de febrero de 2019

TN - Bloquear fecha de vencimiento facturas proveedor SAP


Esta necesidad de bloquear la fecha de vencimiento en las facturas es muy usual y para los que administramos SAP 9.0 se nos complica un poco dado que no existe a nivel sistema una forma de bloquear el campo al usuario, pero esto lo arreglamos con este sencillo TN:

if @object_type = '18' AND @transaction_type IN ('A', 'U')
Begin
    If EXISTS ( SELECT T0.DocNum
FROM OPCH T0
INNER JOIN OCRD T1 ON T0.CardCode = T1.CardCode
inner join OCTG t2 on t2.GroupNum=t1.GroupNum
WHERE T0.[DocEntry] = @list_of_cols_val_tab_del
AND t0.DocDueDate <> (t0.DocDate+t2.ExtraDays)
)
    Begin
        SET @error = 0201006
        SET @error_message = 'Fecha de vencimiento no permitida de acuerdo a las condiciones de pago con el proveedor'
    End   
End

hasta la próxima!.

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!.

jueves, 13 de diciembre de 2018

Training - Status Canceled en SAP


Si alguna vez te has preguntando que significa los tres estados del campo CANCELED, enseguida te lo muestro poniendo como ejemplo la tabla OINV:

'Y' = Facturas Canceladas
'N' = Facturas No Canceladas
'C' = Facturas que realizan la cancelación de otra previa (Esa factura previa se convertirá en una factura con estatus 'Y').

Saludos!.