Alarma: Crear documento

Buenos días,

Necesito vuestra colaboración, estoy tratando de crear una alerta que me muestre los clientes activos que tienen una factura generada en un periodo superior a 18 meses en HANA.

Tengo esto por ahora:

SELECT T0."DocNum", T0."DocDate", T0."CardCode", T0."CardName" FROM OINV T0 WHERE DAYS_BETWEEN(NOW(),  T0."DocDate") >= -547

Pero me aparecen todas las facturas de todos los clientes, solo quiero me aparezcan la de los clientes que no han tenido facturas en este periodo.

Hola buenas, recordar formatear el texto cuando se postea la consulta sql.

Para eso necesitas otro tipo de consulta no la diferencia de fechas.

1 me gusta

¿Que tipo de consulta?

No trato de entender lo que comentas…

Gracias…

Pues algo así, de este estilo…

En el where con una subconsulta le dices que aquellos registros que no estén en la consulta…

where T0.Status ='A' and T0.CstmrCode not in 
(
select distinct(OINV.CardCode) from INV1 
inner join OINV on INV1.Docentry=OINV.DocEntry 
inner join OCRD on OINV.CardCode=OCRD.CardCode 
where INV1.TrgetEntry is null and INV1.AcctCode in ('705028', '705031') and year(OINV.DocDate)=year(getdate()) and month(OINV.DocDate)=month(getdate()) and OCRD.GroupCode<>145)
1 me gusta

La he probado… Pero no me funciona…

@IvanFor no es el código exacto para solucionar tu problema, tienes que adaptarlo.

Es una idea para que construyas el tuyo.

Este va condicionado a que no tenga abonos, que sean 2 cuentas contables determinadas… y que solo evalúe el último mes o mes anterior al actual…y que sea un grupo de clientes determinado.

1 me gusta

Correcto.

Voy a tratar de entender lo que me comentas.

Saludos.

Modifico el titulo del tema porque el otro me aparece como cerrado, tengo problemas para ejecutar la alarma que me informe de la creación de un documento.

Más o menos por lo que te he entendido…
Clientes que tienen factura grabada en el sistema entre unas fechas determinadas …
El inicio lo desconozco pero el fin tiene que ser más o menos Enero de 2021 (18 meses atrás)
Esa select sería algo así como

select distinct(OINV.CardCode) from OINV 
inner join OCRD on OINV.CardCode=OCRD.CardCode 
where oinv.docdate between '20150101' and '20210101'

Pues bien esa consulta de selección es la que tienes que pasar en el where de la otra… diciendo que el código de cliente de la consulta de selección que armas para esta que comentas de clientes activos, esté en esa lista…

SELECT T0.DocNum, T0.DocDate, T0.CardCode, T0.CardName FROM OINV T0
Where T0.CardCode in 
(
select distinct(OINV.CardCode) from OINV 
inner join OCRD on OINV.CardCode=OCRD.CardCode 
where oinv.docdate between '20150101' and '20210101')
1 me gusta

Si correcto, pero quiero ejecutar una alarma a partir de la consulta, si le indico fechas fijas no me sirve… No se si me explico.

Necesito una alarma que me muestre tres cosas por separado, es decir, necesito tres alertas:

  1. Cuando se cree una devolución de mercancias
  2. Cuando se cree una solicitud de pedido
  3. Que me muestre los clientes que no han tenido factura en los ultimos 18 meses.

La 1) y 2) son iguales solo seria modificar el documento.

¿Cómo hago para copiar la consulta que tengo creada, en su formato?

Gracias!!

Encontre esta consulta:

DECLARE @CONT AS INT 
---CONTADOR 
DECLARE @STAT AS NVARCHAR(2) 
--- ESTATUS DE DOCUMENTO ABIERTO O CERRADO 
DECLARE @ULTDOC AS INT 
---NUMERO ULTIMO DOCUMENTO 
SET @CONT = (SELECT COUNT(T4.[DocNum]) FROM OPRQ T4) 
SET @ULTDOC = (SELECT MAX(T4.[DocNum]) FROM OPRQ T4) 
SET @STAT = (SELECT T4.DocStatus FROM OPRQ T4 WHERE T4.[DocNum] = @ULTDOC) 

SELECT @CONT, @ULTDOC, @STAT

IF @STAT = 'O' BEGIN 
	SELECT 
		DISTINCT 
		T0.[DocEntry] as 'N° de Nueva Solicitud de compra' 
	FROM 
		OPRQ T0 
	WHERE 
		@CONT > '0' 
		AND T0.[DocStatus] = 'O' 
		AND T0.DocDate = CONVERT(date,GETDATE(),182)
END

Pero esta en SQL, ¿alguien que me pueda aportar la traducción a HANA?

Leyendo ahora tu punto 3, no coincide con el primer post… te falta un no, primordial y por eso suena raro y complicado.
Para tu punto 3 la consulta inicial de partida tiene que ser de OCRD y en el where tienes que quitar los que no tengan factura en una direrencia de días de 180.
Lo importante que es redactar bien los requerimientos…

SELECT T0.CardCode, T0.CardName FROM OCRD T0
Where T0.CardType='C' and T0.CardCode not in 
(
select distinct(OINV.CardCode) from OINV 
inner join OCRD on OINV.CardCode=OCRD.CardCode 
where datediff (day, getdate(), OINV.docdate)<-180)

Voy a probar… Aunque hablo de meses no de días. Entonces entiendo que modificando DAYS por MONTH, funcionara.

Gracias!

180 días = 6 meses x 30 días de cada mes…

Si utlizas la función meses en la diferencia de fechas, la resta entre meses no se como se comportará cuando cambias de año, por eso se suele hacer por diferencia de días… entre 2 fechas, la actual y una del sistema.

Estoy probando esta consulta, pero no me va… Me da error, es HANA no SQL, he modificado los [] por “” pero no funciona… Alguien me puede ayudar?

DECLARE @CONT AS INT 
---CONTADOR 
DECLARE @STAT AS NVARCHAR(2) 
--- ESTATUS DE DOCUMENTO ABIERTO O CERRADO 
DECLARE @ULTDOC AS INT 
---NUMERO ULTIMO DOCUMENTO 
SET @CONT = (SELECT COUNT(T4."DocNum") FROM OPRQ T4) 
SET @ULTDOC = (SELECT MAX(T4."DocNum") FROM OPRQ T4) 
SET @STAT = (SELECT T4.DocStatus FROM OPRQ T4 WHERE T4."DocNum" = @ULTDOC) 

SELECT @CONT, @ULTDOC, @STAT

IF @STAT = 'O' BEGIN 
	SELECT 
		DISTINCT 
		T0."DocEntry" as 'N° de Nueva Solicitud de compra' 
	FROM 
		OPRQ T0 
	WHERE 
		@CONT > '0' 
		AND T0."DocStatus" = 'O' 
		AND T0.DocDate = CONVERT(date,GETDATE(),182)
END

Que tal @IvanFor, ya habia realizado una consulta similar para uno de mis clientes, solo que el necesitaba los items no facturados en los ultimos X dias… solo tube que hacer unos cambios para contemplar en lugar de items, las facturas y los clientes. Y hacer los cambios pertinentes para HANA, porque la tenia en SQL.

Entonces si entendí bien… Necesitas una consulta que te muestre todos los clientes activos que su ultima factura haya sido hace mas de 18 meses. De estar en lo correcto, creo te servira la siguiente:

SELECT
CASE WHEN MAX(A."DocDate") <= B."FECHA-18M" THEN MAX(A."DocDate") end as "Fecha Ultima Factura",
CASE WHEN MAX(A."DocDate") <= B."FECHA-18M" THEN MAX(A."DocNum") end as "Ultima Factura",
A."CardCode", A."CardName"
FROM OINV A
INNER JOIN (SELECT ADD_MONTHS(TO_DATE(CURRENT_DATE, 'YYYY-MM-DD'), - 18) AS "FECHA-18M" FROM DUMMY)B ON 1=1
INNER JOIN OCRD C ON C."CardCode" = A."CardCode"
WHERE C."validFor" = 'Y'
GROUP BY A."CardCode", A."CardName", B."FECHA-18M"
HAVING CASE WHEN MAX(A."DocDate") <= B."FECHA-18M" THEN MAX(A."DocDate") end is not null;

Prueba y nos comentas como te fué.

Saludos desde Sonora, Mexico. :cowboy_hat_face: :+1:

1 me gusta

Finalmente lo hice a partir de una aplicación externa… No fui capaz de crear la alarma a partir de SAP estándar…

Gracias.