Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо