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

Ado.DataSet как задать в параметр - таблицу на выбор

18.04.2018, 01:36. Показов 4700. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть две таблицы ВидРайона(код_ВР, Наименование_ВР), РайоныЛист(код_РЛ, Наименование_РЛ, код_ВР),
И две таблицы РайонМуниципалитет(код_РМ, Инфо_РМ, код_РЛ), РайонГород(код_РГ, Инфо_РГ, код_РЛ)

Надо подставить имя таблицы (РайонМуниципалитет ИЛИ РайонГород) в ADO.DataSet
(select * from (В это место) where код_РЛ = :ID)

хотел задать параметр :T чтобы comand text получился такой (select * from :T where код_РЛ = :ID)
Но говорит "надо объявить табличную переменную @P1"

Delphi
1
2
3
4
5
6
7
i:=dsAreaType.FieldByName('код_ВР').AsInteger;
if i=1 then t1:='РайоныМуниципалы';
if i=2 then t1:='РайоныГород';
dsAreaInfo.Close;
dsAreaInfo.Parameters.ParamByName('T').Value:=t1;
dsAreaInfo.Parameters.ParamByName('ID').Value:=dsAreaListTable.FieldByName('код_РЛ').AsInteger;
dsAreaInfo.Open;
делаю это при изменении dataSours'a таблицы РайоныЛист.

Если есть какой то перспективный вариант прошу отправить в направлении такого)))
Что бы таким не заниматься,
Delphi
1
2
if i=1 then t1:='РайоныМуниципалы';
if i=2 then t1:='РайоныГород';
понимая что количество видов района может расти...

Заранее благодарю.
использую MSSQL 2014
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2018, 01:36
Ответы с готовыми решениями:

Как передать параметр внутрь запроса в DataSet
Всем привет! Есть вот такой вот SQL запрос: SELECT dir.id_dir, dir.imya, dir.fam, dir.otch, dir.id_banka FROM (dir...

Передача данных из таблицы одной dataSet в таблицу другой dataSet
Здравствуйте. У меня возникла ситуация когда необходимо передать данные из таблицы одной dataset в таблицу другой dataset, которая хранит...

Как передать в процедуру Oracle параметр типа table%rowtype из ADO.NET?
Привет, что-то затруднился. Возможен ли вызов оракловой процедуры через ADP.NET у которой входой параметр имеет тип коллекции...

22
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
18.04.2018, 06:19
Лучший ответ Сообщение было отмечено Slalom как решение

Решение

таких параметров не бывает
и вообще незачем каждый раз переписывать SQL в Query
создайте два Query и пользуйтесь на здоровье
то же касается и грида
для каждой таблицы сделайте свой, отдельный, не жмитесь. И настройте его как следует. Какие колонки показывать, какой ширины и т.д.

Добавлено через 1 минуту
Цитата Сообщение от Slalom Посмотреть сообщение
РайонМуниципалитет(код_РМ, Инфо_РМ, код_РЛ), РайонГород(код_РГ, Инфо_РГ, код_РЛ)
это вообще одна таблица
сделайте в нее поле признак М/Г, чтобы выбирать из нее то, что вам нужно в конкретный момент
если бы понимать , что там у вас вообще хранится, можно было бы более адекватно объяснить
1
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
18.04.2018, 07:33
Цитата Сообщение от Slalom Посмотреть сообщение
Надо подставить имя таблицы (РайонМуниципалитет ИЛИ РайонГород) в ADO.DataSet
(select * from (В это место) where код_РЛ = :ID)
Delphi
1
2
3
4
5
6
7
8
var Raion: string;
begin
case i of
1: Raion:='РайонМуниципалитет'; 
2: Raion:='РайоныГород';
end;
ADODataSet1.CommandText:=Format('(select * from (%s) where код_РЛ = :ID)',[Raion]);
end;
Но это не выход создавать каждый раз однотипную таблицу.
1
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
18.04.2018, 15:35  [ТС]
krapotkin, спасибо. Думал сделать разные таблицы т. к. появились другие виды районов работ, с доп данными, но похоже проще добавить в существующую таблицу пару столбцов, пускай будут пустыми???

Добавлено через 1 час 53 минуты
ZfoxAK, спасибо. Сам понимаю что не выход, буду писать все в одну.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
18.04.2018, 17:15
одинаковые данные должны храниться в одной таблице
бывает так, что для каких-то данных появляются уникальные сопутствующие данные
тогда либо добавляют столбцы (но очень хорошо подумав) либо делают доп таблицу, которая связана с основной, и содержит только дополнительные данные. это нормальный способ
есть еще способ хранить доп. данные, особенно если их много разных видов в методологии EAV
таблица справочник свойств, таблица принадлежности свойств конкретным данным, и таблица значений этого свойства для выбранного ключа в основной таблице
1
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
19.04.2018, 16:43  [ТС]
krapotkin,
0
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
19.04.2018, 16:54  [ТС]
так лучше видно
0
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
19.04.2018, 17:00  [ТС]
krapotkin,
0
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
19.04.2018, 17:03  [ТС]
krapotkin,
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
19.04.2018, 21:38
так. что-то стало понятнее.
5 таблиц слева вроде не вызывают у меня отторжения )))
3 справа я не очень понимаю что там.

теперь что нужно сделать с этим всем?
0
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
19.04.2018, 22:24  [ТС]
Добавлено через 33 секунды
krapotkin, Нужно в дельфи организовать правильное заполнение этих таблиц.

Добавлено через 13 минут
При добавлении нового объекта, я на форме выбора вида объекта создаю поле в таблице Объекты, туда записываю кодОбъекта, и кодВидаОбъекта через query на форме выбора объекта, присваиваю кодОбъекта переменной с формы Редактирования(/Создания/просмотра) Объекта, objID. Потом открываю Форму объекта dataset'у Объекта присваиваю значение objID, получаю форму На которой отображен вид объекта.
Далее выбираю район работ жму на соответствующую кнопку.
Попадаю на форму фото3, три таблицы, добавляю/или выбираю существующую запись из справочника, выбрал, возвращаюсь обратно из dataset'ов с предыдущей формы достаю нужные значения подставляю их в поля, дополняю, адрес и номер, сохраняю.

Добавлено через 1 минуту
3я с права ОКС? эта таблица с данными одного из объектов, (Объект кап.строительства)

Добавлено через 1 минуту
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TfmObjectEdit.FormShow(Sender: TObject);
begin
  dsOBJECT.Close;
  dsOBJECT.Parameters.ParamByName('ID').Value:=objID;
  dsOBJECT.Open;
   TypeObjTable.Close;
   TypeObjTable.Open;
 if IsNew then
  begin
   IsEdit := False;
   Caption:= 'НОВЫЙ УЧАСТОК ';
   ToolButton4.Enabled:=false;
  end
  else
   Caption:= 'Карточка участка';
   ToolButton4.Enabled:=true;
end;
Форма объекта при открытии

Добавлено через 4 минуты
Так переходим с формы выбора вида объекта

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
 
   Q.Close;
   Q.Sql.Text := 'select max([ОБ_код]) as ID from [dbo].[Объекты]';
   Q.Open;
    id:= Q.FieldByName('id').AsInteger+1;
    Q.Close;
    Q.Sql.Clear;
    Q.SQl.Add('insert into [dbo].[Объекты] ([ОБ_код],[ОБ_вид_код])');
    Q.SQl.Add(' values ('+IntToStr(id)+', 1)');
    Q.ExecSql;
    ObjecteditOrder.objID:=id;
    Objectedit.IsNew:=True;
       fmObjectedit.ShowModal;
Добавлено через 2 минуты
Так возвращаемся с формы выбора района
Delphi
1
2
3
4
5
6
7
8
procedure TfmObjectEdit.bbAreaTypeClick(Sender: TObject);
begin
 fmAreaList.ShowModal;
 if isNew then
  Begin
   dbeAdres.Text:=fmAreaList.dsAreaInfo.FieldByName('[ри_Адрес]').AsString;
  End;
end;
Добавлено через 4 минуты
Понимаю что так не правильно. Вопрос как правильно организовать все это взаимодействие?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
20.04.2018, 10:35
ну почему ж сразу неправильно

насколько я понимаю, мы обсуждаем, как делать интерфейс заполнения поля таблицы данными из справочников
тут есть два основных варианта
если для выбора достаточно видеть одно какое-то поле, например название, а вставлять код, то можно использовать DBLookupComboBox прямо на месте
если нужно для выбора видеть несколько полей, то открываем новую модальную форму, где показываем все варианты для выбора, а после закрытия формы по ОК значение из датасета на форме опять же вписывается в поле редактируемого датасета
пример работы с формой тут
https://www.cyberforum.ru/blog... g4873.html

еще один момент, который бросился в глаза, select max(id)+1 from...
Так нельзя делать в многопользовательской системе
это делается через автоинкрементные поля
при каждой вставке вы будете получать уникальный ID
1
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
21.04.2018, 19:04  [ТС]
krapotkin,
Так нельзя делать в многопользовательской системе
это делается через автоинкрементные поля
при каждой вставке вы будете получать у
А как тогда получать id вновь созданного объекта, для заполнения данными?тоесть выбираем объект делаем query.append, в поле вида объекта ставим значение соответствующее коду вида объекта в таблице объектов, делаем query.post, переходим на форму для заполнения остальными данными. Но как получить id этой записи?

Добавлено через 6 минут
krapotkin,
пример работы с формой тут
https://www.cyberforum.ru/blog... g4873.html
Прочитал. Очень поучительно, спасибо! Прочитал практически все ваши Заметки, жаль что не хватает знаний во всех разобраться((
0
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
21.04.2018, 20:43
Цитата Сообщение от Slalom Посмотреть сообщение
А как тогда получать id вновь созданного объекта, для заполнения данными?тоесть выбираем объект делаем query.append
пишут хранимую процедуру для добавления в таблицу
процедуре передают нужные данные, далее они уже проверяются внутри и добавляются в таблицу
обратно возвращается id или номер ошибки с минусом
1
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
22.04.2018, 10:20
я не знаю, как генераторы работают в MSSQL но если почитать доки, всегда есть способ создать запись и в ответ получить значение автоматически сгенерированного для нее ключа

думаю вам поможет вот это
https://stackoverflow.com/ques... i-adoquery
1
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
22.04.2018, 21:23  [ТС]
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE PROCEDURE AddObject1
@Adres nvarchar(250),
@KadN nvarchar(10),
@Vidobj INT,
@RaionI INT
 
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO  [dbo].[Объекты] (ОБ_Адрес, ОБ_КадНомер, ОБ_вид_код, код_рс)
VALUES  (@Adres, @KadN, @Vidobj, @RaionI)
SELECT @@IDENTITY AS [@@ID]
END
GO
Добавлено через 33 секунды
qwertehok, krapotkin,
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE PROCEDURE AddObject1
@Adres nvarchar(250),
@KadN nvarchar(10),
@Vidobj INT,
@RaionI INT
 
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO  [dbo].[Объекты] (ОБ_Адрес, ОБ_КадНомер, ОБ_вид_код, код_рс)
VALUES  (@Adres, @KadN, @Vidobj, @RaionI)
SELECT @@IDENTITY AS [@@ID]
END
GO
Добавлено через 10 минут
Получилось как то так.(выше)
Вопрос:
далее они уже проверяются внутри и добавляются в таблицу
обратно возвращается id или номер ошибки с минусом
Как проверять внутри? Как возвращать номер ошибки с минусом? и как ее (ошибку) обрабатывать в человеческий вид?

Вопрос. Как же тогда реализовывать добавление?? Запоминать все значения до выполнения хранимки?? ?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,670
Записей в блоге: 21
22.04.2018, 22:53
брр. странный вопрос
1.выполнить
2.проверить результат
3. если результат > 0 то все прошло хорошо

по моей ссылке ходили ? там без процедур и все вполне рабочее
1
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
22.04.2018, 22:58
Цитата Сообщение от Slalom Посмотреть сообщение
Как проверять внутри?
я имел ввиду проверки на дубли, проверки на правильность заполнения (если нужно) и тд
Цитата Сообщение от Slalom Посмотреть сообщение
Как возвращать номер ошибки с минусом?
в MSSQL есть try..except

Цитата Сообщение от Slalom Посмотреть сообщение
и как ее (ошибку) обрабатывать в человеческий вид?
передаешь, допустим, дату рождения и пользователь ввел 30 февраля
ты в запросе конвертируешь данные нужному типу и отлавливаешь ошибку
1
4 / 4 / 0
Регистрация: 28.09.2012
Сообщений: 178
23.04.2018, 00:37  [ТС]
qwertehok, Думаю ошибок ввода не будет, т.к. все заполняемые \редактируемые поля будут проверятся до отправки на сервер.
Я вот не соображу, есть StoredProc но к нему не подключить DBedit'ы по аналогии с query или table, получается они не нужны?
Еще момент, а на редактирование данных тоже лучше хранимку делать?

Я к тому что процесс редактирования \заполнения хорошо улавим с dbedit'ами нежели с обычными edit'ми. Или делать query c dbedit, а уже после всех проверок, на заполнение или редактирование исполнять StoredProc?
0
5971 / 4547 / 1094
Регистрация: 29.08.2013
Сообщений: 28,168
Записей в блоге: 3
23.04.2018, 00:47
Цитата Сообщение от Slalom Посмотреть сообщение
получается они не нужны?
не нужны
Цитата Сообщение от Slalom Посмотреть сообщение
Еще момент, а на редактирование данных тоже лучше хранимку делать?
я делаю для любых операций с SQL
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.04.2018, 00:47
Помогаю со студенческими работами здесь

Как очистить таблицу DataSet
db1DataSet.fire.Clear(); - таким образом таблица DataSet очищается и в гриде - нет строк. А как передать изменения в БД? Спасибо!

Как иначе задать параметр?
Как задать папки в качестве параметра, не используя set /p? Какой другой метод существует? @echo off echo Obyedinenie faylov set...

DataSet как правильно организовать таблицу
Нужно как то организовать таблицу в DataSet с такими условиями: столбики(Name, Name2, DIn, Dout, B, r, C, C0), но есть один нюанс: Таблица...

Как в dataGridView отобразить таблицу из DataSet?
Основной вопрос, почему по выражению dataGridView1.DataSource = ds1.Tables; в "dataGridView" не отображается таблица ? Или как...

Как праильно задать параметр функции?
Здравствуйте. Есть функция, которая выводит блоки div из массива и функции добавления и удаления дивов из массива. При клике на div...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru