![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Edit
assassin8899 © (2008-05-28 21:13:00)Иемеется таблица дочерняя ADOTable в которую заносится новая запись(ADOTable.Append) через dbEdit'ы.Вместо того чтобы вводить внешний ключ id в эту же таблицу через DBEdit я создаю edit и задаю метод
procedure TForm2.Edit1Change(Sender: TObject);
var a:integer;
begin
datamodule1.ADOQuery1.SQL.Text:='SELECT ID_вид, Название'+
' FROM Вид where Название like "'+edit1.Text+'%"';//результат запроса родительской таблицы
Datamodule1.ADOQuery1.Active:=true;
a:=datamodule1.ADOQuery1.FieldValues['ID_вид'];//присаеваем id родительской таблицы в переменную
datamodule1.ADOTable6.Fields.Fields[13].AsInteger:=a;//приссваиваем в дочернюю
то есть я делаю запрос который врезультате отображается в DBGrid(что то вроде словаря) в зависимрости от значения вводимого в edit.Этот запрос значения родительской таблицы.Далее я присваиваю буферной переменной "a" значение id ключа запроса родительской таблице и этот ключ присваиваю уже в дочернюю таблицу.
Проблема в том что если при вводе в edit ввести значение которого в результате запроса нет(даже если при вводе ошибится на одну букву) то выпадает ошибка что то проде:
Плохиш (2008-05-29 10:29:00) [1]
> Проблема в том что если при вводе в edit ввести значение
> которого в результате запроса нет(даже если при вводе ошибится
> на одну букву) то выпадает ошибка что то проде:
Проверять надо набор данных на наличие этих данных, а не тупо пытаться что-то из пустого набора данных захапать.
ANB (2008-05-29 10:00:00) [2]1. Выброси свой обработчик. Обращение к справочнику (кистате, это у тебя ни фига не родительская таблица) сделай непосредственно при сохранении записи в основную таблицу (которая у тебя тоже ни фига не дочерняя).
Sergey13 (2008-05-29 09:54:00) [3]> [3] assassin8899 (29.05.08 09:42)
Что-то уж шибко аскетичный у тебя интерфейс получается, ИМХО.
> Пользователь не должен смотреть значение из одной таблицы
> чтобы добавить в другую(а вданном случае это еще и внешние
> id).Это просто неудобно да и неправавильно.
Он должен видеть к чему вводит уточняющую информацию. ИМХО. Это нормальая эргономика. Зачем пользователя делать слепым?
В твоем случае, что мешает тебе, если твой запрос не вернул искомых записей (или вернул несколько - вдруг) сказать об этом пользователю и заставить его повторить ввод.
Кстати
> datamodule1.ADOQuery1.SQL.Text:='SELECT ID_вид, Название'+
> ' FROM Вид where Название like "'+edit1.Text+'%"';//результат запроса родительской таблицы
Во первых в таком случае следует использовать параметры вместо перезаписывания текста запроса.
Во вторых, я не знаю что у тебя за СУБД (подозреваю, что аксес, но не уверен), но наверное неплохо бы как то предварительно обработать edit1.Text, типа к определенному регистру привести, проверить на пустоту и т.п.
assassin8899 (2008-05-29 09:42:00) [4]<<Если ты вводишь данные в ДОЧЕРНЮЮ таблицу, то наверное у тебя перед глазами есть и ГЛАВНАЯ, к ТЕКУЩЕЙ записи которой ты и вводишь связанные данные? Если так, то логично просто прочитать ТЕРУЩЕЕ значение ИД главной таблицы.
Нет.У меня вообще нет отображений таблиц.Пользователь не должен смотреть значение из одной таблицы чтобы добавить в другую(а вданном случае это еще и внешние id).Это просто неудобно да и неправавильно.
Пользовательвводит все значения в dbEdit'ы а значение из главной таблицы,как я упоминал, берутся из словаря, то есть sql запроса.
Sergey13 (2008-05-29 08:17:00) [5]Если ты вводишь данные в ДОЧЕРНЮЮ таблицу, то наверное у тебя перед глазами есть и ГЛАВНАЯ, к ТЕКУЩЕЙ записи которой ты и вводишь связанные данные? Если так, то логично просто прочитать ТЕРУЩЕЕ значение ИД главной таблицы.
assassin8899 (2008-05-29 02:47:00) [6]в событии EditChange я оставляю только
datamodule1.ADOQuery1.SQL.Text:='SELECT ID_вид, Название'+
' FROM Вид where Название like "'+edit1.Text+'%"';//результат запроса родительской таблицы
Datamodule1.ADOQuery1.Active:=true;
далее в событии edit'а ONkeyPress пишу
procedure TForm2.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case key of
chr(13):dbgrid1.SetFocus;
end;
end;
Тогда я ввожу значение в edit уже без риска ошибки и перехожу по клавише Enter непосредственно в dbGrid, где имеется нужный результат запроса,а вот далее я хочу чтобы при нажатии на клавишу ENTER выделенной строки DBGrid'а edit'у присваивалось значение этой строки dbgrid'а, то есть
edit1.Text:=dbgrid1.Fields[1].AsString;
и соответвенно когда уже в edit будет 100% значение которое имеется в запросе должно происходить присвоение
a:=datamodule1.ADOQuery1.FieldValues['ID_вид'];
datamodule1.ADOTable6.Fields.Fields[13].AsInteger:=a;
Вот только вопрос в том, я не знаю как запихнуть последние три строчки кода, чтобы все это работало по нажатию Enter в DBGrid.