Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вычисляемые поля в триггерах, суммирование записей из разных таблиц  
V
    Опции темы
kat809
Дата 27.4.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Помогите пожалуйста срочно нужна помощь лузеру(((
Есть 2 таблицы DOGOVOR (...,base_price, total_price) и OTELI_TURA(...., doplata) и промежуточная между ними таблица VARIANT_TURA.  Мне нужно, чтобы в поле total_price (DOGOVOR) ссумировалось значение поля base_price (DOGOVOR) и поля doplata (OTELI_TURA).
Наверное нужно использовать триггеры??Подскажите я в этом новичок(((
ОЧЕНЬ НУЖНО, ЗАРАНЕЕ БЛАГОДАРНА!

PM MAIL   Вверх
Fortop
Дата 27.4.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Когда суммировались? Зачем суммировались?
Может и триггеры, а может и не они. Можно задачу озвучить яснее?

Получить итоговую сумму можно как минимум полудесятком способов...

Какие у тебя связи между таблицами?
И что храниться в каждой из них?

Добавлено @ 18:28
Вот пример получения итоговой суммы

Код

SELECT base_price+doplata FROM DOGOVOR
JOIN OTELI_TURA ON DOGOVOR.idotel = OTELI_TURA.id
WHERE DOGOVOR.id = 'номер какого-то договора'


Это сообщение отредактировал(а) Fortop - 27.4.2008, 18:28


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
kat809
Дата 28.4.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Может быть нужно создать поле как вычисляемое??прямо при создании таблице, там нужно использовать скрипт.
Суммировтаь нужно, чтобы при добавлении новой записи, например нового тура с определенной базовой ценой и доплатой сразу выводилась общая сумма. таблица ДОГОВОР и ОТЕЛИ ТУРА между собой напрямую не связаны, есть промежуточная таблица ВАРИАНТ ТУРА. В т.ОТЕЛИ ТУРА есть FK id_variant_tura 
и в ДОГОВОРЕ имеется точно такой же вторичный ключ, оба они ссылаются на РК (id) т.ВАРИАНТ ТУРА.
PM MAIL   Вверх
Fortop
Дата 28.4.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Может быть стоит, при добавлении договора сразу записывать общую сумму в таблицу и не мучаться с вычисляемыми полями? smile




--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
kat809
  Дата 28.4.2008, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Да, я понимаю..но хотелось бы автоматизировать....очень хотелось....а то нужно смотреть данные из одной таблицы..суммируя их с данными в другой....а препод жесткий....вот и хочется минимум вычислений самим(((
PM MAIL   Вверх
Fortop
Дата 28.4.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(kat809 @  28.4.2008,  19:39 Найти цитируемый пост)
а то нужно смотреть данные из одной таблицы..суммируя их с данными в другой....

Все эти данные в любом случае нужно будет смотреть, когда будет добавляться новый договор.

Дело в том что сумму можно вообще не хранить, а извлекать при запросе, как я показал выше.

Цитата(kat809 @  28.4.2008,  10:54 Найти цитируемый пост)
Суммировтаь нужно, чтобы при добавлении новой записи, например нового тура с определенной базовой ценой и доплатой сразу выводилась общая сумма.

У тебя при добавлении тура, договор не добавляется?
Я логики базы понять не могу - структура базы достаточно странная.
Схема ее есть?


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
kat809
  Дата 28.4.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Да из меня и проектировщик достаточно странныйс какой стороны не посмотреть(((Это все учебное...но...

Добавлено через 7 минут и 25 секунд
Просто это все начало...потом я буду пытаться создать сайт...с удаленным доступом к этой базе...и чувствую, что вычисляемые поля...это цветочки...по сравнению...чтоб будет дальше....

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  __.emf 23,70 Kb
PM MAIL   Вверх
Fortop
Дата 28.4.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Все в общем-то нормально
два замечания.
1. БАЗОВУЮ_ЦЕНУ надо перенести в ВАРИАНТЫ_ТУРА (ведь договор у каждого клиента свой)
2. ДОПЛАТА - я бы перенес в таблицу отелей
И тогда ОТЕЛИ_ТУРА не нужны и  ВАРИАНТЫ_ТУРА напрямую будут связаны с ОТЕЛИ.

А при создании договора ты в любом случае будешь читать из базы данные по отелю и по туру. И сложить 2ве цены - несложно.


Можно конечно усложнять до безобразия.
например, доплату(т.е. цену отеля) вынести в отдельную таблицу.
Код

ЦЕНА_ОТЕЛЯ - 
ИД_ОТЕЛЯ
ДАТА_НАЧАЛА_ПЕРИОДА
ДАТА_КОНЦА_ПЕРИОДА
СРОК_ПРОЖИВАНИЯ
ЦЕНА


Т.е. ЦЕНА проживания сможет меняться от времени года (месяца, и т.д.)
и срока (например 2 дня в сезон, это далеко не то же, что и 2 дня  в несезон).



Это сообщение отредактировал(а) Fortop - 28.4.2008, 20:24


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
kat809
Дата 28.4.2008, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Ок, спасибо большое за замечания))учту)))А во с еще одной таблицей заморачиваться наверное не буду...а что касается вычисления общей суммы...ее так и оставить в договоре?...и как все-таки она будет вычисляться??каим т.е. мезанизмом?...
я канеша извиняюсь..наверное вопросы тупее некуда...но просто из меня программист, как из слона балерина(((
PM MAIL   Вверх
Fortop
Дата 28.4.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Лучше ее конечно вычислять и добавлять вместе с договором.
Поскольку при составлении договора ты все равно будешь получать информацию об отеле и туре

Можно сделать поле COMPUTED но в случае если у тебя цена тура измениться, в старых договорах цены тоже пересчитаются, что не очень хорошо smile

А можно и сделать лишние телодвижения, в виде триггера, который будет делать лишний запрос и затем записывать цену при добавлении договора.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
kat809
Дата 28.4.2008, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Вот третий вариант для меня навреное самое лучшее))))Я изначально так и хотела)))Ес ди нетрудно примерчик можно?
PM MAIL   Вверх
Fortop
Дата 28.4.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



kat809, это далеко не лучший вариант smile
Вместо 1го запроса, тебе придется писать запрос и триггер smile

Вот пример простого триггера
Код

CREATE OR ALTER TRIGGER ADD_LOCATION_TIME FOR LOCATION
ACTIVE BEFORE INSERT POSITION 20
AS
BEGIN
   NEW.LAST_UPDATE_DATE = 'NOW';
END


вот пример сложного триггера
Код

CREATE OR ALTER TRIGGER ADD_PURCHASE_FROM_TEMP FOR PURCHASE_ORDER_LINE_TEMP
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE WK_FOUND INTEGER;
DECLARE VARIABLE WK_H_PERSON_ID VARCHAR(10); 
DECLARE VARIABLE WK_P_PERSON_TYPE CHAR(2);
DECLARE VARIABLE WK_P_FIRST_NAME VARCHAR(50); 
DECLARE VARIABLE WK_P_LAST_NAME VARCHAR(50); 
DECLARE VARIABLE WK_P_ADDRESS_LINE1 VARCHAR(100); 
DECLARE VARIABLE WK_P_ADDRESS_LINE2 VARCHAR(50); 
DECLARE VARIABLE WK_P_CITY VARCHAR(25); 
DECLARE VARIABLE WK_P_STATE VARCHAR(15); 
DECLARE VARIABLE WK_P_POST_CODE VARCHAR(10); 
DECLARE VARIABLE WK_P_COUNTRY VARCHAR(25);

DECLARE VARIABLE WK_H_PURCHASE_ORDER VARCHAR(10);
DECLARE VARIABLE WK_H_REQUISITION_NO VARCHAR(10) ; 
DECLARE VARIABLE WK_H_PO_DATE        TIMESTAMP ; 
DECLARE VARIABLE WK_H_PO_REVISION_NO CHAR(2) ; 
DECLARE VARIABLE WK_H_PO_STATUS      CHAR(2) ; 
DECLARE VARIABLE WK_H_COMMENTS       VARCHAR(255) ; 
DECLARE VARIABLE WK_H_PO_PRINTED     TIMESTAMP ; 
DECLARE VARIABLE WK_H_USER_ID        VARCHAR(10) ; 
DECLARE VARIABLE WK_H_COMPANY_ID  VARCHAR(20);
DECLARE VARIABLE WK_H_DIVISION_ID  VARCHAR(20);
DECLARE VARIABLE WK_H_ORDER_TYPE  CHAR(2);

DECLARE VARIABLE WK_L_PURCHASE_ORDER  VARCHAR(10);
DECLARE VARIABLE WK_L_PO_LINE         CHAR(4);
DECLARE VARIABLE WK_L_REQUISITION_NO  VARCHAR(10) ; 
DECLARE VARIABLE WK_L_PROD_ID         VARCHAR(30) ; 
DECLARE VARIABLE WK_L_PO_LINE_QTY     INTEGER ; 
DECLARE VARIABLE WK_L_UNIT_PRICE      NUMERIC(9, 3) ; 
DECLARE VARIABLE WK_L_UOM_ORDER       CHAR(2) ; 
DECLARE VARIABLE WK_L_PO_LINE_DUE_DATE TIMESTAMP ; 
DECLARE VARIABLE WK_L_PO_LINE_STATUS  CHAR(2) ; 
DECLARE VARIABLE WK_L_COMMENTS        VARCHAR(255) ; 
DECLARE VARIABLE WK_L_GST_VALUE       INTEGER ; 
DECLARE VARIABLE WK_L_GST_RATE        INTEGER ; 
DECLARE VARIABLE WK_L_GST_CODE        VARCHAR(3) ; 
DECLARE VARIABLE WK_L_LINE_CNT        INTEGER ; 
DECLARE VARIABLE WK_LEN_LABEL_NO      INTEGER; 
DECLARE VARIABLE WK_PROD_LENGTH       INTEGER;
DECLARE VARIABLE WK_PROD_FIXED        CHAR(1);
DECLARE VARIABLE WK_PURCHASE_LENGTH   INTEGER;
DECLARE VARIABLE WK_PURCHASE_FIXED    CHAR(1);
DECLARE VARIABLE WK_PURCHASE_ORDER    VARCHAR(10); 
BEGIN
   WK_H_PERSON_ID  = NEW.H_PERSON_ID;
   WK_P_PERSON_TYPE = NEW.P_PERSON_TYPE;
   WK_P_FIRST_NAME = NEW.P_FIRST_NAME;
   WK_P_LAST_NAME = NEW.P_LAST_NAME;
   WK_P_ADDRESS_LINE1 = NEW.P_ADDRESS_LINE1;
   WK_P_ADDRESS_LINE2 = NEW.P_ADDRESS_LINE2;
   WK_P_CITY = NEW.P_CITY;
   WK_P_STATE = NEW.P_STATE;
   WK_P_POST_CODE = NEW.P_POST_CODE;
   WK_P_COUNTRY = NEW.P_COUNTRY;

   WK_H_PURCHASE_ORDER = NEW.H_PURCHASE_ORDER ;
   WK_H_REQUISITION_NO = NEW.H_REQUISITION_NO ;
   WK_H_PO_DATE        = NEW.H_PO_DATE        ;
   WK_H_PO_REVISION_NO = NEW.H_PO_REVISION_NO ;
   WK_H_PO_STATUS      = NEW.H_PO_STATUS      ;
   WK_H_COMMENTS       = NEW.H_COMMENTS       ;
   WK_H_PO_PRINTED     = NEW.H_PO_PRINTED     ;
   WK_H_USER_ID        = NEW.H_USER_ID        ;
   WK_H_COMPANY_ID = NEW.H_COMPANY_ID;
   WK_H_DIVISION_ID = NEW.H_DIVISION_ID;
   IF (NEW.H_ORDER_TYPE IS NULL) THEN
   BEGIN
      WK_H_ORDER_TYPE = 'PO';
   END
   ELSE
   BEGIN
      WK_H_ORDER_TYPE = NEW.H_ORDER_TYPE;
   END

   WK_L_PURCHASE_ORDER  = NEW.L_PURCHASE_ORDER  ;
   WK_L_PO_LINE         = NEW.L_PO_LINE         ;
   WK_L_REQUISITION_NO  = NEW.L_REQUISITION_NO  ;
   WK_L_PROD_ID         = NEW.L_PROD_ID         ;
   WK_L_PO_LINE_QTY     = NEW.L_PO_LINE_QTY     ;
   WK_L_UNIT_PRICE      = NEW.L_UNIT_PRICE      ;
   WK_L_UOM_ORDER       = NEW.L_UOM_ORDER       ;
   WK_L_PO_LINE_DUE_DATE = NEW.L_PO_LINE_DUE_DATE ;
   WK_L_PO_LINE_STATUS  = NEW.L_PO_LINE_STATUS  ;
   WK_L_COMMENTS        = NEW.L_COMMENTS        ;
   WK_L_GST_VALUE       = NEW.L_GST_VALUE       ;
   WK_L_GST_RATE        = NEW.L_GST_RATE        ;
   WK_L_GST_CODE        = NEW.L_GST_CODE        ;
   /* Check person */
   WK_FOUND = 0;
   SELECT 1 FROM PERSON 
      WHERE PERSON_ID = :WK_H_PERSON_ID
      INTO :WK_FOUND;
   IF (WK_FOUND = 0) THEN
   BEGIN
      /* no person so insert it */
      INSERT INTO PERSON (PERSON_ID, PERSON_TYPE, FIRST_NAME, LAST_NAME, ADDRESS_LINE1, ADDRESS_LINE2, CITY, STATE, POST_CODE, COUNTRY )
      VALUES (:WK_H_PERSON_ID, :WK_P_PERSON_TYPE, :WK_P_FIRST_NAME, :WK_P_LAST_NAME, :WK_P_ADDRESS_LINE1, :WK_P_ADDRESS_LINE2, :WK_P_CITY, :WK_P_STATE, :WK_P_POST_CODE, :WK_P_COUNTRY);
   END
   ELSE
   BEGIN
      UPDATE PERSON  SET PERSON_TYPE = :WK_P_PERSON_TYPE, 
         FIRST_NAME = :WK_P_FIRST_NAME, 
         LAST_NAME = :WK_P_LAST_NAME, 
         ADDRESS_LINE1 = :WK_P_ADDRESS_LINE1, 
         ADDRESS_LINE2 = :WK_P_ADDRESS_LINE2, 
         CITY = :WK_P_CITY, 
         STATE = :WK_P_STATE, 
         POST_CODE = :WK_P_POST_CODE, 
         COUNTRY = :WK_P_COUNTRY 
       WHERE PERSON_ID = :WK_H_PERSON_ID;
   END
   WK_FOUND = 0;
   /* Get length for purchase */   
   SELECT MAX_LENGTH, FIXED_LENGTH
   FROM PARAM
   WHERE DATA_ID = 'PURCHASE'
   INTO :WK_PURCHASE_LENGTH, :WK_PURCHASE_FIXED;
   IF (WK_PURCHASE_LENGTH IS NULL) THEN
   BEGIN
      WK_PURCHASE_LENGTH = 0;
   END
   IF (WK_PURCHASE_FIXED IS NULL) THEN
   BEGIN
      WK_PURCHASE_FIXED = 'F';
   END
   IF (SUBSTR(WK_H_PURCHASE_ORDER,1,1) <> 'P') THEN
   BEGIN
      IF (WK_PURCHASE_FIXED = 'T') THEN
      BEGIN
         WK_PURCHASE_ORDER = WK_H_PURCHASE_ORDER;
         WK_H_PURCHASE_ORDER = 'P' ; 
         WK_LEN_LABEL_NO = STRLEN(WK_PURCHASE_ORDER) + 1 ;     
         /* Padding leading with 0 */
         WHILE (WK_LEN_LABEL_NO < :WK_PURCHASE_LENGTH) DO
         BEGIN
            WK_H_PURCHASE_ORDER= WK_H_PURCHASE_ORDER || '0';      
            WK_LEN_LABEL_NO = WK_LEN_LABEL_NO + 1;
         END
         WK_H_PURCHASE_ORDER= WK_H_PURCHASE_ORDER || WK_PURCHASE_ORDER;      
      END
   END
   WK_L_PURCHASE_ORDER = WK_H_PURCHASE_ORDER ;
   IF (NEW.L_PURCHASE_ORDER IS NULL) THEN
   BEGIN
      NEW.L_PURCHASE_ORDER = WK_L_PURCHASE_ORDER;
   END

   SELECT 1 FROM PURCHASE_ORDER
      WHERE PURCHASE_ORDER = :WK_H_PURCHASE_ORDER
      INTO :WK_FOUND;
   IF (WK_FOUND = 0) THEN
   BEGIN
      /* no order so insert it */
      INSERT INTO PURCHASE_ORDER (
         PURCHASE_ORDER, 
         REQUISITION_NO,
         PO_DATE,      
         PO_REVISION_NO,
         PO_STATUS,    
         COMMENTS,    
         PO_PRINTED, 
         USER_ID,   
         PERSON_ID,
         COMPANY_ID,
         DIVISION_ID,
         ORDER_TYPE)
      VALUES (
         :WK_H_PURCHASE_ORDER     ,
         :WK_H_REQUISITION_NO    ,
         :WK_H_PO_DATE          ,
         :WK_H_PO_REVISION_NO  ,
         :WK_H_PO_STATUS             ,
         :WK_H_COMMENTS             ,
         :WK_H_PO_PRINTED          ,
         :WK_H_USER_ID            ,
         :WK_H_PERSON_ID ,
         :WK_H_COMPANY_ID ,
         :WK_H_DIVISION_ID,
         :WK_H_ORDER_TYPE);
   END
   ELSE
   BEGIN
      UPDATE PURCHASE_ORDER SET
         REQUISITION_NO = :WK_H_REQUISITION_NO ,
         PO_DATE =     :WK_H_PO_DATE ,
         PO_REVISION_NO = :WK_H_PO_REVISION_NO  ,
         PO_STATUS =   :WK_H_PO_STATUS,
         COMMENTS =   :WK_H_COMMENTS ,
         PO_PRINTED = :WK_H_PO_PRINTED ,
         USER_ID =  :WK_H_USER_ID ,
        PERSON_ID = :WK_H_PERSON_ID ,
        COMPANY_ID = :WK_H_COMPANY_ID ,
        DIVISION_ID = :WK_H_DIVISION_ID, 
        ORDER_TYPE = :WK_H_ORDER_TYPE 
         WHERE PURCHASE_ORDER = :WK_H_PURCHASE_ORDER ;
   END
   /* Get length for product */   
   SELECT MAX_LENGTH, FIXED_LENGTH
   FROM PARAM
   WHERE DATA_ID = 'PROD_INTERNAL'
   INTO :WK_PROD_LENGTH, :WK_PROD_FIXED;
   IF (WK_PROD_LENGTH IS NULL) THEN
   BEGIN
      WK_PROD_LENGTH = 0;
   END
   IF (WK_PROD_FIXED IS NULL) THEN
   BEGIN
      WK_PROD_FIXED = 'F';
   END
   IF (WK_PROD_FIXED = 'T') THEN
   BEGIN
      WK_LEN_LABEL_NO = STRLEN(WK_L_PROD_ID) ;     
      /* Padding leading with 0 */
      WHILE (WK_LEN_LABEL_NO < :WK_PROD_LENGTH) DO
      BEGIN
         WK_L_PROD_ID = '0' || WK_L_PROD_ID ;      
         WK_LEN_LABEL_NO = WK_LEN_LABEL_NO + 1;
      END
   END

   /* do I have a po line */
   IF (WK_L_PO_LINE IS NULL) THEN
   BEGIN
      SELECT FIRST 1 PO_LINE 
      FROM PURCHASE_ORDER_LINE
      WHERE PURCHASE_ORDER = :WK_L_PURCHASE_ORDER AND
      PROD_ID = :WK_L_PROD_ID 
      INTO :WK_L_PO_LINE;
   END
   IF (WK_L_PO_LINE IS NULL) THEN
   BEGIN
      /* ok so no line - must generate one */
      SELECT COUNT(*) 
      FROM PURCHASE_ORDER_LINE
      WHERE PURCHASE_ORDER = :WK_L_PURCHASE_ORDER 
      INTO :WK_L_LINE_CNT;
      IF (WK_L_LINE_CNT IS NULL) THEN
      BEGIN
         WK_L_LINE_CNT = 0;
      END
      WK_L_LINE_CNT = WK_L_LINE_CNT + 1;
      WK_L_PO_LINE = LPAD(WK_L_LINE_CNT,'0',4);
   END
   IF (NEW.L_PO_LINE IS NULL) THEN
   BEGIN
      NEW.L_PO_LINE = WK_L_PO_LINE;
   END
   WK_FOUND = 0;
   SELECT 1 FROM PURCHASE_ORDER_LINE
      WHERE PURCHASE_ORDER = :WK_L_PURCHASE_ORDER AND
            PO_LINE = :WK_L_PO_LINE
      INTO :WK_FOUND;
   IF (WK_FOUND = 0) THEN
   BEGIN
      /* no line so insert it */
      INSERT INTO PURCHASE_ORDER_LINE (
         PURCHASE_ORDER,              
         PO_LINE,                    
         REQUISITION_NO,            
         PROD_ID,                  
         PO_LINE_QTY,            
         UNIT_PRICE,            
         UOM_ORDER,            
         PO_LINE_DUE_DATE,    
         PO_LINE_STATUS,     
         COMMENTS,          
         GST_VALUE,        
         GST_RATE,        
         GST_CODE,
         ORIGINAL_QTY)        
      VALUES (
         :WK_L_PURCHASE_ORDER,              
         :WK_L_PO_LINE,                    
         :WK_L_REQUISITION_NO,            
         :WK_L_PROD_ID       ,           
         :WK_L_PO_LINE_QTY   ,         
         :WK_L_UNIT_PRICE    ,        
         :WK_L_UOM_ORDER     ,       
         :WK_L_PO_LINE_DUE_DATE,    
         :WK_L_PO_LINE_STATUS,     
         :WK_L_COMMENTS      ,    
         :WK_L_GST_VALUE     ,   
         :WK_L_GST_RATE      ,  
         :WK_L_GST_CODE      ,
         :WK_L_PO_LINE_QTY            
 );       
   END
   ELSE
   BEGIN
      UPDATE PURCHASE_ORDER_LINE SET
         REQUISITION_NO = :WK_L_REQUISITION_NO,            
         PROD_ID =        :WK_L_PROD_ID       ,           
         PO_LINE_QTY =    :WK_L_PO_LINE_QTY   ,         
         UNIT_PRICE =     :WK_L_UNIT_PRICE    ,        
         UOM_ORDER =      :WK_L_UOM_ORDER     ,       
         PO_LINE_DUE_DATE = :WK_L_PO_LINE_DUE_DATE,    
         PO_LINE_STATUS =   :WK_L_PO_LINE_STATUS,     
         COMMENTS =         :WK_L_COMMENTS    ,      
         GST_VALUE =      :WK_L_GST_VALUE     ,   
         GST_RATE =       :WK_L_GST_RATE      ,  
         GST_CODE =       :WK_L_GST_CODE         
      WHERE PURCHASE_ORDER = :WK_L_PURCHASE_ORDER AND           
         PO_LINE =        :WK_L_PO_LINE;                    
   END
END



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Deniz
Дата 29.4.2008, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



Fortop, это не сложный а длинный триггер. Без обид.
Конструкцию типа:
Код

   SELECT MAX_LENGTH, FIXED_LENGTH
   FROM PARAM
   WHERE DATA_ID = 'PURCHASE'
   INTO :WK_PURCHASE_LENGTH, :WK_PURCHASE_FIXED;
   IF (WK_PURCHASE_LENGTH IS NULL) THEN
   BEGIN
      WK_PURCHASE_LENGTH = 0;
   END
   IF (WK_PURCHASE_FIXED IS NULL) THEN
   BEGIN
      WK_PURCHASE_FIXED = 'F';
   END
можно сделать покороче:
Код

   SELECT coalesce(p.MAX_LENGTH, 0), coalesce(p.FIXED_LENGTH, 'F')
   FROM rdb$database left join PARAM p on p.DATA_ID = 'PURCHASE'
   INTO :WK_PURCHASE_LENGTH, :WK_PURCHASE_FIXED;



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
kat809
Дата 29.4.2008, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 19.4.2008
Где: г.Белгород

Репутация: нет
Всего: нет



Я немного изменила структуру БД, не могли бы вы опятным взглядом посмотреть?)))

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  base.emf 20,74 Kb
PM MAIL   Вверх
Fortop
Дата 29.4.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: нет
Всего: 42



Цитата(Deniz @  29.4.2008,  06:22 Найти цитируемый пост)
Fortop, это не сложный а длинный триггер. Без обид.

Тебе +1 просто за то, что ты решил в нем разобраться smile 
Потому что даже я в этот код не лезу smile ему лет 8м не меньше smile и автор науке неизвестен smile

Но так как он содержит в себе INSERT, SELECT, UPDATE  smile то как пример - пойдет smile 

kat809, эк ты скрестила опыт со словом опять smile "опЯтный" ;) 
Но что ты хочешь чтобы мы рассмотрели?
Структура, в общем и целом, для учебной задачи - подойдет smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.