Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2009, 13:47   #1
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию ClientDataSet - изменить размер (Size) поля

Помогите решить задачку:
Программно создаю таблицу .cds
Код:
     ClientDataSet1.FileName := 'test.cds';
     ClientDataSet1.FieldDefs.Clear;
     With ClientDataSet1.FieldDefs.AddFieldDef do
       begin
         DataType := ftAutoInc;
         Name := 'VuzCode';
       end;
     for i:=1 to 99 do
       begin
         With ClientDataSet1.FieldDefs.AddFieldDef do
           begin
             DataType := ftString;
             Name := 'F' + IntToStr(i);
           end;
       end;
     ClientDataSet1.CreateDataSet;
     ClientDataSet1.SaveToFile('test.cds',dfBinary);
Тут все нормально. Но... Дело в том, что данные будут считываться из защищенных документов Word. Доков много порядка 300шт. Текстовые поля ввода в них соответсвенно не ограниченны. Необходимо программно в процессе заполнения данных увеличивать размер полей ClientDataSet в случае если текст не помещается. Попытался реализовать это таким образом:
Код:
     FindRes:=FindFirst('...папка\*.doc',faAnyFile-faHidden,SR);
     While FindRes=0 do
        begin
          WordApp:=CreateOleObject('Word.Application');
          WordApp.Application.Documents.Open(FileName := '...папка\'+SR.Name, ReadOnly:=true);
          ClientDataSet1.Append;
          for i:=1 to WordApp.Application.ActiveDocument.FormFields.Count do
            begin
             defNumer := ClientDataSet1.FieldDefs.IndexOf('F'+IntToStr(i));
             if Length(WordApp.Application.ActiveDocument.FormFields.Item(i).Result) > ClientDataSet1.FieldDefs[defNumer].Size
                then
                  begin
                   ClientDataSet1.Post;
                   if ClientDataSet1.Active then ClientDataSet1.Close;
                   ClientDataSet1.FieldDefs.Update;
                   ClientDataSet1.FieldDefs.Items[defNumer].Size := Length(WordApp.Application.ActiveDocument.FormFields.Item(i).Result);
                   ClientDataSet1.Open;
                   ClientDataSet1.Last;
                   ClientDataSet1.Edit;
                  end;

              ClientDataSet1.FieldByName('F'+IntToStr(i)).AsString := WordApp.Application.ActiveDocument.FormFields.Item(i).Result;
            end;
          ClientDataSet1.Post;
          WordApp.application.Quit(true,0);
          FindRes:=FindNext(SR);
        end;
     FindClose(SR); // закрываем поиск
Но поле как создается с длиной по умолчанию 20символов, так и остается. Где ошибка? Или вообще в принципе не возможно внести изменения после применения CreateDataSet?

Последний раз редактировалось Highlander1981; 12.11.2009 в 13:49.
Highlander1981 вне форума Ответить с цитированием
Старый 12.11.2009, 14:10   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Необходимо программно в процессе заполнения данных увеличивать размер полей ClientDataSet в случае если текст не помещается
А почему не использовать мемо-поля?
До размера 255 символов они ведут себя практически как строковые.
Больше - расширяются на сколько нужно...
mihali4 вне форума Ответить с цитированием
Старый 12.11.2009, 14:26   #3
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
А почему не использовать мемо-поля?
До размера 255 символов они ведут себя практически как строковые.
Больше - расширяются на сколько нужно...
А если больше 255? Мне просто нужно потом будет накладывать фильтры, а как это будет реализовываться с Memo?
Я просто их не использовал никогда...
Сейчас проверил Memo результат меня в полне устраивает в табличном отображении...
Highlander1981 вне форума Ответить с цитированием
Старый 12.11.2009, 17:12   #4
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

Спасибо, mihali4, в принципе проблема решилась с использованием Memo...
Но тем не менее вопрос остется открытым возможно ли изменить размер поля?
По существу, допустим надо будет какое-то поле со временем увеличить (например,числовое), что опять всю базу перекопировать в новый .cds по строчно или все-таки поле можно увеличить, не повредив уже имеющимся данным?
Highlander1981 вне форума Ответить с цитированием
Старый 13.11.2009, 00:07   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
поле можно увеличить, не повредив уже имеющимся данным
Думаю, что да.
Я предложу такой вариант (когда-то использовал):
1. Создайте временное поле и скопируйте в него данные из того поля, размер которого вы хотите изменить.
2. Удалите поле, которое хотите изменить.
3. Создайте его вновь, но уже с нужным размером.
4. Скопируйте данные из временного поля (см. п.1) в созданное поле с нужным размером.
5. Удалите временное поле.
Это делается на SQL.
Используется ALTER TABLE с ADD и DROP.
mihali4 вне форума Ответить с цитированием
Старый 13.11.2009, 14:15   #6
Highlander1981
Пользователь
 
Регистрация: 12.11.2009
Сообщений: 20
По умолчанию

Цитата:
Сообщение от mihali4 Посмотреть сообщение
Это делается на SQL.
Используется ALTER TABLE с ADD и DROP.
Думаю SQL не прокатит у меня же данные хранятся в *.cds. Не удобно конечно, без SQL. Но задача свести БД к двум файлам без заморочек с провайдерами. Ну а в случае чего придется через дополнительный DataSet переносить данные с уже измененными полями, логика понятна, спс!.
Кстати от Memo тоже пришлось отказаться, Locate не работает с Memo-полями, так что вернулся к String (размер с запасом указал).
Highlander1981 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Размер ключевого поля - ? Evgenii БД в Delphi 10 03.07.2009 11:28
Как изменить в InterBase размер поля varchar(10) на varchar(20) tarakan1983 БД в Delphi 4 23.03.2009 15:35
Размер поля БД kayman Общие вопросы Delphi 1 14.10.2007 21:43
Как изменить размер поля БД Алёна БД в Delphi 5 07.05.2007 10:06