Pular para o conteúdo principal

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
			
  

Postagens mais visitadas deste blog

REST Protheus Converter charset CP1252 para UTF8 com Header Accept UTF-8

O Protheus possui um tag que pode ser utilizada para conversão para UTF8 de forma transparente, basta enviar no header da requisição a TAG ACCEPT com charset=UTF-8, também pode-se adicionar o appllication/json. Accept : application/json; charset=UTF-8 ou Accept : charset=UTF-8 Isso ajuda pois não precisa mais utilizar as funções DecodeUTF8 e EncodeUT8 pois o próprio rest já vai fazer isso.

Recursividade Minha Linda! Estrutura Produtos Protheus SG1

Fato! Depois que você conhece recursividade em sua vida tudo fica mais leve (rss... ) a recursividade pode ser infinita (pode não ta!) se for infinita vai dar problema, não pode. Mas a recursividade nos ajuda a deixar nosso sistema mais flexível e dinâmico para montar uma série de regras de negócio. Hoje vou falar exatamente da SG1, tabela TOTVS Microsiga Protheus que é utilizada para montar a estrutura de um produto dentro PCP (Planejamento e Controle de Produção). Isso séria algo que a recursividade iria ajudar. Na SG1 temos o campos G1_COD (Pai) e G1_COMP (Filho). G1_COD->G1_COMP->G1_COD->G1_COMP->G1_COD->G1_COMP Seria assim o fluxo da informação. Sem mais delongas, abaixo vou deixar o script para MSSQL para apresentar esses dados. Inté! WITH ESTRUT( CODIGO, COD_PAI, COD_COMP, QTD, PERDA, DT_INI, DT_FIM ,TRT ,RECNO, NIVEL ) AS ( SELECT G1_COD PAI, G1_COD, G1_COMP, G1_QUANT, G1_PERDA, G1_INI, G1_FIM,G1_TRT,SG1.R_E_C_N_O_, 1 AS NIVEL FR

Cadastro de funções ADVPL

FWDirRemove( cDir, nType, lComplete, lKillFiles ) Função para remover diretórios, com a vantagem de remover somente o ultimo nível ou todo o caminho. cDir                   Diretório a ser removido lComplete          Remove todo o caminho (.T.) ou apenas o ultimo nível (.F.) lKillFiles             Remove os arquivos antes de tentar remover o diretório FWMakeDir( cDir, lShowMsg ) Função para criar diretório com seus subdiretórios, com a vantagem de criar todo o caminho. cDir                    Diretório a ser criado lShowMsg          Exibe ou não mensagem caso não consiga criar o diretório FwNoAccent( cString ) Retira acentos de uma string cString                 String a ser retirado os acentos Exemplo: cString := 'O avião não pôde aterrissar de manhã' cString := FwNoAccent( cString ) // Retorna : 'O aviao nao pode aterrissar de manha' FWGetSX5( cTable, cKey ) Função de retorno dos campos de uma tabela no SX5 cTable                  Tabela para pesquisa no SX5. Par