Форум: "Базы";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
ВнизПотомки TField Найти похожие ветки
← →
VAleksey (2002-04-15 11:21) [0]Использую в программе постоянные обьекты полей. При переносе программы клиенту у него может оказаться старая структура таблицы и естественно что при открытии таблицы возникает ошибка. Внимание вопрос :
Как сделать так, чтобы в таблицу добавлялись поля, необходимые для работы приложения ?
← →
roottim (2002-04-15 11:33) [1]супер!
мб... просто не определять поля?
а вообще не очень понятно.. почему у клиену :)) не задать новую структуру!... так будет надежнее
← →
Mike S (2002-04-15 11:36) [2]Обновлять программу и структуру одновременно.
← →
Anatoly Podgoretsky (2002-04-15 11:38) [3]Table.FieldDefs.Add()
← →
VAleksey (2002-04-15 11:58) [4]> roottim
> Mike S
Ребята.. по вашим ответам заметно, что вы профессионалы -:) !
Так круто догадаться ! Я сам бы никогда не допер !
> Anatoly Podgoretsky © Как вынуть из обекта свойства именно того поля которое должно быть создано ?
← →
Anatoly Podgoretsky (2002-04-15 12:12) [5]Вопрос не понятел, ты же хочещь добавить новое поле. Посмотри хелп, там есть пример как добавлять новое поле.
← →
roottim (2002-04-15 12:22) [6]2VAleksey © (15.04.02 11:58)
какой ты молодец!... :))
смысл то в том.. чтобы переопределит поля в рантайме.. то биш сначала без определения поля.. затем по Add по типу поля (ft...) с помощью case либо еще как добавлять в DataSet потомков tField!
дальше думаю допреш!
← →
VAleksey (2002-04-15 12:26) [7]Объясняю:Задача как раз обратная. Обекты- поля есть. По ним нужно создать физические поля в таблице.
← →
roottim (2002-04-15 12:29) [8]уточни!.. заново все создать.. или если есть уже такое поле .. то его не трогать?
← →
Reindeer Moss Eater (2002-04-15 14:25) [9]>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;
← →
VAleksey (2002-04-15 17:49) [10]> roottim .. или если есть уже такое поле .. то его не трогать?
Да, совершенно верно.
← →
VAleksey (2002-04-16 06:43) [11]Господа этот вопрос носит чисто теоретический характер. Прошу прощения за резкость у Roottim и Mike S, но ДАВАТЬ ТАКИЕ ОТВЕТЫ ВСЕ РАВНО, ЧТО ГОВОРИТЬ "А ты вообще не программируй, тогда и ошибок не будет." Однако, ситуация описанная выше имеет место быть.
Код написанный Reindeer Moss Eater понятен, но ! Я НЕ ХОЧУ ИСКАТЬ ПОЛЕ ПО ИМЕНИ. При открытии таблицы возникает ошибка "Field not found ..." ВОПРОС я могу как нибудь узнать описание поля ? , потом его создать другим компонентом ттайбле ?
← →
DPashin (2002-04-16 08:35) [12]>VAlexey
1)>ВОПРОС я могу как нибудь узнать описание поля ?
через TTable.FielDefs
2)потом его создать другим компонентом ттайбле ?
Уточни, ты хочешь его создать в компоненте TTable?
Тогда используй TTable.FieldDefs.Add
Или тебе надо в базе данных таблицу перестроить?
← →
Reindeer Moss Eater (2002-04-16 08:45) [13]>VAleksey
А где ты у меня увидел что-то похожее не Open?
← →
Anatoly Podgoretsky (2002-04-16 09:13) [14]Но даже и с Open такая ошибка не возникнет, ошибка у тебя возникает не из за Open, а из того, что у тебя или явно прописаны поля или ты явно обращаешься к несуществующим.
С другой стороны не плохо бы иметь интсраллятор новых версий, который как раз и будет заниматься подобной проверкой и делать новые поля или при необходимости конвентировать старые, если произойдет изменение их размера, кроме того в функции инсталлятора можно включить и ремеонт таблиц.
← →
Val (2002-04-16 10:45) [15]>Anatoly Podgoretsky © (16.04.02 09:13)
"интсраллятор новых версий"
еще одна фраза в словарик "Замечательные опечатки А.П." ;)
← →
Anatoly Podgoretsky (2002-04-16 11:10) [16]Val © (16.04.02 10:45)
Где можно взглянуть :-)
← →
Val (2002-04-16 11:12) [17]только в памяти, жаль ;)
← →
VAleksey (2002-04-16 12:40) [18]> Либо я ламер либо мы с вами друг друга не понимаем
TTable.FieldDefs.Add(Что нужно добавлять ?)
Как мне узнать есть такое поле физически в таблице ?
И если нет то его нужно добавить.
Table1 - в нем есть обекты - поля.
try
Table1.Open
except
for i:=0 to Table1.FieldDefs.Count-1 do
begin
//так можно делать ?
// если поля нет его надо здесь создать !
end;
end;
Примерно вот в таком духе
← →
kaif (2002-04-16 13:16) [19]Anatoly Podgoretsky прав. Нужно писать специализированные конверторы старых баз под новую структуру, которые будут запускаться 1 раз, с соблюдением всех предосторожностей (например, резервное копирование, куча проверок и вопросов), а не запускать все это при каждом старте основного приложения. Иначе вместо живучей программы, которую ты хочешь сделать, ты получишь убивалку данных, которую проклянет пользователь.
Предположим, твое приложение "просекло", какие там новые поля. А где гарантия , что оно во всех случаях правильно просечет и что это хорошо закончится для данных?
Мне кажется саму идеологию надо еще раз обдумать.
← →
Anatoly Podgoretsky (2002-04-16 13:22) [20]Вот оптому и совету, что сам такое переживал :-)
← →
Reindeer Moss Eater (2002-04-16 13:22) [21]Новая версия приложения всегда знает какие новые поля добавлены в экземпляр TTable.
При старте нового приложения проверь наличие этих полей моим кодом, приведенным выше.
Если полей нет, выполни DDL скрипт, создающий поля в таблице базы данных.
← →
VAleksey (2002-04-16 14:55) [22]Ок . Ветка закрыта. Спасибо всем за помощь !
ЗЫ
Как всегда знаешь как решать задачу. Увы но видимо самый тривиальный вариант (Anatoly Podgoretsky , kaif, roottim, Mike S ), самый правильный. С точки зрения Reindeer Moss Eater я еще не смотрел, но чуствую то же самое.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c