Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2015, 17:39   #1
salernitana
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 10
По умолчанию Добавление записи в подчиненную таблицу

Добрый день
Прошу вашей помощи.
Как и все только учусь... (образования программиста не имею, просто для общего развития хочется уметь - любопытный я очень))))

Имею две связанные таблицы в MSAccess 2000
1) FurgonModelCatalog
Id_FurgonModel - счетчик
FurgonModel - string

2) FurgonGradeCatalog
Id_FurgonGrade - счетчик
Id_FurgonModel - integer
FurgonGradePrice - integer
Id_ChassisMarka - integer
Id_ChassisModel - integer


SQL запрос на заполнение второй таблицы:
SELECT *
FROM FurgonGradeCatalog
WHERE Id_FurgonModel=:Id_FurgonModel

в DBGrid настроена видимость только нужных колонок

Если заполнять все вручную в DBGrid - все работает - но это и неудобно и не правильно.

Поэтому для добавления новой записи в FurgonGradeCatalog создал отдельную модальну форму, на которой есть 2 DBLookUpComboBox и Edit
в Id_ChassisMarka пытаюсь вставить DBLookUpComboBox1.KeyValue
в Id_ChassisModel пытаюсь вставить DBLookUpComboBox2.KeyValue
в FurgonGradePrice - Edit1.Text

нужен код на кнопку BTN1 на добавление новой записи во вторую таблицу и закрытие формы.
у меня ничего не получается(((((
что делаю я:
Код:
DataModuleCalculator.QueryFurgonGradeCatalog.Close;
DataModuleCalculator.QueryFurgonGradeCatalog.SQL.Clear;
DataModuleCalculator.QueryFurgonGradeCatalog.SQL.Text:='insert into FurgonGradeCatalog(Id_ChassisMarka, Id_ChassisModel,FurgonGradePrice,NacencaDilera) values (:a, :b, :c, :d) ';
DataModuleCalculator.QueryFurgonGradeCatalog.Parameters.ParamByName('a').Value:=DBLookupComboBox1.KeyValue;
DataModuleCalculator.QueryFurgonGradeCatalog.Parameters.ParamByName('b').Value:=DBLookupComboBox2.KeyValue;
DataModuleCalculator.QueryFurgonGradeCatalog.Parameters.ParamByName('c').Value:=Edit1.Text;
DataModuleCalculator.QueryFurgonGradeCatalog.Parameters.ParamByName('d').Value:=Edit2.Text;
DataModuleCalculator.QueryFurgonGradeCatalog.ExecSQL;
DataModuleCalculator.QueryFurgonGradeCatalog.SQL.Clear;
DataModuleCalculator.QueryFurgonGradeCatalog.SQL.Text:='SELECT * FROM FurgonGradeCatalog WHERE Id_FurgonModel=:Id_FurgonModel';
DataModuleCalculator.QueryFurgonGradeCatalog.Open;
FormFurgonGradeNewChassis.Close;
Ошибка в заполнении обязательного поля Id_FurgonModel
соответственно нужно где-то его добавить но где, если он автоматом добавляется из первой таблицы...
почему не делаю через ADOTable? (кстати через ADOTable все работает) - гораздо проще сортировка фильтрация и многое другое что смог пока усвоить


А еще бы совет - хороший самоучитель для совсем незнаек по SQL+Delphi (Фленов эту тему обошел стороной лишь немного зацепив...)

Последний раз редактировалось Stilet; 02.04.2015 в 16:13.
salernitana вне форума Ответить с цитированием
Старый 01.04.2015, 17:47   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
хороший самоучитель для совсем незнаек по SQL
Мартин Грубер Понимание SQL
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.04.2015, 15:23   #3
salernitana
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 10
По умолчанию

Решил таким образом, если есть варианты другого решения - прошу гуру подсказать
procedure TFormFurgonGradeNewChassis.BitBtn1C lick(Sender: TObject);
begin

DataModuleCalculator.QueryFurgonGra deCatalog.Close;
DataModuleCalculator.QueryFurgonGra deCatalog.SQL.Clear;
DataModuleCalculator.QueryFurgonGra deCatalog.SQL.Text:='insert into FurgonGradeCatalog(Id_FurgonModel, Id_ChassisMarka, Id_ChassisModel,FurgonGradePrice,Na cencaDilera)'+' values ('+DataModuleCalculator.QueryFurgon ModelCatalog.FieldByName('Id_Furgon Model').AsString+',:a, :b, :c, ) ';
DataModuleCalculator.QueryFurgonGra deCatalog.Parameters.ParamByName('a ').Value:=DBLookupComboBox1.KeyValu e;
DataModuleCalculator.QueryFurgonGra deCatalog.Parameters.ParamByName('b ').Value:=DBLookupComboBox2.KeyValu e;
DataModuleCalculator.QueryFurgonGra deCatalog.Parameters.ParamByName('c ').Value:=Edit1.Text;
DataModuleCalculator.QueryFurgonGra deCatalog.Parameters.ParamByName('d ').Value:=Edit2.Text;
DataModuleCalculator.QueryFurgonGra deCatalog.ExecSQL;
DataModuleCalculator.QueryFurgonGra deCatalog.SQL.Clear;
DataModuleCalculator.QueryFurgonGra deCatalog.SQL.Text:='SELECT * FROM FurgonGradeCatalog WHERE Id_FurgonModel=:Id_FurgonModel';
DataModuleCalculator.QueryFurgonGra deCatalog.Open;
FormFurgonGradeNewChassis.Close;
end;
salernitana вне форума Ответить с цитированием
Старый 02.04.2015, 16:06   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Решил таким образом, если есть варианты другого решения
В целом все верное, замечу только
если уж мы работаем с параметризованным запросом, то лучше было бы все данные оформить параметрами
Код:
DataModuleCalculator.QueryFurgonGradeCatalog.SQL.Text:='insert into FurgonGradeCatalog(Id_FurgonModel, Id_ChassisMarka, Id_ChassisModel,FurgonGradePrice,NacencaDilera) values (:n, :a, :b, :c, :d ) ';

DataModuleCalculator.QueryFurgonGradeCatalog.Parameters.ParamByName('n').vaLue:=DataModuleCalculator.QueryFurgonModelCatalog.FieldByName('Id_Furgon Model').AsString;
// и далее по списку (как было)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.04.2015, 09:37   #5
salernitana
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 10
По умолчанию

Появилась другая проблема:
и поискал по форумам она же встречается не только у меня
в DBGrid пользователю не понятны числовые Id_ для этого добавил 2 lookup поля ChassisMarka и ChassisModel, которые заполняются из связанных таблиц ChassisMarkaCatalog и ChassisModelCatalog. поле ChassisMarka отображается нормально, а вот ChassisModel часть полей заполнены, а часть пустые. Заполняются только модели от одной марки. есть ли возможность как-то это исправить? или придется переписывать SQL запрос иначе и отказаться от lookup полей?
salernitana вне форума Ответить с цитированием
Старый 03.04.2015, 11:23   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
а вот ChassisModel часть полей заполнены, а часть пустые. Заполняются только модели от одной марки
Вероятно LookUp-таблица ChassisModelCatalog настроена на показ моделей только ОДНОЙ марки. (Filter =true ? )
ОНА (ChassisModelCatalog) ведь используется еще и для других целей кроме как быть источником LookUp полей ?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.04.2015 в 11:25.
evg_m вне форума Ответить с цитированием
Старый 03.04.2015, 11:56   #7
salernitana
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 10
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Вероятно LookUp-таблица ChassisModelCatalog настроена на показ моделей только ОДНОЙ марки. (Filter =true ? )
ОНА (ChassisModelCatalog) ведь используется еще и для других целей кроме как быть источником LookUp полей ?
Конечно, ChassisModelCatalog настроен так, чтоб в DBgrid отображались только модели одной марки.
вот теперь ищу решение как без Inner Join вывести в lookup полях значения моделей для разных марок.
вернее готов использовать и Inner Join только не получается сделать запрос на добавление новых записей в таблицу FurgonGradeCatalog.
Inner Join использую только для выведения данных из нескольких таблиц, которые не редактируются, а только выводят информацию на экран.
salernitana вне форума Ответить с цитированием
Старый 03.04.2015, 16:04   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. иметь ДВА и более "копий" одной таблицы
это не две таблицы БД, а именно два разных набора данных (DataSet) связанных с одной таблицей БД, но имеющих разные(!!) наборы строк
A. для фильтра
Цитата:
Конечно, ChassisModelCatalog настроен так, чтоб в DBgrid отображались только модели одной марки.
B. для LoookUp-a чтобы показывались ВСЕ.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.04.2015, 17:48   #9
salernitana
Пользователь
 
Регистрация: 18.04.2012
Сообщений: 10
По умолчанию

решил проблему немного другим методом.
поскольку lookup поля в точности повторяли текст из DBCombobox то просто удалил их и добавил да поля в которые этот самый текст и запихнул - может это не правильно но зато нет никаких лишних таблиц)))
и фильтры теперь работают хорошо )))
salernitana вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записи в таблицу через таблицу Anton911 БД в Delphi 0 14.05.2012 11:51
Добавление записи в таблицу chinock Microsoft Office Access 2 24.09.2010 14:39
Добавление записи в таблицу Galiska БД в Delphi 3 25.05.2010 08:07
Добавление записи в таблицу folga БД в Delphi 4 21.04.2010 08:15
Добавление записи в таблицу (ADO) Yura_S БД в Delphi 12 25.11.2009 19:11