Reviews / articles about OS/2 |
Operating systems: ArcaOS, eComStation, IBM OS/2 Warp |
|
|
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) Здесь:
Разбор параметров внутри функцииРазбор параметров нужно выполнять через стандартную конструкцию 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
Комментарии:
|
|
|||||||||||
(C) OS2.GURU 2001-2021