![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка добавления lookup поля в TADOTable [D7, ACCESS]
Fregl © (2007-12-10 17:31:00)Вот есть 2 таблички в access файле.(Номера вагонов,типы вагонов)
в одной хранится id;серийный номер вагона;тип вагона
во второй id;название типа.
и мне надо добавить lookup поле в первую таблицу, что бы выводило строкой имя типа вагона, а не id типа.
средствами IDE сделать не получается, так как после того если законектиться к БД в design mode сразу начинает вылетать ошибка wrong enum value или что то типа того, и проект сохранить нельзя, тока закрыть делфи. делфи 7,глючит АДО..
вобщем решил в рантайме создать поле и присоединить к таблице, вот как это я делаю при создании формы
ADOTable1.TableName:='VagonNumbers'; это номера вагонов
ADOTable2.TableName:='VagonTypes'; это типы вагонов
T1TypeName:=TStringField.Create(Self);
T1TypeName.FieldKind:=fkLookUP;
T1TypeName.FieldName:='T1TypeName';
T1TypeName.DataSet:=ADOTable1;
T1TypeName.KeyFields:='VagonType';
T1TypeName.LookupKeyFields:='ID';
T1TypeName.LookupResultField:='TypeName';
T1TypeName.LookupDataSet:=ADOTable2;
DBGrid1.Columns[0].FieldName:='ID';
DBGrid1.Columns[1].FieldName:='VagonNumber';
DBGrid1.Columns[2].FieldName:='T1TypeName';
DBGrid2.Columns[0].FieldName:='ID';
DBGrid2.Columns[1].FieldName:='TypeName';
при попытке открыть таблицу1 вылетает ошибка - не найдено поле VagonType! Хотя это поле в таблице присутсвтует.
Вобщем я уже запутался, в хелпе ничего конкретного.
Посоветуйте как быть или выложите исчерпывающий пример для добавления собственного lookup поля в ADOTable. Заранее спасибо, лучше пример отправить и на почту
ЮЮ (2007-12-13 12:48:00) [1]> v kakuyu storonu nado rit?
Прочитать [7] (извини, что не в транслите) и убрать нафиг строки, приведенные в [4].
Fregl (2007-12-13 12:44:00) [2]Gospoda, u menya opita raboti s BD v delphi k sojaleniyu ne tak mnogo, poetomu skajite kak nujno sdelat? v kakuyu storonu nado rit?
ЮЮ (2007-12-13 05:12:00) [3]> нужно вызывать типа TField.clear?
Кому это надо при закрытии приложения?
> T1TypeName.DataSet:=nil;
> T1TypeName.Free;
Полагаешь при уничтожении DataSet-а элементы коллекции полей не будут уничтожены? Ошибаешься. Именно отсюда и AV. Сначала ты уничтожил, потом DataSet пытается.
> нужно вызывать типа TField.clear?
Тогда уж Clear method (TField s) , чем даструкторы. Хотя при закрытии приложения это лишнее.
FreGL (2007-12-11 16:41:00) [4]ну ткни пальцем что надо сделать, пожалуста.
я не понимаю что я делаю не так.
нужно вызывать типа TField.clear?
sniknik (2007-12-11 15:55:00) [5]> в чем может быть запара?
а вот во всем этом "обработчике". ни одного нужного действия в нем нет. есть разрушения обьектов без очистки указателей, по которым после "пройдется" деструктор родителя вот и AV.
FreGL (2007-12-11 15:39:00) [6]сделал все в рантайме, все работает, но при закрытии приложения вылетает ошибка
Access violation at 0000000, read of address 000000.
не пойму почему. вроде все корректно закрывается, в formdestroy ставлю такой вот обработчик
T1TypeName.DataSet:=nil;
T1VagonNumber.DataSet:=nil;
T1VagonType.DataSet:=nil;
T2ID.DataSet:=nil;
T2TypeName.DataSet:=nil;
T1TypeName.Free;
T1VagonNumber.Free;
T1VagonType.Free;
T2ID.Free;
T2TypeName.Free;
в чем может быть запара?
ЮЮ (2007-12-11 11:16:00) [7]Если в Design-е нет полей в "Редакторе полей", то твои мероприятия создадут именно 1-ое поле, и никакого VagonType не будет. Если намерен создавать ftLookup-поле именоо в RunTime, то сначала надо добавить все ftData поля.
megabyte (2007-12-11 11:08:00) [8]Совет: не используй ADOTable, используй ADODataSet. Напиши там запрос на получение всей таблицы, попробуй сделать дизайн-тайме все тоже самое(настроить лукап-поле), если будут ошибки, тогда пиши...
FreGL (2007-12-10 17:33:00) [9]структуры таблиц
ADOTable1 : ID :autoinc | VagonNumber :int | VagonType : int
ADOTable2 : ID :int | TypeName : int