quinta-feira, 21 de julho de 2016

Script T-SQL - While - Espelho Ponto Eletrônico

Abaixo um exemplo de script em T-SQL que monta o espelho de ponto.

--DECLARA VARIAVEIS PARA CONTROLE DO WHILE E ARMAZENAMENTO DOS ÚLTIMOS REGISTROS
DECLARE @P8_FILIAL VARCHAR(02) , @P8_MAT VARCHAR(06) , @P8_ORDEM VARCHAR(02) , @P8_HORA VARCHAR(05)
  ,@P8_FILIAL2 VARCHAR(02) , @P8_MAT2 VARCHAR(06) , @P8_ORDEM2 VARCHAR(02) , @PCONT INT , @STRINGSQL VARCHAR(MAX) 
  ,@FIL VARCHAR(02), @MAT VARCHAR(06);

SET @FIL = '02';   
SET @MAT = '030830';

--TABELA CRIADA PARA CONTROLE DO WHILE
DECLARE @TUSER2 AS TABLE (FIL VARCHAR(02), MAT VARCHAR(06), ORD VARCHAR(02), HORA VARCHAR(05))

IF OBJECT_ID('tempdb.dbo.#TESTE_FINAL', 'U') IS NOT NULL
BEGIN
DROP TABLE dbo.#TESTE_FINAL;
END

--CRIA TABELA PARA POPULAR O RESULTADO QUE PRECISAMOS
CREATE TABLE #TESTE_FINAL(
FIL VARCHAR(02) NULL
,MAT VARCHAR(06) NULL
,ORD VARCHAR(02) 
,MARC1 VARCHAR(05)
,MARC2 VARCHAR(05)
,MARC3 VARCHAR(05) 
,MARC4 VARCHAR(05) 
,MARC5 VARCHAR(05)
,MARC6 VARCHAR(05)
,MARC7 VARCHAR(05) 
,MARC8 VARCHAR(05)
,MARC9 VARCHAR(05)
,MARC10 VARCHAR(05) ) ;

--POPULA TABELA PARA SER PERCORRIDA NO WHILE
INSERT INTO 
@TUSER2  
SELECT 
P8_FILIAL
, P8_MAT
, P8_ORDEM
, P8_HORA
FROM
SP8010
WHERE 
P8_DATAAPO <> ''
AND P8_ORDEM <> ''
AND P8_TPMCREP <> 'D' 
AND P8_MOTIVRG <> 'REJEICAO AUTOMATICA' 
AND D_E_L_E_T_ <> '*' 
AND P8_MAT = @MAT
AND P8_FILIAL = @FIL
ORDER BY
P8_FILIAL , P8_MAT , P8_ORDEM , P8_DATA , P8_HORA

--ZERA VARIAVEIS PARA CONTROLAR LACO

SET @P8_FILIAL2 = ''
SET @P8_MAT2 = ''
SET @P8_ORDEM2 = ''
SET @PCONT = 0

WHILE (SELECT COUNT (*) FROM @TUSER2) > 0
BEGIN
--ARMAZENA O REGISTRO DO CURSOR
SELECT TOP 1 @P8_FILIAL = T.FIL
, @P8_MAT = T.MAT
, @P8_ORDEM = T.ORD
, @P8_HORA = T.HORA
FROM @TUSER2 T;
IF @P8_ORDEM <> @P8_ORDEM2
BEGIN
INSERT INTO #TESTE_FINAL (FIL, MAT, ORD, MARC1) VALUES ( @P8_FILIAL, @P8_MAT, @P8_ORDEM, @P8_HORA );
SET @PCONT = 1 ;
SET @P8_FILIAL2 = @P8_FILIAL;
SET @P8_MAT2 = @P8_MAT ;
SET @P8_ORDEM2 = @P8_ORDEM ;
END

ELSE IF @P8_ORDEM = @P8_ORDEM2
BEGIN
SET @PCONT += 1 ;
SET @STRINGSQL = 'UPDATE #TESTE_FINAL SET MARC' + CONVERT(VARCHAR(10), @PCONT) + ' = ''' + @P8_HORA + ''' WHERE FIL = ''' + @P8_FILIAL
+ ''' AND MAT = ''' + @P8_MAT + ''' AND ORD = '''  + @P8_ORDEM + ''' ';
--PRINT @STRINGSQL
EXEC (@STRINGSQL);
END 

--DELETA O REGISTRO DO CURSOR
DELETE FROM @TUSER2 WHERE MAT = @P8_MAT AND FIL = @P8_FILIAL AND ORD = @P8_ORDEM AND HORA = @P8_HORA;
END
SELECT * FROM #TESTE_FINAL;
DROP TABLE #TESTE_FINAL;

Nenhum comentário:

Postar um comentário