Óäîáíåé âñåãî, íàïpèìåp, òàê -
with bmovMyBatchMove do
begin
Mode := bmCopy;
RecordCount := 1;
Execute;
Destination.Delete;
end;
Ãäå bmovMyBatchMove - ýêçåìïëÿð êëàññà TBatchMove èç VCL.
Akzhan Abdulin
(2:5040/55.46)Håïðàâäà Âàøà! ;)
Ýòîò çàãàäî÷íûé BatchMove èìååò îäíó
î÷åíü íåïðèÿòíóþ îñîáåííîñòü (ïî
êðàéíåé ìåðå ïðè ðàáîòå ñ
DBF-òàáëèöàìè è â Delphi 1.0x), êàê-òî:
óâåëè÷èâàåò â ñîçäàâàåìûõ òàáëèöàõ
â ïîëÿõ òèïà NUMBER
êîëè÷åñòâî çíà÷àùèõ öèôð ïîñëå
çàïÿòîé (íå ïîìíþ - âîçìîæíî, ÷òî è
äî), åñëè òàì óêàçàíû íåáîëüøèå
(îêîëî 1-3 öèôð) çíà÷åíèÿ :(.
ß ýòó îñîáåííîñòü ïîáîðîòü íå
ñóìåë, à ìèðèòüñÿ ñ íåé â óñëîâèÿõ
íàøåé êîíòîðû (êîãäà ïðèõîäèòñÿ
áîðîòüñÿ çà ìåñòî ïîä ñîëíöåì ñ
ïðîãðàììèñòàìè íà Clipper è FoxPro
ñîâåðøåííî íåïðèåìëåìî.
Êðîìå òîãî, â ïðåäëîæåííîì âûøå
âàðèàíòå åùå è çàïèñü óäàëÿòü
ïðèõîäèòñÿ...:)
Ðåøàëàñü æå ýòà ïðîáëåìà ñëåäóþùèì
ñïîñîáîì:
procedure CopyStruct( SrcTable, DestTable: TTable;
cpyFields: array of string );
var
i: Integer;
bActive: Boolean;
SrcDatabase,DestDatabase: TDatabase;
iSrcMemSize,iDestMemSize: Integer;
pSrcFldDes: PFldDesc; CrtTableDesc: CRTblDesc;
bNeedAllFields: Boolean;
begin
SrcDatabase := Session.OpenDatabase( SrcTable.DatabaseName );
try
DestDatabase := Session.OpenDatabase(
DestTable.DatabaseName );
try
bActive := SrcTable.Active;
SrcTable.FieldDefs.Update;
iSrcMemSize := SrcTable.FieldDefs.Count * SizeOf(
FLDDesc );
pSrcFldDes := AllocMem( iSrcMemSize );
if pSrcFldDes = nil then
begin
raise EOutOfMemory.Create( 'Íå õâàòàåò
ïàìÿòè!' );
end;
try
SrcTable.Open;
Check( DbiGetFieldDescs( SrcTable.Handle,
pSrcFldDes ) );
SrcTable.Active := bActive;
FillChar( CrtTableDesc, SizeOf( CrtTableDesc ), 0
);
with CrtTableDesc do
begin
StrPcopy( szTblName, DestTable.TableName );
StrPcopy( szTblType, 'DBASE');
if ( Length( cpyFields[0] ) = 0 ) or (
cpyFields[0] = '*' ) then
begin
bNeedAllFields := True;
SrcTable.FieldDefs.Update;
iFldCount := SrcTable.FieldDefs.Count;
end
else
begin
bNeedAllFields := False;
iFldCount := High( cpyFields ) + 1;
end;
iDestMemSize := iFldCount * Sizeof( FLDDesc
);
CrtTableDesc.pFLDDesc := AllocMem(
iDestMemSize );
if CrtTableDesc.pFLDDesc = nil then
begin
raise EOutOfMemory.Create( 'Íå
õâàòàåò ïàìÿòè!' );
end;
end;
try
if bNeedAllFields then
begin
for i := 0 to CrtTableDesc.iFldCount - 1
do
begin
Move( PFieldDescList( pSrcFldDes
)^[i], PFieldDescList( CrtTableDesc.pFLDDesc )^[i], SizeOf(
FldDesc ) );
end;
end
else
begin
for i:=0 to CrtTableDesc.iFldCount-1 do
begin
Move( PFieldDescList( pSrcFldDes
)^[SrcTable.FieldDefs.Find( cpyFields[i] ).FieldNo - 1],
PFieldDescList( CrtTableDesc.pFLDDesc )^[i], SizeOf( FldDesc ) );
end;
end;
Check( DbiCreateTable( DestDatabase.Handle,
True, CrtTableDesc ) );
finally
FreeMem( CrtTableDesc.pFLDDesc, iDestMemSize
);
end;
finally
FreeMem( pSrcFldDes, iSrcMemSize );
end;
finally
Session.CloseDatabase( DestDatabase );
end;
finally
Session.CloseDatabase( SrcDatabase );
end;
end;
Vlad Fillippov
(2:5055/34.3)