Optimizar SP libro de mayor Detallado


#1

Buenas Tardes

Un nuevo caso a postear Agradezco sus comentarios,

Realice un SP, para generar el reporte de Libro de mayor Detallado con un formato especifico para mi compañia, pero esta demasiado lento pasan aproximada 2 horas para generarlo.
Existe algún proceso que pueda implementar para optimizar dicho reporte?

Agradezco sus comentarios

============================================================
USE [ULTRACI]
GO
/****** Object: StoredProcedure [dbo].[_SBOSP_RPT_Libro_Mayor_Detallado] Script Date: 4/08/2017 09:06:51 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER proc [dbo].[_SBOSP_RPT_Libro_Mayor_Detallado] 


@FechaInicial Datetime,
@FechaFinal Datetime,
@IncluirCuentasSaldoCero BIT,
@IncluirCuentasSinMovimiento BIT

AS

begin

Declare @Transacciones 
table(CuentaContableCodigo nvarchar(50),

NoAsientoContable int,

FechaContabilizacion datetime,

TransaccionTipo nvarchar(20),

TransaccionAbreviatura nvarchar(10),

TransaccionTipoDescripcion nvarchar(100),

Comentarios nvarchar(254),

Referencia1 nvarchar(100),

Referencia2 nvarchar(100),

Referencia3 nvarchar(100),

ReferenciaUnificada nvarchar(100),



Debito numeric(19,6),

Credito numeric(19,6))


Declare @CuentasYMovimientos 
table(CuentaContableN1 nvarchar(100),
CuentaContableN1Nombre nvarchar(100),
CuentaContableN2 nvarchar(100),
CuentaContableN2Nombre nvarchar(100),
CuentaContableN3 nvarchar(100),
CuentaContableN3Nombre nvarchar(100),
CuentaContableN4 nvarchar(100),
CuentaContableN4Nombre nvarchar(100),

CuentaContable nvarchar(100),


CuentaContableFormateada nvarchar(100),

CuentaContableNombre nvarchar(254),


SaldoActual numeric(19,6),

SaldoInicial numeric(19,6),

SaldoFinal numeric(19,6),

CuentaContableCodigo nvarchar(50),

NoAsientoContable int,

FechaContabilizacion datetime,

TransaccionTipo nvarchar(20),

TransaccionTipoAbreviatura nvarchar(10),

TransaccionTipoDescripcion nvarchar(100),

Comentarios nvarchar(254),

Referencia1 nvarchar(100),

Referencia2 nvarchar(100),

Referencia3 nvarchar(100),

ReferenciaUnificada nvarchar(100),


Debito numeric(19,6),

Credito numeric(19,6))




Insert into @Transacciones
SELECT T2.AcctCode,

T0.TransId,
T0.[RefDate],


T0.[TransType], 

T3.Abreviatura,

T3.Descripcion,

T0.Memo,

T0.Ref1, T0.Ref2, T0.Ref3,

(Case When ISNULL(T0.Ref1,'')<>'' 

Then T0.Ref1

Else (Case When ISNULL(T0.Ref2,'')<>'' 

Then T0.Ref2

Else ISNULL(T0.Ref3,'')

End)

End),


T1.[Debit], 

T1.Credit
FROM OJDT T0 

Inner Join JDT1 T1 ON T0.TransId = T1.TransId --Detalle de Asientos

Inner Join OACT T2 ON T1.Account = T2.AcctCode --Catalogo de Cuentas


Inner Join [dbo].[_SBOF_Tipos_Documento]() T3 On T3.ObjType= T0.TransType
WHERE T0.[RefDate] Between @FechaInicial AND @FechaFinal

Insert into @CuentasYMovimientos
Select T4.AcctCode as 'Cuenta N1',

T4.AcctName as 'Nombre Cuenta N1',


T3.AcctCode as 'Cuenta N2',

T3.AcctName as 'Nombre Cuenta N2',


T2.AcctCode as 'Cuenta N3',

T2.AcctName as 'Nombre Cuenta N3',


T1.AcctCode as 'Cuenta N4',

T1.AcctName as 'Nombre Cuenta N4',


T0.[FormatCode], 

ISNULL([dbo].[_SBOF_UTILS_CodigoCuentaFormateado] (T0.Segment_0, T0.Segment_1, T0.Segment_2, T0.Segment_3, T0.Segment_4, 
T0.Segment_5, T0.Segment_6, T0.Segment_7, T0.Segment_8, T0.Segment_9),T0.FormatCode),

T0.[AcctName],


T0.CurrTotal,0.00,0.00,

T5.*
From OACT T0


Inner Join OACT T1 On T0.FatherNum=T1.AcctCode --Cuenta Padre Nivel 4

Inner Join OACT T2 On T1.FatherNum=T2.AcctCode --Cuenta Padre Nivel 3

Inner Join OACT T3 On T2.FatherNum=T3.AcctCode --Cuenta Padre Nivel 2

Inner Join OACT T4 On T3.FatherNum=T4.AcctCode --Cuenta Padre Nivel 1

Left Join @Transacciones T5 On T0.AcctCode=T5.CuentaContableCodigo --Movimientos
Where T0.Levels=5


Update @CuentasYMovimientos
Set SaldoInicial=(SaldoActual-ISNULL(( Select SUM(S0T1.Debit-S0T1.Credit)

From OJDT S0T0

Inner Join JDT1 S0T1 On S0T0.TransId=S0T1.TransId

Where S0T1.Account=[@CuentasYMovimientos].CuentaContableCodigo

And S0T0.RefDate>=@FechaInicial

Group By S0T1.Account),0)),

SaldoFinal=(SaldoActual-ISNULL((Select SUM(S0T1.Debit-S0T1.Credit)

From OJDT S0T0

Inner Join JDT1 S0T1 On S0T0.TransId=S0T1.TransId

Where S0T1.Account=[@CuentasYMovimientos].CuentaContableCodigo

And S0T0.RefDate>@FechaFinal

Group By S0T1.Account),0))




Select T0.*
From @CuentasYMovimientos T0
Where (T0.SaldoFinal<>0.00 OR @IncluirCuentasSaldoCero=1)
And ((T0.Debito<>0.00 OR T0.Credito<>0.00) OR @IncluirCuentasSinMovimiento=1)
Order By CuentaContableFormateada, FechaContabilizacion, NoAsientoContable


end
=============================================================

=============================================================

Resultado despues de 2 horas


#2

Estimado @fyelmo

Por lo que veo en tu SP, estás agrupando y haciendo cálculos sobre tu mismo código , por qué no lo haces en el mismo Crystal? Ahi podrías reducir el tiempo de consulta. Por otro lado, no se qué rango de fechas le has colocado a tu Libro Mayor, si estás usando SAP HANA, definitivamente este reporte podrías sacarlo en un minuto si lo haces en función a una Vista.

Saludos!


#3

considerare tus recomendaciones ysanchez , el rango de fechas es por mes,

Saludos


#4

Estimado, cuando realizas este tipo de procesos y calculas sobre el calculo y otra vez lo mismo etc… siempre es recomendable hacer un pre informe , vale decir que no es necesario que ese calculo este en linea, puedes hacer un proceso que corra en la noche o cada 5 horas pero que te actualice una tabla con toda la información lista, esto te ayudara a que el reporte se genere en segundos y sabrás que no cargaran la base de datos abriendo este reporte 1 2 o 3 veces simultaneas, como primera etapa te recomiendo que pruebes el informe en otra base fuera de SAP, una vez que tengas todos los campos bien definido y sabes que tiene toda la data que necesitas puedes migrar la tabla a una tabla de usuario, para que el modelo de datos sea independiente.
Algo rápido que puedes hacer por ahora para jugar con la data desde otra base de datos es cambiando esto en el ultimo select que tienes.

IF OBJECT_ID('[BASE_EXTERNA].[dbo].[NOMBRE_TABLA', 'U') IS NOT NULL
	DROP TABLE [BASE_EXTERNA].[dbo].[NOMBRE_TABLA];

Select T0.*
INTO [BASE_EXTERNA].[dbo].[NOMBRE_TABLA]
From @CuentasYMovimientos T0
Where (T0.SaldoFinal<>0.00 OR @IncluirCuentasSaldoCero=1)
And ((T0.Debito<>0.00 OR T0.Credito<>0.00) OR @IncluirCuentasSinMovimiento=1)
Order By CuentaContableFormateada, FechaContabilizacion, NoAsientoContable

Con el tiempo puedes hacer una query mas inteligente, pero de momento te recomiendo esto.

PD: Para probar tu crystal y si lo vas hacer desde una tabla de usuario SAP recuerda que debes anteponer el prefijo U_ a los campos para que no estes re haciendo el informe y tener como primeros campos Code y Name.

PD2: deberías probar hacer un informe dentro de otro para que uno vaya abriendo los niveles a gusto.


#5

Estimado Panxulo,
me parece formidable el proceso que corra en horas fuera de actividad, excelente nota.

procedo a realizar las pruebas y te informo el status,

Saludos


#6