Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить размер поля или его тип 
:(
    Опции темы
Pakshin A. S.
Дата 13.11.2004, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 2
Всего: 61



Единственный способ изменить размер поля или его тип - использовать DBIDoRestructure. Вот простой пример, который может вам помочь в этом: 


Код

function BDEStringFieldResize(ATable: TTable; AFieldName: string; ANewSize: 
  integer): boolean; 
type 
  TRestructStatus = (rsFieldNotFound, rsNothingToDo, rsDoIt); 
var 
  hDB: hDBIdb; 
  pTableDesc: pCRTblDesc; 
  pFldOp: pCROpType; {фактически это массив array of pCROpType} 
  pFieldDesc: pFldDesc; {фактически это массив array of pFldDesc} 
  CurPrp: CurProps; 
  CSubType: integer; 
  CCbrOption: CBRType; 
  eRestrStatus: TRestructStatus; 
  pErrMess: DBIMsg; 
  i: integer; 
begin 
  Result := False; 
  eRestrStatus := rsFieldNotFound; 
  AFieldName := UpperCase(AFieldName); 
  pTableDesc := nil; 
  pFieldDesc := nil; 
  pFldOp := nil; 

  with ATable do 
  try 

    {убедимся что имеем исключительный доступ и сохраним dbhandle:} 
    if Active and (not Exclusive) then 
      Close; 
    if (not Exclusive) then 
      Exclusive := True; 
    if (not Active) then 
      Open; 
    hDB := DBHandle; 

    {готовим данные для DBIDoRestructure:} 
    BDECheck(DBIGetCursorProps(Handle, CurPrp)); 
    GetMem(pFieldDesc, CurPrp.iFields * sizeOf(FldDesc)); 
    BDECheck(DBIGetFieldDescs(Handle, pFieldDesc)); 
    GetMem(pFldOp, CurPrp.iFields * sizeOf(CROpType)); 
    FillChar(pFldOp^, CurPrp.iFields * sizeOf(CROpType), 0); 

    {ищем в цикле (через fielddesc) наше поле:} 
    for i := 1 to CurPrp.iFields do 
    begin 
      {для ввода мы имеем серийные номера вместо 
      Pdox ID, возвращаемых DbiGetFieldDescs:} 
      pFieldDesc^.iFldNum := i; 
      if (Uppercase(StrPas(pFieldDesc^.szName)) = AFieldName) 
        and (pFieldDesc^.iFldType = fldZSTRING) then 
      begin 
        eRestrStatus := rsNothingToDo; 
        if (pFieldDesc^.iUnits1 <> ANewSize) then 
        begin 
          pFieldDesc^.iUnits1 := ANewSize; 
          pFldOp^ := crModify; 
          eRestrStatus := rsDoIt; 
        end; 
      end; 
      inc(pFieldDesc); 
      inc(pFldOp); 
    end; {for} 

    {"регулируем" массив указателей:} 
    dec(pFieldDesc, CurPrp.iFields); 
    dec(pFldOp, CurPrp.iFields); 

    {в случае отсутствия операций возбуждаем исключение:} 
    case eRestrStatus of 
      rsNothingToDo: raise Exception.Create('Ничего не сделано'); 
      rsFieldNotFound: raise Exception.Create('Поле не найдено'); 
    end; 

    GetMem(pTableDesc, sizeOf(CRTblDesc)); 
    FillChar(pTableDesc^, SizeOf(CRTblDesc), 0); 
    StrPCopy(pTableDesc^.szTblName, TableName); 
    {StrPCopy(pTableDesc^.szTblType,szPARADOX); {} 
    pTableDesc^.szTblType := CurPrp.szTableType; 
    pTableDesc^.iFldCount := CurPrp.iFields; 
    pTableDesc^.pecrFldOp := pFldOp; 
    pTableDesc^.pfldDesc := pFieldDesc; 

    Close; 

    BDECheck(DbiDoRestructure(hDB, 1, pTableDesc, nil, nil, nil, False)); 

  finally 
    if pTableDesc <> nil then 
      FreeMem(pTableDesc, sizeOf(CRTblDesc)); 
    if pFldOp <> nil then 
      FreeMem(pFldOp, CurPrp.iFields * sizeOf(CROpType)); 
    if pFieldDesc <> nil then 
      FreeMem(pFieldDesc, CurPrp.iFields * sizeOf(FldDesc)); 
    Open; 
  end; {пробуем с table1} 
  Result := True; 
end; 


Примечание Vit: На счёт "Единственный способ" - этот товарищ несколько погорячился. Все базы данных поддерживают SQL запрос вида 

Код

ALTER TABLE... 

Конкретный формат надо выяснить в справочнике по используемой базе данных, так как он немного различается для разных серверов, но указанный запрос весьма гибок, и применим не только с BDE, но и с другими системами доступа и с любыми базами данных. 

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0478 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.