Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Вниз

Проблема при записи в таблицу   Найти похожие ветки 

 
Uno-84   (2007-12-13 09:06) [0]

Здравствуйту! подскажите пожалуйста : я записываю сообщения в 2 таблицы, в одной(MSGBODIES) храниться текст сообщения и ID тела сообщения, в другой ID (MESSAGE_EXT) сообщения, отправитель, дата отправки, тип сообщения и ID Тела сообщения вот код:

with DataModule1.IBQShared do begin
        SQL.Clear;
        SQL.Add("insert into MSGBODIES ( MESSAGEBODY_ID,       MESSAGE_TEXT) values (gen_id(MSGBODIES_GEN, 1),
        :MESSAGE_TEXT)");
        ParamByName("MESSAGE_TEXT").AsString := redtSender1.Text;

        try
         ExecSQL;
        finally
        end;
     end;
 with DataModule1.IBQShared do begin
         SQL.Clear;
         SQL.Add ("insert into MESSAGE_EXT( MESSAGE_ID, MESSAGE_SENDER, MESSAGE_SEND_DATE, MESSAGE_TYPE, MESSAGEBODY_ID) values (gen_id(GEN_MESSAGE_EXT_ID, 1), :MESSAGE_SENDER, :MESSAGE_SEND_DATE, :MESSAGE_TYPE,
        :MESSAGEDODY_ID)");

         try
          ExecSQL;
         finally
         end;
      end;
Проблемазаключаеться в следующем:
поле MESSAGEBODY_ID В таблице MESSAGE_EXT  влешний ключ на поле
MESSAGEBODY_ID в таблице MSGBODIES, так вот при записи в таблицу MESSAGE_EXT начение поля MESSAGEBODY_ID ставиться значение NULL, а мне желательно что бы при записи значение поля совбодало с анологичным полем в MSGBODIES, подскажите пожалуйста строку или строки кода, которые помогли бы решить эту проблему. Заранее спасибо.


 
Anatoly Podgoretsky ©   (2007-12-13 09:12) [1]

> Uno-84  (13.12.2007 09:06:00)  [0]

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


 
Johnmen ©   (2007-12-13 09:16) [2]

и почему здесь finally?


 
Uno-84   (2007-12-13 09:19) [3]

Код работает, честно, зачем вторая таблица не знаю))))) но она есть ))))) вот и прошу помощи в её заполнении


 
Johnmen ©   (2007-12-13 09:40) [4]


>  зачем вторая таблица не знаю

Это не твой код?


 
Uno-84   (2007-12-13 09:55) [5]

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


 
morgoth   (2007-12-13 10:00) [6]

try
    ExecSQL;
  finally
  end;
вот из-за таких кусков кода, оставленных в наследство, пришлось однажды убить полдня...

по всему код: зачем внешний ключ, зачем вторая таблица, где проставляются значения параметрам, что значит "код работает честно"?


 
Johnmen ©   (2007-12-13 10:05) [7]


> а вот на счет таблицы MESSAGE_EXT мне сказали её создать

М.б. тогда наиболее логично спросить у них?


 
Uno-84   (2007-12-13 10:17) [8]

Значения параметров прописанны в тригере таблицы


 
Desdechado ©   (2007-12-13 10:23) [9]

Перед вставкой во вторую таблицу запросить полученное после первой вставки значние первичного ключа и использовать его.


 
morgoth   (2007-12-13 10:27) [10]

тогда объясни зачем ты пишешь такие запросы если все делает триггер?
>"insert into MESSAGE_EXT( MESSAGE_ID, MESSAGE_SENDER, >MESSAGE_SEND_DATE, MESSAGE_TYPE, MESSAGEBODY_ID) values >(gen_id(GEN_MESSAGE_EXT_ID, >1), :MESSAGE_SENDER, :MESSAGE_SEND_DATE, :MESSAGE_TYPE,
>        :MESSAGEDODY_ID)"
ну и собсно по null в своем поле смотри код триггера


 
Anatoly Podgoretsky ©   (2007-12-13 10:31) [11]

> Uno-84  (13.12.2007 09:55:05)  [5]

> мне сказали её создать, а смысл её создания ( вернее рационолность) мне трудно понять))))

Это что бы ты помучился.


 
ЮЮ ©   (2007-12-13 10:50) [12]

> > мне сказали её создать, а смысл её создания ( вернее рационолность)
> мне трудно понять))))


Вероятно, тела сообщений иногда бывают такие большие, что требуется сразу несколько отправителей, котрые его отсылают, ведь MSGBODIES связано с MESSAGE_EXT как 1..N :)

При работе с генераторами, ИМХО, следунт работать так:
подправить триггер так, чтобы он обращался к генератору только в том случае, когда Id IS NULL, а иначе бы доверял клиенту (тот и так обломится при попытке вставить запись с дублирующим ключом). Тогда при необходимости вставить записи в главную и подчиненную таблицу запроси на клиенте значение генератора и используй его. При вставке записей только главную таблицу можно "инсертить" и с NULL-евым Id-ом.


 
morgoth   (2007-12-13 10:59) [13]

>тела сообщений иногда бывают такие большие, что требуется сразу несколько отправителей

А решить это одной таблицей разве нельзя?


 
ЮЮ ©   (2007-12-13 11:04) [14]

> [13] morgoth   (13.12.07 10:59)
> >тела сообщений иногда бывают такие большие, что требуется
> сразу несколько отправителей
>
> А решить это одной таблицей разве нельзя?


MESSAGE_SENDER1, ..., MESSAGE_SENDER10 в приличном обществе решением не является :)


 
ЮЮ ©   (2007-12-13 11:08) [15]

> Вероятно, тела сообщений иногда бывают такие большие, что
> требуется сразу несколько отправителей, котрые его отсылают,
> ведь MSGBODIES связано с MESSAGE_EXT как 1..N :)


Или это нафиг никому не нужное тело и его перемылают от одного отправителя к лругому, причем причину перерылки объяняюют одним числом MESSAGE_TYPE.


 
morgoth   (2007-12-13 11:22) [16]

>MESSAGE_SENDER1, ..., MESSAGE_SENDER10 в приличном обществе решением не является :)

а как в приличном обществе решают эту задачу с двумя таблицами когда есть 10 отправителей одного большого сообщения? ))) или в этом случае не будет MESSAGE_SENDER1, ..., MESSAGE_SENDER10???


 
ЮЮ ©   (2007-12-13 11:25) [17]

Будет как у автора.
Исходя из его структуры я и смог сделать предположения [12] и [15] о сущностях предметной области.


 
morgoth   (2007-12-13 11:33) [18]

Мне кажется это будет то же самое и сендеры 1..10 никуда не денутся и в случае [12]
Хотя это уже не имеет значение, автор все равно получил свой ответ и спорить о решении неизвестной задачи не стоит.


 
Sergey13 ©   (2007-12-13 11:44) [19]

> [16] morgoth   (13.12.07 11:22)
> а как в приличном обществе решают эту задачу с двумя таблицами
> когда есть 10 отправителей одного большого сообщения? ))
> )

В приличном обществе в таком случае появляется третья таблица для отправителей сообщения.


 
Anatoly Podgoretsky ©   (2007-12-13 11:49) [20]

А как они собирают обратно целое сообщение, ведь информации о части нет.


 
ЮЮ ©   (2007-12-13 11:53) [21]

> [19] Sergey13 ©   (13.12.07 11:44)
> В приличном обществе в таком случае появляется третья таблица
> для отправителей сообщения.


MESSAGE_EXT.MESSAGE_SENDER, полагаю, и есть объект из таблицы отправителей MSGSENDERS.

т.е. MSGSENDERS и MSGBODIES связаны как M..N, а MESSAGE_EXT и есть таблица связи, которую было бы логичнее назвать MsgBodySenders


 
ЮЮ ©   (2007-12-13 11:56) [22]

> [20] Anatoly Podgoretsky ©   (13.12.07 11:49)
> А как они собирают обратно целое сообщение, ведь информации
> о части нет.


Так это не сообщение на части разбито, а неделимое тело пересылается разными отправмиелями, причем без вдреса получателя.
Это, СПАМ-мащина, где получатель законспирирован под отправителя :)


 
Sergey13 ©   (2007-12-13 11:58) [23]

> [21] ЮЮ ©   (13.12.07 11:53)
> MESSAGE_EXT.MESSAGE_SENDER, полагаю, и есть объект из таблицы
> отправителей MSGSENDERS.

Я имел в  виду, что если бы у сообщения было несколько авторов, то логично было бы записывать их в отдельную таблицу, а не продить поля MESSAGE_SENDER_N.


 
morgoth   (2007-12-13 12:12) [24]

Не проще ли было бы завести поля ID и ParentID в основной таблице и перенести поле с телом сообщения туда же.
Либо оставить 2 таблицы, в таблицу с телами добавить поле с ID сообщения, а ссылку на тело из таблицы сообщений убрать.


 
morgoth   (2007-12-13 12:14) [25]

хотя опять же решение зависит от задачи, а она не ясна...


 
Anatoly Podgoretsky ©   (2007-12-13 12:53) [26]

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


 
morgoth   (2007-12-13 13:04) [27]

помогли, понимаешь, спамеру юному... )))


 
Sergey13 ©   (2007-12-13 13:17) [28]

> [26] Anatoly Podgoretsky ©   (13.12.07 12:53)

Например нечто вроде документообота с множеством авторов. Хотя это гадание на кофейной гуще уже начинается.


 
Anatoly Podgoretsky ©   (2007-12-13 13:24) [29]

> Sergey13  (13.12.2007 13:17:28)  [28]

Рассказать как делаются Многие ко Многим?


 
Sergey13 ©   (2007-12-13 13:49) [30]

> [29] Anatoly Podgoretsky ©   (13.12.07 13:24)

А я в
> [19] Sergey13 ©   (13.12.07 11:44)

разве не про М2М писал?
Таблицы "Сообщения", "Авторы" (про которую в топике нет упоминаний, но которая видимо предполагается), и таблица связи сообщений и множества авторов.

ЗЫ: Автор смотался, а тут похоже холиварчик по домыслам намечается. 8-)


 
Anatoly Podgoretsky ©   (2007-12-13 14:30) [31]

> Sergey13  (13.12.2007 13:49:30)  [30]

У автора две таблицы и это не М2М
Да ладно тут можно ломать голову, нормализацию делал кто то некомпетентный.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.055 c
15-1196978196
Lip
2007-12-07 00:56
2008.01.13
Delphi -> Console Application


15-1196932764
Igor M.
2007-12-06 12:19
2008.01.13
удаленный доступ к сети


2-1197379946
alikon1
2007-12-11 16:32
2008.01.13
BDE Query


4-1181578038
Тохер
2007-06-11 20:07
2008.01.13
Как получить картинку с USB фотокамеры.


6-1173537006
lego1as
2007-03-10 17:30
2008.01.13
Отослать письмо





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский