Когда мы научились создавать таблицы баз данных, дополнительные пункты меню, мы можем начинать разрабатывать полноценный программный код, который может использоваться в бухгалтерии или складском учете.
В этой статье мы попробуем создать простой справочник.
Для начала нам необходимо поставить конкретную задачу. Например, на каждом предприятии есть компьютеры. В первом приближении характеристикой компьютера (для предприятия) являются его название (марка) и пользователь, который за ним работает. Наша задача – создать такой реестр компьютеров, который бы отображал эти данные.
Для реализации этой задачи нам необходимо создать соответствующую таблицу в базе данных, организовать алгоритм ее просмотра, заполнения и редактирования. После окончания мы получим полноценный справочник и сможем его использовать в учете.
Начнем...
Создание таблицы. Определим, какие поля нам необходимы. Во первых, номер компьютера. Назовем поле FNOM и сделаем его текстовым длиной 14 символов (на случай ввода инвентарного номера). Во-вторых, название компьютера – поле FNAME, текстовое длиной 20 символов. И в-третьих, пользователь – поле FUSER. Поскольку существует справочник аналитики „Персонал”, то значение поля мы будем брать из этого справочника. Поэтому тип этого поля сделаем long.
Теперь в папке usrSTRU создадим xml-файл з названием CompStru.xml. Содержимое этого файла приведено в Листинге 1.
Листинг 1
<?xml version="1.0" encoding="UTF-8"?> <STRU> <TABLES> <table attr="" path="cl_mdb" pattern="CL_COMPUTER" sys="ADM" table=" CL_COMPUTER"></table> </TABLES> <PATTERNS> <CL_COMPUTER> <PARENTS> <PARENT pattern="FWIDPARENT"/> </PARENTS> <FIELDS> <FNOM type="longtext"/> <FNAME type="longtext"/> <FUSER type="long"/> <FREM type="longtext"/> <FWID type="counter"/> </FIELDS> </CL_COMPUTER> </PATTERNS> </STRU>
Проведем обновление структур БД и проверим создалась ли необходимая таблица. Как это сделать читайте в статье „Создание базы данных и программ ее просмотра”.
Буква l (от list) в начале названия файла означает то, что файл предназначен для ПРОСМОТРА таблицы, а e (от edit) – для редактирования и заполнения. Поэтому в дальнейшем мы будем придерживаться именно такого порядка наименования файлов. Это облегчит работу ваших коллег, которые после вас будут „разгребать” ваши программы.
Файл l_computer.xml. Этот файл создается на основе формата xml-grid. Давайте создадим файл l_computer.xml в папке XMLGrid и запоним его текстом из Листинга 2.
Листинг 2
<?xml version="1.0" encoding="UTF-8"?> <grid OnePageMode="true"> <page> <field text="Номер|Номер" field="FNOM" width="14"/> <field text="Назва(марка)|Название(марка)" field="FNAME" width="20"/> <field text="Користувач|Пользователь" field="FUSER" width="20"/> <field text="Примітка|Примечание" field="FREM" width="30"/> </page> </grid>
Файл l_computer.js. Этот файл создается на основе формата xml-grid. Давайте создадим файл l_computer.js в папке Scripts и запоним его текстом из Листинга 3.
Листинг 3
var isZaval; function listLoad() { with(this) { title = "Довідник комп`ютерів|Справочник компьютеров"; //заголовок списка editTask = "e_computer.xml"; //форма редактирования записи xmlGridFile = "l_computer.xml"; //описание списка для вывода printLabel = "comp"; //метка для печати } } function listSrc() { this.qrySet( "From", "^CL_COMPUTER", "Order", "FNOM" ); } include ("sys\\DpList.js");
В функции listLoad() мы передаем title – заголовок нашего списка, xmlGridFile – имя xml-файла, в котором описан формат вывода списка, editTask – имя файла-формы для редактирования списка и printLabel – параметр для печати списка.
В функции listSrc() с помощью метода this.qrySet описывается таблица, из которой берутся данные для вывода в список.
include ("sys/DpList.js")
В конце ОБЯЗАТЕЛЬНО необходимо подключить файл DpList.js — главный скрипт, который запускает список.
Обратите внимание на такую строку в фукнции listLoad():
editTask = "e_computer.xml"; //форма редактирования записи
editTask – В этой переменной указывается файл, который отвечает за форму редактирования. В этом файле находится описание формы, а обработка события описана в файле (который „привязывается” к форме) с расширением *.js. Файл формы описывается на основе XMLForm.
В нашем случае это содержимое этого файла описано в Листинге 4.
Листинг 4
<?xml version="1.0" encoding="UTF-8"?> <Form> <Controls col="3"> <Label text="Номер компютера|Номер компьютера" /> <TextField ID="FNOM" width="80" colspan=”2”/> <Label text="Марка компютера|Марка компьютера" /> <TextField ID="FNAME" width="80" colspan=”2”/> <Label text="Користувач|Пользователь" /> <TextField ID="FUSER" width="25" /> <TextField ID="FUSER_TXT" width="100" /> <Label text="Примітка|Примечание" /> <TextField ID="FREM" width="200" colspan=”2”/> </Controls> <script language="JavaScript" src="e_computer.js" /> <script language="JavaScript" src="sys\DpBaseDlg.js"/> </Form>
Рассмотрим позиции в приведенном коде.
<Controls col="3"> - указывает на то, что элементы управления будут размещены в три столбца (значение переменной col). Таких групп может быть несколько. При этом, значения переменной col могут быть разными. То, что находится в теле этого тега, размещается на форме по следующему правилу: один объект – одна ячейка. Если задействована переменная colspan, то данный объект займет количество ячеек, которое равно значению параметра colspan. Когда количество ячеек достигнет значения col, то будет создана новая строка, и т.д.
<Label text="Номер компютера|Номер компьютера" /> - создаем тексттовую метку.
<TextField ID="FNOM" width="80" colspan=”2”/> - добавляем текстовое поле. Параметр ID – название этого поля.
Про другие способы заполнения мы поговорим позже в следующих статьях.
Содержание этого файла приведено в Листинге 5.
Листинг 5
include("sys\\mask.js"); include("Objects\\DpCl.js"); function Load() { Caption(ru("Довідник компютерів","Справочник компьютеров")+":"+ modeName(extPar.mode)); this.tbl=extPar.tblSrc; //инициализация таблицы, которую мы редактируем //описание масок ввода/вывода: FNOM.mask='&&&&&&&&&&&&&&&&&&'; FNAME.mask='&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&'; FREM.mask='&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&' scl = new DpCl("0"); // користувач scl.setClcl(getPar("CODPERS")); scl.linkCtrl(FUSER, FUSER_TXT); //extPar – входящие параметры, //extPar.mode – режим редактирования (добавление, копирование, правка) if (extPar.mode == "EDIT" || extPar.mode == "COPY") { FNOM.value=this.tbl.getValue("FNOM"); FNAME.value=this.tbl.getValue("FNAME"); scl.setCod(this.tbl.getValue("FUSER")); FREM.value=this.tbl.getValue("FREM"); } } function fillObject(m) { m.FNOM = FNOM.value; m.FNAME = FNAME.value; m.FUSER = FUSER.value; m.FREM = FREM.value; }
Первые два рядка подключают файлы mask.js и DpCl.js. Мы будем использовать их для создания масок для полей (первый) и связи полей формы со справочником аналитики (второй). Я рекомендую пересмотреть их содержимое.
Функция Load() вызывается, когда форма становится видимой. Я сознательно пропускаю описание некоторых функций. Остановлюсь только на использовании объекта DpCl().
scl = new DpCl("0"); - этой командой мы создаем сам объект.
scl.setClcl(getPar("CODPERS")); - этой командой ми привязываем созданный объект к справочнику аналитики. Как параметр используется номер справочника. С помощью функции getPar мы получаем значение параметра "CODPERS", где хранится номер справочника „Персонал”.
scl.linkCtrl(FUSER, FUSER_TXT); - после использования этой команды два поля (FUSER, FUSER_TXT) станут „связанными”, то есть, когда в поле FUSER внести код со справочника аналитики, другое поле автоматически заполнится текстом, который соответствует этому коду.
<menu ua="Довідники" ru="Справочники">
Эта строка описывает начало пункта меню «Справочники».
Выбираем пункт меню, после которого хотим добавить новый пункт, и описываем его:
<item ru="Справочник компьютеров" ua="Довідник компютерів" filter="uos" type="l" command="l_computer.js" />
Атрибут filter описывает подсистему, в которой данный пункт будет доступен, атрибут type указывает на тип выводимой информации (l – список, d – диалог, s – системная команда), в атрибуте command указывается файл или команда, который будет запущен при выборе данного пункта.
Ссылки:
[1] /sites/all/modules/pubdlcnt/pubdlcnt.php?file=http://www.debet.kiev.ua/sites/default/files/Cl_Create_ru.doc&nid=156