НОВОЕ: OS/2 GURU - Вопросы и ответы

Reviews / articles about OS/2

Operating systems:
ArcaOS, eComStation, IBM OS/2 Warp
Мифы о eComStation 

Unsorted

 

 

ArcaOS 5.0 Русская версия
Пакет русификации ArcaOS 5.0 OS/2 давно доступен. Поддерживается любая версия: 5.0, 5.0.1, 5.0.2.

eCo Software может выпустить и другие пакеты (Немецкий, Голландский, Бразильский Португальский, Испанский, Шведский и т.д.)

Использование REXX в IBM Works


TITLE: Использование REXX в IBM Works

DATE: 2002-01-04 23:31:34

AUTHOR: Timur Kazimirov

К сожалению, в документации IBM Works не сделан акцент на то, что при работе с таблицами IBM Works можно создавать и использовать свои собственные функции, написанные на REXX. Советую начать изучение этого вопроса с каталога IBM Works, в котором лежат готовые примеры таких функций (например, файл RANDOM.FNC) - не поленитесь и посмотрите насколько все просто. Как это обычно бывает в случае с IBM, не все детали расписаны в справочниках, поэтому приходится доходить до всего самому. Итак, как же все это делается...

Формат вызова собственной функции

Тут все довольно просто. В нужной ячейке введите функцию:

=rexx("имя файла", тип ответа, кол-во аргументов, список аргументов)

При этом, в зависимости от национальных настроек символа разделителя списка, может использоваться запятая или точка с запятой (как система настроена, так и будет). По умолчанию, если при установке вы указали страну 'Россия', то надо будет использовать точку с запятой. Пример ввода (на моей машине):

=rexx("C:\USER\тест на вшивость.RXX";0;1;A1)

Здесь:

"Имя файла"
название файла *в двойных кавычках* с телом вашей функции. Можно указать полный путь или относительный (относительно каталога, в котором находятся программы IBM Works). Расширение файла роли не играет. Имя файла может содержать пробелы.
Тип ответа
Тут вариантов всего лишь два:
0 - если результат вашей функции будет числом;
1 - если возвращается строка (вместо 1 может стоять любое другое, отличное от нуля число).
Количество аргументов
Число, указывающее, сколько аргументов вы передаете вашей функции. Если функция не требует аргументов, то укажите ноль.
Список аргументов
Сами аргументы, передаваемые в вашу функцию. Их количество должно быть таким же, каким вы его указали в предыдущем аргументе, в противном случае вы получите сообщение об ошибке. Что касается самих параметров, то это могут быть:
  • Числа в соответствии с текущими национальными настройками (Например, число 16,4). Даты передаются как числа.
  • Строки передаются в двойных кавычках. Примеры: "Строка1", "Narrow->"
  • Названия ячеек. В этом случае в функцию будет передан результат, содержащийся в указанной ячейке. К сожалению, нельзя передать интервал ячеек. Адресация ячеек может быть как абсолютной, так и относительной. Примеры: A1, $B$8
  • Выражения. Сначала они будут вычислены, после чего результат будет передан в вашу функцию. В выражениях могут участвовать названия ячеек (как абсолютные, так и относительные).

Разбор параметров внутри функции

Разбор параметров нужно выполнять через стандартную конструкцию ARG.... Единственные 'грабли', которые могут встретиться на пути, связаны с национальными настройками. Сам по себе, REXX считает в выражениях числа числами, только если они представлены в форме "xxx.yyy", а если вы передаете ему дробное число "12,6" (заметьте запятую в случае, если текущая страна - Россия), то в теле функции надо это дело поправить - например функцией TRANSLATE, то есть

argvar = TRANSLATE(argvar, ".", ",")

Вторая проблема: IBM Works передает параметры как есть. Например, если в ячейке B1, которая будет аргументом для вашей функции, стоит число 12, но формат отображения указан как денежный и отображается на самом деле '12,00р.', то аргумент окажется строкой '12,00р' (со всеми вытекающими последствиями). Чтобы это избежать, умножьте B1 на единицу. То есть:

=rexx("myfunc.fnc";0;1;B1)

надо заменить на

=rexx("myfunc.fnc";0;1;B1*1)

Тоже самое относится и к процентному представлению чисел. Приходится помнить еще и о том, что даты представляются как числа, однако если в ячейке стоит "28.Дек.01", то и в вашу функцию будет передана именно эта строка, а не "37253.661". Если вы хотите передать числовое представление даты, то умножьте дату на единицу. Учтите, что в теле функции все равно прийдется еще раз править запятую на точку. Ну, а если вам все это сильно не нравится, то меняйте национальные настройки представления чисел (что я всегда и делаю).

Тело функции и возвращаемое значение

Сама функция - это обычная программа на REXX (файл должен начинаться с комментария /*.......*/). Внутри своей функции вы можете творить все что вам хочется - от простого суммирования, до подгрузки библиотеки RxSock, установления HTTP-соединения и запроса какого-либо ресурса с веб-сервера. А результат функции возвращается как обычно - через RETURN значение. Не завершайте функцию фразой EXIT - это может привести к неприятным последствиям.

Разумеется, если ваша функция работает долго, то следует что-то предпринять (вывести какое-то сообщение, запустить дочерний процесс и т.п.). А если, не дай бог, вы загнали ее в бесконечный цикл, то, скорее всего, ничего, кроме 100% загрузки процессора вы не получите и прийдется 'прибивать' сам IBMWORKS, что не всегда приемлемо.

Рабочий пример

В заключение приведу пример расчета лизингового платежа. Текст функции:

/*      Расчет лизингового платежа               */
/*                                               */
/* рассчитывает сумму арендного платежа по:      */
/*                                               */
/* TotalCost - стоимость арендуемого имущества;  */
/* AgrLen - срок контракта (договора);           */
/* LeasePerc - лизинговый процент;               */
/* PeriodCount - периодичность арендных платежей */
/*                                               */
Parse Arg TotalCost, AgrLen, LeasePerc, PeriodCount
TotalCost=Translate(TotalCost, ".", ",")
AgrLen=Translate(AgrLen, ".", ",")
LeasePerc=Translate(LeasePerc, ".", ",")
PeriodCount=Translate(PeriodCount, ".", ",")
tmp1 = LeasePerc / PeriodCount
tmp2 = (1 + tmp1)**(PeriodCount*AgrLen)
answ = TotalCost * tmp1 * tmp2 / (tmp2 - 1)
Return answ

А вот то, что мы получаем в результате:


Автор статьи: Timur Kazimirov

Первая публикация: http://ns.rnlease.snc.ru/~timur/os2/rxworks.shtml

Редактор: Eugene Gorbunoff

Попробуй программу:

ThirdEye - утилита для скачивания фотографий из фотоаппаратов, подключенных через COM-порт.

Комментарии:

Книги про eComStation и OS/2 Warp: для чайников, разработчиков и специалистов. Списки здесь

 


 

(C) OS2.GURU 2001-2021