Когда мы научились создавать таблицы баз данных, дополнительные пункты меню, мы можем начинать разрабатывать полноценный программный код, который может использоваться в бухгалтерии или складском учете.
В этой статье мы попробуем создать простой справочник.
Для начала нам необходимо поставить конкретную задачу. Например, на каждом предприятии есть компьютеры. В первом приближении характеристикой компьютера (для предприятия) являются его название (марка) и пользователь, который за ним работает. Наша задача – создать такой реестр компьютеров, который бы отображал эти данные.
Для реализации этой задачи нам необходимо создать соответствующую таблицу в базе данных, организовать алгоритм ее просмотра, заполнения и редактирования. После окончания мы получим полноценный справочник и сможем его использовать в учете.
Начнем...
Создание таблицы. Определим, какие поля нам необходимы. Во первых, номер компьютера. Назовем поле 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 – название этого поля.
Про другие способы заполнения мы поговорим позже в следующих статьях.
- <script language="JavaScript" src="e_computer.js" /> - подключает к файлу формы файл обработки событий на форме.
Содержание этого файла приведено в Листинге 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 внести код со справочника аналитики, другое поле автоматически заполнится текстом, который соответствует этому коду.
- Функция fillObject(m) отвечает за сохранение документа. Думаю, несложно понять ее содержимое...
- Осталось добавить пункт меню. Открываем файл DpMenu.xml.
- Находим строку:
-
-
<menu ua="Довідники" ru="Справочники">
Эта строка описывает начало пункта меню «Справочники».
Выбираем пункт меню, после которого хотим добавить новый пункт, и описываем его:
-
-
<item ru="Справочник компьютеров" ua="Довідник компютерів" filter="uos" type="l" command="l_computer.js" />
-
Атрибут filter описывает подсистему, в которой данный пункт будет доступен, атрибут type указывает на тип выводимой информации (l – список, d – диалог, s – системная команда), в атрибуте command указывается файл или команда, который будет запущен при выборе данного пункта.