Передёргиваешь! имхо, речь идёт о справочнике для выбора (Select-a). А в создаваемую запись будет вставляться уникальный код для уникальной записи "Иванов Иван Иванович" в справочнике.kreator писал(а): 26 Сентябрь 2019, 12:08 У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
Btrieve и clarion
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- morkovin
 - Ветеран
 - Сообщения: 937
 - Зарегистрирован: 20 Июль 2005, 14:53
 - Откуда: Volgograd, Russia
 - Благодарил (а): 12 раз
 - Поблагодарили: 4 раза
 - Контактная информация:
 
Btrieve и clarion
WBR, morkovin
			
						- 
				kreator
 - ✯ Ветеран ✯
 - Сообщения: 5235
 - Зарегистрирован: 28 Май 2009, 15:54
 - Откуда: Москва
 - Благодарил (а): 11 раз
 - Поблагодарили: 26 раз
 
Btrieve и clarion
Я имел ввиду сам справочник. У меня многие справочники с уникальностью по наименованию. Единицы измерения, например. Плохой пример, нет смысла отводить под это дело 1000 символов. И всё же.morkovin писал(а): 26 Сентябрь 2019, 13:41Передёргиваешь! имхо, речь идёт о справочнике для выбора (Select-a). А в создаваемую запись будет вставляться уникальный код для уникальной записи "Иванов Иван Иванович" в справочнике.kreator писал(а): 26 Сентябрь 2019, 12:08 У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
Ладно, согласен, может и не особо жизненно.
We are hard at work… for you.   
			
						Btrieve и clarion
вопрос стоял только в уникальности поля... я бы сделал поле с хэшем и по нему ключ, можно обработать в тригереfinsoftrz писал(а): 26 Сентябрь 2019, 12:201. Задача не из жизни.kreator писал(а): 26 Сентябрь 2019, 12:08У вас классный междусобойчик! Как сделать,чтобы "Иванов Иван Иванович" (поле 1000 символов) был уникален.
2. Делаем второе поле для ключа по первым или последним символам (где предполагается уникальность), затем в процедурах модификации данных отбираем все записи с ними по ключу (их уже не должно быть много) и проверяем перебором на полное совпадение.
3. Делаем второе поле для ключа, сохраняем в него хэш.
Может еще какие варианты кому в голову придут.
Btrieve и clarion
Не трудоёмко ли с хэшем потом будет работать?finsoftrz писал(а): 26 Сентябрь 2019, 12:203. ... Делаем второе поле для ключа, сохраняем в него хэш.
...
C10, Win10x64
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Не знаю, не пробовал. По идее, не должно быть трудоемко. Для меня эта тема не актуальна, я вообще не вижу практического смысла делать уникальные текстовые поля, тем более на сотни байт. Ну, разве всякие guid, которые используют в системах с претензией на глобальность. Я там пошел по первому варианту с сохранением в ключе фрагмента и фильтрацией до полного значения. Максимальное значение, которое я встречал на практике - алкогольные марки длиной 150 символов.
C6/C12, ШВС, tps/btrieve.
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Операции copy(File) и remove(File), у которых в качестве параметра задана файловая структура, не работают с таблицами, хранящимися в нескольких физических файлах. Хотя, судя по доке, должны.
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Btrieve и clarion
Вроде бы это файловая функция.
COPY - Копирует файл.
файл - Метка оператора FILE, строковая константа или переменная, которые содержат спецификацию файла, который надлежит скопировать.
Никаких файлОВ, входящих в структуру таблицы и т.д.
			
			
									
						COPY - Копирует файл.
файл - Метка оператора FILE, строковая константа или переменная, которые содержат спецификацию файла, который надлежит скопировать.
Никаких файлОВ, входящих в структуру таблицы и т.д.
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Если это FILE, то логично было бы копировать все физические файлы, имена которых однозначно определяются. Конечно, все это решается написанием своей функции.
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- Admin
 - Администратор
 - Сообщения: 4022
 - Зарегистрирован: 05 Июль 2005, 15:59
 - Откуда: Хабаровск
 - Благодарил (а): 59 раз
 - Поблагодарили: 42 раза
 - Контактная информация:
 
Btrieve и clarion
Кусок кода, может чем поможет...
			
			
									
						Код: Выделить всё
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
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Да я вчера сделал. Это в шаблоне автоматической конвертации надо было. 
			
			
									
						Код: Выделить всё
  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/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Btrieve и clarion
В общем случае, там ведь ещё могут быть файлы с MEMO полями …
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Мне просто это не надо, я опустил. Мемо поле - это 5 первых символов имени основного файла и замена остального на мем. А дальше по той же схеме.
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
С 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/C12, ШВС, tps/btrieve.
			
						- finsoftrz
 - ✯ Ветеран ✯
 - Сообщения: 5568
 - Зарегистрирован: 06 Ноябрь 2014, 12:48
 - Благодарил (а): 18 раз
 - Поблагодарили: 78 раз
 
Btrieve и clarion
Ради статистики. Больше полугода крутится боевая база btrieve на терминальном сервере. Было 2 случая сбоя в индексах. Причем на маленьких, мало нагруженных таблицах. Оба раза восстановилось за пять секунд обычным кларионовским full build. На tps за много лет что-то даже не припомню, когда индексы сбивались.
			
			
									
						C6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
 - Ветеран движения
 - Сообщения: 8269
 - Зарегистрирован: 07 Июль 2005, 10:19
 - Откуда: г. Ростов-на-ДоМу
 - Благодарил (а): 34 раза
 - Поблагодарили: 106 раз
 
Btrieve и clarion
Основные проблемы с TPS всё-таки возникают при традиционном сетевом доступе к БД (точнее при обрыве сети) илиfinsoftrz писал(а): 30 Январь 2020, 12:00 На tps за много лет что-то даже не припомню, когда индексы сбивались.
выключении питания на компьютере с локальной БД в момент выполнения записи (добавления, удаления).
Если у Вас на терминальном сервере решены все аппаратные вопросы + все операции выполняются под транзакциями,
то действительно, там просто нечему сбиваться …
За теми, кто отстал, не возвращаться ! 
 Кодекс
			
						