INSERT dbtab ACCEPTING DUPLICATE KEYS
2016-07-07

Quando tentas inserir um registo numa tabela que já tenha outro registo com a mesma chave primária o programa faz dump. O que em alguns casos é uma chatice porque, mesmo que te estejas nas tintas, te obriga a verificar antecipadamente se aqueles chaves já existem na tabela.
Mas o ABAP prevê esses casos e dá-te uma solução:
INSERT dbtab FROM TABLE itab [ACCEPTING DUPLICATE KEYS].
Não te preocupes que quando acrescentas o ACCEPTING DUPLICATE KEYS não violas a primeira lei da termodinâmica: os registos não são inseridos. A única diferença é que o programa não faz dump. O que pode dar jeito nos casos em que não estás preocupado com o que estás a inserir.
O Abapinho saúda-vos.
8 de julho de 2016 às 12:58
Geralmente, pra não receber o dump tenho o costume de usar MODIFY, assim se o registro não existe, o sistema inclui.
Ou, melhor ainda, tratar a exceção CX_SY_OPEN_SQL_DB…
Não conhecia o ACCEPTING DUPLICATE KEYS. Esse nome é meio estranho pois na verdade ele não aceita chaves duplicadas, como vc mesmo disse, é impossível.. ele só não vai gerar dump. Bacana.. mais uma opção!
Valeu!
8 de julho de 2016 às 13:19
Com o MODIFY corres o risco de alterar registos já existentes. Desta forma se já existirem não são alterados. Apenas os inexistentes são adicionados. Penso ser a única diferença. Será útil para casos muito específicos mas é bom saber que existe.
11 de julho de 2016 às 19:43
O problema de tratar a exceção CX_SY_OPEN_SQL_DB é que o comando insert é interrompido no ponto que a chave duplicada ocorrer (ou seja, a exceção ocorrer), ignorando os registros restantes. E, também, não é possível determinar o número de registros inseridos via SY-DBCNT.
Utilizando a extensão ACCEPTING DUPLICATE KEYS, todos os registros com chave não duplicada serão inseridos e o número de registros inseridos é atribuído à SY-DBCNT.
Eu utilizo essa extensão já faz um bom tempo, permitindo informar ao usuário se todos os registros foram inseridos (sy-subrc = 0) ou se somente um determinado número de registros (sy-dbcnt) foram incluídos (sy-subrc = 4).
Portanto, na minha opinião, essa extensão é mais versátil do que tratar a exceção.