Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/27: Рейтинг темы: голосов - 27, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 30

Обновление таблицы и БД

17.03.2010, 17:17. Показов 5675. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу для работы со стандартной БД (employee.gdb) с использованием IBX, все работает отлично, вот только никак не могу наладить выполнение команды update, каждый раз выдает ошибку, хотя код правильный. Компоненты: IBDatabase, IBTransaction, IBQuery, IBUpdateSQL, DataSource. В инспекторе объектов вроде все настроил правильно. В IBUpdateSQL запросы сгенерировал.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Lines.Clear;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 Application.Terminate;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 IBQuery1.SQL.Assign(Memo1.Lines);
 IBQuery1.Active := True;
 DataSource1.DataSet := IBQuery1;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
 IBQuery1.Close;
 IBQuery1.SQL.Clear;
 if Memo1.Lines[0] <> '' then
   IBQuery1.SQL.Add(Memo1.Text)
 else begin
       messageDlg('SQL-запит не було введено', mtError, [mbOK], 0);
       exit;
      end;
 try
   IBQuery1.ExecSQL;
 except
   On e : EDatabaseError do
     MessageDlg(e.Message, mtError, [mbOK], 0);
 end;
(* IBQuery1.ExecSQL;
 IBQuery1.Active := True;
 DataSource1.DataSet := IBQuery1;
 IBQuery1.ApplyUpdates;
 IBDatabase1.ApplyUpdates([IBQuery1]);
 IBQuery1.Refresh;
 if IBQuery1.Modified then
   IBQuery1.Post; *)
end;
 
procedure TForm1.Button4Click(Sender: TObject);
begin
 IBQuery1.SQL.Clear;
 IBQuery1.SQL.Add('select * from employee');
 IBQuery1.Open;
 IBQuery1.Active := True;
end;
Ввожу запрос на обновление:

SQL
1
UPDATE EMPLOYEE SET SALARY=500 WHERE EMP_NO=2
выполняю и получаю сообщение:

Code
1
Project Lab_1_prj.exe raised exception class EIBInterBaseError with message 'Operation violates CHECK constraint INTEG_30 on view or table EMPLOYEE'. Process stopped. Use Step or Run to continue.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2010, 17:17
Ответы с готовыми решениями:

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

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

Как осуществить вывод таблицы в DataGrid и обновление таблицы в БД после закрытия окна программы
Имеется БД в MS Sql с одной таблицей. Как осуществить вывод таблицы в DataGrid(или другой компонент) и обновление таблицы в БД после...

5
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
17.03.2010, 18:08
Это может означать, что в БД у объекта EMPLOYEE есть ограничение INTEG_30, которое нарушается при попытке исполнения приведенного UPDATE. Вам надо каким - либо инструментом (например IBExpert) внимательно посмотреть этот объект и наложенные ограничения. Найти ограничение INTEG_30 и посмотреть в чем Ваш апдейт ему противоречит
1
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 30
17.03.2010, 21:34  [ТС]
Я открыл IBConsole, нашел там эту таблицу, в контекстном меню выбрал пункт "Alter...", появилось диалоговое окно "Table Editor", в секции "Constraints" перешел на вкладку "Check Constraints", там нашел два поля: "Name" и "Text". В поле "Name" стоит значение "INTEG_30" (то самое, которое было в сообщении о ошибке), а в поле "Text":

SQL
1
2
3
4
5
6
7
8
CHECK ( salary >= (SELECT min_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country) AND
            salary <= (SELECT max_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country))
Вот только, что это все значит, я так и не понял. Помогите пожалуйста. Спасибо.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
18.03.2010, 06:00
Цитата Сообщение от Fighter4Freedom Посмотреть сообщение
Вот только, что это все значит, я так и не понял
1. Судя по Вашим вопросам Вы в БД совсем зеленый. Кавалерийским наскоком, конечно, тоже можно осваивать новые пространства, но и матчасть изучать надо
2. Здесь все просто и прозрачно. Ограничение требует, чтобы в поле salary заносились значения, лежащие между некоторым минимально допустимым, задаваемым в виде
SQL
1
2
3
4
SELECT min_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country)
и максимально допустимым
SQL
1
2
3
4
(SELECT max_salary FROM job WHERE
                        job.job_code = employee.job_code AND
                        job.job_grade = employee.job_grade AND
                        job.job_country = employee.job_country))
где эти максимальные и минимальные значения извлекаются из таблицы job
Очевидно, что значение salary, которое Вы пытались ввести не вошло в эти границы
3. Скачай и установи себе IBExpert, не мучайся
1
0 / 0 / 0
Регистрация: 26.02.2010
Сообщений: 30
18.03.2010, 17:17  [ТС]
Так ясно, а если я удалю данное ограничение, тогда никаких ошибок больше не возникнет по данному поводу?
И еще, последний вопрос: когда я применяю команду update и она успешно выполняется, то содержимое DBGrid очищается, как мне этого избежать. Я сделал отдельную кнопку на форме:

Delphi
1
2
3
4
5
6
7
procedure TForm1.Button4Click(Sender: TObject);
begin
 IBQuery1.SQL.Clear;
 IBQuery1.SQL.Add('select * from employee');
 IBQuery1.Open;
 IBQuery1.Active := True;
end;
но это не удобно, пытался вкинуть строку:

Delphi
1
IBQuery1.Active := True;
в код кнопки для update, но ничего из этого не вышло.
0
1263 / 706 / 62
Регистрация: 21.12.2009
Сообщений: 2,256
19.03.2010, 06:12
Цитата Сообщение от Fighter4Freedom Посмотреть сообщение
И еще, последний вопрос:
По некоторым признакам - это вопрос не последний.
Точно ответить не могу. Неизвестно как ты работвешь с объектами. Если исходить из того, что у тебя два объекта. В одном у тебя DataSet, который через DataSource связан с гридом, а другой объект UpdateSQL изменяет данные, то после отработки и фиксации изменений DataSet необходимо обновить. Но и это не гарантия, что ты увидишь зафиксированные изменения. Неизвестно, как ты работаешь с транзакциями. Параметры транзакции могут быть настроены так, что зафиксированные изменения в DataSet будут невидимы. Тут непростое хозяйство и его надобно изучать. Но, возможно я описываю неприятности, с которыми ты не столкнешься!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2010, 06:12
Помогаю со студенческими работами здесь

Обновление поля таблицы на основании выборки из другой таблицы
Есть две таблицы тблМагазиныИнвентаризации (все инвентаризации) и тблМагазиныРейтинг (список магазинов) Есть процедура, результатом...

Выборка из таблицы и обновление второй таблицы
Подскажите пожалуйста , как можно сделать такое: Есть 2 таблицы, table1(code, pol1,pol2,pol3,pol4,pol5) и table2(code,...

Выборка из таблицы и обновление второй таблицы
Подскажите пожалуйста , как можно сделать такое: Есть 2 таблицы, tab1(id, pol1,pol2,pol3,pol4,pol5) и tab2(id, pol1,pol2,pol3,pol4,pol5),...

Обновление столбца одной таблицы из другого столбца другой таблицы (база одна)
Доброго времени суток! Очень нуждаюсь в помощи. Значит: 2 таблицы 1 - product, 2-product_description Нужно обновить столбец...

Обновление данных одной таблицы на основе данных другой таблицы
мне нужно создать запрос на обновление данных одной таблицы на основе данных из другой таблицы. Дано: имя таблицы|ключевые поля ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru