Руководство разработчика

Функция БД_РЕДАКТОР

Функция БД_РЕДАКТОР используется для организации возможности работы со справочниками и редактирования DBF-файлов.

Обращение к функции БД_РЕДАКТОР может осуществляться как для безымянной базы данных, определенной в Инфо-Бухгалтере по умолчанию, так и по имени объекта База данных или База данных с поддержкой SQL.

Можно задавать свой заголовок окна просмотра, если он опущен, то используется заголовок "Редактирование данных".

Может использоваться список полей, которые будут показаны. При его отсутствии показываются все поля.

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

Функция БД_РЕДАКТОР по сути является расширенной версией функции БД_ВЫБОР.

ФУНКЦИЯ ТИП_ЧИСЛО: БД_РЕДАКТОР[ (
    [имя объекта,] 
    [заголовок,] 
    [ 
        [*] [%] имя_поля_1 [:название_1 [:длина_1 [[:] (обработчик_поля_1) ] ] ] 
        [, ... ]
      или
        СТОЛБЦЫ(имя_набора)
        [, идентификатор_обработчика_1: (обработчик_поля_1) ]
        [, ... ]
    ]
    [, номер] 
    [, редактирование [, добавление [, удаление [, ред_при_выборе] ] ] ] 
    [, [обработчики событий] ]
    [; имя_доп_парам_1 = знач_доп_парам_1 [; имя_доп_парам_2 = знач_доп_парам_2 [; ... ]]]
) ]

Параметры

имя объекта
Идентификатор объекта База данных или База данных с поддержкой SQL.
заголовок
Заголовок окна выбора.
*
Поле, по которому осуществляется поиск (может присутствовать только у одного поля).
%
Указанное поле имеет атрибут "Только для чтения".
имя_поля_n
Имя n-го DBF-поля.
название_n
Название n-го поля в таблице (заголовок столбца).
длина_n
Длина n-го поля в таблице (ширина столбца). Отрицательное значение позволяет не отображать данное поле и не проверять его наличие в таблице.
обработчик_поля_n
Функция-обработчик n-го поля в диалоге редактирования записи. Синтаксис см. ниже.
имя_набора
Имя глобального набора столбцов, который может формироваться во время выполнения. См. функцию БД_ДОБАВИТЬ_СТОЛБЕЦ.
идентификатор_обработчика_n
Строковый идентификатор, по которому функции обработчики соотносятся с динамически определенными столбцами из глобального именованного набора.
номер
Номер записи, на которую устанавливается курсор таблицы при запуске функции (по умолчанию 1).
редактирование
Выражение логического типа, разрешающее редактировать значения полей записей базы данных по клавише F4 (по умолчанию ДА).
добавление
Выражение логического типа, разрешающее добавлять новые записи в базу данных по клавише F7 (по умолчанию ДА).
удаление
Выражение логического типа, разрешающее удалять записи из базы данных по клавише F8 (по умолчанию ДА).
ред_при_выборе
Выражение логического типа, указывающее на необходимость редактирования записи по клавише Enter или левому клику мыши. ДА – при выборе происходит редактирование записи. НЕТ – при выборе происходит закрытие окна с таблицей записей, как при нажатии на кнопку "ОК". По умолчанию НЕТ. Если указан дополнительный параметр перекл_выбора равный ДА, то этот режим пользователь может переключить в контекстном меню, а параметр ред_при_выборе задает начальное значение.
имя_доп_парам_n
Имя n-го дополнительного параметра.
Внимание! Из соображений синтаксической однозначности дополнительные параметры отделяются от остальных параметров и между собой точкой с запятой, а не запятой. Всего может быть указано не более 255 параметров.
Поддерживаются следующие параметры:
  • сообщение – текстовое сообщение, которое отображается над таблицей (строка);
  • справка – ссылка на файл справки или команда Инфо-Навигатора (строка);
  • кол_строк – количество видимых строк от 5 до 50, по умолчанию 15 (число);
  • перекл_выбора – при значении ДА позволяет пользователю переключать режим выделения, в контекстное меню добавляется опция "Режим выделения" (логика);
  • нач_действие – определяет действие при открытии окна: "add" - добавление записи, "edit" - редактирование тек. записи, "delete" - удаление тек. записи (строка);
  • яч_курсор – при значении ДА включает режим перемещения курсора по ячейкам, а не по целым строкам, что позволяет манипулировать выбором столбца;
  • нач_столбец – имя столбца (поля) для начального выбора в режиме перемещения курсора по ячейкам;
  • высота_таб_полей – количество видимых строк в таблице полей от 1 до 50, по умолчанию 10 (число);
  • ширина_имени_поля – ширина столбца "Поле" в таблице полей в символах от 1 до 255, по умолчанию 15 (число);
  • ширина_знач_поля – ширина столбца "Значение" в таблице полей в символах от 1 до 255, по умолчанию 35 (число);
  • врем_только_чтение – при значении ДА переводит редактор в режим "только чтение", если отображаемая выборка записей является временной таблицей (возможно в памяти). Проверить, что выборка является временной можно вызовом метода ТИП_SQL.ВРЕМЕННАЯ. В режиме "только чтение" игнорируются значения логических параметров "редактирование", "добавление", "удаление". Все действия по изменению записей выборки становятся запрещены (недоступны пункты меню). Если этот параметр не указан или равен НЕТ, то возможности изменения временной выборки сохраняются. При этом изменения исходных данных не происходит и все изменения во временной выборке будут потеряны при закрытии объекта ТИП_SQL.
  • @<имя> – пользовательский параметр любого типа, который можно считать из функций-обработчиков с помощью функции РЕД_ПОЛЕ. Подробнее о типах пользовательских параметров см. Замечание 4.
  • @@ – динамический список пользовательских параметров. Подробнее см. Замечание 4.
знач_доп_парам_n
Значение n-го дополнительного параметра (выражение соответствующего имени параметра типа).

Замечание 1: в демонстрационной версии функция БД_РЕДАКТОР отображает не более 300 первых записей. При большем количестве записей добавление новых запрещено.

Замечание 2. При указании дополнительного параметра перекл_выбор пользователь может изменять режим выделения в контекстном меню во время работы с таблицей. Чтобы организовать запоминание выбранного режима необходимо:

  1. После выхода из функции БД_РЕДАКТОР вызвать функцию АТРИБУТ с параметром "посл_ред_при_выборе". Значение "ДА" соответствует включенной опции "Режим выделения".
  2. Запомнить это значение, например в каком-нибудь файле.
  3. При последующем вызове сходного БД_РЕДАКТОР передать запомненное значение как параметр ред_при_выборе.

Замечание 3. При указании дополнительного параметра яч_курсор пользователь может изменять текущий столбец. После выхода из функции БД_РЕДАКТОР по ОК, узнать какой столбец был выбран можно с помощью функции АТРИБУТ с параметром "посл_ред_столбец". В обработчиках имя текущего столбца (поля) можно получить вызовом функции РЕД_ПОЛЕ("#ТЕК_СТОЛБЕЦ"). Для столбца номера записи (N) возвращается пустая строка. Переместить курсор на указанный столбец можно вызовом функции УСТ_РЕД_ПОЛЕ("#ТЕК_ПОЗ", <имя столбца>).

Замечание 4. Пользовательский параметр может быть одного из простых типов (строка, число, ...) или быть списком (ТИП_СПИСОК).

Список может указываться с именованным параметром, тогда добавляются параметры с именами <имя>N, где N - номер строки списка от 1. Типом таких параметров будет "строка", а значениями - строки списка. Например, есть переменная типа список "сп", содержащая 3 элемента "RUB", "USD" и "EUR". Укажем при вызове БД_РЕДАКТОР @валюта = сп, тогда создадутся 3 параметра: "валюта1" со значением "RUB", "валюта2" со значением "USD" и "валюта3" со значением "EUR". Для получении значения параметра функцией РЕД_ПОЛЕ надо указывать имя с учетом индекса, например "валюта2". Такой режим использования списков может быть полезным при передаче наборов однородных параметров. Можно передавать несколько списков с разным именем-перфиксом.

Другая возможность передать динамический список параметров - это использование безымянного списка @@. Например, есть переменная типа список "сп", задаем ее как безымянный параметр: @@ = сп. В элементах такого списка необходимо указать имя параметра, знак "=" и значение, например "город = Москва". Все формируемые таким способом параметры имеют строковый тип. Пробелы справа, слева и вокруг = игнорируются. Для получения значения параметра функцией РЕД_ПОЛЕ задается имя, указанное перед "=", например РЕД_ПОЛЕ("город") вернет значение "Москва". Можно указывать несколько безымянных списков, в этом случае параметры добавляются также, как если бы были указаны в одном списке.

Замечание 5. Для получения списка имен пользовательских дополнительных параметров из функций-обработчиков можно вызвать функцию СПИСОК_АТРИБУТОВ с параметром "бд_ред_параметры". При этом возвращаются все имена, как для одиночных значений, так и заданые элементами списков.


Поддерживается два способа определения списка столбцов (полей). Первый способ – это явное перечисление описаний столбцов в параметрах функции БД_РЕДАКТОР. Этот способ простой и наглядный, но имеет тот недостаток, что список полей должен быть известен заранее. Второй способ использует глобальные именованные наборы столбцов, которые могут формироваться динамически во время выполнения. Для применения второго способа используется ключевое слово СТОЛБЦЫ, внутри скобок которого указывается имя необходимого набора столбцов. Т.к. в режиме компилятора необходимо на этапе компиляции знать все потенциально вызываемые функции, то обработчики полей задаются тут же, в параметрах функции БД_РЕДАКТОР после ключевого слова СТОЛБЦЫ. Их связь в с динамическими определениями столбцов из набора происходит при вызове функции БД_РЕДАКТОР по строковому идентификатору обработчика. См. Пример 6.

Для работы с глобальными именованными наборами столбцов есть следующие функции:

Для получения списка имен полей (столбцов) из функций-обработчиков можно вызвать функцию СПИСОК_АТРИБУТОВ с параметром "бд_ред_поля".


Синтаксис обработчика поля:

(имя_библиотеки, имя_функции[(имя_типа)] [, доп. параметры])
имя_библиотеки,имя_функции
Строковые константные выражения.
имя_типа
Должно быть одним из трех типов: ТИП_СТРОКА, ТИП_ЧИСЛО или ТИП_ДАТА. По умолчанию, при отсутствии явной установки типа, устанавливается ТИП_СТРОКА
доп. параметры
При описании обработчика со строковым идентификатором этот параметр не поддерживается. Есть возможность запрета ручного ввода в функции БД_РЕДАКТОР. Для этого в описателе поля внутри круглых скобок после указания имени библиотеки и имени функции (возможно, с типом аргумента) следует строка дополнительных параметров:
"п" (подстановка)
Разрешает авто-подстановку при пустом значении.
"з" (запрет)
Запрещает ручной ввод.
"о" (отключен)
Отключает использование обработчика. При редактировании поля нет кнопки вызова функции.

Также имеется механизм пользовательской проверки данных при добавлении, сохранении и удалении записей в функции БД_РЕДАКТОР. Для этой цели могут задаваться функции-обработчики добавления, изменения и удаления. Функция-обработчик возвращает логическое значение. При возврате обработчиком значения НЕТ, сохранение данных не производится, а закрытие/переход к другой записи диалога предотвращаются.

Также обработчик принимает параметр-переменную строкового типа, которая в текущей реализации никак не используется. Обработчики задаются после всех параметров БД_РЕДАКТОР, т.е. в самом конце, но перед закрывающей скобкой. Их список заключен в квадратные скобки. Обработчики в списке разделяются запятыми.

Синтаксис задания обработчика:

тип_обработчика:(имя_библиотеки,имя_функции[(имя_типа)])
тип_обработчика
Идентификатор: И – проверка изменения, Д – проверка добавление, У – удаление, Н – перед добавлением, П – перед изменением, А – замена диалога добавления, М – замена диалога изменения, В – обработчик выделения записи, Ж – обработчик множественного выделения записей, Ф – обработчик редактирования фильтра, С – обработчик редактирования сортировки.
имя_библиотеки,имя_функции
Строковые константные выражения.
имя_типа
Должно быть одним из трех типов: ТИП_СТРОКА, ТИП_ЧИСЛО или ТИП_ДАТА. По умолчанию, при отсутствии явной установки типа, устанавливается ТИП_СТРОКА

Замечание 1: в идентификаторе типа обработчика могут присутствовать другие буквы, но значение имеет только первая. То есть вместо И, Д, У, Н, П, А, М, В и Ж можно использовать, например: Изм, Доб, Уд.

Замечание 2. Обработчик выделения записи вызывается только при значении параметра ред_при_выборе равном ДА или включении соответствующего режима в контекстном меню (команда "Режим выделения").

Замечание 3. Обработчик множественного выделения записей (Ж) вызывается при выборе команд контекстного меню "Выделить все" и "Сброс выделения". Эти команды появляются и становятся доступными в меню при указании данного обработчика. Функция-обработчик должна иметь один параметр ПЕРЕМ ТИП_ЛОГИКА. Параметр используется только в качестве входного: ДА – "Выделить все", НЕТ – "Сброс выделения".

Замечание 4. При указании обработчиков редактирования фильтра (Ф) и сортировки (С) в окне добавляются кнопки "Фильтр" и "Сортировка", при нажатии на которые и происходит вызов обработчиков. Для работы с объектом базы данных функция-обработчик должна быть методом:

ФУНКЦИЯ ТИП_SQL ТИП_ЛОГИКА: <имя>(ПЕРЕМ ТИП_СТРОКА: заголовок)

Входящее значение параметра "заголовок" соответствует начальному тексту заголовка, указанного при вызове БД_РЕДАКТОР. В теле метода значение параметра "заголовок" может быть изменено. При возврате методом ДА применяется новый заголовок и обновляется таблица записей. Также заголовок может быть изменен вызовом функции УСТ_РЕД_ПОЛЕ("#ТЕК_ЗАГОЛОВОК", ...). Новая позиция в таблице после изменения фильтра или сортировки может быть указана функции УСТ_РЕД_ПОЛЕ("#ТЕК_ПОЗ", ...).

Замечание 5. В функциях-обработчиках для получения копии используемого объекта ТИП_SQL можно воспользоваться функцией SQL_ТЕК_РЕД_КЛОН.


Возвращаемое значение

Номер выбранной записи. При выходе из функции осуществляется сброс текущей записи. При нажатии на кнопку Отмена возвращает 0. Более точно определить была нажата кнопка ОК или Отмена позволяет вызоыв функции АТРИБУТ("результат_диалога").


Окно редактирования

В этом диалоговом окне осуществляется редактирование файла.

Можно осуществить поиск в таблице запись с полем, удовлетворяющим образцу, при помощи кнопки Найти или клавиш Ctrl+A. Для того, чтобы указать, по какому полю необходимо произвести поиск, необходимо кликнуть левой кнопкой мыши заголовок требуемого столбца.

Инкрементальный поиск работает по столбцу, выбранному для поиска (с вдавленным заголовком). Начальный столбец для поиска задается символом *.

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

В столбце Поле находятся имена полей выделенной строки. В столбце Значение находятся значения соответствующих полей, подлежащие редактированию.

Пример 1:

Пусть имеется файл city.dbf. Вызовем окно редактирования, где можно будет добавить новые записи и изменить существующие, а функция удаления будет заблокирована.

База = БД_ОТКРЫТЬ ("city")             // открываем базу База
н=БД_РЕДАКТОР (База, ДА, ДА, НЕТ)      // в базе можно добавлять и
                                       // редактировать записи,
СООБЩЕНИЕ ("Номер записи: "+СТР(н) )   // но нельзя удалять
База.ЗАКРЫТЬ                           // закрываем базу База

Пример 2:

бд = SQL_ОТКРЫТЬ ("mmt.dbf", DBASE)
бд.СОРТИРОВКА ("Place")
ном_зап = БД_РЕДАКТОР ( бд, "Редактирование базы данных АМТС",
    [ * "Place":"Название населенного пункта", "Code_place":
        "Код населенного пункта"],
    ДА, ДА, НЕТ)
бд.ЗАКРЫТЬ

Кроме того, существует возможность вызова библиотечных функций при редактировании поля базы данных с помощью функции БД_РЕДАКТОР. Функция должна иметь такой же интерфейс как и для графы с вызовом функции:

ФУНКЦИЯ ТИП_ЛОГИКА: имя (ПЕРЕМ ТИП_СТРОКА: имя_переменной)
ФУНКЦИЯ ТИП_ЛОГИКА: имя (ПЕРЕМ ТИП_ЧИСЛО: имя_переменной)
ФУНКЦИЯ ТИП_ЛОГИКА: имя (ПЕРЕМ ТИП_ДАТА: имя_переменной)

Если обработчик принимает тип, отличный от строки (т.е. дату или число), это нужно указать при его задании в вызове функции. Интерфейс функции должен находиться в согласовании с заданным в вызове БД_РЕДАКТОР принимаемым типом для обработчика. См. синтаксис задания обработчика.

Описание вызова может производиться для каждого редактируемого поля.

описание_поля (имя_библиотеки, имя_функции [,запрет_ручного_ввода])

Параметр запрет_ручного_ввода логического типа, по умолчанию имеет значение НЕТ. Когда же этот параметр имеет значение ДА, то пользователь может подставить значение путем вызова функции. В этом случае функция вызывается при любой попытке редактирования пустого поля.

Пример 3:

// Формульный раздел бланка
гр = SQL_ОТКРЫТЬ (ФАЙЛГР)
гр.ЗАПРОС ("SELECT * FROM '"+ФАЙЛГР+"' WHERE (kodpost='"+СЧПОСТ+"'
    OR kodpost='')
AND (nomnak='"+ном+"' OR nomnak='')")
номгр = БД_РЕДАКТОР (гр,"Введите список отгружаемых товаров
    ( Enter – Выбрать, F4 – Изм., F7 – Нов., F8 – Удл.):",
         [ "kodsch":"Код счета товара":20 ("prnak", "ТОВАР_СЧ", ДА),
         "naimsch":"Наименование товара":50 ("prnak", "НАИМ_ТОВ", ДА),
         "edsch":"Ед.Изм.":3 ("prnak.ibl", "ЕД_ТОВ", ДА),
         "st_nds":"Ст.НДС":5,
         "ostkol":"Остаток":8 ("prnak.ibl", "ОСТ_ТОВ",ДА),
         "kol":"Количество",
         "pric":"Цена"],
         ДА, ДА, ДА)
ЕСЛИ номгр>0 ТО
    гр.ЗАПРОС ("UPDATE '"+ФАЙЛГР+"' SET datnak='"+SQL_ДАТА(датан)+"'
    WHERE kodpost=''")
    гр.ЗАПРОС ("UPDATE '"+ФАЙЛГР+"' SET kodpost='"+СЧПОСТ+"'
        WHERE kodpost=''")
    гр.ЗАПРОС ("UPDATE '"+ФАЙЛГР+"' SET nomnak='"+ном+"'
        WHERE nomnak=''")
КОНЕЦ_ЕСЛИ
гр.ЗАКРЫТЬ

//Формульный раздел библиотеки Prnak.ibl
ФУНКЦИЯ  ТИП_ЛОГИКА: ТОВАР_СЧ ( ПЕРЕМ  ТИП_СТРОКА: сч )
КОД_ТОВ=""
ЕСЛИ  сч="" ТО  // Если счет не указан, то предложить
                // по умолчанию 10 счет
сч="10"
КОНЕЦ_ЕСЛИ
сч = ВЫБОР_СЧЕТА (сч, ДА)
ЕСЛИ  СЧЕТ_СУЩ (сч)  ТО
    КОД_ТОВ = сч
    ТОВАР_СЧ = ДА
ИНАЧЕ
    ТОВАР_СЧ = НЕТ
КОНЕЦ_ЕСЛИ
// . . .

Пример 4:

бд = SQL_ОТКРЫТЬ (имя_файла)
// поле CODE можно заполнять только с помощью вызова функции МойВыбор,
// при пустом значении поля функция вызывается автоматически
//(без нажатия на кнопку)
н = БД_РЕДАКТОР ( бд, "Мой редактор",
["CODE":"Код" ("my.ibl", "МойВыбор"(ТИП_СТРОКА), "ПЗ"),
    %"COMMENT":"Название",
    "PRICE":"Цена"],
    ДА, ДА, ДА, ДА )
бд.ЗАКРЫТЬ

Пример 5:

бд = SQL_ОТКРЫТЬ (имя_файла)
н = БД_РЕДАКТОР (бд, "Мой редактор",
    ["CODE":"Код" ("my.ibl","МойВыбор"(ТИП_СТРОКА), "ПЗ"),
    %"COMMENT":"Название",
    "PRICE":"Цена"],
    ДА, ДА, ДА, ДА,
    [
       Изм: ("my.ibl", "МояПроверка"),
       Доб: ("my.ibl", "МояПроверкаНовой"),
       Уд:    ("my.ibl", "МойВопросОбУдалении")
    ] )
бд.ЗАКРЫТЬ

Функции МояПроверка, МояПроверкаНовый и МойВопросОбУдалении должны иметь следующий вид:

ФУНКЦИЯ ТИП_ЛОГИКА: имя_функции (ПЕРЕМ ТИП_СТРОКА: стр)

События проверки полей записи вызываются после нажатия пользователем кнопки "Ок", но до записи в базу данных.

При замене диалогов добавления или изменения все проверки (до и после) должны выполняться самостоятельно, в обработчике замены диалога. При этом обработчики "перед" и обработчики проверки не вызываются, даже если указаны. Обработчик удаления заменяет стандартный вопрос об удалении записи № такой-то.

События замены диалогов возвращают логическое значение:

ДА
Выполнить действие с записью в базе данных (добавление, изменение или удаление – в зависимости от того, какое событие).
НЕТ
Действие отменено по тем или иным причинам, никаких изменений в базу данных не вносится.

Замечание: для доступа к полям сохраняемой или удаляемой записи используется функция РЕД_ПОЛЕ.

Для функции БД_РЕДАКТОР существуют события ПередДобавлением и ПередИзменением. События позволяют проанализировать данные новой или изменяемой записи до их модификации пользователем (с помощью функции РЕД_ПОЛЕ), а также самостоятельно модифицировать данные в буфере редактируемой записи (с помощью функции УСТ_РЕД_ПОЛЕ).

Если обработчик возвращает НЕТ, то модификации буфера записи отменяются, а пользователь увидит запись в режиме "только чтение". При этом все равно при нажатии кнопки "ОК" или переходе к следующей записи будет вызван обработчик Изменение.

В качестве обработчика должна использоваться функция следующего вида:

ФУНКЦИЯ ТИП_ЛОГИКА: имя (ПЕРЕМ ТИП_СТРОКА: стр)

Синтаксис задания обработчиков ПередДобавлением и ПередИзменением такой же как для других обработчиков.

"Н", "Нач" и т.п. с буквы Н
ПередДобавлением (Начальное состояние).
"П", "Перед" и т.п. с буквы П
ПередИзменением.

Замечание: обработчик Удаление вызывается перед удалением записи, т.е. необходимости в специальном обработчике ПередУдалением нет.

Пример 6:

Использование глобального именованного набора столбцов.

бд = SQL_ОТКРЫТЬ("produkt.dbf")

Набор = "Продукты"
БД_СБРОС_СТОЛБЦОВ(Набор)
  
БД_ДОБАВИТЬ_СТОЛБЕЦ(Набор, "KOD", "Код", 0, "Ч")
БД_ДОБАВИТЬ_СТОЛБЕЦ(Набор, "NAIM", "Название", 0, "", "ОбрНазвания")
БД_ДОБАВИТЬ_СТОЛБЕЦ(Набор, "NETTO", "Вес нетто", 0, "", "ОбрВеса")
БД_ДОБАВИТЬ_СТОЛБЕЦ(Набор, "BRUTTO", "Вес брутто", 0, "", "ОбрВеса")

рез = БД_РЕДАКТОР(бд, "Список продуктов",
                  [
                    СТОЛБЦЫ(Набор),
                    "ОбрНазвания": ("DBEDIT_LIB", "ВыборНазвПродукта"(ТИП_СТРОКА)),
                    "ОбрВеса"    : ("DBEDIT_LIB", "ВыборВесаПродукта"(ТИП_ЧИСЛО))
                  ],
                  ДА, ДА, ДА, ДА)

Здесь заполняется набор столбцов с именем Продукты. Поле KOD получает опцию "Ч" – "только чтение". Для поля NAIM задается идентификатор обработчика ОбрНазвания, для полей NETTO и BRUTTOОбрВеса. Соответствующие идентификаторы обработчиков указываются в параметрах БД_РЕДАКТОР, где им сопоставляется имя библиотеки и функции.


См. также: