Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
ВнизДобавить поле в таблицу Найти похожие ветки
← →
O.O (2005-01-26 10:32) [0]Как проверить есть ли нужное поле в таблице, и если его нет добавить?
← →
Johnmen © (2005-01-26 10:51) [1]GetFieldNames
ALTER TABLE ...
← →
msguns © (2005-01-26 10:55) [2]Очень интересная постановка вопроса однако
← →
O.O (2005-01-26 12:41) [3]Смысл вот в чём. Обновляю старенькую программку. В существующей таблице нужно добавить дополнительное поле. Вот и нужно перед тем как открыть таблицу, проверить есть оно или нет, если нет - добавить, а после этого открыть все нужные таблицы и начать работу
← →
msguns © (2005-01-26 14:36) [4]Т.е. получается, что проге могут подсунуть 2 варианта таблиц: старую (без поля) и новую (с полем), а она сама должна типа разобраться и, если что, из старой таблицы сделать новую ?
Если так, то получить информацию о полях входной таблицы (к моменту старта проги неясно какой: новой или старой) можно просто открыв запрос Select * from Table и перебрать коллекция филдов датасета.
Хотя сама идея мутная, т.к. непонятки, что делать с инфой, добавленной в это новое поле в предыдущем сеансе работы с прогой. ИМХО, надо какашки отделить от рубашки. Т.е. отдельной процедурой (не обязательно писать для этого программу) сделать проверку и реструктуризацию (если надо) таблицы и запускать ее либо ручками (одноразово ?), либо непосредственно перед запуском проги. А сама прога уже работает с неизменной структурой. Иначе, ИМХО, будет каша.
← →
O.O (2005-01-26 14:47) [5]В том-то и суть, что программе может быть подсунута старая таблица и в любой момент времени. Поэтому руками делать не выход, программа сама должна разобраться и если что, то добавить поле, естественно в старых записях данные этого нового поля будут нулевые. После этой операции открываются датасеты заточенные на работу с этим полем
← →
msguns © (2005-01-26 16:23) [6]1. Открываем БД
2. Запускаем запрос на выборку всего с заведомо ложным условием (т.к. нам нужны не данные, а инфа о филдах)
3. Ищем в коллекции филдов открытого датасета поле-фантом и выставляем признак есть/нет
4. Закрываем запрос
5. Если признак "нет фантома", то
5.1. Переводим таблицу в эклюзив
5.2. Рисуем динамический DDL-запрос типа ALTER, который должен добавить поле в таблицу
5.3. Запускаем запрос и проверяем результат. Если фалс, то ченить вякаем и терминируем прогу.
5.4. Снимаем с таблы эксклюзив
6. Основная работа проги (таблица уже с нужным полем)
← →
msguns © (2005-01-26 16:24) [7]Надо понимать, что прожка исключительно однопользовательская ?
← →
Vlad © (2005-01-26 18:03) [8]м.б. так?
if Table1.FindField("SomeField") = nil then Query1.Execute
Соотв. в Query1 содержится запрос ALTER TABLE ...
← →
msguns © (2005-01-26 18:08) [9]>Vlad © (26.01.05 18:03) [8]
А как быть с экслюзивностью ?
← →
Johnmen © (2005-01-26 18:11) [10]>msguns © (26.01.05 18:08) [9]
>А как быть с экслюзивностью ?
Серега , ты хочешь увидеть пересказ/повтор того, что сам уже написал про неё ? :)))
← →
Vlad © (2005-01-26 18:15) [11]
> msguns © (26.01.05 18:08) [9]
> Johnmen © (26.01.05 18:11) [10]
позабыл особенности файл-серверных БД :-)
Просто хотел посоветовать использовать метод FindField для определения существования или отсутствия поля.
← →
Arrows © (2005-01-27 10:10) [12]С Paradox я не работаю, для DBF я смотрю структуру по шапке базы данных. Думаю что можно сравнить две шапки таблицы. И добавить недостающие поля.
← →
msguns © (2005-01-27 10:24) [13]>Arrows © (27.01.05 10:10) [12]
>С Paradox я не работаю, для DBF я смотрю структуру по шапке базы данных. Думаю что можно сравнить две шапки таблицы
Можно еще по сапогам. Или шубе. Встречаем по одежке ?
В сабже надо программно ;)
← →
Arrows © (2005-01-27 10:40) [14]>msguns © (27.01.05 10:24) [13]
>Можно еще по сапогам. Или шубе. Встречаем по одежке ?
А это не программно-))
Type
TFieldDescriptor = Record //описатель поля
FieldName:Array[1..11] Of Char;//имя поля
FieldType:Char; //тип поля
OffsetOfBeingRecord:Array[1..4] Of Byte;//смещение относительно начала записи
FieldLength:Byte;//длина поля
DecimalCont:Byte;//количество знаков после запятой
ReservedOne:Array[1..2] Of Byte;//зарезервировано
WokrAreaID:Byte;//идентификатро рабочей области
MultyUserDBase:Array[1..2] Of Byte;//многопользователькое использование
SetFields:Byte;//установка поля
ReservedTwo:Array[1..7] Of Byte;//зарезервировано
MDXIndex:Byte;//MDX-индекс
procedure TForm1.BitBtn1Click(Sender: TObject);
Var
hFile : Integer;
FieldDescriptor:TFieldDescriptor;
begin
.......
hFile:=FileOpen(OpenDialog1.FileName,fmOpenReadWrite)
FileRead(hFile,FieldDescriptor,SizeOf(TFieldDescriptor));
..........
← →
msguns © (2005-01-27 10:56) [15]Во-первых, где здесь "шапка" ? Заголовок, т.е. часть файла дбф, где записана инфа о структуре таблицы (в.ч.дескрипторы полей) назвать шапкой ?
Да и вообще... странный код. Имеет какой-то досовский душок
← →
Arrows © (2005-01-27 11:09) [16]Для меня "шапка" - это заголовок, извините если не прав.
Еще раз оговорюсь - я работаю только с DBF
Я привел, код только для определения структуры БД. В начале заголовка приведена вся информация о БД.
>msguns © (27.01.05 10:56) [15]
Предложите как вы еще хотите точно определить длину полей типа Num размера 18,3? У типа флоат нет ведь реального размера, это плаавющая точка.
← →
msguns © (2005-01-27 11:22) [17]>Arrows © (27.01.05 11:09) [16]
>Для меня "шапка" - это заголовок, извините если не прав.
Шапкой вообще-то называеться то, что видно вверху (в начале) чего либо: отчета, например. В гриде вообще-то то, что Вы называете шапкой, обзывается титулом или, но рабоче-крестьянски, заголовком. Со структурой (по-Вашему "шапкой") таблиц данных, который этот грид отображает, этот заголовок может иметь весьма мало общего.
>Еще раз оговорюсь - я работаю только с DBF
Мне грустно за Вас.
>Я привел, код только для определения структуры БД. В начале заголовка приведена вся информация о БД.
Во-первых, не о БД, а лишь о таблице, а во-вторых, не вся.
>Предложите как вы еще хотите точно определить длину полей типа Num размера 18,3? У типа флоат нет ведь реального размера, это плаавющая точка.
Я ничего предлагать не буду. Кроме того, что могу отослать Вас к многочисленным докам по разным форматам, движкам и серверам БД
с целью осознания физического способа хранения и способов интерпретации и отображения чисел в таблицах баз данных.
В дбф, по-моему, все всегда хранится в символьном виде, или я не прав ?
← →
Reindeer Moss Eater © (2005-01-27 11:26) [18]2. Запускаем запрос на выборку всего с заведомо ложным условием (т.к. нам нужны не данные, а инфа о филдах)
Зачем такие извращения?
Fielddefs.Update - и все метаданные у вас в кармане.
← →
msguns © (2005-01-27 11:29) [19]>Reindeer Moss Eater © (27.01.05 11:26) [18]
>Зачем такие извращения?
Fielddefs.Update - и все метаданные у вас в кармане.
Для этого надо открыть таблицу. Запрос же ее не открывает,- в этом и разница. Кстати, открытие таблицу по времени подольше будет (для парокса во всяком случае). Запрос же выполнится практически мгновенно, даже если на другом компе.
← →
Reindeer Moss Eater © (2005-01-27 11:30) [20]Для этого надо открыть таблицу.
Для этого не надо открывать таблицу
← →
Reindeer Moss Eater © (2005-01-27 11:40) [21]Имеется ввиду, что метод Open не надо вызывать.
Сама таблица разумеется будет открыта как файл, так же как и в случае с select * from table where 0=1
← →
msguns © (2005-01-27 11:45) [22]>Reindeer Moss Eater © (27.01.05 11:30) [20]
>Для этого не надо открывать таблицу
Call Update to refresh the field definitions when the structure of the underlying dataset may have changed. Update updates the field definitions without opening the dataset.
Согласен. Просто я так пользуюсь другими средствами. Кстати, если глянуть TDataSet, то, возможно, он сам и пускает подобные запросы, а ?
← →
Arrows © (2005-01-27 11:58) [23]>msguns © (27.01.05 11:22) [17]
>В дбф, по-моему, все всегда хранится в символьном виде, или я не прав ?
Не правы.
>msguns © (27.01.05 10:56) [15]
>Да и вообще... странный код. Имеет какой-то досовский душок
Все хорошее, это хорошо забытое старое.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.06 c