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

Różnice w wersjach PROGRESS'a



Coś cicho na liście, więc wrzucę moją przygodę ku przestrodze innym.

Właśnie przestawiam aplikacje z wersji 8.1 na wersję 9.0 Progress'a i 
wyszedł mi taki kwiatek, nad którym straciłem trochę czasu by go 
znaleźć  Piszę to, by inni nie musieli szukać, jeśliby im to się zdarzyło. 
Otóż kwiatek jest taki:

   STRING(No,"Prawda/Nie")

   - w wersji 8.1 daje "Nie"     - długość 3 znaki
   - w wersji 9.0 daje "Nie   "  - długość 6 znaków  ("Nie" i trzy spacje 
na końcu)

Długość zwracanego łańcucha jest taka, jak długość dłuższego z łańcuchów 
reprezentujących poszczególne warości.  Sprawdziłem jak to jest w wersji 
7.3, bo taką mam - jest tak jak wersji 9.0.

W postaci "klinicznej" sprawa jest prosta, ale znaleźć to w aplikacji nie 
było prosto. Otóż wynikało to z   własnych "wynalazków", które w firmie PSC 
są bardzo lubiane, a które zawsze mnie doprowadzały do szewskiej pasji, 
czego wyraz dawałem już na tej liści i na konferencjach. Te wynalazki, to 
przypisywanie znanym powszechnie pojęciom innego znaczenia, a z kolei 
przypisywanie powszechnie znanym zjawiskom nowych nazw (dla 
zainteresowanych służę przykładami). Wracając do powyższego kwiatka, to w 
aplikacji były następujące zapisy (piszę tutaj w uproszczeniu, chodzi o ideę):

      STRING(No,"Prawda/Nie")  = 
"Nie"                                        - ma wartość True
      LOOKUP(STRING(No,"Prawda/Nie"),"Prawda,Nie")<>0    - ma wartość False

Gdzie tkwi różnica, której na pierwszy rzut oka nie widać. Otóż w 
Progress'ie operator porównania dla łańcuchów (=) działa tak, że:

    "Nie" = "Nie"           - daje True
    "Nie" = "Nie       "    - daje też  True, mimo dodatkowych znaków 
spacji na końcu
    "Nie       " = "Nie"    - daje też  True, mimo dodatkowych znaków 
spacji na końcu

Tutaj ciśnie się pytanie - to po co jest operator BEGINS ?  Po co zmieniać 
znaczenie operatora porównania, który w matematyce i wielu innych językach 
znaczy to co znaczy ?

W przypadku LOOKUP oczywiście działa to inaczej, bo tam nie ma już 
obcinania spacji z łańcucha zwracanego ze  STRING() , których w wersji 8.1 
nie było a w wersji 9.0 pojawiły się.  Stąd właśnie mój kwiatek, bo w 
wersji 8.1 oba wyrażenia dawały wartość True, zaś w wersji 9.1 drugie z 
nich daje wartość False.

Pozdrawiam i życzę przyjemniejszych zajęć, niż szukanie takich kwiatków.

                      Henryk Jusza                           henju@pg.gda.pl
                      ---------------------------------------------------------
                      Ośrodek Informatyczny Politechniki Gdańskiej
                      Pracownia Rozwoju Oprogramowania
                      tel (058) 347-28-01          fax (058) 347-24-63

------
Strona WWW:     http://pluton.pol.lublin.pl/pugpl/index.htm
Obsluga listy:  listserv@zeto.bydgoszcz.pl
Archiwum listy: http://www.zeto.bydgoszcz.pl/progress/index.html
------