Ув. эксперты! Вопрос по InterBase. Требуется вызвать в триггере при вставке записи произвести изменения в других таблицах, возможно, сделать кое-какие изменения в данной таблице, НО НИЧЕГО НЕ ВСТАВЛЯТЬ. Как это реализовать? Я попробовал сделать это при помощи исключений – вначале сделать всё, что нужно, а затем вызвать исключение. Беда в том, что в этом случае происходит откат транзакции и изменения не сохраняются. Можно ли подтвердить (и как это можно сделать) текущую транзакцию прямо в тексте триггера, а только потом вызывать исключение? С уважением, Валерий
Добрый день, Lerry! Под вставкой Вы подразумеваете INSERT? В таком случае, Вы создаете триггер, который начинает работу ДО вставки новых записей: CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы BEFORE INSERT AS BEGIN <Делаете то, что Вам нужно> END На случай, если Вы решаете вставлять или не вставлять новую запись по каким-то особым признакам вновь вставляемой записи, есть переменные OLD.ИмяТаблицы и NEW.ИмяТаблицы (старая запись в таблице, новая запись, которая будет). Т.е. их можно сравнивать между собой и тогда решать, что Вам нужно сделать. Ответ отправлен: 16.02.2004, 11:43 Отправитель: sir henry
Вопрос № 1339
Здравствуйте эксперты ! Помогите пожалуйста. Никак не могу разобраться с объектами. Создаю следующий объект и все что с ним связано: const MaxOperatorsNum = 100; type TOperatorStatus = (Main,Simple); TOperatorID = class(TObject) OperatorName: String; OperatorPassword: String; OperatorStatus: TOperatorStatus; constructor Create; end; TOperatorIDFile = file of TOperatorID; TOperatorIDArray = array[1..MaxOperatorsNum] of TOperatorID; // var OperatorIDFile: TOperatorIDFile; OperatorIDArray: TOperatorIDArray; конструктор такой constructor TOperatorID.Create; begin inherited Create; end; по кнопке заполняю первый элемент массива и хочу записать в файл OperatorIDArray[1]:=TOperatorID.Create; OperatorIDArray[1].OperatorName:='james bond'; OperatorIDArray[1].OperatorPassword:='12345'; OperatorIDArray[1].OperatorStatus:=Main //
сохраняем в файл AssignFile(OperatorIDFile,'d:operator.dat'); Rewrite(OperatorIDFile); Write(OperatorIDFile,OperatorIDArray[1]); CloseFile(OperatorIDFile); OperatorIDArray[1].Free; Дельфи3 не ругается, но в файл пишет все время одну и ту же фигню ↓┴ В чем дело ? Заранее спасибо.
Добрый день, Радик! Это для Вас фигня :)), а для машины - это родное. И Вы видидите, то, что захотели - а захотели записать всю начинку объекта -> загляните в главу "Объект" хорошего учебника - там обязательно есть диаграмма и описание внутренней структуры объекта (ВЫ ПИШЕТЕ В ФАЙЛ ИМЕННО ЕЕ!). Там хранятся указатель на класс (после Self), и таблицы вирутальных, динамических методов - Вы их не создаете, но есть есть в TObject. Ответ отправлен: 18.02.2004, 10:17 Отправитель: Boriss Отвечает sir henry
Приветствую Вас, Радик! Если я Вас правильно понял, вы открываете файл для просмотра текстов и он Вам показывает всякую фигню вместо текста? Так ничего другого он Вам никогда и не покажет, програмируй Вы хоть на ТР, хоть на Дельфи7 :). Ведь файл-то Ваш не текстовый. Если хотите просматривать записаную информацию как текст, то записывайте элементы Вашего объекта в ТЕКСТОВЫЙ ФАЙЛ, а не в типизированый. Ответ отправлен: 18.02.2004, 10:33 Отправитель: sir henry
Вопрос № 1340
Здравствуйте! Поправка к вопросу № 1338. Меня не правильно поняли. Попытаюсь уточнить. ЧрЕзВыЧаЙнО утрирую. Пусть имеется таблица tbl_Dummy. В ней имеется запись «1, Яблоко». Имеется триггер для этой таблицы trg_tbl_Dummy_bi0 (before insert). От триггера требуется следующее. Когда я вставляю в таблицу, скажем, запись «2, Слива», требуется изменить запись «1, Яблоко» на «1, Груша», а запись «2, Слива» не вставлять вовсе! Как это реализовать? Я могУ установить, вставляется ли «Слива» или нет и изменить первую запись. Но как НЕ ДОПУСТИТЬ вставки самой «Сливы»? С уважением…
Приветствую Вас, Lerry! Вставте в триггер AFTER INSERT команду модефикации нужной записи: UPDATE таблица SET поле = "Груша" WHERE признак_модифицируемой_записи; и команду удаления только что созданой: DELETE FROM таблица WHERE признак_только-что_вставленой_записи; А вообще-то непонятно зачем это. Вы любите сложности? Так заблокируйте добавление записи при определенных условиях или для определенного пользователя. Ответ отправлен: 18.02.2004, 11:03 Отправитель: sir henry Отвечает kvINT
Доброе время суток, Lerry! создай триггер после вставки с таким кодом delete from tblDummy where id = new.id;
Ответ отправлен: 19.02.2004, 14:27 Отправитель: kvINT
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.