Paradox 에서 field type 이 Float 인 Field 를 Integer 로 바꿔 줄려면
어케 하면 됨까..
물론 Database Desktop 으로 수정하는 말구요.. 프로그램으로 바꿀려면 말이죠..
여러군데 찾아 봤는데 잘 안보이는군요..
제가 어거지(?)로 해 놓은 방법은 바꾸고자 하는 Integer type 의 임시 Field 를
추가해 놓고 원래의 FIeld 값을 임시 Field 로 백업해 놓고
원래의 FIeld 를 drop 했다가 다시 Integer Type 으로 같은 이름의 Field 를
추가 한 뒤 백업 해 두었던 임시 FIeld 를 Restore 해 넣는 방법입니다.
이런 무식한(?) 방법 말고 쌈빡한 방법이 있을 것 같은데.. 쩝~~~
아시는 분 한수 부탁드림다.
아래와 같이 코딩하시고 테스트 해보세요...
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으로 변경할수 있는
방법을 아시게 되면 연락주세요...