[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

BUG w wersjach 6,7,8 ????



Witam
Pozwolę sobie przedstawić moim zdaniem dużą "niedoróbkę" która
pozostaje niezmieniona do wersji 8 włącznie.

Interesuje mnie konstrukcja 
 "FOR EACH rekord WHERE wyrazenie ..."
która m.in. ma zastosowanie w składni OPEN QUERY...

Chcę dać użytkownikowi mozliwość wyboru rekordów wg ustalonych przez
niego parametrów. Przyklad:

Zalozmy nastepujaca tabele:
  Tabela: Czlowiek
    Pola: Imie
          Nazwisko
          Nr_PESEL (index idx-pesel)

Chcę, aby użytkownik mógł sobie szukać wg dowolnego pola (pól) w tabeli.
Robię mu ot taki interfejs do wprowadzania filtru.

+-------- Warunki wyszukiwania ------+
|     imie: Jan________              |
| nazwisko: ___________              | (nasza_ramka)
| nr PESEL: 6907_______              |
+------------------------------------+

W powyższym przykładzie chcę znaleźć wszystkich Janków, Januszów itp
których pesel zaczyna się od "6907". Ale założenie jest takie, że
użytkownik może zadać dowolną kombinację warunków. Dla uproszczenia
przykładu, zakładam, iż łączy je spónik logiczny "and".

Tworzę więc kod...

--------------------------------------------------------------------

DEF VAR par1 LIKE czlowiek.imie      LABEL "imie".
DEF VAR par2 LIKE czlowiek.nazwisko  LABEL "nazwisko".
DEF VAR par3 LIKE czlowiek.nr_pesel  LABEL "nr PESEL".

UPDATE par1 par2 par3 WITH nasza_ramka.

FOR EACH czlowiek WHERE
  (IF par1 <> "" THEN czlowiek.imie     BEGINS par1 ELSE true) AND
  (IF par2 <> "" THEN czlowiek.nazwisko BEGINS par2 ELSE true) AND
  (IF par3 <> "" THEN czlowiek.nr_pesel BEGINS par3 ELSE true):

  /* i tu jakieś akcje np: */
  DISPLAY czlowiek.
END.

--------------------------------------------------------------------

Wydawałoby się, iż sprawa jest oczywista. Kod działa jak trzeba.
Użytkownik podaje dowolne parametry, procedura je łączy w odpowiednie
warunki i wybiera rekordy. Gdy wszystkie parametry będą puste, w pętli
zostaną wyświetlone wszystkie rekordy. Jest tylko małe "ALE".

DLACZEGO DO LICHA PROGRESS NIE KORZYSTA Z ŻADNEGO INDEKSU????!!!!

W naszym przykładzie z Jankami powinien zgrabnie wykorzystać index
idx-pesel. A tego ewidentnie nie robi. Jeśli natomiast trzeci warunek:

   "(IF par3 <> "" THEN czlowiek.nr_pesel BEGINS par3 ELSE true)"

   zastąpimy przez

   "czlowiek.nr_pesel BEGINS par3"

... to wszystko przebiega szybko i indeks jest wykorzystany.

Jest to moim zdaniem ewidentny BUG i potwierdza, iż wykorzystanie
indeksów w produkcie firmy PSC jest kiepściutkie.