Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Вниз

Edit   Найти похожие ветки 

 
assassin8899   (2008-05-28 21:13) [0]

Иемеется таблица дочерняя 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 ввести значение которого в результате запроса нет(даже если при вводе ошибится на одну букву) то выпадает ошибка что то проде:


 
assassin8899   (2008-05-29 02:47) [1]

в событии 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.


 
Sergey13 ©   (2008-05-29 08:17) [2]

Если ты вводишь данные в ДОЧЕРНЮЮ таблицу, то наверное у тебя перед глазами есть и ГЛАВНАЯ, к ТЕКУЩЕЙ записи которой ты и вводишь связанные данные? Если так, то логично просто прочитать ТЕРУЩЕЕ значение ИД главной таблицы.


 
assassin8899   (2008-05-29 09:42) [3]

<<Если ты вводишь данные в ДОЧЕРНЮЮ таблицу, то наверное у тебя перед глазами есть и ГЛАВНАЯ, к ТЕКУЩЕЙ записи которой ты и вводишь связанные данные? Если так, то логично просто прочитать ТЕРУЩЕЕ значение ИД главной таблицы.

Нет.У меня вообще нет отображений таблиц.Пользователь не должен смотреть значение из одной таблицы чтобы добавить в другую(а вданном случае это еще и внешние id).Это просто неудобно да и неправавильно.
Пользовательвводит все значения в dbEdit"ы а значение из главной таблицы,как я упоминал, берутся из словаря, то есть sql запроса.


 
Sergey13 ©   (2008-05-29 09:54) [4]

> [3] assassin8899   (29.05.08 09:42)

Что-то уж шибко аскетичный у тебя интерфейс получается, ИМХО.

> Пользователь не должен смотреть значение из одной таблицы
> чтобы добавить в другую(а вданном случае это еще и внешние
> id).Это просто неудобно да и неправавильно.

Он должен видеть к чему вводит уточняющую информацию. ИМХО. Это нормальая эргономика. Зачем пользователя делать слепым?

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

Кстати

> datamodule1.ADOQuery1.SQL.Text:="SELECT ID_вид, Название"+
> " FROM Вид where Название like ""+edit1.Text+"%"";//результат запроса родительской таблицы

Во первых в таком случае следует использовать параметры вместо перезаписывания текста запроса.
Во вторых, я не знаю что у тебя за СУБД (подозреваю, что аксес, но не уверен), но наверное неплохо бы как то предварительно обработать edit1.Text, типа к определенному регистру привести, проверить на пустоту и т.п.


 
ANB   (2008-05-29 10:00) [5]

1. Выброси свой обработчик. Обращение к справочнику (кистате, это у тебя ни фига не родительская таблица) сделай непосредственно при сохранении записи в основную таблицу (которая у тебя тоже ни фига не дочерняя).


 
Плохиш ©   (2008-05-29 10:29) [6]


> Проблема в том что если при вводе в edit ввести значение
> которого в результате запроса нет(даже если при вводе ошибится
> на одну букву) то выпадает ошибка что то проде:

Проверять надо набор данных на наличие этих данных, а не тупо пытаться что-то из пустого набора данных захапать.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2008.06.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.043 c
15-1210504788
Nucer
2008-05-11 15:19
2008.06.22
Определения и сохранение изменений файла


15-1210145256
Галинка
2008-05-07 11:27
2008.06.22
Как вернуть массив строк из dll


2-1211959348
DmT
2008-05-28 11:22
2008.06.22
Терминал на канве


8-1182176117
kyro
2007-06-18 18:15
2008.06.22
продолжительность mp3


2-1211821514
DJ_UZer
2008-05-26 21:05
2008.06.22
Добавить ссылку в меню файла "отправить"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский