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