Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.07.2010, 20:16
Botaniq Botaniq вне форума
Новичок
 
Регистрация: 20.06.2010
Сообщения: 64
Репутация: 10
По умолчанию Проблема при вставке нового значения из запроса в таблицу Oracle

Здравствуйте!
Возникла проблем при вставке нового значения из запроса.
Есть процедура на загрузку формы, где я выбираю из таблицы Quest(id_test,id_quest,answer,correct_answer) поле id_quest и записываю его в переменную form1.idvopros.
Потом в этой же процедуре я этот form1.idvopros подставляю в запрос и вытаскиваю из таблицы Answer все ответы на вопрос и записываю их в Эдиты.
Вторая же процедура на кнопку перелистывает вопросы и ответы и пользователь выбирает вариант ответа и эта процедура вставляет поля в таблицу Answer_User.
Но при выборе из 2 вопроса ответа и дальнейшей вставке значения в таблицу влетает ошибка ORA-20002:Cannot insert Answer_User because Answer does not exist
Процедура на OnShow
Код:
procedure TStart_test.y();
var
i: integer;
begin
h:=0;
k:=0;

DataModule2.OracleQuery2.SQL.Add('select * from quest where id_test='+IntToStr(form1.idtest));
DataModule2.OracleQuery2.Execute;
form1.idvopros:=DataModule2.OracleQuery2.Field('id_quest');

DataModule2.OQuery.SQL.Add('select a.*,b.quest from answer a, quest b where a.id_quest='+IntToStr(form1.idvopros)+'and b.id_test='+IntToStr(form1.idtest)+'and a.id_quest=b.id_quest');
DataModule2.OQuery.Execute;

Start_test.Label1.Caption:=DataModule2.OracleQuery2.Field('quest');
while not DataModule2.OQuery.Eof do
   begin
 inc(k);
 mass[k]:=DataModule2.OQuery.Field('id_quest');
 otvet[k]:=DataModule2.OQuery.Field('Correct_Answer');
  for i:=0 to ComponentCount-1 do
    begin
    if Components[i].Name = 'Edit' + IntToStr(k) then
      begin

        (Components[i] as TEdit).Text := DataModule2.OQuery.Field('Answer');
      end;

   end;
 DataModule2.OQuery.Next;
end;

DataModule2.OQuery.Close;
DataModule2.OQuery.Clear;


end;

Процедура на кнопку
Код:
procedure TStart_test.Button4Click(Sender: TObject);
var
r,i: integer;
begin



DataModule2.ODS_Answer_User.Insert;
DataModule2.ODS_Answer_UserID_USER.AsInteger:=form1.iduser;
DataModule2.ODS_Answer_UserID_Test.AsInteger:=form1.idtest;
DataModule2.ODS_Answer_UserID_QUEST.AsInteger:=form1.idvopros;
DataModule2.ODS_Answer_UserID_ANSWER.AsInteger:=mass[RadioGroup1.ItemIndex+1];
DataModule2.ODS_Answer_UserCORRECT_ANSWER.AsString:=otvet[RadioGroup1.ItemIndex+1];
DataModule2.ODS_Answer_User.Post;
DataModule2.ODS_Answer_User.Refresh;



DataModule2.OracleQuery2.Next;
form1.idvopros:=DataModule2.OracleQuery2.Field('id_quest');
DataModule2.OQuery.SQL.Add('select a.*,b.quest from answer a, quest b where a.id_quest='+IntToStr(form1.idvopros)+'and b.id_test='+IntToStr(form1.idtest)+'and a.id_quest=b.id_quest');
DataModule2.OQuery.Execute;

        k:=0;
while not DataModule2.OQuery.Eof do

   begin
 inc(k);
 mass[k]:=DataModule2.OQuery.Field('id_quest');
 otvet[k]:=DataModule2.OQuery.Field('Correct_Answer');
  for i:=0 to ComponentCount-1 do
    begin
    if Components[i].Name = 'Edit' + IntToStr(k) then
      begin
        (Components[i] as TEdit).Text := DataModule2.OQuery.Field('Answer');
      end;

   end;


 DataModule2.OQuery.Next;


end;

DataModule2.OQuery.Close;
DataModule2.OQuery.Clear;
   end;
Admin: Учимся пользоваться тегами!

Последний раз редактировалось Admin, 04.07.2010 в 19:06.
Ответить с цитированием
  #2  
Старый 02.07.2010, 22:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Перепищи код. На каждую операцию завели свой запрос и текст запроса задай во время разработки. поставновка занчений - через параметры.

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

Вообще, как-то странно написано...
Ответить с цитированием
  #3  
Старый 02.07.2010, 23:09
Botaniq Botaniq вне форума
Новичок
 
Регистрация: 20.06.2010
Сообщения: 64
Репутация: 10
По умолчанию

Почему тогда при первом выборе ответа всё работает???
И как переделать???
Ответить с цитированием
  #4  
Старый 03.07.2010, 10:10
Botaniq Botaniq вне форума
Новичок
 
Регистрация: 20.06.2010
Сообщения: 64
Репутация: 10
По умолчанию

Помогите плиз, работа горит...
Ответить с цитированием
  #5  
Старый 03.07.2010, 11:31
Аватар для Marvel
Marvel Marvel вне форума
Начинающий
 
Регистрация: 14.06.2010
Адрес: Пятигорск
Сообщения: 121
Репутация: 24
По умолчанию

ну перед
Код:
DataModule2.OQuery.SQL.Add('select a.*,b.quest from answer a, quest b where a.id_quest='+IntToStr(form1.idvopros)+'and b.id_test='+IntToStr(form1.idtest)+'and a.id_quest=b.id_quest');
нужно поставить
Код:
DataModule2.OQuery.SQL.Clear;
и заместо
Код:
DataModule2.OQuery.Execute;
попробуй сделать
Код:
DataModule2.OQuery.Open;
__________________
Коли навчався в школі я - в мені росли мозгЫ. КудИж вони поділися? гы-гы гы-гы гы-гы...


ICQ: 593977748
Nick: Marvel
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter