Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.114.38] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Пишу прогу для работы с БД Access с использованием ADO. Столкнулся с очень неприятной ситуацией при выборке/вставке данных из одной таблицы в другую. Постараюсь вкратце описать суть.
Есть БД, которая разделена следующим образом: - "Основная" таблица, с данными клиентов типа ИД, ФИО, Улица, Дом... - Доп. таблицы, в которых раскиданы данные по оплате для для каждого клиента по месяцам (возможно структура с приколом, но мне так подходит). - При добавлении нового клиента, в каждой доп таблице создаются значения по-дефолту и копируется ИД записи из первой таблицы. Когда я добавляю нового клиента - норм, когда открываю запись клиента для редактирования - норм (все данные для него подтягиваются без проблем), а вот дальше... Задача: выборка из "основной" таблицы строк по условию + выборка из любой доп. таблицы записи, которая соотв ИД из основной, а затем отобразить всю строку в отдельной таблице на форме... и так для всех строк из основной таблицы. Код ниже описывает сам процесс и вот с ним трабла: procedure TForm3.BitBtn2Click(Sender: TObject); var id2: integer; begin if Form3.RadioButton1.Checked then Form3.ADOQuery14.SQL.Clear; Form3.ADOQuery14.SQL.Add('SELECT * FROM delo WHERE DV="*"'); //поле текстовое, и заполняется *, если нужно Form3.ADOQuery14.Open; id2:=Form3.ADOQuery14.FieldByName('id').AsInteger; if Form3.ComboBox1.Text='Январь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id=id3'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open; end else if Form3.ComboBox1.Text='Февраль' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Feb WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Март then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM March WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Апрель' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Май' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM May WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Июнь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jun WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Июль' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jul WHERE id=:id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Август' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Aug WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Сентябрь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Sept WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Октябрь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Oct WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ноябрь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Nov WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Декабрь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Dec12 WHERE id=id2'); Form3.ADOQuery2.Open end; try Form3.ADOQuery1.Insert; Form3.ADOQuery1.FieldByName('id').AsInteger:=Form3.ADOQuery14.FieldByName('id').AsInteger; Form3.ADOQuery1.FieldByName('FIO').AsString:=Form3.ADOQuery14.FieldByName('FIO').AsString; Form3.ADOQuery1.FieldByName('Order').AsString:=Form3.ADOQuery14.FieldByName('Order').AsString; Form3.ADOQuery1.FieldByName('House').AsString:=Form3.ADOQuery14.FieldByName('House').AsString; Form3.ADOQuery1.FieldByName('Street').AsString:=Form3.ADOQuery14.FieldByName('Street').AsString; Form3.ADOQuery1.FieldByName('DV').AsString:=Form3.ADOQuery14.FieldByName('DV').AsString; Form3.ADOQuery1.FieldByName('MD').AsString:=Form3.ADOQuery14.FieldByName('MD').AsString; Form3.ADOQuery1.FieldByName('God').AsString:=Form3.ADOQuery2.FieldByName('God').AsString; Form3.ADOQuery1.FieldByName('Mes').AsString:=Form3.ADOQuery2.FieldByName('Mes').AsString; Form3.ADOQuery1.FieldByName('Data').AsDateTime:=Form3.ADOQuery2.FieldByName('Data').AsDateTime; Form3.ADOQuery1.FieldByName('Subs').AsInteger:=Form3.ADOQuery2.FieldByName('Subs').AsInteger; Form3.ADOQuery1.FieldByName('PK').AsInteger:=Form3.ADOQuery2.FieldByName('PK').AsInteger; Form3.ADOQuery1.FieldByName('UPSN').AsInteger:=Form3.ADOQuery2.FieldByName('UPSN').AsInteger; Form3.ADOQuery1.ExecSQL; except on e:Exception do end; Form3.ADOQuery1.Refresh; end; Теперь весь процесс: Прикреплённый файл11.jpg (43,13 Кбайт, скачиваний: 532) в БД записи есть Прикреплённый файл1.jpg (70,23 Кбайт, скачиваний: 505) само окно поиска Прикреплённый файл12.jpg (67,93 Кбайт, скачиваний: 520) условия выбраны и кнопка выбрать нажата Прикреплённый файл13.jpg (74,05 Кбайт, скачиваний: 511) Повторное нажатие.... Прикреплённый файл15.jpg (65,56 Кбайт, скачиваний: 515) ... и финал... В чем м.б. загвоздка? Код приведённый выше - на форме поиска/добавления (форма №1) и редактирования (форма №2) всё прекрасно вытаскивает, а здесь.... Подскажите плиз |
Сообщ.
#2
,
|
|
|
Уважаемые форумчане, очень нужна помощь!
|
Сообщ.
#3
,
|
|
|
Цитата WinFack @ Код ниже описывает сам процесс и вот с ним трабла Что такое "трабла"? Тrабла с кодом или процессом? |
Сообщ.
#4
,
|
|
|
Это что
Цитата WinFack @ ?Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id=id2'); Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id='+String(id2)); Лучше через параметр передавать id2,id3. |
Сообщ.
#5
,
|
|
|
Цитата MIF @ Трабла таки с кодом, т.к. при выполнении в нужной таблице появляется строка с "0" Добавлено Цитата Bas @ При использовании кода, предложенного вами, получаю ошибку - ошибка синтаксиса (пропущен оператор) в выражении запроса 'id=" Добавлено Цитата Bas @ Это что Цитата WinFack @ ?Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id=id2'); Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id='+String(id2)); Лучше через параметр передавать id2,id3. Для меня остается загадкой, почему код Form1.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id='+Form1.ADOQuery1.FieldByName('id').AsString); на первых 2-х формах работает просто отлично, а здесь упорно отказывается? |
Сообщ.
#6
,
|
|
|
Цитата WinFack @ ошибка синтаксиса (пропущен оператор) в выражении запроса 'id=" Синтаксис надо знать, у вас и подстановка и параметры, используйте что-то одно. Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id=:id'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open; Если используете ADOQuery Цитата WinFack @ Form3.ADOQuery1.Insert; То используйте запрос на вставку INSERT INTO "Customer.db" (CustNo, Company) VALUES (9842, "Inprise Corporation") Добавлено Цитата WinFack @ на первых 2-х формах работает просто отлично, а здесь упорно отказывается? Потому что ('id').AsString - это явное преобразование. Мое изобретение (+String(id2)) может и не пройти , давно не писал на делфях. Добавлено Прочтите свой код. Цитата WinFack @ if Form3.ComboBox1.Text='Июнь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jun WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Июль' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jul WHERE id=:id2'); Form3.ADOQuery2.Open end В первом случае запрос будет SELECT * FROM Jun WHERE id=id2 Где id2 не известно что , то есть null. Во втором случае, тоже самое , так как вы объявили параметр (:id2) и его не заполнили. |
Сообщ.
#7
,
|
|
|
Цитата Bas @ Цитата WinFack @ ошибка синтаксиса (пропущен оператор) в выражении запроса 'id=" Синтаксис надо знать, у вас и подстановка и параметры, используйте что-то одно. Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id=:id'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open; Если используете ADOQuery Цитата WinFack @ Form3.ADOQuery1.Insert; То используйте запрос на вставку INSERT INTO "Customer.db" (CustNo, Company) VALUES (9842, "Inprise Corporation") Добавлено Цитата WinFack @ на первых 2-х формах работает просто отлично, а здесь упорно отказывается? Потому что ('id').AsString - это явное преобразование. Мое изобретение (+String(id2)) может и не пройти , давно не писал на делфях. Добавлено Прочтите свой код. Цитата WinFack @ if Form3.ComboBox1.Text='Июнь' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jun WHERE id=id2'); Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Июль' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jul WHERE id=:id2'); Form3.ADOQuery2.Open end В первом случае запрос будет SELECT * FROM Jun WHERE id=id2 Где id2 не известно что , то есть null. Во втором случае, тоже самое , так как вы объявили параметр (:id2) и его не заполнили. Итак... докрутил код кнопки до такого вида: procedure TForm3.BitBtn2Click(Sender: TObject); var id2: integer; fio: string; ord: string; hs: string; str: string; dv: string; md: string; god: string; mes: string; data: string; sub: integer; pk: integer; upsn: integer; begin if Form3.RadioButton1.Checked then begin Form3.ADOQuery14.SQL.Clear; Form3.ADOQuery14.SQL.Add('SELECT id,FIO,Order,Street,House,DV,MD FROM selo WHERE DV="x"'); Form3.ADOQuery14.Open; end else if Form3.RadioButton2.Checked then begin Form3.ADOQuery14.SQL.Clear; Form3.ADOQuery14.SQL.Add('SELECT id,FIO,Order,Street,House,DV,MD FROM selo WHERE MD="x"'); Form3.ADOQuery14.Open; end; Form3.Edit1.Text:=Form3.ADOQuery14.FieldByName('id').AsString; id2:=Form3.ADOQuery14.FieldByName('id').AsInteger; if Form3.ComboBox1.Text='ßíâàðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open; end else if Form3.ComboBox1.Text='Ôåâðàëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Feb WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ìàðò' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM March WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Àïðåëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ìàé' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM May WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Èþíü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jun WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Èþëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jul WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Àâãóñò' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Aug WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ñåíòÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Sept WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Îêòÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Oct WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Íîÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Nov WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Äåêàáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Dec12 WHERE id=:id2'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end; fio:=Form3.ADOQuery14.FieldByName('FIO').AsString; ord:=Form3.ADOQuery14.FieldByName('Order').AsString; hs:=Form3.ADOQuery14.FieldByName('House').AsString; str:=Form3.ADOQuery14.FieldByName('Street').AsString; dv:=Form3.ADOQuery14.FieldByName('DV').AsString; md:=Form3.ADOQuery14.FieldByName('MD').AsString; god:=Form3.ADOQuery2.FieldByName('God').AsString; mes:=Form3.ADOQuery2.FieldByName('Mes').AsString; data:=Form3.ADOQuery2.FieldByName('Data').AsString; sub:=Form3.ADOQuery2.FieldByName('Subs').AsInteger; pk:=Form3.ADOQuery2.FieldByName('PK').AsInteger; upsn:=Form3.ADOQuery2.FieldByName('UPSN').AsInteger; //// Form3.ADOQuery1.SQL.Clear; Form3.ADOQuery1.SQL.Add('INSERT INTO Lgot ([id], [FIO], [House], [Order], [Street], [DV], [MD], [God], [Mes], [Data], [Subs], [PK], [UPSN]) VALUES (:id2, :fio, :hs, :ord, :str, :dv, :md, :god, :mes, :data, :sub, :pk, :upsn)'); Form3.ADOQuery1.Parameters[0].Value:=id2; Form3.ADOQuery1.Parameters[1].Value:=fio; Form3.ADOQuery1.Parameters[2].Value:=hs; Form3.ADOQuery1.Parameters[3].Value:=ord; Form3.ADOQuery1.Parameters[4].Value:=str; Form3.ADOQuery1.Parameters[5].Value:=dv; Form3.ADOQuery1.Parameters[6].Value:=md; Form3.ADOQuery1.Parameters[7].Value:=god; Form3.ADOQuery1.Parameters[8].Value:=mes; Form3.ADOQuery1.Parameters[9].Value:=data; Form3.ADOQuery1.Parameters[10].Value:=sub; Form3.ADOQuery1.Parameters[11].Value:=pk; Form3.ADOQuery1.Parameters[12].Value:=upsn; try Form3.ADOQuery1.ExecSQL; // затыкается именно здесь except on e:Exception do end; end; При нажатии кнопки в гриде нифига не отображается.... повторное нажатие доводит до ошибки [attach=#0][/attach] НО... после повторного запуска приложения в гриде таки отображаются строки... (снова строка с 0 и первая, которая соотв. условиям отбора).&!#@%$&^$ Как я понимаю - select * должен выбирать все строки и таблицы, которые соотв условию. Или здесь еще нужно организовывать цикл на заполнение? Прикреплённый файл____________________.jpg (61,77 Кбайт, скачиваний: 663) |
Сообщ.
#8
,
|
|
|
Еще немного подковырял код:
procedure TForm3.BitBtn2Click(Sender: TObject); var id2: integer; fio: string; ord: string; hs: string; str: string; dv: string; md: string; god: string; mes: string; data: string; sub: integer; pk: integer; upsn: integer; begin if Form3.RadioButton1.Checked then begin Form3.ADOQuery14.SQL.Clear; //Form3.ADOQuery14.SQL.Add('SELECT id,FIO,Order,Street,House,DV,MD FROM selo WHERE DV="x"'); Form3.ADOQuery14.SQL.Add('SELECT * FROM selo WHERE DV="x"'); Form3.ADOQuery14.Open; end else if Form3.RadioButton2.Checked then begin Form3.ADOQuery14.SQL.Clear; //Form3.ADOQuery14.SQL.Add('SELECT id,FIO,Order,Street,House,DV,MD FROM selo WHERE MD="x"'); Form3.ADOQuery14.SQL.Add('SELECT * FROM selo WHERE MD="x"'); Form3.ADOQuery14.Open; end; Form3.Edit1.Text:=Form3.ADOQuery14.FieldByName('id').AsString; id2:=Form3.ADOQuery14.FieldByName('id').AsInteger; if Form3.ComboBox1.Text='ßíâàðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jan WHERE id=:id2 AND Mes="ßíâàðü"');//здесь и далее название месяца Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open; end else if Form3.ComboBox1.Text='Ôåâðàëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Feb WHERE id=:id2 AND Mes="Ôåâðàëü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ìàðò' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM March WHERE id=:id2 AND Mes="Ìàðò"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Àïðåëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Apr WHERE id=:id2 AND Mes="Àïðåëü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ìàé' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM May WHERE id=:id2 AND Mes="Ìàé"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Èþíü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jun WHERE id=:id2 AND Mes="Èþíü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Èþëü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Jul WHERE id=:id2 AND Mes="Èþëü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Àâãóñò' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Aug WHERE id=:id2 AND Mes="Àâãóñò"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Ñåíòÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Sept WHERE id=:id2 AND Mes="Ñåíòÿáðü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Îêòÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Oct WHERE id=:id2 AND Mes="Îêòÿáðü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Íîÿáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Nov WHERE id=:id2 AND Mes="Íîÿáðü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end else if Form3.ComboBox1.Text='Äåêàáðü' then begin Form3.ADOQuery2.SQL.Clear; Form3.ADOQuery2.SQL.Add('SELECT * FROM Dec12 WHERE id=:id2 AND Mes="Äåêàáðü"'); Form3.ADOQuery2.Parameters[0].Value:=id2; Form3.ADOQuery2.Open end; fio:=Form3.ADOQuery14.FieldByName('FIO').AsString; ord:=Form3.ADOQuery14.FieldByName('Order').AsString; hs:=Form3.ADOQuery14.FieldByName('House').AsString; str:=Form3.ADOQuery14.FieldByName('Street').AsString; dv:=Form3.ADOQuery14.FieldByName('DV').AsString; md:=Form3.ADOQuery14.FieldByName('MD').AsString; god:=Form3.ADOQuery2.FieldByName('God').AsString; mes:=Form3.ADOQuery2.FieldByName('Mes').AsString; data:=Form3.ADOQuery2.FieldByName('Data').AsString; sub:=Form3.ADOQuery2.FieldByName('Subs').AsInteger; pk:=Form3.ADOQuery2.FieldByName('PK').AsInteger; upsn:=Form3.ADOQuery2.FieldByName('UPSN').AsInteger; //// try Form3.ADOQuery1.SQL.Clear; Form3.ADOQuery1.SQL.Add('INSERT INTO Lgot ([id], [FIO], [House], [Order], [Street], [DV], [MD], [God], [Mes], [Data], [Subs], [PK], [UPSN]) VALUES (:id2, :fio, :hs, :ord, :str, :dv, :md, :god, :mes, :data, :sub, :pk, :upsn)'); Form3.ADOQuery1.Parameters[0].Value:=id2; Form3.ADOQuery1.Parameters[1].Value:=fio; Form3.ADOQuery1.Parameters[2].Value:=hs; Form3.ADOQuery1.Parameters[3].Value:=ord; Form3.ADOQuery1.Parameters[4].Value:=str; Form3.ADOQuery1.Parameters[5].Value:=dv; Form3.ADOQuery1.Parameters[6].Value:=md; Form3.ADOQuery1.Parameters[7].Value:=god; Form3.ADOQuery1.Parameters[8].Value:=mes; Form3.ADOQuery1.Parameters[9].Value:=data; Form3.ADOQuery1.Parameters[10].Value:=sub; Form3.ADOQuery1.Parameters[11].Value:=pk; Form3.ADOQuery1.Parameters[12].Value:=upsn; Form3.ADOQuery1.ExecSQL; except on e:Exception do end; end; В итоговой таблице пришлось убрать ключевое поле, а точнее выставить его просто числовым и разрешить повторения значений... Теперь ошибок при поиске/вставке нет, но опять-таки в таблицу вставляется только первая строка из условия... причем столько раз, сколько будет нажата кнопка. И содержимое таблицы не отображается, хотя данные записываются... Как можно побороть? |
Сообщ.
#9
,
|
|
|
Цитата WinFack @ причем столько раз, сколько будет нажата кнопка. Вы же разрешили Цитата WinFack @ разрешить повторения значений... Вот она и вставляет сколько раз вы нажали кнопку. |
Сообщ.
#10
,
|
|
|
Цитата Bas @ Цитата WinFack @ причем столько раз, сколько будет нажата кнопка. Вы же разрешили Цитата WinFack @ разрешить повторения значений... Вот она и вставляет сколько раз вы нажали кнопку. Ну да ладно.... вернуть уникальность полю не так и сложно (правда будет снова ругаться на повторение значений), а вот почему выбирается и соотв. вставляется только первая строка из поиска - вопрос остается открытым... |
Сообщ.
#11
,
|
|
|
Цитата WinFack @ а вот почему выбирается и соотв. вставляется только первая строка из поиска - вопрос остается открытым... Что надо сделать? Вставить в Lgot запись? В нем id это внешний ключ или уникальное поле? |
Сообщ.
#12
,
|
|
|
Цитата Bas @ Цитата WinFack @ а вот почему выбирается и соотв. вставляется только первая строка из поиска - вопрос остается открытым... Что надо сделать? Вставить в Lgot запись? В нем id это внешний ключ или уникальное поле? По-факту, да. В таблицу Lgot необходимо вставить все строки, которые соотв. условию. Сам запрос такой: - сначала выбираем все строки из таблицы selo, в которых в поле DV или MD имеет х; - затем, в зависимости от "месяца", который указывается до нажатия кнопки, выбрать из соотв. таблицы строку в которой id равен id из таблицы selo; - после, результирующую строку нужно записать в таблицу Lgot... и этот процесс нужно повторить для всех строк из таблицы selo |
Сообщ.
#13
,
|
|
|
Блин.. прям какой-то заколдованный круг... Как мысль, решил попробовать заключить процесс селекта по месяцам в цикл:
while not Form3.ADOQuery14.Eof do begin ....... Form3.ADOQuery1.Refresh; Form3.ADOQuery14.Next; end; Form3.ADOQuery14.Close; end; Правда толку нет, т.к. в гриде них... не отображается и в таблицу также ничего не записывается... |
Сообщ.
#14
,
|
|
|
Всё... разобрался. Всем откликнувшимся, огромное спасибо. Тема закрыта
|