НОВОЕ: OS/2 GURU - Вопросы и ответы ru · en · de · es · it · pt · cz · pl · fr

OS/2.GURU Library

Reviews / articles about OS/2 eComStation ArcaOS

Operating systems
ArcaOS, eComStation, IBM OS/2 Warp
eComStation myths 

Latest  
 
 
Blonde Guy

Reformat Утилита для форматирования USB флешек, USB винчестеров (для совместимости с OS/2)

 

(promo)

Unsorted

 

 

AD: Upgrade ArcaOS to NeoWPS level

  • Install original PNG icons drawed by designer, specialized at OS/2 adornation.
  • Install eSchemes 2019 to change colors and buttons on desktop.

Usage of REXX with IBM Works


TITLE: Usage of REXX with IBM Works

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

AUTHOR: Timur Kazimirov
Please use online translator
go to http://translate.google.com
and request the translation of http://ru.ecomstation./projects/reviews/index.php?id=37
to your language

К сожалению, в документации 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

Test the program:

ACPI kernel - it is aimed to reduce power consumption, noise (results of experiments)

Comments:

It's easy to maintain eComStation: a) Fast installation (20 minutes and it's ready), b) Universal drivers, replace a device - the system boots and continues work, c) Use eCS to recover damaged Windows (no danger to be infected by virus)

 

Siberian OS/2

 


 

 

ArcaOS 5.1.1 - DOS works again

DOS virtual machine works again (it was working on Core 2 Duo, and didn't for i5). Install ArcaOS in UEFI mode to use DOS VM.

Blonde Guy

FOC file selector

eCo Software have created File Open Container - modern dialog to open/select files.

Some remarks about FOC development

// надо на ENG!!

Warpstock Europe 2017

Warpstock Europe 2017 conference was in Rotterdam (Netherlands). Meeting of OS/2 users and developers. Report (russian text):

 

(C) OS2.GURU 2001 -- 2025