FIN VS
Материал из GedeminWiki
CREATE TABLE fin_vs ( /* Параметры для полей */ vskey dintkey, /* Первичный ключ */ userkey INTEGER, /* Индетификатор пользователя */ context SMALLINT, /* Контекст */ tablename dname, /* Наименование таблицы */ LANGUAGE dlanguage, /* Язык (на будущее) */ fieldname dtablename, /* Наименование поля */ fieldorder SMALLINT, /* Номер по порядку */ visible dboolean, /* Отображаемо ли поле */ displaylabel dname, /* Визуальное наименование поля */ displaywidth SMALLINT, /* Текущий визуальный размер поля */ resizeable dboolean, /* Может изменяться размер пользователем или нет */ maxwidth SMALLINT, /* Максимальная ширина колонки */ minwidth SMALLINT, /* Минимальная ширина колонки */ displayformat VARCHAR(60), /* Формат отображения поля */ alignment CHAR(1), /* Выравнивание поля */ editmask VARCHAR(60), /* Маска редактирования поля */ /* Параметры для grid-ов */ titlefontcolor dcolor, /* Шрифт заглавия */ titlefontsize INTEGER, /* Размер шрифта заглавия */ titlefontstyle CHAR(4), /* Стиль шрифта заглавия */ titlefontname dfontname, /* Название шрифта заглавия */ titlealignment CHAR(1), /* Выравнивание заглавия */ titlecolor dcolor, /* Цвет заглавия */ fontcolor dcolor, /* Цвет шрифта */ fontsize INTEGER, /* размер шрифта */ fontstyle CHAR(4), /* Стиль шрифта */ fontname dfontname, /* Наименование шрифта */ color dcolor /* Цвет колонки */ ); ALTER TABLE fin_vs ADD CONSTRAINT fin_pk_vs PRIMARY KEY (vskey); CREATE ASC INDEX fin_xvs ON fin_vs ( userkey, context, tablename ); SET TERM ^ ; CREATE EXCEPTION fin_einvalidvs "Invalid VS"^ /* Генератор ключа для fin_vs */ CREATE GENERATOR fin_g_vs^ SET GENERATOR fin_g_vs TO 2000^ /* trigger на добавление новой записи fin_vs */ CREATE TRIGGER fin_insert_vs FOR fin_vs BEFORE INSERT POSITION 0 AS BEGIN /* Генерируем новый ключ */ IF (NEW.vskey IS NULL) THEN NEW.vskey = GEN_ID(fin_g_vs, 1); /* Все названия таблиц и полей должны прописываться заглавными буквами */ NEW.tablename = g_s_ansiuppercase(NEW.tablename); NEW.fieldname = g_s_ansiuppercase(NEW.fieldname); /* Проверка на повтор одинаковых userkey, contex, tablename, fieldname */ DELETE FROM fin_vs WHERE userkey = NEW.userkey AND context = NEW.context AND tablename = NEW.tablename AND fieldname = NEW.fieldname; /* Размер шрифта не может быть отрицательным или нулевым*/ IF (NEW.fontsize < 1) THEN NEW.fontsize = NULL; /* Размер шрифта не может быть отрицательным или нулевым*/ IF (NEW.titlefontsize < 1) THEN NEW.titlefontsize = NULL; /* Если пользователь не указывает растягиваемость колонки, то по умолчанию ставим ее растягиваемой */ IF (NEW.resizeable IS NULL) THEN NEW.resizeable = 1; END^ /* trigger на изменение параметров полей fin_vs */ CREATE TRIGGER fin_update_vs FOR fin_vs BEFORE UPDATE POSITION 0 AS DECLARE VARIABLE C INTEGER; /* Служит для проверки существования одинковых параметров поля */ BEGIN /* Все названия таблиц и полей должны прописываться заглавными буквами */ NEW.tablename = UPPER(NEW.tablename); NEW.fieldname = UPPER(NEW.fieldname); /* Проверка на содержание базы полей с одинаковыми userkey, context, tablename, fieldname */ SELECT COUNT(*) FROM fin_vs WHERE userkey = NEW.userkey AND context = NEW.context AND tablename = NEW.tablename AND fieldname = NEW.fieldname INTO :C; /* Если одинаковые параметры существуют, то выдаем ошибку */ IF (:C > 1) THEN EXCEPTION fin_einvalidvs; END^ /* Данная процедура возвращает список визуальных настроек для таблиц и связанных с ними контролов по ключам userkey, context. */ CREATE PROCEDURE fin_p_vs_getvs(auserkey INTEGER, acontext INTEGER) RETURNS /* Возвращаемые данные: */ ( vskey INTEGER, /* Ключ таблицы визуальных настроек fin_vs */ exist INTEGER /* Существуют ли настройки */ ) AS DECLARE VARIABLE C INTEGER; /* Обычный счетчик */ DECLARE VARIABLE UK INTEGER; /* Userkey */ DECLARE VARIABLE CTXT INTEGER; /* context */ DECLARE VARIABLE TABLENAME VARCHAR(60); /* Наименование текущей таблицы */ BEGIN /* По порядку проходим по всем названиям таблиц или query (дополнительно, не знаю зачем, производим отсеивание одинаковых tablename) */ FOR SELECT DISTINCT tablename FROM fin_vs GROUP BY tablename INTO :tablename DO BEGIN /* Производим проверку на наличие указанного context с текущей tablename */ SELECT COUNT(*) FROM fin_vs WHERE tablename = :tablename AND context = :acontext INTO :C; IF (:C = 0) THEN CTXT = -1; /* Если tablename и context такие не существуют, то возращает контекст по умолчанию*/ ELSE CTXT = :acontext; /* Если же существует, то используем данный context */ /* Производим такую же проверку на userkey */ SELECT COUNT(*) FROM fin_vs WHERE tablename = :tablename AND userkey = :auserkey AND context = :CTXT INTO :C; IF (:C = 0) THEN UK = -1; /* Если настроек с таким userkey нет, то берем userkey по умолчанию */ ELSE UK = :auserkey; /* Если же существует, то используем данный userkey */ /* Дополнительно производим проверку на существование указанных context, userkey в параметрах процедуры */ SELECT COUNT(*) FROM fin_vs WHERE tablename = :tablename AND context = :acontext AND userkey = :auserkey INTO :C; /* Указываем существование данных с параметрами процедуры */ IF (:C = 0) THEN exist = 0; ELSE exist = 1; /* Скидываем данные в результат процедуры */ FOR SELECT vskey FROM fin_vs WHERE tablename = :tablename AND userkey = :UK AND context = :CTXT INTO :vskey DO SUSPEND; END END^ SET TERM ; ^