СБиС news №4/15.04.98
Этот выпуск СБиС news посвящен нововведениям в язык
описания бухгалтерских операций и отчетных форм. Вообще говоря, эти изменения не
носят принципиальный характер в том смысле, что и без них можно жить. Однако они
позволят некоторые конструкции сделать лаконичнее и эффективные. Учтите, что все
приведенные ниже изменения будут работать только, начиная с версии 1.1 комплекса
СБиС++. На сегодняшний день эта версия проходит этап тестирования. Итак...
Теперь в описании правил операций и отчетов
можно использовать новый оператор "ВыборПо". В общем случае данная конструкци
языка выглядит следующим образом:
ВыборПо(ВыражениеВыбора)
{
выбор Выражение1,Выражение2,...:
Оператор;
...
Оператор;
...
выбор ВыражениеN1,ВыражениеN2,...:
Оператор;
...
Оператор;
иначе
Оператор;
...
Оператор;
}
Давайте рассмотрим каждый из приведенных
элементов более подробно. После ключевого слова "ВыборПо" в
круглых скобках идет некоторое выражение. Результат его выполнения
последовательно сравнивается со значениями выражений, идущих после ключевых слов
"выбор". Если значение какого-то выражения совпало, то будут выполняться
операторы после соответствующего двоеточия до следующего ключевого слова
"выбор", либо до "иначе", либо до закрывающейся фигурной скобки. Если же ни одно
из значений не равно, будут выполнены операторы после ключевого слова "иначе" до
закрывающейся фигурной скобки. По крайней мере, должен
быть хотя бы один блок операторов, начинающийся со слова "выбор". Таких блоков
может быть сколько угодно много. Блока "иначе" можно опускать.
До сегодняшнего дня, чтобы реализовать подобную
конструкцию, приходилось использовать несколько операторов "Если/Иначе".
Выглядело это так:
Если( ВыражениеВыбора==Выражение1 )
{
Оператор; ... Оператор;
}
иначе если( ВыражениеВыбора==Выражение2 )
{
Оператор; ... Оператор;
}
...
иначе
{
Оператор; ... Оператор;
}
Данная конструкция практически аналогична
оператору "ВыборПо" за исключением маленького "но" - выражение выбора будет
рассчитываться заново при каждом сравнении. И в заключение
еще несколько примеров возможного использования нового оператора. Так например,
можно проанализировать переменную "Раздел".
ВыборПо(Раздел)
{
выбор "ТРЗ":
Проводка(…);
выбор "МАТ", "МБП":
Проводка(…);
Проводка(…);
иначе
Проводка(…);
Проводка(…);
}
А вот похожий пример из файла RASCH.RPT.
Кстати, можете сравнить, как это делается сейчас.
ВыборПо('Тип документа')
{
выбор "ПлатВход":
Установить(Лицо1);
Тип = "ПОРУЧЕНИЕ";
выбор "ТребВход":
Установить(Лицо0);
Тип = "ТРЕБОВАНИЕ";
выбор "ПлатИсхд":
Установить(Лицо0);
Тип = "ПОРУЧЕНИЕ";
выбор "ТребИсхд":
Установить(Лицо1);
Тип = "ТРЕБОВАНИЕ";
}
Появилась возможность создавать и
использовать массивы данных. Дабы облегчить понимание дальнейшего текста
приведем небольшой умозрительный пример использования массивов дл реализации
мини переводчика:
Слово["Один"] = "One";
Слово["Два"] = "Two";
Слово[1] = "One";
Слово[2] = "Two";
C = "?";
Спросить(С); # слово для перевода
Сообщить(Слово[C]); # выдать перевод
А теперь формальные правила работы с
массивами:
- Массив, как и переменная, имеет имя.
- Массив создается в момент первого обращения к его элементу.
- Обращение к элементам массива осуществляетс через квадратные скобки.
- Элементы массива адресуются строками, то есть фактически каждый элемент
массива имеет имя. Регистр букв в имени значения не имеет.
- Поскольку адресация элементов массива числами пока не реализована, числа
преобразуются в строки. В нашем примере обращение "Слово[1]" создаст элемент
массива с именем "1".
- Элементы массива сортируются по имени.
- Количество элементов в массиве ограничено только размерами свободной
оперативной памяти. Хотя, конечно же, не стоит создавать сверхбольших
массивов.
- В массивах может храниться любая разнородна информация, то есть в одном
массиве допускаетс хранить и строки, и числа, и даты.
И в заключение еще пример использовани
массива:
СуммаСборки[0] = 0.0;
Номер = 0;
ДляВсех(Наименований)
{
Если(Найти(Тип,"Базов")) Номер += 1;
Если(Найти(Тип,"Компл"))
СуммаСборки[Номер] += СуммаЦен*0.05;
}
Номер = 0;
ДляВсех(Наименований)
Если(Найти(Тип,"Базов"))
{
Номер += 1;
СуммаЦен = СуммаСборки[Номер];
}
Фактически данный оператор аналогичен
оператору "Если/Иначе". Записывается он в следующей форме:
УслВыражение?Выражение1:Выражение2
Работает оператор так. Вычисляетс значение
условного выражения, если его значение отлично от нуля, то возвращается значение
первого выражения, в противном случае возвращается значение второго выражения.
Применение этого оператора не так очевидно, как других
новых элементов языка. Его удобно использовать в тех случаях, когда нужно
получить либо то, либо другое значение в зависимости от какого-то условия. При
умелом использовании этого оператора можно значительно сократить запись
некоторых операций. Например, в инсталляционной базе данных встречаются такие
строки:
Если( Оплата > Отгрузка )
Расчет = Отгрузка;
иначе
Расчет = Оплата;
Если же использовать новый оператор все
выглядит значительно проще и понятнее:
Расчет = Оплата>Отгрузка?Отгрузка:Оплата;
Сразу видно, что цель этой строки рассчитать
значение переменной "Расчет". На самом деле приведенный пример можно еще более
упростить следующим образом:
Расчет = Мин(Отгрузка,Оплата);
Или же другой пример из расчета зарплаты:
Если( ПолныхЛет > 10 )
Сумма = ЗаМесяц * 0.1;
иначе Если( ПолныхЛет > 5 )
Сумма = ЗаМесяц * 0.05;
иначе
Сумма = 0;
Эту конструкцию можно записать так:
Сумма = ПолныхЛет>10?ЗаМесяц*0.1:
ПолныхЛет>5?ЗаМесяц*0.05:0;
А если еще немного подумать, то можно и еще
упростить:
Сумма = ЗаМесяц*(ПолныхЛет>10?0.1:
ПолныхЛет>5?0.05:0);
В общем, дерзайте!
<<< Предыдущий выпуск | Архив выпусков | Следующий выпуск >>>
|