Welcome to eComStation.RU site!

Select your language: Russian English Deutch Spanish Italian Portuguese Czech Polish French

Frequently asked questions and answers:

eComStation.RU

ru · en · de · es · it · pt · cz · pl · fr
eComStation - это совершенно другая операционная система для PC (IBM OS/2 Warp)
Программы, новости, статьи, поддержка пользователей, оборудование, вопросы и ответы.
 
      Что такое OS/2?НовостиУстановкаОбновлениеПрименениеБудущееСообществоКупить    
(Карта сайта)

 
 
Списки протестированного OS/2 оборудования
Как получить драйверы OS/2 бесплатно

 
Обновление

 
Программы

 
(Санкт-Петербург)

 
Преимущества (1)

 
Разработчику (1)

 
(Пайпы программ)

 
Компании: (1)

 
История (1):

 
(Бонусы)

 
Советы:

 
(Барьеры и решения)

 
Технологии: (1)

 
(Применение в науке, лаборатории, ..)

 

 
Готовые решения:

 
Новая eComStation:

 
Будущее: (1)

 
(Ссылки на другие сайты)

 
(Картинка дня)

 
Артефакты OS/2

 
Гаджеты

 

Использование 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

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

WarpOverlay! - видео-оверлей для видеоадаптеров, выпускавшихся до 2006 года.

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

Прокомментируйте эту статью (напоминаем, автор работал над текстом несколько недель, уважайте мнение других).


Ваше имя:

Ваш E-Mail:

CODE:
......

  

Ваш комментарий:


Как приумножить количество пользователей eComStation? Каждый осевик может установить eCS своим друзьям и родственникам, распечатать для них методичку, как пользоваться системой - Сайт LiveBook

Статьи

Операционная система
Программное обеспечение
Оборудование
Для разработчика
Разное
Колонка редактора


Готовая eComStation на SSD диске

 





Последний активный опрос: Какая высота барьера RPM?

IBM OS/2 Warp

 
Обучение новичков

Списки протестированного OS/2 оборудования

 
Статьи


   
  Почему eComStation?
Возможности
Особенности
Применение
Ролики и скриншоты
   eComStation для
для бизнесменов
для студентов и инженеров
для продавцов компьютеров
сообщество пользователей
   Разработчик
Распространить программу
Описание API, библиотеки
Начать новый проект
Конкурсы
   Программы
Он-лайн каталог
Выбрать через eCo Market
   Служба поддержки
Отправить вопрос
Купить eComStation
Вопросы и ответы
Обучение новичков
 
 
© 2001 - 2014 eCo Software, All rights reserved
eComStation is a registered trademark of Serenity Systems International
OS/2 Warp is a registered trademark of IBM Corporation
 

 

 
Картинка дня: