Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
1
Другое

Выборка строки из таблицы БД Access ADO Delphi 7

03.02.2015, 18:22. Показов 2747. Ответов 12
Метки нет (Все метки)

Всем доброго времени суток. Есть небольшая проблемка - пишу прогу для работы с БД абонентов. Суть такова:
- сначала вносится новый абонент - ему присваивается свой id + этот id копируется в отдельные таблицы (месяца), т.е. счетчик в отдельных таблицах присваивается из главной. Возможно решение не самое лучшее, но так захотели...
- если на основной таблице выполняется двойной клик - открывается другая форма, на которой есть поля, куда выводятся данные из БД и таблица (типа сводной для данного абонента) и Label, который показывает текущий ИД для абонента.
При этом механизм (задумка) следующий:
- в поля на второй форме, скажем "Данные по абоненту" выводятся общие данные, типа ФИО и т.п.
- в сводной таблице должны выводиться все записи по месяцам, т.е. только те, для которых совпадает ИД из основной таблицы.
Пример (сводная):
месяц | показания | оплатил | долг
январь | 258 | 120 | 25
февраль .....
и, при клике уже на сводной таблице - в нужные поля на второй форме выводятся данные из той строки, которая была выделена.

Проблема:
- при двойном клике, открывается вторая форма, с указанными элементами и в Edit-ы выводятся общие данные, а вот со сводной - беда.
Запрос на общую выборку слепил такой:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.DBGrid1DblClick(Sender: TObject);
begin
try
Form2.Label19.Caption:=Form1.ADOQuery1.FieldByName('id').AsString;
ADOQuery2.SQL.Clear;
Form1.ADOQuery2.SQL.Add('SELECT * FROM Jan where  id=Form2.Label19.Caption');
...
except
on e:Exception do
end;
end;
А вот как записать эту строку в сводную таблицу только в строку 1, которая соответствует месяцу, и отобразить?
Пробовал так:
Delphi
1
2
3
ADOQuery14.SQL.Clear;
Form1.ADOQuery14.SQL.Add('INSERT INTO Obsh (Месяц, Показания, Опл, Долг) VALUES (Месяц, Показания, Опл, Долг) WHERE id=1');
Form1.ADOQuery14.Post;
Мож кто сталкивался с подобным?

Добавлено через 14 минут
Момент - даже если я вручную пропишу в таблице Jan, все данные для полей - при выполнении запроса для указанного абонента по ИД - в сводную таблицу они не переносятся, т.е. строка, которая соответствует "Январь" - пустая...
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2015, 18:22
Ответы с готовыми решениями:

Delphi БД - Access + ADO
Всем привет. Сразу к делу: проект в Delphi 7, к нему подцеплена БД Access через ADO (все элементы,...

Delphi Access and ADO
Здравствуйте! Пишу программу с первым применением БД. БД Access. Там несколько таблиц. В...

Access+Delphi+ADO
Добрый вечер уважаемые програмисты! Помогите решить задачку. Есть таблица в Аксесе: Дата ...

delphi+ADo+Access ERROR
error что делать , кто знает в чем дело можете подсказать?

12
484 / 443 / 172
Регистрация: 11.12.2013
Сообщений: 2,339
03.02.2015, 22:33 2
А где в запросе на добавление код абонента?
0
1073 / 986 / 340
Регистрация: 07.08.2012
Сообщений: 2,782
03.02.2015, 22:53 3
Здесь, Алексей, случай патологический.
В запросе на добавление пишется условие (интересно было бы узнать логику написавшего такое).
А значения, которые должны записываться, повторяют имена полей (что бы это могло значить? Неужто параметры?).
0
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
03.02.2015, 23:33  [ТС] 4
Наверное я чуток обздался в описании задачи."Сводная" таблица будет "собираться" для каждого абонента отдельно, в зависимости от его ИД. В этой таблице будет всего 12 строк и соотв 12 ИД для них.
Delphi
1
Form1.ADOQuery14.SQL.Add('INSERT INTO Obsh (Месяц, Показания, Опл, Долг) VALUES (Месяц, Показания, Опл, Долг) WHERE id=1');
Этой строкой я подразумевал добавление значений из запроса именно в первую строку "сводной" таблицы, т.к. она для месяца "Январь", а первый запрос:
Delphi
1
Form1.ADOQuery2.SQL.Add('SELECT * FROM Jan where  id=Form2.Label19.Caption');
Подразумевает выборку всех значений из таблицы "Январь" для данного ИД.
0
1073 / 986 / 340
Регистрация: 07.08.2012
Сообщений: 2,782
03.02.2015, 23:44 5
Нужно поизучать синтаксис SQL запросов.

В запросах INSERT не имеет смысла выражение WHERE с условиями.

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

SQL запрос - это всего лишь текст и вставлять в этот текст имена дельфийских объектов тоже не имеет никакого смысла. Такой запрос не пройдет проверку на корректность синтаксиса.
Т.е. пример запроса в такой ситуации:
Delphi
1
Form1.ADOQuery2.SQL.Add('SELECT * FROM Jan where  id='+Form2.Label19.Caption);
0
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
04.02.2015, 00:21  [ТС] 6
Ok. С этим вроде понятно, а как тогда вытащить ИД абонента?
0
1073 / 986 / 340
Регистрация: 07.08.2012
Сообщений: 2,782
04.02.2015, 00:29 7
А что, в возвращаемом запросом SELECT * FROM Jan where id=... результате этого ИД нет?
0
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
06.02.2015, 08:27  [ТС] 8
Короче, запарился... Математику для прожки сварганил, новые данные в таблицы записываются без проблем, а вот со "сводной" так и остался затык... Блин, кто сталкивался, подскажите как всю строку с данными после команды
Delphi
1
Form1.ADOQuery2.SQL.Add('SELECT * FROM Jan where  id='+Form2.Label19.Caption);
- разместить в "сводной таблице и именно в первой строке? В сводной таблице всего 12 строк и ИД у них не изменяется. Структура у всех таблиц идентичная. К этому можно зацепиться? Помогите плиз!!!
Или тыкните носом, где можно пример глянуть али книжку.... перерыл массу всего...
0
1073 / 986 / 340
Регистрация: 07.08.2012
Сообщений: 2,782
06.02.2015, 08:46 9
"Разместить" - видимо перезаписать что есть в первой строке.
Если так. то используется запрос UPDATE. Только с другим компонентом ADOQuery.
Delphi
1
2
3
4
5
ADOQueryN.SQL.Text := 'update Obsh set Месяц='+ InToStr(ADOQuery2['Месяц'])+','
  'Показания = '+(ADOQuery2['Показания'])+','
  'Опл = '+(ADOQuery2['Опл'])+','
  'Долг = '+(ADOQuery2['Долг']);
ADOQueryN.ExecSQL;
Если поле имеет числовой тип, то полученное по запросу значение нужно преобразовывать к строке.
Если Месяц число, то применяется IntToStr. Так и по другим полям (тип полей в таблице неизвестен, поэтому показаны только скобки: (ADOQuery2['Опл'])).
Если поле текстовое, то значение для запроса update нужно заключать в одинарные кавычки (в Аксессе можно в двойные). Одинарные проще вставить функцией QuotedStr.
0
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
06.02.2015, 08:56  [ТС] 10
Блин... а вот на счет апдейта я сомневался. Если типы полей указаны через Access - то преобразовывать нет смысла. Я прав? А в следующие строки "сводной" таблицы, добавлять после Next.... ADOQueryN?
0
1073 / 986 / 340
Регистрация: 07.08.2012
Сообщений: 2,782
06.02.2015, 09:49 11
Упустил важнейший момент. В запросе должно быть обязательное условие, по которому ищется нужная строка для обновления в ней данных:
Delphi
1
2
3
4
ADOQueryN.SQL.Text := 'update Obsh set Месяц='+ InToStr(ADOQuery2['Месяц'])+','
  'Показания = '+(ADOQuery2['Показания'])+','
  'Опл = '+(ADOQuery2['Опл'])+','
  'Долг = '+(ADOQuery2['Долг'])+' where id = '+IntToStr(ADOQuery2['ID']); //имя поля [B]ID[/B]?
Если надо заменить все строки, то да, после Next.

Добавлено через 12 минут
Если типы полей указаны через Access - то преобразовывать нет смысла. Я прав?
Нет, не прав.
Дело в том, что SQL запрос - это текст каким бы этот запрос не был.
И поэтому надо все значения преобразовывать к строковое представление. Кроме текстовых значений, которые достаточно обрамить кавычками.

Добавлено через 21 минуту
Если формировать параметрический запрос, то тогда, верно: преобразования значений не нужны, которые в случае такого запроса присваиваются в параметры.
Но в приведенном случае значения внедрены непосредственно в текст запроса и здесь преобразование нужно делать.

Добавлено через 5 минут
Параметрический запрос (полезен в любом случае, особенно, если в запросе участвуют поля типа Дата):
Delphi
1
2
3
4
5
  ADOQueryN.SQL.Text := 'update Obsh set Месяц=:М, Показания = :П, Опл = :Опл, Долг = :Долг';
  ADOQueryN.Parameters[0].Value := ADOQuery2['Месяц']);
  ADOQueryN.Parameters[1].Value := ADOQuery2['Показания']);
  ADOQueryN.Parameters[2].Value := ADOQuery2['Опл']);
  ADOQueryN.Parameters[3].Value := ADOQuery2['Долг']);
1
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
09.02.2015, 17:43  [ТС] 12
Нифига.... так ничего и не собирается в "сводную" таблицу.... Мож скинуть весь проект?
0
0 / 0 / 0
Регистрация: 11.01.2015
Сообщений: 18
14.02.2015, 06:16  [ТС] 13
Народ, если кто имеет желание помочь http://www.ex.ua/449731768989 - сам проект (пути для БД крутить не надо). Загвоздка так и осталась в "выборке" для сводной таблицы, т.е. при двойном клике на основной - открывается форма, на которой есть другая таблица в которую должны собираться строки из дополнительных таблиц по общему ИД из первой. Плиз, очень нужно...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2015, 06:16

Delphi и SQL (ADO, Access)
Здравствуйте. Возникла такая проблема: Использую Access через ADO. Создаю новое поле (столбец) в...

Помогите с БД Delphi+ADO+Access
Как мне сделать, чтобы при нажатии на кнопку заносилась(адресс фотографии) в таблицу в поле...

Обновление таблицы (ADO и Access)
Всем привет!!! Подскажите как правильно обновить таблица после выполнения запроса (после апдейта...

ADO Refresh Access 2000 and Delphi 6
Проблема. Немогу с первого раза обновить(Close Open) НД1 при изменении в НД2. Обновляет только при...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.