Использование функций преобразования

Основное предназначение

«Функции преобразования» представляют собой операторы внутреннего языка программирования, на котором разработана программа. Функции преобразования используются для сложных преобразований значений колонок импортируемого прайс-листа, например, удаление или извлечение артикула из наименования, перестановку местами терминов наименования товара, добавления к наименованиям реквизитов дополнительных значений и т.д.

Для того, чтобы перейти в окно ввода функции преобразования, в настройке приема данных перейдите на вкладку «Настройки для XLS, CSV, XML, DBF», выберите реквизит, для которого будет использоваться функция преобразования и два раза нажмите левой кнопкой мыши на колонку «Параметры« в строке с выбранным реквизитом. В приведенном ниже примере показана функция преобразования, которая убирает все восклицательные знаки из наименования товара. STRTRAN - это оператор внутреннего языка программы, который заменяет в указанном выражении один указанный символ на другой, NM - это внутреннее имя колонки наименования товара:

Следующая функция преобразования убирает из наименования артикул, с которого оно начинается. Команда SUBSTR выделяет из заданной строки подстроку, начиная с указанного порядкового номера символа внутри строки. Команда AT определяет порядковый номер заданного символа в заданной строке (в данном примере - пробел). NM - внутреннее имя колонки с наименованием товара. С помощью приведенной функции преобразования, мы сначала с помощью команды AT определяем порядковый номер первого пробела, которым заканчивается артикул и с которого начинается наименование товара. Затем с помощью команды SUBSTR мы выделяем подстроку с порядкового номера первого пробела, таким образом убирая артикул и оставляя только наименование товара:

Перечень внутренних имен колонок программы

Внутреннее имя Тип Расшифровка
Nm Символьный Наименование товара
Articul Символьный Артикул
FactNum Символьный Оригинальный номер
Km Символьный Код товара
Ei Символьный Единица измерения
Qv Символьный в 1 уп.
Cena_Prc Символьный Цена постав.
Gtg_01 Символьный Главная категория товаров
Gtg_02 Символьный Подкатегория товаров №2
Gtg_03 ... Gtg_09 Символьный Подкатегории товаров с №3 по №9
Gtg_10 Символьный Подкатегория товаров №10
Izg Символьный Производитель
CityTov Символьный Место изготовления
Skl1_Tov Символьный Склад *есть*
Skl2_Tov Символьный Склад *в пути*
Skl3_Tov Символьный Склад *заказ*
Ost_Prc Символьный Остаток
Tip1_Tov Символьный Признак *новинка*
Tip2_Tov Символьный Признак *акция*
Min_Tov Символьный Кратность заказа
Ves_Prc Символьный Сес
Gbr_Tov Символьный Габариты
Seas_Tov Символьный Модель
Razm_Tov Символьный Год выпуска
Cvet_Tov Символьный Цвет
Grnt_Tov Символьный Двигатель
Ean_Tov Символьный Кузов
Rth_Tov Символьный Акция
Rti_Tov Символьный Примечание
Ind_Txar Символьный Описание
Ind_Tanl Символьный Аналоги
Ind_Tweb Символьный WEB-ссылки
Ind_Adx1 Символьный Применение
Cena_Ad1 Символьный Цена (реком.)
Cena_Ad2 Символьный Цена (>1000 шт)
Cena_Ad3 Символьный Цена (от 50000 р)
Cena_Ad4 Символьный Цена (вип)
Cena_Ad5 Символьный Цена (у.е)

Операторы работы со строками внутреннего языка программы

Оператор Описание
ALLTRIM(реквизит) Убирает все пробелы слева и справа от указанного реквизита, например ALLTRIM(Nm) убирает все пробелы слева и справа от наименования товара
AT("символ", реквизит, номер вхождения) Определяет порядковый номер заданного в кавычках символа в указанном реквизите слева, с учетом порядкового номера вхождения. Например AT("а","балка",2) вернет значение 5, т.к. мы определяем порядковый номер второго вхождения символа "а" в строку "балка" слева. Если номер вхождения не указан, будет возвращен порядковый номер заданного символа в первом вхождении в заданную строку
ADDBS(реквизит) Добавляет обратный слэш "" к строке заданного реквизита. Если в конце строки уже имеется обратный слэш, то добавление не производится.
BETWEEN( числовой реквизит, число1, число2) Возвращает логическое "да", если заданный реквизит попадает в указанный числовой диапазон между число1 и число2. Например BETWEEN(VAL(Ost_Prc),10,20) возвращает .T. (true - да), если преобразованный в число с помощью функции VAL остаток попадает в диапазон от 10 до 20, иначе .F. (false-нет)
EMPTY(реквизит) Возвращает логическое "да", если значение заданного реквизита пустое (не содержит никаких значений) и "нет" - в противном случае. Используется в операторах условных выражений IIF и ICASE.
EVL(реквизит, значение) Возвращает первое не пустое значение из двух заданных, например EVL("","процессор") вернет значение "процессор", EVL(5,0) вернет значение 5.
GETWORDCOUNT( реквизит, разделитель терминов) Возвращает количество слов (терминов) в заданном реквизите. В качестве разделителя терминов по умолчанию подразумевается пробел. Например GETWORDCOUNT("водяной насос 2101") вернет значение 3. GETWORDCOUNT("водяной,насос 2101", ",") вернет значение 2.
HOUR( DATETIME() ) Данная функция возвращает часы из текущей или заданной даты, например STR(HOUR(DATETIME())) возвращает преобразованные в строку часы текущей даты и времени.
GETWORDNUM( реквизит, порядковый номер термина, разделитель терминов) Возвращает термин по указанному порядковому номеру слова (термина) в значении заданного реквизита. В качестве разделителя терминов по умолчанию подразумевается пробел. Например GETWORDNUM("водяной насос 2101",2) вернет "насос".
INLIST(реквизит, значение1, значение2, ...значение15) Возвращает логическое "да" (.T.-true), в случае если значение заданного реквизита равно какому-либо из указанных значений (значение1, значение2,...значение15). Например, INLIST("2101","2105","2101","2106") вернет логическое "да" (.T. - true)
ISALPHA( реквизит ) Возвращает логическое "да" (.T.-true), в случае если крайний левый символ значения заданного реквизита является буквой (русского или английского алфавита). Например ISALPHA("видеокарта") вернет логическое "да" (.T. - true)
ISDIGIT( реквизит ) Возвращает логическое "да" (.T.-true), в случае если крайний левый символ значения заданного реквизита является цифрой. Например ISDIGIT("2101-2344433") вернет логическое "да" (.T. - true)
ISLOWER( реквизит ) Возвращает логическое "да" (.T.-true), в случае если крайний левый символ значения заданного реквизита находится в нижнем регистре. Например, ISLOWER(&qzot;redmond&qzot;) вернет логическое "да" (.T. - true), ISLOWER(&qzot;Redmond&qzot;) вернет логическое "нет" (.F. -false)
ISUPPER( реквизит ) Возвращает логическое "да" (.T.-true), в случае если крайний левый символ значения заданного реквизита находится в верхнем регистре. Например, ISUPPER(&qzot;Redmond&qzot;) вернет логическое "да" (.T. - true), ISUPPER(&qzot;redmond&qzot;) вернет логическое "нет" (.F. -false)
LEFT(реквизит, количество символов) Возвращает слева подстроку длиной в количество указанных символов из значения заданного реквизита. Например, LEFT("процессор Intel Core2Duo",9) вернет "процессор".
ISNULL( реквизит ) Возвращает логическое "да" (.T.-true), в случае если значение реквизита имеет значение NULL
LEN(реквизит) Возвращает количество символов (длину) значения заданного реквизита. Например, LEN("задний бампер BMW 5") вернет значение 19, с учетом пробелов.
LIKE(значение, реквизит) Возвращает логическое "да" (.T.-true), в случае если значение (или его маска) содержится в строке заданного реквизита. Искомое значение может быть задано в виде маски, с символом * слева и/или справа от значения. Использование маски означает что поиск будет осуществляться по вхождению искомого значения по всей длине заданной строки. Например, LIKE("*карт*","ATI RADEON видеокарта 5850") вернет логическое "да" (.T. - true). LIKE("Intel*","Процессор Intel 8400") вернет логическое "нет" (.F. -false), т.к. термин Intel находится не сначала строки. LIKE("*8400","Процессор Intel 8400") вернет логическое "да" (.T. - true), т.к. строка заканчивается на искомый термин.
LOWER(реквизит) Переводит значение заданного реквизита в нижний регистр. Например LOWER("FOX") вернет значение "fox"
LTRIM(реквизит) Убирает все пробелы слева от указанного реквизита, например LTRIM(Nm) убирает все пробелы слева от наименования товара
NVL(реквизит, значение) Возвращает первое не NULL значение из двух заданных, например EVL(NULL,"процессор") вернет значение "процессор", NVL(5,NULL) вернет значение 5.
OCCURS( значение, реквизит) Возвращает количество вхождений значения в строку заданного реквизита. Например, OCCURS(";","100;200;300;400;500") вернет значение 4, именно столько раз символ ";" содержится в заданной строке.
PADL(реквизит, итоговая длина строки, символ добавления) Данная функция добавляет заданное количество пробелов слева к строке реквизита до достижения итоговой длины строки. Например, PADL(Nm,80) добавляет слева к наименованию товара такое количество пробелов, чтобы итоговая строка наименования получилось длиной 80 символов. PADL(Nm,65,"!") добавляет слева к наименованию товара определенное количество восклицательных знаков, чтобы итоговая строка получилась длинной 65 символов
PADR(реквизит, итоговая длина строки, символ добавления) Данная функция является аналогом PADL, только добавляет символы справа от строки заданного реквизита
PADC(реквизит, итоговая длина строки, символ добавления) Данная функция является аналогом PADL, только добавляет символы и справа и слева от строки заданного реквизита
PROPER( реквизит ) Данная функция приводит строку заданного реквизита к нормальной форме правописания, т.е. слово начинается с большой буквы, далее идут символы в нижнем регистре. Например, PROPER("visual FoXPro") возвращает значение "Visual Foxpro".
RAT("символ", реквизит, номер вхождения) Определяет порядковый номер заданного в кавычках символа в указанном реквизите справа, с учетом порядкового номера вхождения. Например RAT("а","балка",2) вернет значение 2, т.к. мы определяем порядковый номер второго вхождения символа "а" в строку "балка" справа. Если номер вхождения не указан, будет возвращен порядковый номер заданного символа в первом вхождении в заданную строку
REPLICATE( "символ", количество повторений) Дублирует заданный символ на заданное количество повторений. Например REPLICATE("!",10) возвращает значение "!!!!!!!!!!"
RIGHT(реквизит, количество символов) Возвращает справа подстроку длиной в количество указанных символов из значения заданного реквизита. Например, RIGHT("процессор Intel Core2Duo",3) вернет "Duo".
RTRIM(реквизит) Убирает все пробелы справа от указанного реквизита, например RTRIM(Nm) убирает все пробелы справа от наименования товара
SPACE(количество пробелов) Возвращает заданное количество пробелов, например SPACE(5) вернет пять пробелов " "
STR(число, длина, количество знаков дробной части) Данная функция переводит заданное число (реквизит) в строку, с указанной длинной и количеством знаков дробной части. Например, STR(255) вернет строку "255". STR(564.33,6,2) вернет строку "564.33", где 6 общая итоговая длина строки с учетом разделителя дробной части ".", 2 - количество знаков дробной части.
STREXTRACT( реквизит, символ начального разделителя, символ конечного разделителя, порядковый номер разделителя, дополнительные флаги) Данный оператор извлекает из строки реквизита подстроку, обрамленную начальным и конечным разделителем, например <видеокарта> или "процессор". Например, STREXTRACT("Процессор <8400> Intel Box 6MB L","<",">") вернет значение 8400. Порядковый номер разделителя указывает с какого номера вхождения начального разделителя в строку нужно производить извлечение. Дополнительные флаги: 1 - учитывать регистр символов разделителей, 2 - не учитывать конечный разделитель, 4 - возвращать извлеченную подстроку вместе с разделителями. STREXTRACT("Видеокарта ATI RADEON (GYGABITE) 6950 (1024Mb)","(",")",2,4) вернет значение (1024Mb)
STRTRAN( реквизит, символ подлежащий замене, символ замены, порядковый номер начала замены, количество замен) Данная функция заменяет в строке реквизита указанный символ на символ замены, начиная с порядкового номера начала замены с учетом количества замен. Например, если порядковый номер начала замены равен 3, то замена символа будет производиться только с третьего раза, когда символ встречается в строке. Например, STRTRAN(Nm,"!","?",5,2) заменяет в наименовании товара символ "!" на "?", начиная с места, где символ "!" встречается в 3 раз, делая при этом только 2 замены. STRTRAN(Ctg_01,".","") убирает в главной категории товара все точки.
STUFF( реквизит, порядковый номер вставки, количество символов замены, набор символов вставки) Данная функция заменяет (или вставляет) в строке реквизита заданный набор символов, начиная с порядкового номера вставки, заменяя при этом заданное количество символов в строке. Например, STUFF("видеокарта",6,2,"-") вернет значение "видео-рта". Если количество символов замены равно 0, то производится вставка в строку, например STUFF("видеокарта",6,0,"-") вернет "видео-карта".
SUBSTR( реквизит, стартовая позиция, количество символов отбора) Данная функция выделяет из строки реквизита подстроку длиной в количество символов отбора, начиная со стартовой позиции. Например, SUBSTR("Intel Pentium Box",7,4) вернет подстроку "Pent". Если количество символов отбора не задано, вернется вся подстрока, начиная со стартовой позиции отбора, например SUBSTR("Intel Pentium Box",7) вернет подстроку "Pentium Box"
TRIM(реквизит, символ удаления1, символ удаления2, ... символ удаления23) Данная функция удаляет из конца строки заданного реквизита указанные символы удаления, например TRIM("aaa.bbb","b") возвращает значение "aaa.". TRIM("aaa;ffbbbf","b","f") возвращает "aaa;"
UPPER(реквизит) Переводит значение заданного реквизита в верхний регистр. Например UPPER("fox") вернет значение "FOX"

Операторы работы с числами внутреннего языка программы

Оператор Описание
ABS(реквизит) Возвращает абсолютное значение числа (без знака минус), например ABS(-10) вернет значение 10.
CEILING(реквизит) Возвращает ближайшее целое число, которое больше чем значение реквизита, например CEILING(10.1) вернет значение 11, CEILING(-10.9) вернет значение -10
FLOOR(реквизит) Возвращает ближайшее целое число, которое меньше чем значение реквизита, например FLOOR(10.9) вернет значение 10, CEILING(-10.1) вернет значение -11
INT(реквизит) Возвращает целую часть значения реквизита или заданного выражения. Например, INT(12.5) вернет значение 12, INT(6.25 * 2) вернет значение 12.
LOG(число) Возвращает натуральный логарифм с экспоненциальным основанием E
LOG10(число) Возвращает натуральный логарифм с экспоненциальным основанием 10
MAX(ревизит, значение1, значение2,...значениеN) Возвращает максимальное значение из указанного перечня значений, например MAX(10,2,7,12,1) вернет значение 12, MAX(VAL(Cena_Prc), VAL(Cena_Ad1)) вернет максимальную из 2-х цен прайс-листа (цены поставки и дополнительной цены)
MIN(ревизит, значение1, значение2,...значениеN) Возвращает минимальное значение из указанного перечня значений, например MIN(10,2,7,12,1) вернет значение 1, MIN(VAL(Cena_Prc), VAL(Cena_Ad1)) вернет минимальную из 2-х цен прайс-листа (цены поставки и дополнительной цены)
MOD(делимое,делитель) Возвращает дробный остаток после деления делимого на делитель, например MOD(4,2) = 0, т.к. 4 делится на 2 ровно без дробного остатка, MOD(36,10) возвращает 6, т.е. 36/10 = 3.6.
RAND() Возвращает случайное число от 0 до 1 (0.34, 0.97, 0.43 и т.д.)
ROUND(реквизит, количество знаков дробной части) Округляет числовое значение до указанного количества знаков после запятой, например ROUND(12.36,1) вернет 12.4, ROUND(12.36,0) вернет 12.
SIGN(реквизит) Возвращает 1, если указанный реквизит является положительным числом, -1 - если отрицательным, и 0 если число является нулем.
SQRT(реквизит) Возвращает квадратный корень
VAL(реквизит) Данная функция переводит строку заданного реквизита в число, например VAL("2101") вернет число 2101. VAL("54abc") вернет число 54.

Операторы работы с датой и временем внутреннего языка программы

Оператор Описание
DATE() Возвращает текущую дату в формате ДД/ММ/ГГ
DTOC(DATE()) Возвращает текущую дату в символьном виде
DMY(DATE()) Возвращает текущую дату в развернутом виде, например "11 сентября 11"
DTOS(DATE()) Возвращает текущую дату в формате ГГГГММДД
HOUR( DATETIME() ) Возвращает часы из текущей или заданной даты, например STR(HOUR(DATETIME())) возвращает преобразованные в строку часы текущей даты и времени.
MINUTE(DATETIME()) Возвращает минуты из текущей или заданной даты, например STR(MINUTE(DATETIME())) возвращает преобразованные в строку минуты текущей даты и времени
MONTH(DATETIME()) Возвращает номер месяца из текущей или заданной даты, например STR(MONTH(DATETIME())) возвращает преобразованный в строку номер месяца (1-12) текущей даты и времени
SEC(DATETIME()) Возвращает секунды из текущей или заданной даты, например STR(SEC(DATETIME())) возвращает преобразованные в строку секунды текущей даты и времени
SECONDS() Возвращает количество секунд, прошедших с полуночи
TIME() Возвращает текущее время в формате ЧЧ:ММ:СС
TTOC(DATETIME()) Возвращает текущую дату и время в символьном виде

Условные, сравнительные и логические операторы внутреннего языка программы

Оператор Описание
значение $ реквизит Возвращает логическое "да" (.T. - true), если указанное значение содержится в строке реквизита, например "bra" $ "abracadabra" вернет значение .T.
ICASE(логическое условие1, результат1, логическое условие2, результат2, логическое условие3,результат3, ...,результат в случае невыполнения ни одного условия) Данный оператор возвращает результат при выполнении первого из перечисленных по порядку по порядку условий. При не выполнении ни одного из условий, возвращается результат, который указан перед закрывающей скобкой оператора. Например ICASE(1+2=2,"Первое условие ложь", 1+2=3, "Второе условие истина", "Все условия ложны") вернет значение "Второе условие истина". ICASE(MOD(4,2)=1,"Первое условие истина", MOD(3,2)=0,"Второе условие истина","Все условия ложны") вернет значение "Все условия ложны". Например, функция ICASE(VAL(Ost_Prc)<10,"мало", BETWEEN(VAL(Ost_Prc),10,50), "достаточно", "много") возвращает для каждой строки прайса три значения ("мало", "достаточно", "много") в зависимости от того, в какой числовой диапазон попадает преобразованное с помощью оператора VAL значение остатка.
IIF(логическое условие, результат1, результат2) Данный оператор возвращает результат1 при выполнении логического условия и результат2 в противном случае. Например, IIF(1+2=2,"Да","Нет") вернет результат "Нет". IIF(VAL(Ost_Prc)>0,"есть на складе", "нет на складе"). Оператор IIF может содержать в себе вложенные операторы IIF и ICASE, например IIF(VAL(Ost_Prc)<10,"мало",IIF(VAL(Ost_Prc)>10 AND VAL(Ost_Prc)<50,"достаточно","много")).
NOT или ! Логический оператор отрицания, NOT .T. = .F., ! .F. = .T.
AND Логический оператор "И". IIF(1>0 AND 2>0,"Да","Нет") возвращает значение "Да"
OR Логический оператор "ИЛИ". IIF(1>0 OR 2=0,"Да","Нет") возвращает значение "Да", т.к. выполнилось условие 1>0
+ - * / Соответственно "сложение", "вычитание", "умножение", "деление"
> < = >= <= Соответственно "больше", "меньше", "равно", "больше или равно", "меньше или равно"
<> != # Не равно, IIF(1<>2,"Истина", "Ложь") вернет значение "Истина"

Все операторы внутреннего языка могут быть вложены друг в друга. Условные операторы IIF и ICASE также могут быть вложены друг в друга, например ICASE(IIF(условие,.T.,.F.), значение1, IIF(условие,.T.,.F.), значение2, значение3). Операторы работы со строками и числами могут содержать внутри условные операторы и наоборот - внутри условных операторов могут содержаться операторы работы со строками и числами, например:

IIF(VAL(STR(IIF(BETWEEN(RAND(),0.1,0.5),0.25,0.75),5,2))=0.75,"0 целых 75 сотых","0 целых 25 сотых")

Данная функция начинается с оператора генерации случайных чисел RAND(), который генерирует число в диапазоне от 0 до 1. Функция BETWEEN() проверяет возвращенное оператором RAND() случайное число на попадание в диапазон от 0.1 до 0.5. Если случайное число попадает в данных диапазон, оператор IIF возвращает значение 0.25 и 0.75 в противном случае. Оператор STR преобразовывает возвращенное оператором IIF число в строку длиной пять символов с двумя знаками после дробной части. Последующая функция VAL преобразовывает полученное с помощью оператора STR строку обратно в число 0.25 или 0.75. И наконец, последний оператор IIF в случае получения оператором VAL числа 0.75 возвращает расшифровку этого числа или числа 0.25 в противном случае.

Пример удаления артикула из наименования товара

Данный пример демонстрирует импорт из прайс-листа, в «наименовании товара» которго содержится «артикул». «Артикул» отделен от «наименования» символом восклицательного знака "!". Задача - убрать из «наименования товара» «артикул» с помощью функции преобразования:

Пример выделения «плавающего» артикула из наименования товара

Данный пример демонстрирует процесс извлечения артикула из наименования товара. Особенность данного примера состоит в том, что артикул не имеет четко заданного местоположения в наименовании товара:

Пример формирования собственного значения для колонки "остаток"

Данный пример демонстрирует импорт прайс-листа, у которого в колонке "остаток" символами "Х" обозначено наличие товара на складе. Символ "-" и пустая колонка означают отсутствие товара на складе. Задача - для позиций со статусом "Х" занести в колонку остаток значение "мало", для "ХХ" - "достаточно", для "ХХХ" - "много". Для позиций со статусом "-" и пустым значением колонки занести в колонку остаток значение "нет":

Дополнительный пример формирования собственного значения для колонки "остаток"

Данный пример демонстрирует импорт прайс-листа, у которого в колонке "остаток" содержится числовое количество товара на складе. Задача - для позиций с количеством остатка от 1 до 10 занести в колонку остаток значение "мало", для диапазона от 11 до 50 - "достаточно", от 50 и выше - "много". Для позиций с количеством остатка "0" и пустым значением колонки занести в колонку остаток значение "нет":

Пример преобразования категории в наименование по ее коду

Данный пример демонстрирует импорт прайс-листа, у которого в колонке "группа" содержится ее код, а расшифровка названия категории находится на другом листе прайса. Коды категории следующие: 1-"Комплектующие", 2-"Серверы", 3-"Рабочие станции",4-"Компьютеры",5-"Ноутбуки",6-"Мониторы",7-"Принтеры и МФУ" и т.д. Задача - вместо кода категории импортировать ее наименование. Для того, чтобы сопоставить коду категории ее наименование, с помощью команды замены символов STRTRAN нужно избавиться от слова "Группа", оставив только код:

Яндекс.Метрика