Àêæàí â ñåòè - Íà óðîâåíü ââåðõ(PDX, DBF) Êàê ïðîãðàììíî èçìåíèòü LangDriver äëÿ òàáëèö dBase è Paradox?

Îòêpûâàåøü help è ñìîòpèøü:

.......
var List:TStrings;
.......
BEGIN
.......
  List.Add ( 'LANGDRIVER=db866ru0 ');
.......
  Session.ModifyDriver( 'DBASE', List );
.......
END;

Ýòî äåéñòâèå ÿ ïpîâîæy ïåpåä îòêpûòèåì òàáëèöû

Ivan Sboev

(2:5049/36.15)

Ýòî î "ðóñèôèêàöèè" òàáëèöû.  òàáëèöàõ dBase è Paradox èìååòñÿ áàéò, êîòîðûé îïðåäåëÿåò CodePage ñîäåðæèìîãî òàáëèöû. Ðàíüøå îí íå èñïîëüçîâàëñÿ è áûë çàðåçåðâèðîâàí. Òåáå íóæíî åãî ïðàâèëüíî óñòàíîâèòü. Ýòî äåëàåòñÿ ÷åðåç DBD Restructure table. Åñëè õî÷åøü ïðîãðàììíî, ìîæåøü âîñïîëüçîâàòüñÿ ñëåäóþùåé ïðîöåäóðîé:

uses DbiTypes, DbiProcs, DbiErrs, DB, WinProcs, SysUtils;

procedure ChangeLangDriver( DatabaseName, TableName, LDName: string );
var
  TblExt: string;
  Database: TDatabase;
  TblDesc: CRTblDesc;
  OptDesc: FLDDesc;
  OptData: array [0..250] of Char;
  Cur: hDBICur;
  Rec: CFGDesc;
begin
  if ( TableName='' ) or ( LDName='' ) then
    raise Exception.Create( 'Unknown TableName or LDName' );
  Database:=Session.OpenDatabase( DatabaseName );
  try
    if Database.IsSQLBased then raise Exception.Create( 'Function ChangeLangDriver working only with dBase or Paradox tables' );
    FillChar( OptDesc, SizeOf( OptDesc ), #0 );
    FillChar( TblDesc, SizeOf( TblDesc ), #0 );
    StrCopy( OptDesc.szName, 'LANGDRIVER' );
    OptDesc.iLen := Length( LDName ) + 1;
    with TblDesc do
    begin
      StrPCopy( szTblName, TableName );
      TblExt := UpperCase( ExtractFileExt( TableName ) );
      if TblExt = 'DBF' then StrCopy( szTblType, szDbase )
      else if TblExt = '.DB' then StrCopy( szTblType, szParadox )
      else
      begin
        AnsiToOEM( StrPCopy( OptData, DatabaseName ), OptData );
        if DbiOpenCfgInfoList( nil, dbiREADONLY, cfgPersistent,
          StrPCopy( OptData, '\DATABASES\' + StrPas( OptData ) + '\DB INFO\' ),
          Cur ) <> DBIERR_NONE
        then
          raise Exception.Create( 'Unknown table type');
        try
          while DbiGetNextRecord( Cur, dbiNOLOCK, @Rec, nil ) <> DBIERR_EOF do
            if StrComp( Rec.szNodeName, 'DEFAULT DRIVER' ) = 0 then
            begin
              StrCopy( szTblType, Rec.szValue );
              Break;
            end;
        finally
          Check( DbiCloseCursor( Cur ) );
        end;
      end;
      iOptParams := 1;
      pfldOptParams := @OptDesc;
      pOptData := @OptData;
    end;
    StrPCopy( OptData, LDName );
    Check( DbiDoRestructure( Database.Handle, 1, @TblDesc, nil,
      nil, nil, False ) );
  finally
    Session.CloseDatabase( Database );
  end;
end;

Ïðèìåðû èñïîëüçîâàíèÿ:

ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE', 'ancyrr' );
ChangeLangDriver( 'DBDEMOS', 'EMPLOYEE.DB', 'ancyrr' );
ChangeLangDriver( 'C:\DELPHI\DEMOS\DATA', 'CLIENTS.DBF', 'db866ru0' );

LDName:
äëÿ D1 - èìÿ .LD ôàéëà â êàòàëîãå IDAPI\LANGDRV;
äëÿ D2 è CB - èç BDECFG32.HLP ïîëå Short name â òàáëè÷êå ïî óêàçàòåëþ language drivers, dBASE èëè ïîëå Internal â òàáëè÷êå ïî óêàçàòåëþ language drivers, Paradox;
äëÿ D3 è âûøå - íå çíàþ òàê êàê ó ìåíÿ å¸ íåò, íî äóìàþ, ÷òî òàêæå, êàê è â D2.

Farid Zaripov

farid@aduis.kiev.ua
(2:463/201.101)