Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 09:22   #1
Romowski
Пользователь
 
Регистрация: 02.04.2012
Сообщений: 49
По умолчанию Ошибка при повторном Insert после CancelUpdates

Добрый день!

Такая ситуация:
1. Вызываю pFIBDataSet.Insert;
2. Открывается форма. Если в ней нажать Отмена, вызывается pFIBDataSet.CancelUpdates.
3. Следующий вызов Insert выходит в ошибку

Как будто CancelUpdates не отрабатывает...

В чем может быть проблема?
Romowski вне форума Ответить с цитированием
Старый 06.02.2013, 11:17   #2
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

а ошибка то какая?
и что в InsertSQL.Text ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 06.02.2013, 11:30   #3
Romowski
Пользователь
 
Регистрация: 02.04.2012
Сообщений: 49
По умолчанию

Стандартная, дельфийская (во вложении)

в InsertSQL вот что:
Код:
INSERT INTO TBREQUESTS(REQUEST_ID,REQUEST_NUMBER,REQUEST_DATE,REQUEST_TIME_B,REQUEST_TIME_E,KSK_ID,ADDRESS_ID, SERVICE_TO_DO, SERVICE_DONE, EXECUTOR_ID, USER_ID, REQUEST_DONE_TIME, REQUEST_STATUS )
VALUES(
    :REQUEST_ID, :REQUEST_NUMBER, :REQUEST_DATE, :REQUEST_TIME_B, :REQUEST_TIME_E, :KSK_ID, :ADDRESS_ID, :SERVICE_TO_DO, :SERVICE_DONE, :EXECUTOR_ID, :USER_ID, :REQUEST_DONE_TIME, :REQUEST_STATUS )
сгенерированный...

P.S. Проверил вот что - После CancelUpdates pFIBDataset.State in dsEditModes (((
Изображения
Тип файла: png error.png (19.7 Кб, 24 просмотров)

Последний раз редактировалось Romowski; 06.02.2013 в 11:39.
Romowski вне форума Ответить с цитированием
Старый 06.02.2013, 11:49   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

судя по ошибке, это не c запросом проблема..

рискну предположить, что при закрытии формы какой-то из объектов уничтожается (как вариант, pFIBDataSet ). При повторном обращении - не создаётся.
Попытка обращения к несозданному объекту и даёт access violation...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.02.2013, 11:52   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Стандартная, дельфийская
как "красиво" то сказано)))) ... они все такие, ага ))
а на тему ошибки, да, Serg прав, запрос тут не приделах.
показывай под кнопок "отмены" и "добавления".
и еще, почему бы не делать pFIBDataSet.Cancel вместо pFIBDataSet.CancelUpdates ?
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 06.02.2013, 12:15   #6
Romowski
Пользователь
 
Регистрация: 02.04.2012
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
судя по ошибке, это не c запросом проблема..
это то понятно ))

Кнопка Add:
Код:
procedure TfmMain.tbAddClick(Sender: TObject);
var fmAdd : TfmAddEdit;
begin
  fmAdd := TfmAddEdit.Create(nil);
  requestEditMode := 'I';
  fmAdd.ShowModal;
  fmAdd.Free;
end;
При открытие данной формы:
Код:
if requestEditMode = 'I' then
  begin
    dmMain.dRequests.Insert;
    fmAddEdit.Caption := 'Новая заявка - '+FormatFloat('000000', currReqNumber + 1);
    edReqNumber.Text := FormatFloat('000000', currReqNumber + 1);
    dtReqDate1.DateTime := Now();
    dtReqTime.Value := Now();
    dtReqTimeEnd.Value := Now();
    cbReqState.ItemIndex := 0;
  end
  else
    begin
      dmMain.dRequests.Edit;      
    end;
Для сохранения или отката стоит ButtonGroup:
Код:
procedure TfmAddEdit.bgRequestButtonClicked(Sender: TObject; Index: Integer);
begin
  case Index of
    0: begin
      if dmMain.dRequests.State in [dsInsert] then
        try
          reqID := dmMain.Database.Gen_Id(dmMain.dRequests.AutoUpdateOptions.GeneratorName, dmMain.dRequests.AutoUpdateOptions.GeneratorStep, dmMain.dRequests.UpdateTransaction);
          dmMain.dRequests.FieldByName('REQUEST_ID').AsInteger := reqID;
          dmMain.dRequests.FieldByName('REQUEST_NUMBER').AsInteger := StrToInt(edReqNumber.Text);
          dmMain.dRequests.FieldByName('USER_ID').AsInteger := userID;
          dmMain.dRequests.FieldByName('REQUEST_DONE_TIME').AsDateTime := dtReqTime.Value;
          dmMain.dRequests.FieldByName('REQUEST_STATUS').AsInteger := cbReqState.ItemIndex; //pending
          dmMain.dRequests.Post;
          currReqNumber := StrToInt(edReqNumber.Text);
        except on E: Exception do
          begin
            Application.MessageBox(pchar('Ошибка создания заявки:' + #13#10 + E.Message), 'Ошибка БД', MB_ICONERROR + MB_OK);
            dmMain.dRequests.CancelUpdates;
          end;
        end
      else
      if dmMain.dRequests.State in [dsEdit] then
        try
          dmMain.dRequests.FieldByName('REQUEST_STATUS').AsInteger := cbReqState.ItemIndex; //pending
          dmMain.dRequests.Post;
        except on E: Exception do
          begin
            Application.MessageBox(pchar('Ошибка редактирования заявки:' + #13#10 + E.Message), 'Ошибка БД', MB_ICONERROR + MB_OK);
            dmMain.dRequests.CancelUpdates;
          end;
        end;
      ModalResult := mrOk;
    end;
    1: begin
      dmMain.dRequests.CancelUpdates;
      ModalResult := mrCancel;
    end;
  end;
end;
Romowski вне форума Ответить с цитированием
Старый 06.02.2013, 13:13   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы рекомендовал поставить точки останова и пройтись в пошаговом режиме, на какой строчке вылетит Access Violation - вот с тем объектом и разбираться детальнее - где Вы его убиваете и не создаёте...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.02.2013, 13:33   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
requestEditMode := 'I';
А вот эта переменная у Вас в каком модуле прописана?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.02.2013, 13:36   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Похоже тут Yurk@ прав. Метод Cancel отменяет все изменения по текущей записи и делает state=dsBrowse. Не проверял, но скорее всего CancelUpdates state не изменяет, остаётся dsInsert и последующая попытка выполнить Insert заканчивается аварийно.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.02.2013, 13:55   #10
Romowski
Пользователь
 
Регистрация: 02.04.2012
Сообщений: 49
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Похоже тут Yurk@ прав. Метод Cancel отменяет все изменения по текущей записи и делает state=dsBrowse. Не проверял, но скорее всего CancelUpdates state не изменяет, остаётся dsInsert и последующая попытка выполнить Insert заканчивается аварийно.
да я это понял
Цитата:
P.S. Проверил вот что - После CancelUpdates pFIBDataset.State in dsEditModes (((
, сейчас проверю
Romowski вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вылетает ошибка при вставке в таблицу через Insert (ex. Что здесь не так ) pavel0088 SQL, базы данных 9 02.02.2013 07:15
Перекрытие вариабл при повторном вызове функции KOTBASILIO JavaScript, Ajax 0 18.07.2011 19:09
Возникает ошибка исключения при повторном открытии формы Nik_K БД в Delphi 10 25.04.2011 23:49
ошибка при INSERT INTO; D7, access mdb helluvaname Помощь студентам 4 07.01.2010 10:16
Ошибка при Выполнении Insert nimf БД в Delphi 2 27.11.2007 18:16