"
Apoiado por

As duplas negativas dos RANGEs

Os RANGEs têm propriedades interessantes.

Por exemplo, estas duas linhas parecem a mesma coisa mas não são:

SignOptionLow
INEX
EEQX

Marado, né?

Ontem cruzei-me com outro tipo de dupla negação bizarra no qual nunca tinha pensado. Quando usamos um RANGE como critério no WHERE de um SELECT e este está vazio, o critério devolve sempre TRUE. É contra-intuitivo porque o correcto seria dar FALSE (em rigor o valor a comparar não está no RANGE) mas dá imenso jeito que assim seja. O RANGE vazio funciona como um wildcard. Ok.

Mas, e se se usar o NOT assim:


DATA r TYPE RANGE of kunnr.

SELECT * FROM kna1 INTO TABLE @data(t)
WHERE kunnr NOT IN r.

Portanto, o RANGE está vazio e por isso logicamente que qualquer KUNNR não se encontra lá e como tal o NOT IN r deveria dar TRUE. Mas, como o RANGE vazio funciona como wildcard e devolve TRUE quando deveria devolver FALSE,… a negação devolve FALSE quando deveria devolver TRUE. E ainda bem. Acho eu…

O Abapinho saúda-vos.

2 comentários a “As duplas negativas dos RANGEs”

  1. Tas Diz:

    Nuno, RANGE são muito úteis, mas é preciso muita cautela ao se utilizar com grande volume de dados. Já tive algumas experiências negativas, onde ocorreu dump por conta da tabela de range estar com muitos registros.

  2. Nuno Godinho Diz:

    Olá Thiago,

    Sim, sem dúvida. Penso que já abordei isso num artigo há alguns atrás. Imagino que dependa da base de dados e das configurações do seu parser de SQL. Raramente uso ranges com centenas de entradas. Mas quando o decido fazer (porque causa da limitação de só se poder ter um FOR ALL ENTRIES por query) a minha regra de polegar é não deixar passar dos 1000-1500 registos, ainda que saiba que em alguns casos dá para mais. Obrigado pelo aviso!

    Abraço,
    Nuno

Deixe um comentário


Acerca do Abapinho
O Abapinho é suportado pelo WordPress
Artigos (RSS) e Comentários (RSS).