Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

FAQ - Вопросы - ответы - советы - Базы данных

Вопрос:

[PDX,DBF] Как программно изменить LANGDRIVER для таблиц DBASE и PARADOX?

Ответ:

Открываешь HELP и смотришь:

.......
VAR LIST:TSTRINGS;
.......
BEGIN
  .......
  LIST.ADD ('LANGDRIVER=DB866RU0');
  .......
  SESSION.MODIFYDRIVER('DBASE',LIST);
  .......
END;

это действие я провожу перед открытием таблицы

Это о "русификации" таблицы. В таблицах 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.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог