Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранение данных в БД  (Прочитано 10131 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ostrik
Интересующийся

ru
Offline Offline
Пол: Женский

« : 12-05-2010 06:20 » 

Здравствуйте!  Улыбаюсь
FireBird 2.1 , работаю ч/з DataSet в Delphi7
В программа 12 таблиц, все они о объединены между собой ч/з Join. У каждой таблицы свой генератор идентификационного номера записи. Когда сохраняем данные небходимо запомнить номер, который присваивает генератор записи.
И собственно вопрос!!!
Как ЭТО сделать?  Здесь была моя ладья...
Я это делаю так...
Код:
// Таблица PATIENT
   DM_ORND.dset_PATIENT.Insert;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_ID').AsInteger:=100000 ;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_LN').AsString:=mePAT_reg.Text ;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_FN').AsString:=mePAT_FN_reg.Text;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_MN').AsString:=mePAT_MN_reg.Text;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_BD').AsDateTime :=dtpPAT_BD_reg.Date ;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_SEX_ID').AsInteger:=lcbSex_reg.KeyValue;
   DM_ORND.dset_PATIENT.FieldByName('SEX_OLD_ID').AsInteger:=1 ;
   DM_ORND.dset_PATIENT.Post;
   // запоминание номера PATIENT
   p:=DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_ID').AsString;
  // Таблица  APPEAL
   DM_ORND.dset_APPEAL.Insert;
   DM_ORND.dset_APPEAL.FieldByName('APP_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_APPEAL.FieldByName('PAT_OLD_ID').AsInteger:=1 ;
   DM_ORND.dset_APPEAL.FieldByName('TOT_OLD_ID').AsInteger:=1;
   DM_ORND.dset_APPEAL.FieldByName('BRA_OLD_ID').AsInteger:=1;
   DM_ORND.dset_APPEAL.FieldByName('APP_OLD_BRA_ID').AsInteger:=lcbBRA_reg.KeyValue;
   DM_ORND.dset_APPEAL.FieldByName('APP_OLD_TOT_ID').AsInteger:=lcsTOT_reg.KeyValue;
   DM_ORND.dset_APPEAL.FieldByName('APP_OLD_PAT_ID').AsString:=p ;

   DM_ORND.dset_APPEAL.Post;
   // запоминание номера  APPEAL
   a:=DM_ORND.dset_APPEAL.FieldByName('APP_OLD_ID').AsString ;
    // Таблица  RECEPTION
   DM_ORND.dset_RECEPTION.Insert;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_RECEPTION.FieldByName('BRA_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_RECEPTION.FieldByName('PAT_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_RECEPTION.FieldByName('SEX_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_RECEPTION.FieldByName('TOT_OLD_ID').AsInteger:=10000;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_APP_ID').AsString:=a;
   DM_ORND.dset_RECEPTION.FieldByName('APP_OLD_ID').AsInteger:=1;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_DATE').AsDateTime:=dtpREC_reg.Date;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_DOC_ID').AsInteger:=lcbDOC_reg.KeyValue;
   DM_ORND.dset_RECEPTION.FieldByName('DOC_OLD_ID').AsInteger:=1;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_ANA_ID').AsInteger:=lcbANA_reg.KeyValue;
   DM_ORND.dset_RECEPTION.FieldByName('ANA_OLD_ID').AsInteger:=1;
   DM_ORND.dset_RECEPTION.FieldByName('CON_OLD_ID').AsInteger:=1;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_CON_ID').AsInteger:=1;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_DES').AsString:=mDES_reg.Text ;
   DM_ORND.dset_RECEPTION.FieldByName('REC_OLD_ZAKL').AsString:=mZAKL_reg.Text ;

   DM_ORND.dset_RECEPTION.Post;
При таком варианте запоминаются внесенные номера, а не те, что сгенерированые, т.е.:
Код:
DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_ID').AsInteger:=100000 ;
DM_ORND.dset_APPEAL.FieldByName('APP_OLD_ID').AsInteger:=10000;
А далаю имеено так, потому что по-другому не работает.
Мы присваиваем номер, а после сохранение ганератор заменяет его на свой сгенерированный. А как запомнить этот сгеннерированный номер, я не знаю.
Может кто-нибудь знает?
« Последнее редактирование: 12-05-2010 06:27 от Ostrik » Записан

Жизнь прекрасна и надо радоваться каждому мгновению
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 12-05-2010 06:49 » 

в 1,5 птице я делал так

вставка данных - через процедуру (PR_INS_INTO_MESSLOG_GET_ID)

Код:
CREATE PROCEDURE PR_INS_INTO_MESSLOG_GET_ID
(
    MESS_TYPE SMALLINT //некое поле данных
)
RETURNS
(
    MESSAGE_ID BIGINT
)
AS
 begin
 
    MESSAGE_ID = GEN_ID(NEW_MESS_ID,1);
 
    INSERT INTO MESS_LOG (mess_type) VALUES (:mess_type);

    suspend;
 end

NEW_MESS_ID - это генератор
Код:
CREATE GENERATOR NEW_MESS_ID;
//SET GENERATOR NEW_MESS_ID TO 1;
« Последнее редактирование: 12-05-2010 06:52 от Алексей1153++ » Записан

Ostrik
Интересующийся

ru
Offline Offline
Пол: Женский

« Ответ #2 : 26-05-2010 05:08 » 

Код:
// Таблица PATIENT
   DM_ORND.dset_PATIENT.Insert;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_LN').AsString:=mePAT_reg.Text ;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_FN').AsString:=mePAT_FN_reg.Text;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_MN').AsString:=mePAT_MN_reg.Text;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_BD').AsDateTime :=dtpPAT_BD_reg.Date ;
   DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_SEX_ID').AsInteger:=lcbSex_reg.KeyValue;
   DM_ORND.dset_PATIENT.FieldByName('SEX_OLD_ID').AsInteger:=1 ;
   DM_ORND.dset_PATIENT.Post;
   // запоминание номера PATIENT
   p:=DM_ORND.dset_PATIENT.FieldByName('PAT_OLD_ID').AsString;
А в dataset_PATIENT в InsertSQL
Код:
 insert into PATIENT
  ( PAT_OLD_LN, PAT_OLD_FN, PAT_OLD_MN, PAT_OLD_BD, PAT_OLD_SEX_ID)
values
  (:PAT_OLD_LN, :PAT_OLD_FN, :PAT_OLD_MN, :PAT_OLD_BD, :PAT_OLD_SEX_ID)
GeneratorField PAT_ID_GEN -> PAT_OLD_ID By 1
Выдает ошибку

validation error for column Pat_OLD_ID, Value "***null***"
В чем причина не могу понять  Не понял
« Последнее редактирование: 26-05-2010 05:57 от Алексей1153++ » Записан

Жизнь прекрасна и надо радоваться каждому мгновению
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 26-05-2010 06:00 » 

Ostrik, картинка в посте таак не покажется - её надо прикреплять или класть где-то в интернете и потом ссылку вставлять )  Но в любом случае, это не должен быть BMP.

Выдает ошибку

validation error for column Pat_OLD_ID, Value "***null***"
В чем причина не могу понять  Не понял

так вроде написано же - на значение ругается. Поле то текстовое или это счётчик ? Или повтор значения для ключа
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 29-05-2010 13:50 » 

Ostrik, а зачем запоминать номер генератора, если он и так уже "запомнен" в базе?

допустим, есть Table1 с полями ID, Name и Table2 с полями ID, Table1ID, Name. нам надо вставить записи в обе таблицы с сохранением ссылочной целостности, причём значения полей ID у обеих полей задаются генераторами в самой БД. я правильно понимаю ваш проблему?

хитрость здесь будет в том, что пока вы не закомитите транзакцию, вы не увидите тех значений, которые внёс сервер (например, значения, задаваемые генераторами в триггерах). решить это можно, например, так: написать функцию, которая возвращает следующее значение генератора для нужной таблицы (по сути, это будет просто тупой селект). далее:

1. Запоминаем в переменной значение генератора для таблицы Table1.
2. Вставляем данные в Table1 указывая значение для ID, полученное в п.1.
3. Вставляем данные в Table2, причём в поле Table1ID засовываем тоже значение.

а вообще - переходите на FIB+. и забудете про весь этот геморрой раз и навсегда.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines