![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Потомки TField [D5, Paradox]
VAleksey © (2002-04-15 11:21:00)Использую в программе постоянные обьекты полей. При переносе программы клиенту у него может оказаться старая структура таблицы и естественно что при открытии таблицы возникает ошибка. Внимание вопрос :
Как сделать так, чтобы в таблицу добавлялись поля, необходимые для работы приложения ?
VAleksey (2002-04-16 14:55:00) [1]Ок . Ветка закрыта. Спасибо всем за помощь !
ЗЫ
Как всегда знаешь как решать задачу. Увы но видимо самый тривиальный вариант (Anatoly Podgoretsky , kaif, roottim, Mike S ), самый правильный. С точки зрения Reindeer Moss Eater я еще не смотрел, но чуствую то же самое.
Reindeer Moss Eater (2002-04-16 13:22:00) [2]Новая версия приложения всегда знает какие новые поля добавлены в экземпляр TTable.
При старте нового приложения проверь наличие этих полей моим кодом, приведенным выше.
Если полей нет, выполни DDL скрипт, создающий поля в таблице базы данных.
Anatoly Podgoretsky (2002-04-16 13:22:00) [3]Вот оптому и совету, что сам такое переживал :-)
kaif (2002-04-16 13:16:00) [4]Anatoly Podgoretsky прав. Нужно писать специализированные конверторы старых баз под новую структуру, которые будут запускаться 1 раз, с соблюдением всех предосторожностей (например, резервное копирование, куча проверок и вопросов), а не запускать все это при каждом старте основного приложения. Иначе вместо живучей программы, которую ты хочешь сделать, ты получишь убивалку данных, которую проклянет пользователь.
Предположим, твое приложение "просекло", какие там новые поля. А где гарантия , что оно во всех случаях правильно просечет и что это хорошо закончится для данных?
Мне кажется саму идеологию надо еще раз обдумать.
VAleksey (2002-04-16 12:40:00) [5]> Либо я ламер либо мы с вами друг друга не понимаем
TTable.FieldDefs.Add(Что нужно добавлять ?)
Как мне узнать есть такое поле физически в таблице ?
И если нет то его нужно добавить.
Table1 - в нем есть обекты - поля.
try
Table1.Open
except
for i:=0 to Table1.FieldDefs.Count-1 do
begin
//так можно делать ?
// если поля нет его надо здесь создать !
end;
end;
Примерно вот в таком духе
Val (2002-04-16 11:12:00) [6]только в памяти, жаль ;)
Anatoly Podgoretsky (2002-04-16 11:10:00) [7]Val © (16.04.02 10:45)
Где можно взглянуть :-)
Val (2002-04-16 10:45:00) [8]>Anatoly Podgoretsky © (16.04.02 09:13)
"интсраллятор новых версий"
еще одна фраза в словарик "Замечательные опечатки А.П." ;)
Anatoly Podgoretsky (2002-04-16 09:13:00) [9]Но даже и с Open такая ошибка не возникнет, ошибка у тебя возникает не из за Open, а из того, что у тебя или явно прописаны поля или ты явно обращаешься к несуществующим.
С другой стороны не плохо бы иметь интсраллятор новых версий, который как раз и будет заниматься подобной проверкой и делать новые поля или при необходимости конвентировать старые, если произойдет изменение их размера, кроме того в функции инсталлятора можно включить и ремеонт таблиц.
Reindeer Moss Eater (2002-04-16 08:45:00) [10]>VAleksey
А где ты у меня увидел что-то похожее не Open?
DPashin (2002-04-16 08:35:00) [11]>VAlexey
1)>ВОПРОС я могу как нибудь узнать описание поля ?
через TTable.FielDefs
2)потом его создать другим компонентом ттайбле ?
Уточни, ты хочешь его создать в компоненте TTable?
Тогда используй TTable.FieldDefs.Add
Или тебе надо в базе данных таблицу перестроить?
VAleksey (2002-04-16 06:43:00) [12]Господа этот вопрос носит чисто теоретический характер. Прошу прощения за резкость у Roottim и Mike S, но ДАВАТЬ ТАКИЕ ОТВЕТЫ ВСЕ РАВНО, ЧТО ГОВОРИТЬ "А ты вообще не программируй, тогда и ошибок не будет." Однако, ситуация описанная выше имеет место быть.
Код написанный Reindeer Moss Eater понятен, но ! Я НЕ ХОЧУ ИСКАТЬ ПОЛЕ ПО ИМЕНИ. При открытии таблицы возникает ошибка "Field not found ..." ВОПРОСя могу как нибудь узнать описание поля ? , потом его создать другим компонентом ттайбле ?
VAleksey (2002-04-15 17:49:00) [13]> roottim .. или если есть уже такое поле .. то его не трогать?
Да, совершенно верно.
Reindeer Moss Eater (2002-04-15 14:25:00) [14]>VAleksey
Допустим надо проверить таблицу MyTable на наличие нового поля MyFieldName:
При старте приложения вызывается функция, которая проверяет наличие поля в структуре таблицы. Если его нет, выполняем выражение DDL, которое добавит это поле.
Проверка наличия поля:
with TQuery.Crete(nil) do
try
DatabaseName:="MyDatabaseName";
SQL.Text:="Select * from MyTable";
FieldDefs.Update;
Result:=Assigned(FieldDefs.Find("MyFieldName"));
finally
Free;
end;
roottim (2002-04-15 12:29:00) [15]уточни!.. заново все создать.. или если есть уже такое поле .. то его не трогать?
VAleksey (2002-04-15 12:26:00) [16]Объясняю:Задача как раз обратная. Обекты- поля есть. По ним нужно создать физические поля в таблице.
roottim (2002-04-15 12:22:00) [17]2VAleksey © (15.04.02 11:58)
какой ты молодец!... :))
смысл то в том.. чтобы переопределит поля в рантайме.. то биш сначала без определения поля.. затем по Add по типу поля (ft...) с помощью case либо еще как добавлять в DataSet потомков tField!
дальше думаю допреш!
Anatoly Podgoretsky (2002-04-15 12:12:00) [18]Вопрос не понятел, ты же хочещь добавить новое поле. Посмотри хелп, там есть пример как добавлять новое поле.
VAleksey (2002-04-15 11:58:00) [19]> roottim
> Mike S
Ребята.. по вашим ответам заметно, что вы профессионалы -:) !
Так круто догадаться ! Я сам бы никогда не допер !
> Anatoly Podgoretsky © Как вынуть из обекта свойства именно того поля которое должно быть создано ?
Anatoly Podgoretsky (2002-04-15 11:38:00) [20]Table.FieldDefs.Add()