Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67

Каким образом работает команда .append в ADOQuery ?

01.06.2015, 17:42. Показов 6528. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня в проекте как минимум 3 раза встречается место где через ADOQuery мне нужно на отдельной форме Добавить/редактировать запись в таблице, и удалить(Но об этом позже)!!! Поэтому был бы очень рад с кем то пообщаться кто сказал бы как лучше всё сделать!
Редактирование на готовые записи работает, Добавление попросту не добавляет новую строку, а заменяет первую запись. Грешу на то что неправильно использую синтаксис метода append.


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TConnect.Button5Click(Sender: TObject);  //Кнопка редактирования
begin
  New_Connect.Showmodal;   // Форма на которой добавляю/изменяю данные
  DM.ADOConnect.active:=False;
  DM.ADOConnect.active:=true;
end;
 
procedure TConnect.Button6Click(Sender: TObject);   //Кнопка добавления
begin
  DM.ADOConnect.Append;
  New_Connect.Showmodal;
  DM.ADOConnect.active:=False;
  DM.ADOConnect.active:=true;
end;

Кнопка "Сохранить и выйти"
Delphi
1
2
3
4
5
6
  if DM.ADOConnect.modified then
  DM.ADOConnect.post;
 
  DM.ADOConnect.Active:=False;
  DM.ADOConnect.Active:=True;
  close;
В самом запросе прописан только вывод данных для Грида.

SQL
1
2
3
SELECT c.id_connect, c.id_service, s.name_service, c.id_klient, K.FIO, c.Date_connect, c.cost,  c.id_worker, w.FIO
FROM CONNECT AS c, Klient AS k, Service AS s, Worker AS w
WHERE c.id_service=s.id_service AND c.id_klient=k.id_klient  AND c.id_worker=w.id_worker
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.06.2015, 17:42
Ответы с готовыми решениями:

Не работает метод Append в ADOQuery
Приветствую. Имеется база данных (СУБД Access). Схема данных изображена во вложенном изображении. Проблема, как понятно из заголовка...

Как записать новую запись в базу данных и почему не отрабатывает команда append
При добавлении пустой записи(blank) в базу данных командой ADOTable.append указатель записи ADOTable.recNo переходит в положение -1, т.е....

Чем метод adoquery sql.add отличается от метода sql.append этого компонента?
Чем метод adoquery sql.add отличается от метода sql.append этого компонента?

16
554 / 484 / 191
Регистрация: 11.12.2013
Сообщений: 2,505
01.06.2015, 17:52
попробуйте так:
Delphi
1
2
3
4
5
6
7
8
procedure TConnect.Button6Click(Sender: TObject);   //Кнопка добавления
begin
  with DM.ADOConnect do begin
   Append;
   New_Connect.Showmodal;
   Post;   
  end;
end;
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 18:46  [ТС]
Такой же простой командой выходило добавлять записи через ADOTable. Уже пробовал заполнять эти таблицы через ADOTable, а выводить через ADOQuery, но тогда сталкивался с другими проблемами, поэтому вернулся к первоначальному виду, и снова мучаюсь по поводу добавления строки.

Добавлено через 6 минут
Цитата Сообщение от Алекcей Посмотреть сообщение
попробуйте так:
Код Delphi
1
2
3
4
5
6
7
8
procedure TConnect.Button6Click(Sender: TObject); //Кнопка добавления
begin
with DM.ADOConnect do begin
Append;
New_Connect.Showmodal;
Post;
end;
end;
Нет, не выходит, по прежнему не создаёт новую запись, а ещё в добавок теперь светит ошибку что нужен Insert.
Неужели без запроса тут никак не обойтись?
И можно ли это сделать в этом же запросе или придётся создавать новый чисто для добавления строки? Но тогда ведь если я передумаю создавать запись и закрою окно то пустая строка останется?

Добавлено через 46 минут
Уважаемые форумчане, очень прошу помощи, может кто-то будет не против по скайпу выйти чтобы всё было легче объяснить. Я нашёл довольно много информации по редактированию, добавлению, но всё везде по разному и сложно разобраться, может мне использовать не BDEdit а обычные и всё прописывать в запросах, делать редактирование через .Modified или запросом Update. Я просто сел в тупик и не знаю в какую сторону двигаться! Раньше не имел опыта работы с БД, в делфи так тем более поэтому возникает много проблем.
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 20:02  [ТС]
Решил изменить программу чтобы Добавление/редактирование делать полностью с помощью запросов.
Ругается на ParamByName.
Сама база является дочерней, её ключ создаётся авто инкременцией, мне лишь нужно через DBLookupListBox связать её с родительской, ну и заполнить ещё несколько полей. Подскажите в чём ошибка!
Delphi
1
2
3
4
5
6
  DM.ADOQuery1.Active:=False;
  DM.ADOQuery1.SQL.Clear;
  DM.ADOQuery1.SQL.Text:='Insert into Connect(id_service, id_worker, date_connect, cost) values(DBLookupComboBox1.KeyField,DBLookupComboBox2.KeyField, DateTimePicker1.Date, Edit1.text)';
  DM.ADOQuery1.ParamByName('id_klient').AsInteger:=DBLookupListBox1.KeyField;
  DM.ADOQuery1.ExecSQL;
  DM.ADOQuery1.Active:=True;
Название: 55.jpg
Просмотров: 267

Размер: 14.0 Кб
форма на которой заполняется можно увидеть на 1-ой записи в моём посте.
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 20:20  [ТС]
Исправил код на более правильный, но по прежнему ругается на ParamByName
Delphi
1
2
3
4
5
6
7
8
9
10
  DM.ADOQuery1.Active:=False;
  DM.ADOQuery1.SQL.Clear;
  DM.ADOQuery1.SQL.Text:='Insert into Connect(id_klient, id_service, id_worker, date_connect, cost) values(:id_klient, :id_service, :id_worker, :date_connect, :cost)';
  DM.ADOQuery1.ParamByName('id_klient').Value:=DBLookupListBox1.KeyField;
  DM.ADOQuery1.ParamByName('id_service').Value:=DBLookupComboBox1.KeyField;
  DM.ADOQuery1.ParamByName('id_worker').Value:=DBLookupComboBox2.KeyField;
  DM.ADOQuery1.ParamByName('date_connect').Value:=DateTimePicker1.date;
  DM.ADOQuery1.ParamByName('cost').Value:=Edit1.text;
  DM.ADOQuery1.ExecSQL;
  DM.ADOQuery1.Active:=True;
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
01.06.2015, 20:20
Цитата Сообщение от funduk17 Посмотреть сообщение
Ругается на ParamByName.
Delphi
1
DM.ADOQuery1.Parameters.ParamByName
1
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 20:33  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Цитата Сообщение от funduk17 Посмотреть сообщение
Ругается на ParamByName.
Код Delphi
1 DM.ADOQuery1.Parameters.ParamByName
Больше не ругается, спасибо!
Но вот что вылазит:

И следом указывает на эту строку:

В БД у меня все записи с полем id стоят на int.
В Лукапах в keyField выставлены поля верно.
Может конечно ругаться на DateTimePicker1.date, но я так же пробовал и DateTimePicker1.datetime (хотя и нужна мне только дата), но не в этом дело!
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
01.06.2015, 21:02
Цитата Сообщение от funduk17 Посмотреть сообщение
В БД у меня все записи с полем id стоят на int.
А DBLookupListBox1.KeyField это по твоему целое число?
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 21:09  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
А DBLookupListBox1.KeyField это по твоему целое число?
А разве нет? Этот локуп у меня выводит поле id_klient из таблицы Klient. В нём хранится значение созданное авто инкременцией в SQL server'e.
0
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
01.06.2015, 21:18
Цитата Сообщение от funduk17 Посмотреть сообщение
А разве нет?
Конечно нет. KeyField это ссылка на объект класса TField (точнее его наследника).
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 21:42  [ТС]
Цитата Сообщение от northener Посмотреть сообщение
Конечно нет. KeyField это ссылка на объект класса TField (точнее его наследника).
Хм. ну у меня Эти лукапы служат для связи этой таблицы с другими таблицами. В ListField я ввожу поле по которому буду выбирать, а в KeyField - значения, которые нужно занести непосредственно в таблицу!
А как обойти эту проблему? В SQL server'e нету типа данных TField, та и к тому же эти поля с id являются внешними ключами, они должны быть такого же типа данных как и первичные ключи.

Добавлено через 16 минут
И ещё вот какой вопрос назрел! поля DataField и DataSourse в компонентах DB оставлять пустыми? я ими пользовался когда заполнял таблицу с помощью делфи а не запросов.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
01.06.2015, 22:13
DB-компоненты сами по себе вносят изменения в соответствующую таблицу, поэтому их значения дополнительно никуда добавлять не надо.
В обработчике кнопки подтверждения следует прописать добавление данных лишь из неDB-компонентов (DateTimePicker и т.п.) и делать это средствами Дельфи, а не через запросы.
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 22:24  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
DB-компоненты сами по себе вносят изменения в соответствующую таблицу, поэтому их значения дополнительно никуда добавлять не надо.
В обработчике кнопки подтверждения следует прописать добавление данных лишь из неDB-компонентов (DateTimePicker и т.п.) и делать это средствами Дельфи, а не через запросы.
Ну раньше у меня всё делалось через ДБ компоненты, но тогда столкнулся с проблемой что никак не мог добавить новую строку. Вот хоть убей, пересмотрел тут на форуме кучу постов, но не append не insert не работали у меня как нужно.
Пришлось всё переделывать на запросы, и учиться работать с UPDATE и INSERT в MySQL.
Просто я уже около 4-5 дней сижу почти на одном месте. Испробовал кучу вариантов, но всегда есть изъяны и приходится всё переделывать!
Если вы говорите что можно обойтись без запросов, то подскажите как добавить новую строку через ADOQuery ? В самом верху поста я писал про эту проблему.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
01.06.2015, 23:19
Цитата Сообщение от funduk17 Посмотреть сообщение
В самом верху поста я писал про эту проблему.
Ну судя по запросу, для отображения данных поле id_klient должно быть заполнено, а где это происходит я не вижу.
Посмотри в самОй базе, может при Аппенде добавляются строки, которых просто не видно в запросе.

Еще один момент:
Цитата Сообщение от funduk17 Посмотреть сообщение
Delphi
1
2
if DM.ADOConnect.modified then
* DM.ADOConnect.post;
при изменении данных в неDB-компонентах модификации таблицы зафиксировано не будет и данные не сохранятся.
0
41 / 4 / 4
Регистрация: 20.05.2013
Сообщений: 67
01.06.2015, 23:39  [ТС]
Цитата Сообщение от FIL Посмотреть сообщение
Ну судя по запросу, для отображения данных поле id_klient должно быть заполнено, а где это происходит я не вижу.
Это происходит через DBLookupListBox. я на форме выбираю фамилию из уже готовой таблицы, и этот лукап мне возвращает значение поля id_klient.

Цитата Сообщение от FIL Посмотреть сообщение
при изменении данных в неDB-компонентах модификации таблицы зафиксировано не будет и данные не сохранятся.
Да, я знаю об этом, у меня всё было в DB-компонентах, а на DateTimePicker1 я прописывал отдельную процедуру.

Сейчас ещё поэксперементировал и заметил такую штуку:
Когда у меня на форме во всех DB компонентах поля DataField и DataSource были пустые. то Append заработал и я увидел новую строку, но как только по выставлял там связи с полями и DBQuery, запустил, и новая строка уже не появлялась, а опять же начала редактировать.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
01.06.2015, 23:58
Цитата Сообщение от funduk17 Посмотреть сообщение
Это происходит через DBLookupListBox
В запросе 3 параметра: id_service, id_klient, id_worker, а на форме 2 DBLookupListBox.
Каким образом 2 DBLookupListBox могут задавать 3 значения?

Цитата Сообщение от funduk17 Посмотреть сообщение
Когда у меня на форме во всех DB компонентах поля DataField и DataSource были пустые
Какие настройки ты выставляешь в BLookupListBox?
1
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
02.06.2015, 00:54
Цитата Сообщение от funduk17 Посмотреть сообщение
Хм. ну у меня Эти лукапы служат для связи этой таблицы с другими таблицами. В ListField я ввожу поле по которому буду выбирать, а в KeyField - значения, которые нужно занести непосредственно в таблицу!
Ну что за бред ты несёшь! Ну ты хоть какую-нибудь книжку/учебник найди и держи под руками.
Посмотри значение свойства DBLookupListBox1.KeyField в инспекторе объектов. Что ты там увидишь? Имя поля в некоей таблице. Имя, а не значение поля!
А вот значение поля ты можешь получить из DBLookupListBox1.KeyValue. Тогда хоть код и останется кривым, но всё же будет не бредовым.

Цитата Сообщение от FIL Посмотреть сообщение
DB-компоненты сами по себе вносят изменения в соответствующую таблицу, поэтому их значения дополнительно никуда добавлять не надо.
Когда программы пишутся методом тыка, не важно что это за компоненты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2015, 00:54
Помогаю со студенческими работами здесь

Каким образом работает ключ шифрования
Пытался найти в интернете - не смог. Везде продвинутая информация, а мне лишь понять, каким образом информация шифруется и...

Каким образом работает шифр в телеграм?
Если шифр закрытый и при перехвате будут всякие кракозябры, и сообщение видит только получаетель и отправитель. То почему нельзя просто...

Каким образом работает метод clone() ?
Когда мы переопределяем метод clone, то мы вызываем super.clone(). Он должен возвращать Object, но каким образом мы потом можем этот...

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

Каким образом работает static_cast в данном выражении
#include<iostream> using namespace std; //////////////////////////////////////////////////// class INT { private: int...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru