Q&A

  • 이미 존재하는 테이블의 field type 변경방법??
Paradox 에서 field type 이 Float 인 Field 를 Integer 로 바꿔 줄려면

어케 하면 됨까..

물론 Database Desktop 으로 수정하는 말구요.. 프로그램으로 바꿀려면 말이죠..

여러군데 찾아 봤는데 잘 안보이는군요..

제가 어거지(?)로 해 놓은 방법은 바꾸고자 하는 Integer type 의 임시 Field 를

추가해 놓고 원래의 FIeld 값을 임시 Field 로 백업해 놓고

원래의 FIeld 를 drop 했다가 다시 Integer Type 으로 같은 이름의 Field 를

추가 한 뒤 백업 해 두었던 임시 FIeld 를 Restore 해 넣는 방법입니다.

이런 무식한(?) 방법 말고 쌈빡한 방법이 있을 것 같은데.. 쩝~~~

아시는 분 한수 부탁드림다.





1  COMMENTS
  • Profile
    뭉치 2001.06.29 02:21
    저도 첨으로 답변을 해봅니다.

    아래와 같이 코딩하시고 테스트 해보세요...



    type

    ChangeRec = packed record

    szName: DBINAME;

    iType: Word;

    iSubType: Word;

    iLength: Word;

    iPrecision: Byte;

    end;

    implementation



    {$R *.DFM}



    var MyChangeRec : ChangeRec ;

    procedure ChangeField(Table: TTable; Field: TField;Rec :ChangeRec; );

    var

    Props: CURProps;

    hDb: hDBIDb;

    TableDesc: CRTblDesc;

    pFields: pFLDDesc;

    pOp: pCROpType;

    B: Byte;

    begin

    pFields := nil;

    pOp := nil;

    if not Table.Active then

    raise EDatabaseError.Create('Table must be opened to restructure');

    if not Table.Exclusive then

    raise EDatabaseError.Create('Table must be opened exclusively' +

    'to restructure');

    Check(DbiSetProp(hDBIObj(Table.Handle), curxltMODE, Integer(xltNONE)));

    Check(DbiGetCursorProps(Table.Handle, Props));

    if (Props.szTableType <> szPARADOX) and (Props.szTableType <> szDBASE) then

    raise EDatabaseError.Create('Field altering can only occur on Paradox' +

    ' or dBASE tables');

    pFields := AllocMem(Table.FieldCount * sizeof(FLDDesc));

    pOp := AllocMem(Table.FieldCount * sizeof(CROpType));



    try

    Inc(pOp, Field.Index);

    pOp^ := crMODIFY;

    Dec(pOp, Field.Index);



    Check(DbiGetFieldDescs(Table.Handle, pFields));

    Inc(pFields, Field.Index);

    if (Length(Rec.szName) > 0) then

    pFields^.szName := Rec.szName;

    // **이부분에서 rec.itype을 원하는 type으로 변경하세요...

    //rec.itype := 1 ; // string

    //rec.iType := 2 ; // Date Type

    //rec.itype := 4 ; // logical

    //rec.itype := 5 ; // short ;

    //rec.itype := 6 ; // integer

    //rec.iType := 7 ; // number

    //rec.itype := 8 ; // BCD

    //rec.itype := 9 ; // byte

    //rec.iType := 10 ; // Time Type

    //rec.itype := 11 ; // time stamp

    if (Rec.iType > 0) then

    pFields^.iFldType := Rec.iType;

    if (Rec.iSubType > 0) then

    pFields^.iSubType := Rec.iSubType;

    if (Rec.iLength > 0) then

    pFields^.iUnits1 := Rec.iLength;

    if (Rec.iPrecision > 0) then

    pFields^.iUnits2 := Rec.iPrecision;

    Dec(pFields, Field.Index);

    for B := 1 to Table.FieldCount do begin

    pFields^.iFldNum := B;

    Inc(pFields, 1);

    end;

    Dec(pFields, Table.FieldCount);



    FillChar(TableDesc, sizeof(TableDesc), #0);

    Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));

    StrPCopy(TableDesc.szTblName, Table.TableName);

    StrPCopy(TableDesc.szTblType, Props.szTableType);

    TableDesc.iFldCount := Table.FieldCount;

    TableDesc.pecrFldOp := pOp;

    TableDesc.pFldDesc := pFields;

    Table.Close;

    Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, False));

    finally

    if (pFields <> nil) then

    FreeMem(pFields);

    if (pOp <> nil) then

    FreeMem(pOp);

    end;

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var i : integer ;

    begin

    Table1.active := true ;

    ChangeField(Table1, Table1.FieldByName('Mo_Date'), MyChangeRec) ;

    end;



    저도하다가 포기한부분인데 혹시 Autoincrement type으로 변경할수 있는

    방법을 아시게 되면 연락주세요...