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 ; ^
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты