Bem Vindo! | Welcome!
By Felipe Lamounier, Minas Gerais, Brasil🇧🇷 – powered by 🙂My Easy B.I.
📑 Table of Contents:
Contexto
- Hana Enterprise XSA com SDI para replicação em tempo real de tabelas do SAP ECC para um banco Hana sidecar, sem camada de aplicação (ABAP)
- Em um determinado dia, o espaço (storage) para log de alteração no Hana Enterprise estourou, e as replicações do ECC não foram gravadas, embora para o ECC fossem consideradas entregues. Isso causou perda de dados.
- A perda de dados inclui registros criados, modificados e deletados, ou seja, uma janela de dados desatualizados
- São mais de 300 tabelas replicadas e não é viável reiniciar novamente todas as tabelas pois o ambiente não consegue fazer cargas Full com tabelas de mais de 5 milhões de registros, o que são a maioria.
Definição do Problema e Objetivo
- Problema: Perda de dados replicados entre ECC e Hana Enterprise XSA
- Objetivo: Recuperação dos dados no Hana Enterprise XSA sem necessidade de reiniciar a replicação da tabela, via Script de Insert e Atualização, preenchendo as tabelas com os dados originais da fonte (ECC).
- Script executado no Hana Enterprise, conectando via Virtual Table no ECC (dblink)
- Perda de Dados envolve Dados Criados e/ou Atualizados e outro ponto importante que são os dados Deletados ( Deleção lógica onde _CHANGE_TYPE = D).
- Quando um registro é deletado na Fonte (ECC) e não é replicado no destino (Hana Enterprise XSA), cria-se um “Registro Fantasma” no destino, pois o registro não existe mais na fonte e o destino não sabe da eliminação.

Estratégia de Recuperação Dados Perdidos
A estratégia de fazer o Script visa ser uma estratégia que será transparente para os sistemas que consome dados do Hana Enterprise XSA, como o Data Lake.
Desta forma não preciso mobilizar Engenheiros de Dados para recarregar centenas de tabelas novamente, tendo que “costurar” arquivos CSV nos diretórios do ADF (Azure Data Factory)
A ordem da estratégia para recuperação dos registros perdidos devem seguir a ordem:
- Registros Deletados
- Registros Existentes Não Atualizados que já existiam no Hana Enterprise, porém não foram atualizados
- Registros criados e/ou atualizados que não foram criados no Hana Enterprise
Registros Deletados (“Registros Fantasmas”)

- Criar Virtual Table (dblink) no ECC para cada tabela em Questão
- Executar o script abaixo dentro do Hana Enterprise
- _CHANGE_TYPE = D
- _CHANGE_TIME = data/hora atual
UPDATE "BASE_CORP_REP"."T_VTTK"
SET
_change_type = 'D',
_CHANGE_TIME = '2025-06-09 18:00:00.000000000'
WHERE TKNUM IN (
SELECT t.TKNUM
FROM (
SELECT TKNUM
FROM "BASE_CORP_REP"."T_VTTK"
WHERE _change_type <> 'D'
) AS t
LEFT JOIN "BASE_CORP_REP"."VT_VTTK_P00" AS p
ON t.TKNUM = p.TKNUM
WHERE p.TKNUM IS NULL
);
Legenda:
T_VTTK é dentro do Hana Enterprise
VT_VTTK_P00 é a tabela virtual (dblink) que está no ECC
Registros Existentes Não Atualizados (Update)

Selecionar na tabela fonte (ECC) todos os registros atualizados no dia específico (campo AEDAT) e fazer Update na tabela correspondente no Hana Enterprise, somente para os campos atualizados
Código para Conferência se existe registros nesta condição:
select p.VBELN, t.VBELN, p.POSNR, t.POSNR, p.AEDAT, t.AEDAT, t._change_type, t._change_time FROM BASE_CORP_REP.VT_VBAP_P00 AS P
inner join "BASE_CORP_REP"."T_VBAP" as T on
P.MANDT = T.MANDT
AND P.VBELN = T.VBELN
AND P.POSNR = T.POSNR
AND P.AEDAT <> T.AEDAT
AND P.AEDAT BETWEEN '20250603' AND '20250606';
Código (script) para Update:
UPDATE BASE_CORP_REP.T_VBAP T
SET
T.MATNR = P.MATNR,
T.MATWA = P.MATWA,
T.PMATN = P.PMATN,
T.CHARG = P.CHARG,
T.MATKL = P.MATKL,
T.ARKTX = P.ARKTX,
T.ZZ_NRO_LANCES = P.ZZ_NRO_LANCES,
T.ZZ_METRAGEM = P.ZZ_METRAGEM,
T.ZZ_CODACOND = P.ZZ_CODACOND,
T.ZZ_TRANSP_CE = P.ZZ_TRANSP_CE,
T.ZZ_DATA_ETA = P.ZZ_DATA_ETA,
T.ZZ_NRO_LANCE_AC = P.ZZ_NRO_LANCE_AC,
T.ZZ_METRAGEM_TOT = P.ZZ_METRAGEM_TOT,
T.ZZ_PERC_TOL_INF = P.ZZ_PERC_TOL_INF,
T.ZZ_PERC_TOL_SUP = P.ZZ_PERC_TOL_SUP,
T._CHANGE_TYPE = 'A',
T._CHANGE_TIME = '2025-06-16 21:00:00.000000000'
FROM BASE_CORP_REP.T_VBAP AS T
INNER JOIN BASE_CORP_REP.VT_VBAP_P00 AS P
on
T.MANDT = P.MANDT AND
T.VBELN = P.VBELN AND
T.POSNR = P.POSNR AND
P.AEDAT <> T.AEDAT AND
P.AEDAT BETWEEN '20250603' AND '20250606';
Registros Não criados (Insert)
Há também os casos onde o registro foi criado na data da perda dos dados e depois não houve modificação e portanto esse registros não foram criados no Hana Enterprise XSA e precisamos fazer o Insert

Código Script pra Insert
-- condição insert
SELECT
P.MANDT,
P.VBELN,
P.POSNR
FROM
BASE_CORP_REP.VT_VBAP_P00 P
WHERE
P.ERDAT BETWEEN '20250603' AND '20250606'
AND NOT EXISTS (
SELECT 1
FROM BASE_CORP_REP.T_VBAP T
WHERE
T.MANDT = P.MANDT
AND T.VBELN = P.VBELN
AND T.POSNR = P.POSNR
);
-- insert
INSERT INTO BASE_CORP_REP.T_VBAP (
MANDT, VBELN, POSNR,
MATNR, MATWA, PMATN, CHARG, MATKL, ARKTX, PSTYV, POSAR, LFREL, FKREL, UEPOS, GRPOS, ABGRU, PRODH, ZWERT, ZMENG, ZIEME,
UMZIZ, UMZIN, MEINS, SMENG, ABLFZ, ABDAT, ABSFZ, POSEX, KDMAT, KBVER, KEVER, VKGRU, VKAUS, GRKOR, FMENG, UEBTK, UEBTO,
UNTTO, FAKSP, ATPKZ, RKFKF, SPART, GSBER, NETWR, WAERK, ANTLF, KZTLF, CHSPL, KWMENG, LSMENG, KBMENG, KLMENG, VRKME,
UMVKZ, UMVKN, BRGEW, NTGEW, GEWEI, VOLUM, VOLEH, VBELV, POSNV, VGBEL, VGPOS, VOREF, ZZ_PERC_TOL_SUP,
_CHANGE_TYPE, _CHANGE_TIME
)
SELECT
P.MANDT, P.VBELN, P.POSNR,
P.MATNR, P.MATWA, P.PMATN, P.CHARG, P.MATKL, P.ARKTX, P.PSTYV, P.POSAR, P.LFREL, P.FKREL, P.UEPOS, P.GRPOS, P.ABGRU, P.PRODH, P.ZWERT, P.ZMENG, P.ZIEME,
P.UMZIZ, P.UMZIN, P.MEINS, P.SMENG, P.ABLFZ, P.ABDAT, P.ABSFZ, P.POSEX, P.KDMAT, P.KBVER, P.KEVER, P.VKGRU, P.VKAUS, P.GRKOR, P.FMENG, P.UEBTK, P.UEBTO,
P.UNTTO, P.FAKSP, P.ATPKZ, P.RKFKF, P.SPART, P.GSBER, P.NETWR, P.WAERK, P.ANTLF, P.KZTLF, P.CHSPL, P.KWMENG, P.LSMENG, P.KBMENG, P.KLMENG, P.VRKME,
P.UMVKZ, P.UMVKN, P.BRGEW, P.NTGEW, P.GEWEI, P.VOLUM, P.VOLEH, P.VBELV, P.POSNV, P.VGBEL, P.VGPOS, P.VOREF, P.ZZ_PERC_TOL_SUP,
'A' AS _CHANGE_TYPE,
TO_TIMESTAMP('2025-06-16 21:00:00.000000000') AS _CHANGE_TIME
FROM BASE_CORP_REP.VT_VBAP_P00 P
WHERE
P.ERDAT BETWEEN '20250603' AND '20250606'
AND NOT EXISTS (
SELECT 1
FROM BASE_CORP_REP.T_VBAP T
WHERE
T.MANDT = P.MANDT
AND T.VBELN = P.VBELN
AND T.POSNR = P.POSNR
);
-- conferir
select * from BASE_CORP_REP.T_VBAP T
where
t.MANDT = '310' and
t.VBELN = '0201522344' and
t.POSNR = '000010'
select mandt, vbeln, posnr from BASE_CORP_REP.VT_VBAP_p00 P
where p.MANDT = '310' and p.VBELN = '0201522344' and p.POSNR = '000010'
Notes
Código para fazer seleção dinâmica buscando todos os campo da Tabela, com exceção da Chave
SELECT
'P."' || FIELDNAME || '" = T."' || FIELDNAME || '"' AS update_line
FROM sapabap1.DD03L
WHERE
tabname = 'VBAP'
AND KEYFLAG <> 'X'
ORDER BY POSITION
Keywords: Perda de dados no Hana Enterprise; SDI hana enterprise xsa recuperação de dados; Recuperação de Dados no Hana Enterprise: Estratégias e Soluções; Problemas de Replicação no Hana: Como Evitar a Perda de Dados; Estratégias Eficazes para Manter Integridade de Dados no Hana;