REXX w arkuszu IBM Works

Autor: Przemysław Pawełczyk

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?).

Problem pierwszy

W czym problem? Otóż, ogólna postać każdej z funkcji arkusza zawiera argumenty przedzielone średnikiem (Zdj.1.), na przykład:
FIND(text;string;startchar)

Rys.1. Postać funkcji arkusza. - [17 kB]

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.

[Help]

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ą.

[Funkcja REXXowa]

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.

Problem drugi

Kolej na drugą pułapkę. REXX w OS/2 Warp 4.0 korzysta z zapisu angielskiego, gdzie znakiem oddzielającym część ułamkową jest kropka. Tymczasem arkusz może się posługiwać (i to robi!, chyba, że zadeklarujemy innaczej) polską składnią, w której przecinek służy do zaznaczania ułamków, a kropka do oddzielania tysięcy. Dlatego posługując się funkcją REXXa, tj. programami REXXowymi trzeba zmienić składnię arkusza na angielską.

Problem trzeci

Trzecia przeszkoda, na jaką się natknąłem się podczas tego jednego tylko przykładu (!) związana była z samym REXXem. Jeśli napiszemy dla arkusza program-funkcję, która czyta z arkusza parametry (liczby, łańcuchy), to nie możemy posłużyć się w tym celu posłużyć poleceniem PARSE ARG. W takim przypadku musimy skorzystać z funkcji ARG(n), gdzie n oznacza kolejny przekazywany parametr.

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 SysLoadFuncs
Nie 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.

Problem czwarty i ostatni (uff...)

Związany jest z edytorem systemowym używanym w arkuszu do pisania REXXowych programów-funkcji. Wybieramy z menu głównego opcji Edit, a potem Paste functions... Po zaznaczeniu w polu Category opcji REXX, uaktywni się klawisz Edit, a okno Functions stanie się puste. Naciskamy ten klawisz, po czym zjawi się nowe okno Edit Rexx Function z nową kolekcją przycisków Edit, Add i Delete. Wpisujemy nazwę pliku np. retybzdety.cmd i naciskamy Edit. W tym momencie edytor systemowy E.EXE otworzy nasz plik. Ale uwaga, podczas pisania pierwszego programu, edytor otwierał mi się w dowolnym katalogu. Tymczasem nasz plik MUSI zostać zapisany w katalogu (...)/bonuspak/ibmworks, innaczej arkusz go nie znajdzie.
 
<-Powrót 

Tech/2 strony z poradami technicznymi na temat systemu OS/2