Btrieve и clarion

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Btrieve и clarion

Сообщение morkovin »

kreator писал(а): 26 Сентябрь 2019, 12:08 У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
Передёргиваешь! имхо, речь идёт о справочнике для выбора (Select-a). А в создаваемую запись будет вставляться уникальный код для уникальной записи "Иванов Иван Иванович" в справочнике.
WBR, morkovin
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Btrieve и clarion

Сообщение kreator »

morkovin писал(а): 26 Сентябрь 2019, 13:41
kreator писал(а): 26 Сентябрь 2019, 12:08 У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
Передёргиваешь! имхо, речь идёт о справочнике для выбора (Select-a). А в создаваемую запись будет вставляться уникальный код для уникальной записи "Иванов Иван Иванович" в справочнике.
Я имел ввиду сам справочник. У меня многие справочники с уникальностью по наименованию. Единицы измерения, например. Плохой пример, нет смысла отводить под это дело 1000 символов. И всё же.
Ладно, согласен, может и не особо жизненно.
We are hard at work… for you. :)
Аватара пользователя
porutchik
Активист
Сообщения: 150
Зарегистрирован: 01 Февраль 2009, 5:35

Btrieve и clarion

Сообщение porutchik »

finsoftrz писал(а): 26 Сентябрь 2019, 12:20
kreator писал(а): 26 Сентябрь 2019, 12:08У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
1. Задача не из жизни.
2. Делаем второе поле для ключа по первым или последним символам (где предполагается уникальность), затем в процедурах модификации данных отбираем все записи с ними по ключу (их уже не должно быть много) и проверяем перебором на полное совпадение.
3. Делаем второе поле для ключа, сохраняем в него хэш.

Может еще какие варианты кому в голову придут.
вопрос стоял только в уникальности поля... я бы сделал поле с хэшем и по нему ключ, можно обработать в тригере
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Btrieve и clarion

Сообщение vic7tar »

finsoftrz писал(а): 26 Сентябрь 2019, 12:203. ... Делаем второе поле для ключа, сохраняем в него хэш.
...
Не трудоёмко ли с хэшем потом будет работать?
C10, Win10x64
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

vic7tar писал(а): 30 Сентябрь 2019, 17:52
finsoftrz писал(а): 26 Сентябрь 2019, 12:203. ... Делаем второе поле для ключа, сохраняем в него хэш.
...
Не трудоёмко ли с хэшем потом будет работать?
Не знаю, не пробовал. По идее, не должно быть трудоемко. Для меня эта тема не актуальна, я вообще не вижу практического смысла делать уникальные текстовые поля, тем более на сотни байт. Ну, разве всякие guid, которые используют в системах с претензией на глобальность. Я там пошел по первому варианту с сохранением в ключе фрагмента и фильтрацией до полного значения. Максимальное значение, которое я встречал на практике - алкогольные марки длиной 150 символов.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

Операции copy(File) и remove(File), у которых в качестве параметра задана файловая структура, не работают с таблицами, хранящимися в нескольких физических файлах. Хотя, судя по доке, должны.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Btrieve и clarion

Сообщение Игорь Столяров »

Вроде бы это файловая функция.

COPY - Копирует файл.
файл - Метка оператора FILE, строковая константа или переменная, которые содержат спецификацию файла, который надлежит скопировать.

Никаких файлОВ, входящих в структуру таблицы и т.д.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

Если это FILE, то логично было бы копировать все физические файлы, имена которых однозначно определяются. Конечно, все это решается написанием своей функции.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Btrieve и clarion

Сообщение Admin »

Кусок кода, может чем поможет...

Код: Выделить всё

xDataBackupProClass.GetFileName      PROCEDURE(FILE FileName)
LOC:Temp                             STRING(255)
  CODE
  LOC:Temp = FileName{PROP:Name}
  IF INSTRING('\!', LOC:Temp, 1, 1)
    LOC:Temp = SUB(LOC:Temp, 1, INSTRING('\!', LOC:Temp, 1, 1) - 1)
    RETURN(LOC:Temp)
  END
  IF CLIP(SELF.ExtractExt(FileName{PROP:Name})) = ''
    CASE UPPER(FileName{PROP:Driver})
    OF 'TOPSPEED'
        LOC:Temp = CLIP(LOC:Temp) & '.tps'
    OF 'CLARION'
        LOC:Temp = CLIP(LOC:Temp) & '.dat'
    OF 'CLIPPER'
    OROF 'FOXPRO'
    OROF 'DBASE3'
    OROF 'DBASE4'
      LOC:Temp = CLIP(LOC:Temp) & '.dbf'
    END
  END
  RETURN(SELF.NormalizeFileName(LOC:Temp))
!*************************************************************************************************************************
xDataBackupProClass.GetKeyNames      PROCEDURE
        MAP
AddKeyFile                           PROCEDURE(STRING FileName),BYTE
GenKeyFileName                       PROCEDURE(STRING Ext)
        END
LOC:Temp                             STRING(255)
LOC:File                             STRING(255)
LOC:Key                              STRING(255)
FIQ                  QUEUE,PRE(F_IQ)
Name                   STRING(FILE:MAXFILENAME)
ShortName              STRING(13)
Date                   LONG
Time                   LONG
Size                   LONG
Attrib                 BYTE
                     END
  CODE
  LOC:File = SELF.ExtractPath(SELF.Files.FileLabel{PROP:Name})
  LOOP W# = 1 TO RECORDS(SELF.Keys)
    GET(SELF.Keys, W#)
    IF SELF.Keys.FileNumber = SELF.Files.FileNumber
      IF ERRORCODE() THEN MESSAGE(ERROR(), SELF.CaptionName, ICON:Asterisk) END
      LOC:Key = SELF.ExtractFile(SELF.Files.FileLabel{PROP:Name})
      CASE UPPER(SELF.Files.FileLabel{PROP:Driver})
      OF 'CLARION'
        !keys K??
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.K??'
        DIRECTORY(FIQ, LOC:Temp, FF_:DIRECTORY)
        LOOP E# = 1 TO RECORDS(FIQ)
          GET(FIQ, E#)
          IF ERRORCODE() THEN MESSAGE(ERROR()) END
          IF FIQ.Name[1] <> '.'
            LOC:Temp = CLIP(LOC:File) & CLIP(FIQ.Name)
            IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
          END
        END
        !memo MEM
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.MEM'
        IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
      OF 'CLIPPER'
        !key NTX
        GenKeyFileName('NTX')
        !memo DBT
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.DBT'
        IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
      OF 'FOXPRO'
        !key IDX
        GenKeyFileName('IDX')
        !memo FBT
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.FBT'
        IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
      OF 'DBASE3'
        !key NDX
        GenKeyFileName('NDX')
        !memo DBT
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.DBT'
        IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
      OF 'DBASE4'
        !key NDX
        GenKeyFileName('NDX')
        !memo DBT
        LOC:Temp = CLIP(LOC:File) & CLIP(LOC:Key) & '.DBT'
        IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
      END
    END
  END
GenKeyFileName                       PROCEDURE(STRING Ext)
  CODE
  IF SELF.Keys.KeyLabel{PROP:Name} <> ''
    IF CLIP(SELF.ExtractExt(SELF.Keys.KeyLabel{PROP:Name})) = ''
      LOC:Temp = CLIP(LOC:File) & CLIP(SELF.Keys.KeyLabel{PROP:Name}) & '.' & CLIP(Ext)
    ELSE
      LOC:Temp = CLIP(LOC:File) & CLIP(SELF.Keys.KeyLabel{PROP:Name})
    END
  ELSE
    IF CLIP(SELF.ExtractExt(SELF.Keys.KeyName)) = ''
      LOC:Temp = CLIP(LOC:File) & CLIP(SELF.Keys.KeyName) & '.' & CLIP(Ext)
    ELSE
      LOC:Temp = CLIP(LOC:File) & CLIP(SELF.Keys.KeyName)
    END
  END
  IF AddKeyFile(LOC:Temp) AND SELF.FileExists = FALSE THEN SELF.FileExists = TRUE END
AddKeyFile                           PROCEDURE(STRING FileName)
  CODE
  IF FindFile(SELF.NormalizeFileName(FileName))
    SELF.AddList(SELF.NormalizeFileName(FileName))
    RETURN TRUE
  END
  RETURN FALSE
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

Да я вчера сделал. Это в шаблоне автоматической конвертации надо было.

Код: Выделить всё

  COPY(%FsFile,loc:filenameS)
  REMOVE(%FsFile)

  if %FsFile{PROP:Driver}='Btrieve'  !для btrieve копируем файлы-продолжения
    loop loc:numBtrv=1 to 99
       if ~exists(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)))
          break
       end
       copy(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)),FsStrReplace(loc:filenameS,'.dat','.^' & format(loc:numBtrv,@n02)))
       remove(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)))
    end
  end 
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Btrieve и clarion

Сообщение Игорь Столяров »

finsoftrz писал(а): 27 Октябрь 2019, 8:26Да я вчера сделал.
В общем случае, там ведь ещё могут быть файлы с MEMO полями …
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

Мне просто это не надо, я опустил. Мемо поле - это 5 первых символов имени основного файла и замена остального на мем. А дальше по той же схеме.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

С memo вот так будет выглядеть:

Код: Выделить всё

  COPY(%FsFile,loc:filenameS)
  REMOVE(%FsFile)

  if %FsFile{PROP:Driver}='Btrieve'  !для btrieve копируем файлы-продолжения
    loop loc:numBtrv=1 to 99
       if ~exists(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)))
          break
       end
       copy(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)),FsStrReplace(loc:filenameS,'.dat','.^' & format(loc:numBtrv,@n02)))
       remove(FsStrReplace(%FsFile{PROP:NAME},'.dat','.^' & format(loc:numBtrv,@n02)))
    end

    loc:fileMemBtrv=FsFileShort(%FsFile{PROP:NAME},2)
    loc:fileMemBtrv=FsStrReplace(%FsFile{PROP:NAME},clip(loc:fileMemBtrv) & '.dat',clip(sub(loc:fileMemBtrv,1,5)) & 'mem.dat')
    if exists(loc:fileMemBtrv)
       loc:fileMemTargBtrw=FsFileShort(loc:filenameS,2)
       loc:fileMemTargBtrw=FsStrReplace(loc:filenameS,clip(loc:fileMemTargBtrw) & '.dat',clip(sub(loc:fileMemTargBtrw,1,5)) & 'mem.dat')

       COPY(loc:fileMemBtrv,loc:fileMemTargBtrw)
       REMOVE(loc:fileMemBtrv)

       loop loc:numBtrv=1 to 99
          if ~exists(FsStrReplace(loc:fileMemBtrv,'.dat','.^' & format(loc:numBtrv,@n02)))
             break
          end
          copy(FsStrReplace(loc:fileMemBtrv,'.dat','.^' & format(loc:numBtrv,@n02)),FsStrReplace(loc:fileMemTargBtrw,'.dat','.^' & format(loc:numBtrv,@n02)))
          remove(FsStrReplace(loc:fileMemBtrv,'.dat','.^' & format(loc:numBtrv,@n02)))
       end
    end
  end 
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4549
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 34 раза

Btrieve и clarion

Сообщение finsoftrz »

Ради статистики. Больше полугода крутится боевая база btrieve на терминальном сервере. Было 2 случая сбоя в индексах. Причем на маленьких, мало нагруженных таблицах. Оба раза восстановилось за пять секунд обычным кларионовским full build. На tps за много лет что-то даже не припомню, когда индексы сбивались.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Btrieve и clarion

Сообщение Игорь Столяров »

finsoftrz писал(а): 30 Январь 2020, 12:00 На tps за много лет что-то даже не припомню, когда индексы сбивались.
Основные проблемы с TPS всё-таки возникают при традиционном сетевом доступе к БД (точнее при обрыве сети) или
выключении питания на компьютере с локальной БД в момент выполнения записи (добавления, удаления).
Если у Вас на терминальном сервере решены все аппаратные вопросы + все операции выполняются под транзакциями,
то действительно, там просто нечему сбиваться … :)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить