Àêæàí â ñåòè - Íà óðîâåíü ââåðõ(VCL, BDE) Åñòü íåêîòîðàÿ òàáëèöà è òðåáóåòñÿ ïðè íàæàòèè íà êíîïêó ñîçäàâàòü òàáëèöû òàêîé æå ñòðóêòóðû. Ïîäñêàæèòå, êàê ýòî óäîáíåå âñåãî ñäåëàòü?

Óäîáíåé âñåãî, íàï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)