Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-26268
Olgerd
2002-03-26 17:53
2002.05.09
Эмуляция других ОС


1-26087
Juli
2002-04-26 14:09
2002.05.09
Работа со строками


14-26264
ATLANTIDO
2002-04-02 16:04
2002.05.09
Autorun на сидюках


3-26003
Jakov
2002-04-05 13:59
2002.05.09
.dbx - ?


4-26300
Gayrus
2002-03-06 16:18
2002.05.09
Hook





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский