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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.01.2014, 18:40
Anzhelika Anzhelika вне форума
Прохожий
 
Регистрация: 07.11.2012
Сообщения: 7
Репутация: 10
Восклицание Ошибка: Не удаётся вставить пустую строку. Необходим хотя бы один столбец значений

Здравствуйте программисты! Помогите исправить ошибку.
Требуется написать курсовую работу "Тестирование в делфи".
Форма с учетными данными всё выполняет правильно.
Проблема возникает при записи вариантов ответов в базу данных аксесса.
После выбора RadioButton1 и нажатии на кнопку, появляется ошибка: "Не удаётся вставить пустую строку. Необходим хотя бы один столбец значений."

Код:
procedure TForm3.Button1Click(Sender: TObject);
begin
DM.M1V1.Open;
DM.M1V2.Open;
DM.M1V3.Open;
DM.M1V4.Open;
DM.M1V5.Open;
DM.Testiruemiy.Open;
DM.Testiruemiy.Last;
DM.OtvetTestera.Open;
DM.OtvetTestera.Append;
If (RadioButton1.Checked=False) and (RadioButton2.Checked=False) and (RadioButton3.Checked=False) and (RadioButton4.Checked=False) and (RadioButton5.Checked=False)
then MessageDlg('Выберите вариант ответа!', mtWarning, [mbOK],0)
else begin
If RadioButton1.Checked=True then begin
if not (DM.OtvetTestera.FieldByName('ID_user').IsNull) then
DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
if not (DM.OtvetTestera.FieldByName('№VO').IsNull) then
DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
DM.OtvetTestera.Post;
//MessageDlg(DM.M1V1.FieldValues['№VO'], mtWarning, [mbOK],0);
DM.M1V1.Active:=True;
//RadioButton1.Caption:= dm.M1V1.FieldValues['№VO'];
a:=a+1;
DM.ADOQuery1.Next;
RadioButton1.Checked:=False;
                                  end;
If RadioButton2.Checked=True then begin
//DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
//DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
//DM.OtvetTestera.Post;
//RadioButton2.Caption:= dm.M1V2.FieldValues['№VO'];
a:=a+1;
DM.ADOQuery1.Next;
RadioButton2.Checked:=False;
                                  end;
If RadioButton3.Checked=True then begin
//DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
//DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
//DM.OtvetTestera.Post;
a:=a+1;
DM.ADOQuery1.Next;
RadioButton3.Checked:=False;
                                  end;
If RadioButton4.Checked=True then begin
//DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
//DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
//DM.OtvetTestera.Post;
a:=a+1;
DM.ADOQuery1.Next;
RadioButton4.Checked:=False;
                                  end;
If RadioButton5.Checked=True then begin
//DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
//DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
//DM.OtvetTestera.Post;
a:=a+1;
RadioButton5.Checked:=False;
DM.ADOQuery1.Next;
                                  end;
      end;
If a=25 then begin
Button2.Visible:=True;
DBMemo1.Visible:=False;
RadioButton1.Visible:=False;
RadioButton2.Visible:=False;
RadioButton3.Visible:=False;
RadioButton4.Visible:=False;
RadioButton5.Visible:=False;
Label1.Caption:='Спасибо за прохождение теста!';
              end;
 
end;

Надеюсь на Вашу помощь!
Ответить с цитированием
  #2  
Старый 05.01.2014, 21:08
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Код требует оптимизации, совершенно не читаем, по одной процедуре ничего не видно, непонятно к чему и какая секция относится, много повторов, прям бейсик какой-то итд. - будь ласка, сбросьте на zalil.ru весь проект посмотреть функционал в живую, только, пжлст, без мусора в виде экзешников и всяких там *.dcu, надо поглядеть
Ответить с цитированием
  #3  
Старый 06.01.2014, 07:47
Anzhelika Anzhelika вне форума
Прохожий
 
Регистрация: 07.11.2012
Сообщения: 7
Репутация: 10
По умолчанию

Как умею). Вот исходник посмотрите пожалуйста.
http://zalil.ru/34884158
Ответить с цитированием
  #4  
Старый 06.01.2014, 12:52
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Вот непонятный кусок кода из модуля "M1":
Код:
procedure TForm3.Button1Click(Sender: TObject);
begin
.....
  DM.OtvetTestera.Open;
  DM.OtvetTestera.Append;
  if (RadioButton1.Checked = False) and (RadioButton2.Checked = False) and
    (RadioButton3.Checked = False) and (RadioButton4.Checked = False) and
    (RadioButton5.Checked = False) then
    MessageDlg('Выберите вариант ответа!', mtWarning, [mbOK], 0)
  else
  begin
    if RadioButton1.Checked = True then
    begin
      if not (DM.OtvetTestera.FieldByName('ID_user').IsNull) then
        DM.OtvetTestera.FieldByName('ID_user').AsInteger := strtoint(DM.Testiruemiy.FieldValues['ID_user']);
      if not (DM.OtvetTestera.FieldByName('№VO').IsNull) then
        DM.OtvetTestera.FieldByName('№VO').AsInteger := strtoint(DM.M1V1.FieldValues['№VO']);
      DM.OtvetTestera.Post;
.....
Зачем здесь проверки полей на IsNull? Ведь перед этим была добавлена новая, пустая запись (через Append), поэтому очевидно что все поля будут IsNull (пустые).
Или по крайней мере нужно изменить условие на обратное, а то получается, что если поле не пустое (т.е. not null, что в данном случае никогда не будет), то делаем в нём изменения, а если поле было пустое (что в данном случае будет всегда), то оно таким пустым и останется и в результате будет попытка записать полностью пустую запись.
Ответить с цитированием
  #5  
Старый 06.01.2014, 13:05
Anzhelika Anzhelika вне форума
Прохожий
 
Регистрация: 07.11.2012
Сообщения: 7
Репутация: 10
По умолчанию

Это я так пыталась избавиться от ошибки.
Код:
procedure TForm3.Button1Click(Sender: TObject);
begin
.....
DM.OtvetTestera.Open;
DM.OtvetTestera.Append;
If (RadioButton1.Checked=False) and (RadioButton2.Checked=False) and (RadioButton3.Checked=False) and (RadioButton4.Checked=False) and (RadioButton5.Checked=False)
then MessageDlg('Выберите вариант ответа!', mtWarning, [mbOK],0)
else begin
If RadioButton1.Checked=True then begin
DM.OtvetTestera.FieldByName('ID_user').AsInteger:=strtoint(DM.Testiruemiy.FieldValues['ID_user']);
DM.OtvetTestera.FieldByName('№VO').AsInteger:=strtoint(DM.M1V1.FieldValues['№VO']);
DM.OtvetTestera.Post;
.....
Изображения
Тип файла: jpg ошибка.jpg (19.9 Кбайт, 2 просмотров)

Последний раз редактировалось Anzhelika, 06.01.2014 в 13:17.
Ответить с цитированием
  #6  
Старый 06.01.2014, 13:16
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Anzhelika
Это я так пыталась избавиться от ошибки
Тогда ты не ту таблицу проверяешь на IsNull - эта ошибка возникает в таблице Testiruemiy или в M1V1 (а ты проверяешь на IsNull таблицу OtvetTestera).

Т.е. должно быть как-то так:
Код:
    if RadioButton1.Checked then
    begin
      if not DM.Testiruemiy.FieldByName('ID_user').IsNull then
        DM.OtvetTestera.FieldByName('ID_user').AsInteger := DM.Testiruemiy.FieldByName('ID_user').AsInteger;
      if not DM.M1V1.FieldByName('№VO').IsNull then
        DM.OtvetTestera.FieldByName('№VO').AsInteger := DM.M1V1.FieldByName('№VO').AsInteger;
      DM.OtvetTestera.Post;
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
Anzhelika (06.01.2014)
  #7  
Старый 06.01.2014, 13:26
Anzhelika Anzhelika вне форума
Прохожий
 
Регистрация: 07.11.2012
Сообщения: 7
Репутация: 10
По умолчанию

Да, вы правы. Но после стала появляться другая ошибка(. Она связана со схемой данных БД аксесса?
Изображения
Тип файла: jpg ошибка2.jpg (29.2 Кбайт, 3 просмотров)
Ответить с цитированием
  #8  
Старый 06.01.2014, 13:40
Anzhelika Anzhelika вне форума
Прохожий
 
Регистрация: 07.11.2012
Сообщения: 7
Репутация: 10
По умолчанию

Всё заработало, спасибо). 2-ю ошибку решила в аксессе. убрала связь 1:М в схеме данных.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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