Zawarty w OS/2 Warp 4.0 pakiet IBM Works został znacznie poprawiony. Można z jego aplikacji wysyłać pocztę Lotus cc:Mail, bazy danych - adresowe i telefoniczne - mogą wreszcie importować i eksportować w zewnętrznych formatach, powiększono elementy graficzne w edytorze, itp. Tym razem kilka słów o arkuszu kalkulacyjnym IBM Works. Dokonano w nim dwóch znacząłcych poprawek - umożliwiono sortowanie oraz, co najciekawsze, "podłączono" do REXXa. Dzięki temu użytkownik arkusza może tworzyć nowe funkcje, ograniczone jedynie własną wyobraźnią.
Ale jak to u IBMa, dokumentacja jest bardziej niż skromna, na dodatek nie pełna, i co gorsza funkcja została niedopracowana (czyżby casus Microsoftu był zaraźliwy?).
FIND(text;string;startchar)
Natomiast w dokumentacji funkcji zawartej w Pomocy (Help), jako ograniczniki argumentów podane są przecinki (!!!). Jest to pierwsza niekonsekwencja IBMa, gdy tymczasem poprawne są jedynie średniki, tak jak to widnieje na zdjęciu.
Rys.2. Sufler funkcji REXXowych arkusza
Innaczej wygląda sprawa podczas korzystania z funkcji REXXa. Jej definicja ma niepoprawną postać zarówno w dokumentacji, jak i w oknie wyboru:
REXX("function filename",isStr,nArgs,Args)
Tymczasem powinna wyglądać jak poniżej:
REXX("function filename";isStr;nArgs;Args)
"function filename" - to nazwa pliku REXXa w postaci "nazwa.cmd",
isStr - jeśli 0 to funkcja zwraca liczbę, jeśli 1 to łańcuch
nArgs - liczba argumentów przekazywana funkcji
Args - lista argumentów przedzielona średnikami (też IBM o tym nie pisze),
na przykład: D3;H5;K8.
Widoczna na zdjęciu 3 postać wymaga więc nie tylko wpisania właściwych
argumentów, ale także ręcznego poprawienia znaków, które je rozgraniczają.
Rys.3. Funkcja REXXowa w arkuszu, wymaga ręcznego poprawienia.
Przykładowa postać wywołania funkcji REXXowej, która posłużyła mi do opracowania porównawczego zestawienia cen napędów optycznych miała ostatecznie postać (poprawną):
=rexx("Ilekaset.cmd";0;2;L$4;$E110)
$ - oznacza wartości bezwzględne, tj. niezmienne podczas powielania funkcji.
Pełna postać mojego programu REXXowego wyglądała następująco:
/**/ hdd = arg(1) media = arg(2) if (hdd//media > 0) then wynik=hdd%media+1 else wynik=hdd%media return wynik Gdzie "%" oznacza dzielenie modulo, a "//" resztę z dzielenia.Tak jak napisałem, skorzystanie z polecenia PARSE ARG w postaci
/**/ parse arg hdd media (...)nic nie da.
Uwaga: po nagłówku komentarza /* */ powinny wystąpić w programie deklaracje rejestrujące funkcje REXXa:
Call RxFuncAdd 'SysLoadFuncs','Rexxutil','SysLoadFuncs' Call SysLoadFuncsNie ma ich tu tylko dlatego, że robi to globalnie osobny programik uruchamiany podczas każdego startu systemu. Po prostu umieściłem go w teczce STARTUP.
| <-Powrót |