Procedure para calcular o campo A1_NROCOM E A1_PAGATR na tabela SA1 de clientes do ERP TOTVS Microsiga Protheus
RECALCULAR O CAMPO A1_MSALDO, ANALISA OS MAIORES SALDOS EM ABERTO PARA UM CLIENTE POR DIA COMO EXECUTAR A PROCUDERE: DECLARE @OUT_RESULTADO varchar(max) EXEC PRC_CALE_REFAZ_SA1050_A1_MSALDO '0101', ' ', 'ZZZZZZ', ' ', 'ZZZZ' , @OUT_RESULTADO OUT PRINT @OUT_RESULTADO
CREATE PROCEDURE [dbo].[PRC_CALE_REFAZ_SA1010_A1_MSALDO]
(
@FILIAL CHAR(4) ,
@CLIENTE_DE CHAR(6) ,
@CLIENTE_ATE CHAR(6) ,
@LOJA_DE CHAR(4) ,
@LOJA_ATE CHAR(4) ,
@OUT_RESULTADO varchar(250) OUT
) AS
BEGIN TRY
PRINT 'Execução Iniciada'
DECLARE @EMISSAO VARCHAR(10)
DECLARE @TIT_EMISSAO VARCHAR(10)
DECLARE @VALORACU DECIMAL(20,2)
DECLARE @VALORDIA DECIMAL(20,2)
DECLARE @VALORABE DECIMAL(20,2)
DECLARE @CLIENTE CHAR(6)
DECLARE @LOJA CHAR(4)
DECLARE @TIT_CLIENTE CHAR(6)
DECLARE @TIT_LOJA CHAR(4)
DECLARE @TIT_FILIAL CHAR(4)
-- PARAMTROS PROCEDURE
/*DECLARE @FILIAL CHAR(4)
DECLARE @CLIENTE_DE CHAR(6)
DECLARE @CLIENTE_ATE CHAR(6)
DECLARE @LOJA_DE CHAR(4)
DECLARE @LOJA_ATE CHAR(4)
DECLARE @OUT_RESULTADO varchar(max)*/
/*SET @FILIAL = '0101'
SET @CLIENTE_DE = ' '
SET @CLIENTE_ATE = 'ZZZZZZ'
SET @LOJA_DE = ' '
SET @LOJA_ATE = 'ZZZZ'*/
-- FIM PARAMETRO PROCEDURE
SET @OUT_RESULTADO = ''
-- BUSCA CLIENTES A SEREM PROCESSADOS
DECLARE CLIENTES CURSOR
FOR
SELECT A1_COD, A1_LOJA
FROM [SA1010] SA1 (NOLOCK)
INNER JOIN [SE1010] SE1 (NOLOCK)
ON SE1.D_E_L_E_T_ = ''
AND E1_CLIENTE = A1_COD
AND E1_LOJA = A1_LOJA
WHERE SA1.D_E_L_E_T_ = ''
AND A1_COD BETWEEN @CLIENTE_DE AND @CLIENTE_ATE
AND A1_LOJA BETWEEN @LOJA_DE AND @LOJA_ATE
GROUP BY A1_COD, A1_LOJA
OPEN CLIENTES;
FETCH NEXT FROM CLIENTES INTO @CLIENTE, @LOJA;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @VALORACU = 0
SET @VALORDIA = 0
SET @VALORABE = 0
--PRINT @CLIENTE+ '/ ' + @LOJA
DECLARE C_EMISSAO CURSOR FOR
SELECT DISTINCT E1_FILIAL, E1_CLIENTE, E1_LOJA,E1_EMISSAO
FROM [SE1010]
WHERE D_E_L_E_T_ = ''
AND E1_FILIAL = @FILIAL
AND E1_CLIENTE = @CLIENTE
AND E1_LOJA = @LOJA
OPEN C_EMISSAO
FETCH NEXT FROM C_EMISSAO INTO @TIT_FILIAL, @TIT_CLIENTE, @TIT_LOJA, @TIT_EMISSAO
WHILE @@FETCH_STATUS = 0
BEGIN
-- PROCURA O VALOR EM ABERTO
SET @VALORABE = ISNULL((SELECT SUM(E1_VALOR)
FROM [SE1010] SE1
WHERE SE1.D_E_L_E_T_ = ''
AND SE1.E1_FILIAL = @TIT_FILIAL
AND SE1.E1_CLIENTE = @TIT_CLIENTE
AND SE1.E1_LOJA = @TIT_LOJA
AND SE1.E1_TIPO NOT IN ('AB-','FT','NCC','NCF','ST','RA')
AND SE1.E1_EMISSAO @TIT_EMISSAO
AND (SE1.E1_BAIXA = '' OR SE1.E1_BAIXA > @TIT_EMISSAO) ),0)
-- BUSCA O VALOR DO DIA
SET @VALORDIA = ISNULL(( SELECT SUM(E1_VALOR)
FROM [SE1010]
WHERE D_E_L_E_T_ =''
AND E1_FILIAL = @TIT_FILIAL
AND E1_TIPO NOT IN ('AB-','FT','NCC','NCF','ST','RA')
AND E1_CLIENTE = @TIT_CLIENTE
AND E1_LOJA = @TIT_LOJA
AND E1_EMISSAO = @TIT_EMISSAO),0)
IF (@VALORDIA + @VALORABE) > @VALORACU
BEGIN
/*
PRINT 'DIA : ' +CONVERT(VARCHAR(10),CONVERT(VARCHAR(10),CONVERT(DATETIME,@EMISSAO,103),103))
PRINT 'VALOR DIA : ' +CONVERT(VARCHAR(10),@VALORDIA)
PRINT 'VALOR ABERTO: ' +CONVERT(VARCHAR(10),@VALORABE)
PRINT ''
PRINT '' */
SET @VALORACU = @VALORDIA + @VALORABE
END
FETCH NEXT FROM C_EMISSAO INTO @TIT_FILIAL, @TIT_CLIENTE, @TIT_LOJA, @TIT_EMISSAO
END
CLOSE C_EMISSAO
DEALLOCATE C_EMISSAO
PRINT @CLIENTE + '/' + @LOJA + ' - MAIOR ACUMULO: ' +CONVERT(VARCHAR(10),@VALORACU)
if @VALORACU > 0 UPDATE [SA1010] SET A1_MSALDO = @VALORACU WHERE D_E_L_E_T_ = '' AND A1_COD = @CLIENTE AND A1_LOJA = @LOJA
-- calcula A1_PAGATR pois via rotina padrao nao estava fazendo
UPDATE SA1 SET A1_PAGATR = ISNULL((
SELECT SUM(E1_VALLIQ)
FROM [SE1010]
WHERE D_E_L_E_T_ = ''
AND DATEDIFF(DAY, CONVERT(DATE,E1_VENCREA, 3), CONVERT(DATE, E1_BAIXA, 3)) > 0
AND E1_CLIENTE = A1_COD
AND E1_LOJA = A1_LOJA
),0)
FROM [SA1010] SA1
INNER JOIN [SE1010] SE1
ON SE1.D_E_L_E_T_ = ''
AND E1_CLIENTE = A1_COD
AND E1_LOJA = A1_LOJA
WHERE SA1.D_E_L_E_T_ = ''
AND A1_COD = @CLIENTE
AND A1_LOJA = @LOJA
-- calcula A1_NROCOM pois via rotina padrao nao estava fazendo
UPDATE SA1 SET A1_NROCOM = ISNULL((
SELECT COUNT(1) FROM (
SELECT DISTINCT E1_FILIAL , E1_PREFIXO, E1_NUM
FROM [SE1010]
WHERE D_E_L_E_T_ = ''
AND E1_TIPO NOT IN ('AB-','FT','NCC','NCF','ST','RA')
AND E1_CLIENTE = A1_COD
AND E1_LOJA = A1_LOJA
) C
),0)
FROM [SA1010] SA1
WHERE SA1.D_E_L_E_T_ = ''
AND A1_COD = @CLIENTE
AND A1_LOJA = @LOJA
FETCH NEXT FROM CLIENTES INTO @CLIENTE, @LOJA
END;
CLOSE CLIENTES;
DEALLOCATE CLIENTES;
SET @OUT_RESULTADO = 'Finalizado com sucesso!'
END TRY
BEGIN CATCH
IF CURSOR_STATUS('global','CLIENTES') >= -1
BEGIN
IF CURSOR_STATUS('global','CLIENTES') > -1
BEGIN
CLOSE CLIENTES
END
DEALLOCATE CLIENTES
END
IF CURSOR_STATUS('global','C_EMISSAO') >= -1
BEGIN
IF CURSOR_STATUS('global','C_EMISSAO') > -1
BEGIN
CLOSE C_EMISSAO
END
DEALLOCATE C_EMISSAO
END
SELECT
@OUT_RESULTADO = ERROR_MESSAGE()
PRINT 'ERRO SQL - ' + @OUT_RESULTADO
END CATCH