|
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
Комментарии: Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).
|
В eComStation 2.0 реализовано удобное (автоматическое) переключение между WiFi и Ethernet-соединением. Что нового в eCS 2.0? |
|
|
|
Готовая eComStation на SSD диске
Последний активный опрос: Какая высота барьера RPM?
[Google]
|
IBM OS/2 Warp
|