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:
Sign | Option | Low
—|—|—
I | NE | X
E | EQ | X
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.