Таблица из базы данных
Существует типичная операция просмотра таблицы базы данных:
меньшее количество записей демонстрируется в браузере, большее количество записей все еще не запрошено с базы данных.
Введем html-элемент dialogue, демонстрирующий записи таблицы базы данных
с полосой прокрутки по правому боку
(чтобы таблица базы данных демонстрировалась именно в таком виде,
а не в виде дерева или куба,
свойство type должно быть равно record).
В атрибуте roll укажем название таблицы базы данных
<dialogue roll="A"/>
dialogue {
type: record;
}
или SQL-запрос
<dialogue roll="select * from A where a15=100"/>
dialogue {
type: record;
}
а в свойствах
- address - доменное имя или IP-адрес СУБД
(по умолчанию тот же адрес, откуда взят html-документ)
- size - количество одновременно демонстрируемых записей (т.е. длину html-элемента)
- type=record
Связь с базой данных будет происходить по отдельному TCP-порту по протоколу SQL5.
Когда браузер встречает этот html-элемент в процессе загрузки документа, он:
Примечание: поле представления (view) A ссылается на ту же самую колонку некой таблицы C,
на которую ссылается поля таблицы B, вошедшее в представление.
Отображаемые значения демонстрируются так:
Если пользователь нажмет "стрелку-вниз" на последней полученной записи, то браузер запросит cледующую порцию запросом
select * from A downward a1="v50_1" a2="v50_2" a3="v50_3" limit 50;
Если пользователь нажмет "стрелку-вверх" на первой вновь полученной записи,
то браузер запросит предыдущую порцию (которая могла быть уже изменена в базе данных)
select * from A upward a1="v100_1" a2="v100_2" a3="v100_3" limit 50;
Если пользователь пытается ввести значение в ссылающееся (на какую-то главную таблицу) поле,
то появляется новое отдельное окно браузера с содержимым главной таблицы
(пользователь должен выбрать запись главной таблицы).
Если пользователь добавит новую запись и заполнит все ее обязательные ячейки
(которые известны из схемы базы данных), а затем подождет время, равное двойному щелчку мыши,
то браузер немедленно сохранит добавленную строку.
Если пользователь изменит запись, а затем подождет время, равное двойному щелчку мыши,
то браузер немедленно сохранит новый варианты записи.
Если пользователь удалит запись (кнопкой
"Dell" в меню браузера), то браузер удалит ее в СУБД.
Каждый 1-ый щелчек на заголовке столбца приказыет запросит в базе данных порцию записей,
отсортированных по возрастанию, начиная с текущей записи.
Каждый 2-й щелкек - по убыванию.
Отображение столбцов
CSS может сделать некоторые колонки неотображаемыми
dialogue §a2 {
display: none;
}
Колонки таблицы отображаются в соответствии с CSS, определенным для них.
Свойства колонок могут быть равны не только константам (как это в CSS сейчас), но и значениям других колонок
(в качестве значения свойства нужно указать имя xml-аттрибута, предварив его знаком "§").
dialogue §a3 {
color: §a4;
font: §a5;
}
Для каждого столбца свойство header указывает заголовок столбца
(по умолчанию заголовок равен названию поля в базе данных).
dialogue §a3 {
header: "column header"
}
Нижеследующее значение свойства path означает,
что "C" есть главная таблица для таблицы "B", "B" есть главная таблица для поля "§a2",
и что браузер визуализирует в отдельном окне сначала содержимое таблицы "C"
чтобы выбрать под-набор таблицы "B"
(т.е. записи таблицы "B", которые ссылаются на выбранную запись таблицы "C").
dialogue §a2 {
path: B C;
}
Поля текущей записи (на которой стоит курсор пользователя) могут быть задублированы в input
-
input
должны иметь то же самое значение атрибута roll,
что и dialogue,
а в атрибуте value
должны содержать имена xml-аттрибутов
(при этом их атрибут type
игнорируется, т.к. определяется схемой базы данных).
Изменения, внесенные в текущую запись, отображаются и в input
;
изменения, внесенные в эти input
, отображаются и в текущей записи.
<dialogue roll="A"/>
<input roll="A" value="a1">
<input roll="A" value="a2">
<input roll="A" value="a3">
Если главная и подчиненная таблицы отображаются в двух dialogue одного html-документа,
то в подчиненной демонстрируются только записи, ссылающиеся на текущую запись главной таблицы.
<dialogue roll="M"/>
<dialogue roll="S"/>
Если главная и несколько подчиненных таблиц отображаются каждая в отдельном dialogue
одного и того же html-документа,
то в подчиненной демонстрируются только записи, ссылающиеся на текущие записи главных таблиц.
<dialogue roll="M1"/>
<dialogue roll="M2"/>
<dialogue roll="M3"/>
<dialogue roll="S"/>
Если подчиненная таблица несколькими своими полями ссылается на главную таблицу, то
аттрибут influence главной dialogue указывает
значение атрибута id
подчиненной dialogue,
а аттрибут to главной dialogue указывает
название колонки подчиненной таблицы базы данных.
<dialogue roll="M" to="s3"/>
<dialogue roll="M" to="s5"/>
<dialogue roll="M" to="s7"/>
<dialogue roll="S"/>
<dialogue roll="M" influence="id1" to="s3"/>
<dialogue roll="S" id="id1"/>
<dialogue roll="S" id="id2/>
Кроме того, в главной таблице можно указать дополнительные виртуальные колонки,
свойство cultivate которых будет содержать имя подчиненной таблицы,
а свойство to - ссылающееся поле подчиненной таблицы.
Если пользователь щелкнет на ячейке такой виртуальной колонки,
появляется новое отдельное окно браузера с теми записями подчиненной таблицы, которые ссылаются на запись главной
(чтобы увидеть все записи подчиненной таблицы, нужно нажать кнопку
"All" в меню браузера).
dialogue §m20::after { cultivate:S; to:s5 }
dialogue §m20::after::after { cultivate:SS; to:ss8 }
dialogue §m20::after::after::after { cultivate:SSS; to:sss7 }
Свойство to необязательно, если только одно поле в подчиненной таблице ссылается на главную таблицу.
dialogue §m20::after {
cultivate: S;
}
P.S.
dialogue с любым значением свойства type
(равным record, tree, или cube)
может быть главным html-элементом для
dialogue также с любым значением свойства type.
Сам html-документ, запросы от всех dialogue, содержащихся в нем,
ответы на запросы идут последовательно по одному и тому же TCP-соединению
(ответы разделены друг от друга и от html-документа баментом
<?new/?>,
ответы приходят после окончания получения html-документа).
Тюрин Дмитрий