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.
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)
@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.
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')
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)
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;