Abapinho

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.

Exit mobile version