[BlackTDN] :: Identificando as marcações ímpares na tabela SP8
1) A consulta das marcações impares;
2) A "deleção lógica" dos registros impares;
Segue:
1) Para consultar as marcações impares:
------------------------------------------------------------------------------------------------
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
ORDER BY 1,2,3,4
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
ORDER BY 1,2,3,4
------------------------------------------------------------------------------------------------
2) Para a "Deleção Lógica" das marcações impares:
UPDATE SP8_U
SET SP8_U.D_E_L_E_T_='*'
FROM
SP8010 SP8_U
INNER JOIN
(
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
) SP8_R
ON SP8_U.P8_FILIAL=SP8_R.P8_FILIAL
AND SP8_U.P8_MAT=SP8_R.P8_MAT
AND SP8_U.P8_PAPONTA=SP8_R.P8_PAPONTA
AND SP8_U.P8_ORDEM=SP8_R.P8_ORDEM
WHERE SP8_U.D_E_L_E_T_=' '
SET SP8_U.D_E_L_E_T_='*'
FROM
SP8010 SP8_U
INNER JOIN
(
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
) SP8_R
ON SP8_U.P8_FILIAL=SP8_R.P8_FILIAL
AND SP8_U.P8_MAT=SP8_R.P8_MAT
AND SP8_U.P8_PAPONTA=SP8_R.P8_PAPONTA
AND SP8_U.P8_ORDEM=SP8_R.P8_ORDEM
WHERE SP8_U.D_E_L_E_T_=' '
OU
------------------------------------------------------------------------------------------------
MERGE INTO
SP8010 SP8_U
USING
(
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
) SP8_R
ON SP8_U.P8_FILIAL=SP8_R.P8_FILIAL
AND SP8_U.P8_MAT=SP8_R.P8_MAT
AND SP8_U.P8_PAPONTA=SP8_R.P8_PAPONTA
AND SP8_U.P8_ORDEM=SP8_R.P8_ORDEM
WHEN MATCHED THEN
UPDATE SET
SP8_U.D_E_L_E_T_='*';
MERGE INTO
SP8010 SP8_U
USING
(
SELECT SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
FROM SP8010 SP8
WHERE SP8.D_E_L_E_T_=' '
GROUP BY SP8.P8_FILIAL
,SP8.P8_MAT
,SP8.P8_PAPONTA
,SP8.P8_ORDEM
HAVING ((COUNT(*)%2)=1)
) SP8_R
ON SP8_U.P8_FILIAL=SP8_R.P8_FILIAL
AND SP8_U.P8_MAT=SP8_R.P8_MAT
AND SP8_U.P8_PAPONTA=SP8_R.P8_PAPONTA
AND SP8_U.P8_ORDEM=SP8_R.P8_ORDEM
WHEN MATCHED THEN
UPDATE SET
SP8_U.D_E_L_E_T_='*';
------------------------------------------------------------------------------------------------
Obs.:
1) Antes de efetuar qualquer operação que modifique os dados diretamente no SGBD efetue uma cópia da tabela;
2) Nem sempre os registros devem ser deletados. A melhor opção é identificar os funcionários com marcações impares e incluir a marcação faltante.
Comentários
Postar um comentário